<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Home on Steven Engelhardt</title>
    <link>https://www.stevenengelhardt.com/</link>
    <description>Recent content in Home on Steven Engelhardt</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Wed, 28 May 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.stevenengelhardt.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Wednesday 2025-05-28 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/05/2025-05-28-wednesday-assorted-links/</link>
      <pubDate>Wed, 28 May 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/05/2025-05-28-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, May 28:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/unlocking-the-power-of-regex-in-sql-server/&#34;&gt;Unlocking the Power of Regex in SQL Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/announcing-the-general-availability-ga-of-json-data-type-json-aggregates/&#34;&gt;Announcing the General Availability (GA) of JSON data type &amp;amp; JSON aggregates&amp;hellip;&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We are excited to announce the General Availability (GA) of the native JSON data type and JSON&#xA;aggregates – JSON_OBJECTAGG &amp;amp; JSON_ARRAYAGG. You can use the JSON data type and JSON&#xA;aggregates to integrate and work with JSON documents more efficiently in the database.&#xA;This functionality is available in Azure SQL Database, Azure SQL Managed Instance with the&#xA;Always-up-to-date update policy.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/csharp-exploring-extension-members/&#34;&gt;C# 14 – Exploring extension members&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/evaluating-ai-content-safety/&#34;&gt;Evaluating content safety in your .NET AI applications&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We are excited to announce the addition of the Microsoft.Extensions.AI.Evaluation.Safety&#xA;package to the Microsoft.Extensions.AI.Evaluation libraries! This new package provides&#xA;evaluators that help you detect harmful or sensitive content — such as hate speech, violence,&#xA;copyrighted material, insecure code, and more — within AI-generated content in your&#xA;Intelligent Applications.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/introducing-dotnet-aspire-93/&#34;&gt;.NET Aspire 9.3 is here and enhanced with GitHub Copilot!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-05-27 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/05/2025-05-27-tuesday-assorted-links/</link>
      <pubDate>Tue, 27 May 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/05/2025-05-27-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, May 27:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/sharded-diskann-focused-vector-search-for-better-performance-and-lower-cost/&#34;&gt;Fast, Accurate, and Affordable: Sharded DiskANN for Multitenant Vector Search in Azure Cosmos DB&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Azure Cosmos DB now includes Sharded DiskANN, a powerful capability that optimized for&#xA;large-scale multitenant apps by splitting a DiskANN index into smaller, more performant pieces.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/general-availability-for-data-api-in-vcore-based-azure-cosmos-db-for-mongodb/&#34;&gt;General Availability for Data API in vCore-based Azure Cosmos DB for MongoDB&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Data API is a RESTful HTTPS interface that enables developers to interact with their&#xA;MongoDB data hosted in vCore-based Azure Cosmos DB directly from their applications—no&#xA;drivers or complex query logic required. It offers a simple, efficient way to connect your&#xA;MongoDB data with web apps, mobile apps, and tools like Power BI.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/azure-cosmosdb-per-partition-automatic-failover-preview-annoucment/&#34;&gt;Elevating Azure Cosmos DB Resilience with Per Partition Automatic Failover&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Today, we’re excited to announce the preview of Per Partition Automatic Failover (PPAF) for&#xA;Azure Cosmos DB, a significant improvement to our single-region write accounts that boosts&#xA;availability and resilience.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/boost-query-performance-with-global-secondary-indexes-in-azure-cosmos-db/&#34;&gt;Boost Query Performance with Global Secondary Indexes in Azure Cosmos DB&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Global secondary indexes for Azure Cosmos DB—now in Public Preview—make it easier to query&#xA;data efficiently, especially as your datasets grow.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/new-generally-available-and-preview-search-capabilities-in-azure-cosmos-db-for-nosql/&#34;&gt;New Generally Available and Preview Search Capabilities in Azure Cosmos DB for NoSQL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-05-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/05/2025-05-26-monday-assorted-links/</link>
      <pubDate>Mon, 26 May 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/05/2025-05-26-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, May 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2025/04/28/security/how-meta-understands-data-at-scale/&#34;&gt;How Meta understands data at scale&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Managing and understanding large-scale data ecosystems is a significant challenge for many&#xA;organizations, requiring innovative solutions to efficiently safeguard user data. Meta’s&#xA;vast and diverse systems make it particularly challenging to comprehend its structure,&#xA;meaning, and context at scale.&lt;/li&gt;&#xA;&lt;li&gt;To address these challenges, we made substantial investments in advanced data understanding&#xA;technologies, as part of our Privacy Aware Infrastructure (PAI). Specifically, we have&#xA;adopted a “shift-left” approach, integrating data schematization and annotations early in&#xA;the product development process. We also created a universal privacy taxonomy, a&#xA;standardized framework providing a common semantic vocabulary for data privacy management&#xA;across Meta’s products that ensures quality data understanding and provides developers with&#xA;reusable and efficient compliance tooling.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/efficiently-and-elegantly-modeling-embeddings-in-azure-sql-and-sql-server/&#34;&gt;Efficiently and Elegantly Modeling Embeddings in Azure SQL and SQL Server&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Storing and querying text embeddings in a database it might seem challenging, but with the&#xA;right schema design, it’s not only possible, it’s powerful. Whether you’re building AI-powered&#xA;search, semantic filtering, or recommendation features, embeddings, and thus vectors, are now&#xA;a first-class data type. So how do you model them well inside a database like SQL Server and&#xA;Azure SQL?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/sql-analysis-dotnet-tool/&#34;&gt;Avoid T-SQL anti-patterns with the free T-SQL analysis tool&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;T-SQL Analyzer is a free, open-source, cross platform command line tool for identifying, and&#xA;reporting the presence of anti-patterns and design issues in SQL Server T-SQL scripts.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://brooker.co.za/blog/2023/03/23/economics.html&#34;&gt;Surprising Scalability of Multitenancy&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Roughly speaking, the cost of a system scales with its (short-term1) peak traffic, but for&#xA;most applications the value the system generates scales with the (long-term) average traffic.&lt;/p&gt;&#xA;&lt;p&gt;The gap between “paying for peak” and “earning on average” is critical to understand how the&#xA;economics of large-scale cloud systems differ from traditional single-tenant systems.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=sc3J4McebHE&#34;&gt;FAST &amp;lsquo;23 - Building and Operating a Pretty Big Storage System (My Adventures in Amazon S3)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-05-05 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/05/2025-05-05-monday-assorted-links/</link>
      <pubDate>Mon, 05 May 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/05/2025-05-05-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, May 5:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/rewriting-nuget-restore-in-dotnet-9/&#34;&gt;How we ended up rewriting NuGet Restore in .NET 9&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This is the story of how team members across NuGet, Visual Studio, and .NET embarked on a&#xA;journey to fully rewrite the NuGet Restore algorithm to achieve break-through scale and&#xA;performance. Written from the perspective of several team members, this entry provides a deep&#xA;dive into the internals of NuGet, as well as strategies to identify and address performance&#xA;issues. We hope that you enjoy it!&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/how-netflix-accurately-attributes-ebpf-flow-logs-afe6d644a3bc&#34;&gt;How Netflix Accurately Attributes eBPF Flow Logs&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In a previous blog post, we described how Netflix uses eBPF to capture TCP flow logs at scale&#xA;for enhanced cloud network insights. In this post, we delve deeper into how Netflix solved a&#xA;core problem: accurately attributing flow IP addresses to workload identities.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://andrewlock.net/going-beyond-singleton-scoped-and-transient-lifetimes/&#34;&gt;Going beyond singleton, scoped, and transient lifetimes—tenant, pooled, and drifter&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In this post I first briefly describe the standard lifetimes available in the .NET DI&#xA;container. I then briefly describe the three hypothetical lifetimes described in the podcast.&#xA;Finally, I show how you could implement one of these lifetimes in practice. In the next post&#xA;I show a possible implementation for the remaining lifetime.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://michael-mckenna.com/multi-tenant-asp-dot-net-8-tenant-services/&#34;&gt;Multi-tenancy in ASP.NET Core 8 - Dependency Injection &amp;amp; Tenant Specific Services&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This post discusses how we can have tenant specific services in a multi-tenant ASP.NET Core 8&#xA;application.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/enhancing-search-capabilities-in-sql-server-and-azure-sql-with-hybrid-search-and-rrf-re-ranking/&#34;&gt;Enhancing Search Capabilities in SQL Server and Azure SQL with Hybrid Search and RRF Re-Ranking&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In today’s data-driven world, delivering precise and contextually relevant search results is&#xA;critical. SQL Server and Azure SQL Database now enable this through Hybrid Search—a technique&#xA;that combines traditional full-text search with modern vector similarity search. This allows&#xA;developers to build intelligent, AI-powered search experiences directly inside the database&#xA;engine.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2025-04-09 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/04/2025-04-09-wednesday-assorted-links/</link>
      <pubDate>Wed, 09 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/04/2025-04-09-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, April 9:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.usenix.org/system/files/osdi20-yang.pdf&#34;&gt;A large scale analysis of hundreds of in-memory cache clusters at Twitter&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In this work, we significantly further the understanding of real-world cache workloads by&#xA;collecting production traces from 153 in-memory cache clusters at Twitter, sifting through&#xA;over 80 TB of data, and sometimes interpreting the workloads in the context of the business&#xA;logic behind them.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.evanjones.ca/durability-filesystem.html&#34;&gt;Durability: Linux File APIs&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;[Y]ou should assume your data is corrupt between when a write is issued until after a flush or&#xA;force unit access write completes. However, most programs use system calls to write data. This&#xA;article looks at the guarantees provided by the Linux file APIs. It seems like this should be&#xA;simple: a program calls &lt;code&gt;write()&lt;/code&gt; and after it completes, the data is durable. However,&#xA;&lt;code&gt;write()&lt;/code&gt; only copies data from the application into the kernel&amp;rsquo;s cache in memory. To force&#xA;the data to be durable you need to use some additional mechanism.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/how-netflix-scales-its-api-with-graphql-federation-part-1-ae3557c187e2&#34;&gt;How Netflix Scales its API with GraphQL Federation (Part 1)&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;As we&amp;rsquo;ve grown the number of developers and increased our domain complexity, developing the&#xA;API aggregation layer has become increasingly harder.&lt;/p&gt;&#xA;&lt;p&gt;In order to address this rising problem, we&amp;rsquo;ve developed a federated GraphQL platform to power&#xA;the API layer.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://iximiuz.com/en/posts/traefik-canary-deployments-with-weighted-load-balancing/&#34;&gt;Traefik: canary deployments with weighted load balancing&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Traefik is The Cloud Native Edge Router yet another reverse proxy and load balancer. Omitting&#xA;all the Cloud Native buzzwords, what really makes Traefik different from Nginx, HAProxy, and&#xA;alike is the automatic and dynamic configurability it provides out of the box. And the most&#xA;prominent part of it is probably its ability to do automatic service discovery.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bitfieldconsulting.com/posts/rust-vs-go&#34;&gt;Rust vs Go in 2025&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Which is better, Rust or Go—and does that question even make sense? Which language should you&#xA;choose for your next project in 2025, and why? How does Rust compare with Go in areas like&#xA;performance, simplicity, safety, features, scale, and concurrency?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-04-08 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/04/2025-04-08-tuesday-assorted-links/</link>
      <pubDate>Tue, 08 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/04/2025-04-08-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, April 8:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2020/11/11/data-center-engineering/twine-2/&#34;&gt;Building a ubiquitous shared infrastructure using Twine&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Twine is our homegrown cluster management system, which has been running in production for the&#xA;past decade. A cluster management system allocates workloads to machines and manages the life&#xA;cycle of machines, containers, and workloads. Kubernetes is a prominent example of an open&#xA;source cluster management system. Twine has helped convert our infrastructure from a&#xA;collection of siloed pools of customized machines dedicated to individual workloads to a&#xA;large-scale ubiquitous shared infrastructure in which any machine can run any workload.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/457667/&#34;&gt;Ensuring data reaches disk&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The purpose of this document is to describe the path data takes from the application down to&#xA;the storage, concentrating on places where data is buffered, and to then provide best&#xA;practices for ensuring data is committed to stable storage so it is not lost along the way in&#xA;the case of an adverse event. The main focus is on the C programming language, though the&#xA;system calls mentioned should translate fairly easily to most other languages.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.uber.com/blog/money-scale-strong-data/&#34;&gt;Revolutionizing Money Movements at Scale with Strong Data Consistency&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;As one of the underlying engines, Uber Money fulfills some of the most important aspects of&#xA;people&amp;rsquo;s engagement in the Uber experience. A system like this should not only be robust, but&#xA;should also be highly available with zero-tolerance to downtime, after our success mantra:&#xA;&amp;ldquo;To collect and disburse on-time, accurately and in-compliance&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;While we expand to multiple lines of businesses, and strategize the next best, the engineers&#xA;in Uber Money also thrive on building the next generation&amp;rsquo;s Payments Platform which extends&#xA;Uber&amp;rsquo;s growth. In this blog, we introduce you to this platform and provide insights into our&#xA;learnings. This includes migrating hundreds of millions customers between two asynchronous&#xA;systems while maintaining data-consistency with a goal of zero impact on our users.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.wired.com/story/how-30-lines-of-code-blew-up-27-ton-generator/&#34;&gt;How 30 Lines of Code Blew Up a 27-Ton Generator&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A secret experiment in 2007 proved that hackers could devastate power grid equipment beyond&#xA;repair—with a file no bigger than a GIF.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/builders-library/avoiding-overload-in-distributed-systems-by-putting-the-smaller-service-in-control/&#34;&gt;Avoiding overload in distributed systems by putting the smaller service in control&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Within AWS, a common pattern is to split the system into services that are responsible for&#xA;executing customer requests (the &lt;em&gt;data plane&lt;/em&gt;), and services that are responsible for managing&#xA;and vending customer configuration (the &lt;em&gt;control plane&lt;/em&gt;). In this article, I discuss a number&#xA;of different ways the data plane and the control plane interact with each other to avoid&#xA;system overload. In many of these architectures the larger data plane fleet calls the smaller&#xA;control plane fleet, but I also want to share the success we’ve had at Amazon when we put the&#xA;smaller fleet in control.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-04-07 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/04/2025-04-07-monday-assorted-links/</link>
      <pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/04/2025-04-07-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, April 7:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://randomascii.wordpress.com/2012/11/21/the-lost-xperf-documentationdisk-usage/&#34;&gt;The Lost Xperf Documentation–Disk Usage&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;As I&amp;rsquo;ve lamented previously, the documentation for xperf (Windows Performance Toolkit) is a&#xA;bit light. The names of the columns in the summary tables can be exquisitely subtle, and I&#xA;have never found any documentation for them. But, I’ve talked to the xperf authors, and I&amp;rsquo;ve&#xA;used xperf a lot, and I’ve done some experiments, and here I share some more results, this&#xA;time for the Disk Usage summary table.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2020/11/23/the-macro-problem-with-microservices/&#34;&gt;The macro problem with microservices&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In just 20 years, software engineering has shifted from architecting monoliths with a single&#xA;database and centralized state to microservices where everything is distributed across&#xA;multiple containers, servers, data centers, and even continents. Distributing things solves&#xA;scaling concerns, but introduces a whole new world of problems, many of which were previously&#xA;solved by monoliths.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lambda.blinkit.com/learnings-from-two-years-of-kubernetes-in-production-b0ec21aa2814&#34;&gt;Learnings From Two Years of Kubernetes in Production&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2020/11/18/open-source/fiosynth/&#34;&gt;FioSynth: A representative I/O benchmark and data visualizer for data center workloads&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;FioSynth is a benchmark tool used to automate the execution of storage workload suites and to&#xA;parse results. It contains a base set of block level storage workloads, synthesized from&#xA;production I/O traces, that simulate a diverse range of Facebook production services. It is&#xA;useful for predicting how a storage device will perform in realistic production environments&#xA;and for assisting with performance tuning.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stevelasker.blog/2019/10/29/azure-container-registry-teleportation/&#34;&gt;Azure Container Registry Adds Teleportation&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Project Teleport removes the cost of download and decompression by SMB mounting pre-expanded&#xA;layers from the Azure Container Registry to Teleport enabled Azure container hosts.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2025-04-04 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/04/2025-04-04-friday-assorted-links/</link>
      <pubDate>Fri, 04 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/04/2025-04-04-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, April 4:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bluesnews.com/abrash/chap70.shtml&#34;&gt;Quake&amp;rsquo;s 3-D Engine:  The Big Picture&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://notes.neeasade.net/color-spaces.html&#34;&gt;Reasoning about colors&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In July 2020 I went on a color-scheme vision quest. This led to some research on various color&#xA;spaces and their utility, some investigation into the styling guidelines outlined by the&#xA;base16 project, and the color utilities that ship within the GNU Emacs text editor. This&#xA;article will be a whirlwind tour of things you can do to individual colors, and at the end how&#xA;I put these blocks together.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://itnext.io/modern-storage-is-plenty-fast-it-is-the-apis-that-are-bad-6a68319fbc1a&#34;&gt;Modern storage is plenty fast. It is the APIs that are bad.&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In this article I will demonstrate that while hardware changed dramatically over the past&#xA;decade, software APIs have not, or at least not enough. Riddled with memory copies, memory&#xA;allocations, overly optimistic read ahead caching and all sorts of expensive operations,&#xA;legacy APIs prevent us from making the most of our modern devices.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.scylladb.com/2020/05/05/how-io_uring-and-ebpf-will-revolutionize-programming-in-linux/&#34;&gt;How io_uring and eBPF Will Revolutionize Programming in Linux&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;[eBPF and io_uring] may look evolutionary, but they are revolutionary in the sense that they&#xA;will — we bet — completely change the way applications work with and think about the Linux&#xA;Kernel.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://webflow.sourcegraph.com/blog/ex-googler-guide-dev-tools&#34;&gt;An ex-Googler&amp;rsquo;s guide to dev tools&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I thought it would be helpful to write a guide to dev tools outside of Google for the&#xA;ex-Googler, written with an eye toward pragmatism and practicality. No doubt many ex-Googlers&#xA;wish they could simply clone the Google internal environment to their new company, but you&#xA;can&amp;rsquo;t boil the ocean. Here is my take on where you should start and a general path I think&#xA;ex-Googlers can take to find the tools that will make them - and their new teams - as&#xA;productive as possible.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2025-04-03 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/04/2025-04-03-thursday-assorted-links/</link>
      <pubDate>Thu, 03 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/04/2025-04-03-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, April 3:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://drive.google.com/file/d/0B9GCVTp_FHJIMjJ2U2t6aGpHLTFUVHFnMTRUbnBwc2pLa1RN/edit?resourcekey=0-rrhWdzttok2azwiYD8VN2Q&#34;&gt;A Critique of Snapshot Isolation&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;There have been recent attempts to enrich large-scale data stores, such as HBase and BigTable,&#xA;with transactional support. Not surprisingly, inspired by traditional database management&#xA;systems, serializability is usually compromised for the benefit of efficiency. For example,&#xA;Google Percolator, implements lock-based snapshot isolation on top of BigTable. We show in&#xA;this paper that this compromise is not necessary in lock-free implementations of transactional&#xA;support. We introduce &lt;em&gt;write-snapshot isolation&lt;/em&gt;, a novel isolation level that has a&#xA;performance comparable with that of snapshot isolation, and yet provides serializability.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cse.iitb.ac.in/infolab/Data/Courses/CS632/2009/Papers/p492-fekete.pdf&#34;&gt;Making Snapshot Isolation Serializable&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This article develops a theory that characterizes when nonserializable executions of&#xA;applications can occur under [snapshot isolation].&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pmg.csail.mit.edu/papers/adya-phd.pdf&#34;&gt;Weak Consistency: A Generalized Theory and Optimistic Implementations for Distributed Transactions&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This thesis presents the first implementation-independent specifications of existing ANSI&#xA;isolation levels and a number of levels that are widely used in commercial systems, e.g.,&#xA;Cursor Stability, Snapshot Isolation. It also specifies a variety of guarantees for&#xA;predicate-based operations in an implementation-independent manner. Two new levels are defined&#xA;that provide useful consistency guarantees to application writers; one is the weakest level&#xA;that ensures consistent reads, while the other captures some useful consistency properties&#xA;provided by pessimistic implementations.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://justinjaffray.com/what-does-write-skew-look-like/&#34;&gt;What Does Write Skew Look Like?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This post is about gaining intuition for Write Skew, and, by extension, Snapshot Isolation.&#xA;Snapshot Isolation is billed as a transaction isolation level that offers a good mix between&#xA;performance and correctness, but the precise meaning of “correctness” here is often vague. In&#xA;this post I want to break down and capture exactly when the thing called &amp;ldquo;write skew&amp;rdquo; can&#xA;happen.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://duriansoftware.com/joe/constructing-human-grade-parsers&#34;&gt;Constructing human-grade parsers&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Here are some observations on how parsers can be constructed in a way that makes it easier to&#xA;recover from parse errors, produce multiple diagnostics in one pass, and provide partial&#xA;results for further analysis even in the face of errors, providing a better experience for&#xA;user-driven command line tools and interactive environments.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2025-04-02 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/04/2025-04-02-wednesday-assorted-links/</link>
      <pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/04/2025-04-02-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, April 2:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cambridge.org/core/services/aop-cambridge-core/content/view/097CE52C750E69BD16B78C318754C7A4/S0956796820000088a.pdf/build-systems-a-la-carte-theory-and-practice.pdf&#34;&gt;Build systems à la carte: Theory and practice&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Build systems are awesome, terrifying – and unloved. They are used by every developer around&#xA;the world, but are rarely the object of study. In this paper, we offer a systematic, and&#xA;executable, framework for developing and comparing build systems, viewing them as related&#xA;points in a landscape rather than as isolated phenomena. By teasing apart existing build&#xA;systems, we can recombine their components, allowing us to prototype new build systems with&#xA;desired properties.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/LRC12-cheng20webpage.pdf&#34;&gt;Erasure Coding in Windows Azure Storage&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In this paper we introduce a new set of codes for erasure coding called Local Reconstruction&#xA;Codes (LRC). LRC reduces the number of erasure coding fragments that need to be read when&#xA;reconstructing data fragments that are offline, while still keeping the storage overhead&#xA;low.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://reproducible-builds.org/&#34;&gt;Reproducible Builds&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Reproducible builds are a set of software development practices that create an&#xA;independently-verifiable path from source to binary code.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://nikhilism.com/post/2020/windows-deterministic-builds/&#34;&gt;Getting to Deterministic Builds on Windows&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This is a set of notes on getting to deterministic builds in C, C++ and Rust on Windows.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://research.swtch.com/deps&#34;&gt;Our Software Dependency Problem&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Software dependencies carry with them serious risks that are too often overlooked. The shift&#xA;to easy, fine-grained software reuse has happened so quickly that we do not yet understand the&#xA;best practices for choosing and using dependencies effectively, or even for deciding when they&#xA;are appropriate and when not. My purpose in writing this article is to raise awareness of the&#xA;risks and encourage more investigation of solutions.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-04-01 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/04/2025-04-01-tuesday-assorted-links/</link>
      <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/04/2025-04-01-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, April 1:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2025/03/cloudflare-turns-ai-against-itself-with-endless-maze-of-irrelevant-facts/&#34;&gt;Cloudflare turns AI against itself with endless maze of irrelevant facts&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;On Wednesday, web infrastructure provider Cloudflare announced a new feature called &amp;ldquo;AI&#xA;Labyrinth&amp;rdquo; that aims to combat unauthorized AI data scraping by serving fake AI-generated&#xA;content to bots. The tool will attempt to thwart AI companies that crawl websites without&#xA;permission to collect training data for large language models that power AI assistants like&#xA;ChatGPT.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.clientserver.dev/p/war-story-the-hardest-bug-i-ever&#34;&gt;War story: the hardest bug I ever debugged&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;All of a sudden, without any ostensible cause, Google Docs was flooded with errors. How it&#xA;took me 2 days and a coworker to solve the hardest bug I ever debugged.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://edera.dev/stories/styrolite&#34;&gt;Introducing Styrolite: Building a Linux Container Runtime from Scratch&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Edera Protect is a suite of offerings bridging the gap between modern cloud native computing&#xA;and virtualization-based security techniques. To power this platform, we&amp;rsquo;ve built our own&#xA;container runtime designed to operate as a microservice, allowing it to run containers in a&#xA;fully programmatic way—similar to how the Kubernetes Container Runtime Interface (CRI) enables&#xA;container management through microservices.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blend2d.com/blog/png-image-codec.html&#34;&gt;High-Performance PNG Codec&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I would like to announce a new high-performance PNG codec, which is much faster than other&#xA;available codecs written in C, C++, and other programming languages.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/sumup-engineering/image-creation-and-testing-with-hashicorp-packer-and-serverspec-bb2bd065441&#34;&gt;Image creation and testing with HashiCorp Packer and ServerSpec&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-03-31 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/03/2025-03-31-monday-assorted-links/</link>
      <pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/03/2025-03-31-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, March 31:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.allthingsdistributed.com/2025/03/in-s3-simplicity-is-table-stakes.html&#34;&gt;In S3 simplicity is table stakes&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Today, on Pi Day (S3&amp;rsquo;s 19th birthday), I&amp;rsquo;m sharing a post from Andy Warfield, VP and&#xA;Distinguished Engineer of S3. Andy takes us through S3&amp;rsquo;s evolution from simple object&#xA;store to sophisticated data platform, illustrating how customer feedback has shaped every&#xA;aspect of the service. It&amp;rsquo;s a fascinating look at how we maintain simplicity even as&#xA;systems scale to handle hundreds of trillions of objects.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://research.swtch.com/xz-script&#34;&gt;The xz attack shell script&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/blogs/2025/03/26/custom-instructions&#34;&gt;Context is all you need: Better AI results with custom instructions&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Earlier this month, we announced the general availability of custom instructions in&#xA;Visual Studio Code. Custom instructions are how you give Copilot specific context about&#xA;your team&amp;rsquo;s workflow, your particular style preferences, libraries the model may not&#xA;know about, etc.&lt;/p&gt;&#xA;&lt;p&gt;In this post we&amp;rsquo;ll dive into what custom instructions are, how you can use them today to&#xA;drastically improve your results with GitHub Copilot, and even a brand new preview&#xA;feature called &amp;ldquo;prompt files&amp;rdquo; that you can try today.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://techcrunch.com/2025/03/26/openai-adopts-rival-anthropics-standard-for-connecting-ai-models-to-data/&#34;&gt;OpenAI adopts rival Anthropic’s standard for connecting AI models to data&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In a post on X on Wednesday, OpenAI CEO Sam Altman said that OpenAI will add support for&#xA;Anthropic&amp;rsquo;s Model Context Protocol, or MCP, across its products, including the desktop app&#xA;for ChatGPT. MCP is an open source standard that helps AI models produce better, more relevant&#xA;responses to certain queries.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.theverge.com/news/634598/microsoft-security-copilot-ai-agents&#34;&gt;Microsoft announces security AI agents to help overwhelmed humans&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Microsoft&amp;rsquo;s six security agents will be available in preview next month, and are designed to&#xA;do things like triage and process phishing and data loss alerts, prioritize critical&#xA;incidents, and monitor for vulnerabilities.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-03-18 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/03/2025-03-18-tuesday-assorted-links/</link>
      <pubDate>Tue, 18 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/03/2025-03-18-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, March 18:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2025/03/researchers-astonished-by-tools-apparent-success-at-revealing-ais-hidden-motives/&#34;&gt;Researchers astonished by tool’s apparent success at revealing AI’s &amp;ldquo;hidden objectives&amp;rdquo;&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In a new paper published Thursday titled &amp;ldquo;Auditing language models for hidden objectives,&amp;rdquo;&#xA;Anthropic researchers described how custom AI models trained to deliberately conceal certain&#xA;&amp;ldquo;motivations&amp;rdquo; from evaluators could still inadvertently reveal secrets, due to their ability&#xA;to adopt different contextual roles they call &amp;ldquo;personas.&amp;rdquo; The researchers were initially&#xA;astonished by how effectively some of their interpretability methods seemed to uncover these&#xA;hidden training objectives, although the methods are still under research.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gaming/2025/03/this-small-snes-timing-issue-is-causing-big-speedrun-problems/&#34;&gt;Why SNES hardware is running faster than expected—and why it&amp;rsquo;s a problem&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;After significant research and testing on dozens of actual SNES units, the TASBot team now&#xA;thinks that a cheap ceramic resonator used in the system&amp;rsquo;s Audio Processing Unit (APU) is to&#xA;blame for much of this inconsistency. While Nintendo&amp;rsquo;s own documentation says the APU should&#xA;run at a consistent rate of 24.576 Mhz (and the associated Digital Signal Processor sample&#xA;rate at a flat 32,000 Hz), in practice, that rate can vary just a bit based on heat, system&#xA;age, and minor physical variations that develop in different console units over time.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thephd.dev/c2y-the-defer-technical-specification-its-time-go-go-go&#34;&gt;The Defer Technical Specification: It Is Time&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Time for me to write this blog post and prepare everyone for the implementation blitz that&#xA;needs to happen to make &lt;code&gt;defer&lt;/code&gt; a success for the C programming language.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/introducing-slnx-support-dotnet-cli/&#34;&gt;Introducing support for SLNX, a new, simpler solution file format in the .NET CLI&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Solution files have been a part of the .NET and Visual Studio experience for many years now,&#xA;and they&amp;rsquo;ve had the same custom format the whole time. Recently, the Visual Studio solution&#xA;team has begun previewing a new, XML-based solution file format called SLNX. Starting in .NET&#xA;SDK 9.0.200, the &lt;code&gt;dotnet&lt;/code&gt; CLI supports building and interacting with these files in the same&#xA;way as it does with existing solution files.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/hybrid-cache-is-now-ga/&#34;&gt;Hello HybridCache! Streamlining Cache Management for ASP.NET Core Applications&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;HybridCache is a new .NET 9 library available via the Microsoft.Extensions.Caching.Hybrid&#xA;package and is now generally available! HybridCache, named for its ability to leverage both&#xA;in-memory and distributed caches like Redis, ensures that data storage and retrieval is&#xA;optimized for performance and security, regardless of the scale or complexity of your&#xA;application.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-03-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/03/2025-03-17-monday-assorted-links/</link>
      <pubDate>Mon, 17 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/03/2025-03-17-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, March 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://go.dev/blog/swisstable&#34;&gt;Faster Go maps with Swiss Tables&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Like sorting algorithms, hash table data structures continue to see improvements. In&#xA;2017, Sam Benzaquen, Alkis Evlogimenos, Matt Kulukundis, and Roman Perepelitsa at Google&#xA;presented a new C++ hash table design, dubbed “Swiss Tables”. In 2018, their&#xA;implementation was open sourced in the Abseil C++ library.&lt;/p&gt;&#xA;&lt;p&gt;Go 1.24 includes a completely new implementation of the built-in map type, based on the Swiss Table design.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.stepsecurity.io/blog/harden-runner-detection-tj-actions-changed-files-action-is-compromised&#34;&gt;Harden-Runner detection: tj-actions/changed-files action is compromised&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We are investigating a critical security incident involving the popular tj-actions/changed-files&#xA;GitHub Action. We want to alert you immediately so that you can take prompt action. This post&#xA;will be updated as new information becomes available.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/open-source/git/highlights-from-git-2-49/&#34;&gt;Highlights from Git 2.49&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Faster packing with name-hash v2&lt;/li&gt;&#xA;&lt;li&gt;Backfill historical blobs in partial clones&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mccue.dev/pages/3-11-25-life-altering-postgresql-patterns%5D&#34;&gt;Life Altering Postgresql Patterns&lt;/a&gt;:&#xA;Many of these apply to all SQL, not just PostgreSQL&#xA;&lt;blockquote&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Use UUID primary keys&lt;/li&gt;&#xA;&lt;li&gt;Give everything created_at and updated_at&lt;/li&gt;&#xA;&lt;li&gt;On update restrict on delete restrict&lt;/li&gt;&#xA;&lt;li&gt;Use schemas&lt;/li&gt;&#xA;&lt;li&gt;Enum Tables&lt;/li&gt;&#xA;&lt;li&gt;Name your tables singularly&lt;/li&gt;&#xA;&lt;li&gt;Mechanically name join tables&lt;/li&gt;&#xA;&lt;li&gt;Almost always soft delete&lt;/li&gt;&#xA;&lt;li&gt;Represent statuses as a log&lt;/li&gt;&#xA;&lt;li&gt;Mark special rows with a &lt;code&gt;system_id&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Use views sparingly&lt;/li&gt;&#xA;&lt;li&gt;JSON Queries&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/Rucadi/cpp-match&#34;&gt;cppmatch&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A header-only C++ library that offers exceptionless error handling and type-safe enums, bringing&#xA;Rust-inspired error propagation with the ? operator and the match operator to C++.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2025-03-14 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/03/2025-03-14-friday-assorted-links/</link>
      <pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/03/2025-03-14-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, March 14:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/agentic-ai-is-the-new-web-app-and-your-ai-strategy-must-evolve/&#34;&gt;Agentic AI is the New Web App, and Your AI Strategy Must Evolve&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Two years into the generative AI revolution, the LLMs that power tools like ChatGPT and Claude&#xA;have become startlingly powerful. However, according to Salesforce CEO Marc Benioff, they may be&#xA;reaching their limits. Per Benioff, the next evolution is not necessarily more intelligent LLMs&#xA;but autonomous AI agents that leverage LLMs to execute tasks independently.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/title-launch-observability-at-netflix-scale-8efe69ebd653&#34;&gt;Title Launch Observability at Netflix Scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.nelhage.com/post/cpython-tail-call/&#34;&gt;Performance of the Python 3.14 tail-call interpreter&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;About a month ago, the CPython project merged a new implementation strategy for their bytecode interpreter. The&#xA;initial headline results were very impressive, showing a 10-15% performance improvement on average across a wide&#xA;range of benchmarks across a variety of platforms.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, as I will document in this post, these impressive performance gains turned out to be primarily&#xA;due to inadvertently working around a regression in LLVM 19.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://modelcontextprotocol.io/introduction&#34;&gt;Model Context Protocol&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;MCP is an open protocol that standardizes how applications provide context to LLMs. Think of MCP like a USB-C&#xA;port for AI applications. Just as USB-C provides a standardized way to connect your devices to various&#xA;peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources&#xA;and tools.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://go.dev/blog/osroot&#34;&gt;Traversal-resistant file APIs&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A &lt;em&gt;path traversal vulnerability&lt;/em&gt; arises when an attacker can trick a program into opening a file other than&#xA;the one it intended. This post explains this class of vulnerability, some existing defenses against it, and&#xA;describes how the new os.Root API added in Go 1.24 provides a simple and robust defense against unintentional&#xA;path traversal.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2025-03-13 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/03/2025-03-13-thursday-assorted-links/</link>
      <pubDate>Thu, 13 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/03/2025-03-13-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, March 13:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/ise/spark_job_otel/&#34;&gt;Instrumenting Apache Spark Structured Streaming jobs using OpenTelemetry&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Monitoring Apache Spark structured streaming data workloads is challenging because the data&#xA;is continuously processed as it arrives. Because of this always-on nature of stream processing,&#xA;it is harder to troubleshoot problems during development and production without real-time&#xA;metrics, alerting and dashboards. Traces complement metrics, and since Spark doesn’t include&#xA;them by default, we integrate them using OpenTelemetry.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2025/02/18/security/protecting-user-data-through-source-code-analysis/&#34;&gt;Protecting user data through source code analysis at scale&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Meta&amp;rsquo;s Anti Scraping team focuses on preventing unauthorized scraping as part of our ongoing&#xA;work to combat data misuse. In order to protect Meta&amp;rsquo;s changing codebase from scraping attacks,&#xA;we have introduced static analysis tools into our workflow. These tools allow us to detect&#xA;potential scraping vectors at scale across our Facebook, Instagram, and even parts of our Reality&#xA;Labs codebases.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2025/03/weve-figured-out-the-basics-of-a-shape-shifting-t-1000-style-material/&#34;&gt;We&amp;rsquo;ve figured out the basics of a shape-shifting, T-1000-style material&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Campàs and his team drew inspiration from processes called fluidization and convergent extension—mechanisms&#xA;that cells in embryos use to coordinate their behavior when forming tissues and organs in a developing&#xA;organism. The team built a robotic collective where each robotic unit behaved like an embryonic cell. As a&#xA;collective, the robots behaved like a material that could change shape and switch between solid and liquid&#xA;states, just like the T-1000.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/cross-modal-retrieval-why-it-matters-for-multimodal-ai/&#34;&gt;Cross-Modal Retrieval: Why It Matters for Multimodal AI&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;With its ability to simultaneously process different data types (think text, image, audio, video and more),&#xA;the continuing development of multimodal AI represents the next step that would help to further enhance a&#xA;wide range of tools — including those for generative AI and autonomous agentic AI.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-deployment-bottleneck-no-one-talks-about/&#34;&gt;The Deployment Bottleneck No One Talks About&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Most applications rely on cloud SDKs to connect to services like message brokers, queues, databases, APIs&#xA;and more.&lt;/p&gt;&#xA;&lt;p&gt;Rather than working directly with cloud SDKs, a better approach is to introduce a standardized layer between&#xA;applications and cloud services. This allows developers to interact with essential resources without being&#xA;tightly coupled to a specific provider&amp;rsquo;s SDKs. A framework like Dapr helps achieve this by providing a uniform&#xA;API for interacting with cloud resources.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2025-03-12 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/03/2025-03-12-wednesday-assorted-links/</link>
      <pubDate>Wed, 12 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/03/2025-03-12-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, March 12:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bughunters.google.com/blog/5424842357473280/zen-and-the-art-of-microcode-hacking&#34;&gt;Zen and the Art of Microcode Hacking&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The root cause of the EntrySign vulnerability is that the AMD Zen microcode signature verification algorithm uses&#xA;the CMAC function as a hash function; however, CMAC is a message authentication code and does not necessarily provide&#xA;the same security guarantees as a cryptographic hash function.&lt;/p&gt;&#xA;&lt;p&gt;The weakness of using CMAC as a hash function is that anyone who has the encryption key is able to observe the&#xA;intermediate values of the encryption and calculate a way to &amp;ldquo;correct&amp;rdquo; the difference so that the final output&#xA;remains the same, even if the inputs are completely different.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cside.dev/blog/thousands-of-websites-hit-by-four-backdoors-in-3rd-party-javascript-attack&#34;&gt;Thousands of websites hit by four backdoors in 3rd party JavaScript attack&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;While analyzing threats targeting WordPress frameworks, we found an attack where a single 3rd party JavaScript&#xA;file was used to inject four separate backdoors into 1,000 compromised websites using cdn.csyndication[.]com/.&lt;/p&gt;&#xA;&lt;p&gt;Creating four backdoors facilitates the attackers having multiple points of re-entry should one be detected and&#xA;removed. A unique case we haven&amp;rsquo;t seen before. Which introduces another type of attack made possibly by abusing&#xA;websites that don’t monitor 3rd party dependencies in the browser of their users.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/ai-and-ml/github-copilot/how-to-debug-code-with-github-copilot/&#34;&gt;How to debug code with GitHub Copilot&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;GitHub Copilot can streamline your debugging process by troubleshooting in your IDE, analyzing pull requests,&#xA;and more, helping you tackle issues faster and more robustly.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/engineering/platform-security/finding-leaked-passwords-with-ai-how-we-built-copilot-secret-scanning/&#34;&gt;Finding leaked passwords with AI: How we built Copilot secret scanning&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Passwords are notoriously difficult to detect with conventional programming approaches. AI can help us find&#xA;passwords better because it understands context. This blog post will explore the technical challenges we faced&#xA;with building the feature and the novel and creative ways we solved them.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.ploeh.dk/2022/03/28/monads/&#34;&gt;Monads&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;If you understand what a functor is, it should be easy to grasp the idea of a monad. It&amp;rsquo;s a functor you can&#xA;flatten.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-03-11 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/03/2025-03-11-tuesday-assorted-links/</link>
      <pubDate>Tue, 11 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/03/2025-03-11-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, March 11:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-generative-ai-is-reshaping-the-sdlc/&#34;&gt;How Generative AI Is Reshaping the SDLC&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Amazon Q shows how GenAI is helping developers at all stages of code creation and delivery, said&#xA;Srini Iragavarapu of AWS in this episode of Makers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/announcing-dotnet-ai-template-preview1/&#34;&gt;.NET AI Template Now Available in Preview&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Want to get started with AI development, but not sure where to start? I’ve got a treat for you –&#xA;we have a new AI Chat Web App template now in preview.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/rethinking-system-architecture-the-rise-of-distributed-intelligence-with-ebpf/&#34;&gt;Rethinking System Architecture: The Rise of Distributed Intelligence with eBPF&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;With eBPF, we can process, filter, and act on data as it flows through the system — directly at the&#xA;kernel level. This architecture approach flips the centralized model on its head by embedding&#xA;decision-making directly into the system at the point where data is generated.  This means that instead&#xA;of forwarding vast amounts of raw data for centralized processing, we can use intelligent,&#xA;kernel-embedded programs to analyze, process, and act on data exactly where it was generated in&#xA;real-time. By doing this, eBPF enables a shift from centralized, reactive decision-making to&#xA;distributed, proactive intelligence.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://time.com/7259395/ai-chess-cheating-palisade-research/&#34;&gt;When AI Thinks It Will Lose, It Sometimes Cheats, Study Finds&lt;/a&gt;:&#xA;This is the AI alignment problem, which has been explored extensively in science fiction.&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;When sensing defeat in a match against a skilled chess bot, [advanced AI models] don&amp;rsquo;t always concede,&#xA;instead sometimes opting to cheat by hacking their opponent so that the bot automatically forfeits the game.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/start-using-the-microsoft-ai-evaluations-library-today/&#34;&gt;Unlock new possibilities for AI Evaluations for .NET&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Microsoft.Extensions.AI.Evaluations library is designed to simplify the integration of AI evaluation&#xA;processes into your applications. It provides a robust framework for evaluating your AI applications and&#xA;automating the assessment of their performance.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-03-10 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/03/2025-03-10-monday-assorted-links/</link>
      <pubDate>Mon, 10 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/03/2025-03-10-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, March 10:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/vector-databases-the-foundation-of-ai-agent-innovation/&#34;&gt;Vector Databases: The Foundation of AI Agent Innovation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/nvme-of-substantially-reduces-data-access-latency/&#34;&gt;NVMe-oF Substantially Reduces Data Access Latency&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;NVMe-oF is a network protocol that extends the parallel access and low latency features of Nonvolatile Memory Express (NVMe) protocol&#xA;across networked storage. Originally designed for local storage and common in direct-attached storage (DAS) architectures, NVMe&#xA;delivers high-speed data access and low latency by directly interfacing with solid-state disks. NVMe-oF allows these same advantages&#xA;to be achieved in distributed and clustered environments by enabling external storage to perform as if it were local.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-observability-needs-to-go-headless/&#34;&gt;Why Observability Needs To Go Headless&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Many enterprises generate terabytes of log data every day, resulting in high costs to ingest, store and analyze that data. Even&#xA;worse, many observability platforms are walled gardens, making it hard to use log data for use cases beyond observability, such&#xA;as business intelligence, data science and machine learning.&lt;/p&gt;&#xA;&lt;p&gt;To solve both of these problems, it’s time for headless observability, a fresh approach that decouples the frontend (visualization,&#xA;querying and analytics) from the backend (data ingestion and storage) — all while keeping operations simple.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-million-dollar-problem-of-slow-microservices-testing/&#34;&gt;The Million-Dollar Problem of Slow Microservices Testing&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;By shifting integration tests from the slow outer loop into the rapid inner loop, organizations can fundamentally transform their&#xA;development process.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2025/01/21/production-engineering/strobelight-a-profiling-service-built-on-open-source-technology/&#34;&gt;Strobelight: A profiling service built on open source technology&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;We&amp;rsquo;re sharing details about Strobelight, Meta&amp;rsquo;s profiling orchestrator.&lt;/li&gt;&#xA;&lt;li&gt;Strobelight combines several technologies, many open source, into a single service that helps engineers at Meta improve&#xA;efficiency and utilization across our fleet.&lt;/li&gt;&#xA;&lt;li&gt;Using Strobelight, we’ve seen significant efficiency wins, including one that has resulted in an estimated 15,000 servers&#39;&#xA;worth of annual capacity savings.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2025-02-28 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-28-friday-assorted-links/</link>
      <pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-28-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, Febuary 28:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/5-frameworks-that-embrace-declarative-state-management/&#34;&gt;5 Frameworks That Embrace Declarative State Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-staging-bottleneck-microservices-testing-in-fintech/&#34;&gt;The Staging Bottleneck: Microservices Testing in FinTech&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A sandbox is a lightweight, isolated, production-like testing setup created dynamically from a shared baseline&#xA;environment. Designed to replicate production conditions at a fraction of the cost and complexity, sandboxes&#xA;effectively transform a single staging environment into multiple independent environments. By multiplexing the&#xA;baseline staging setup, sandboxes provide tailored environments for individual engineers or QA teams without&#xA;adding compliance risks or increasing maintenance burdens, as they inherit the same compliance and configuration&#xA;frameworks as production.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-ai-agents-need-an-operational-database/&#34;&gt;Why AI Agents Need an Operational Database&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/database-scalability-and-the-giant-flea-a-lesson-in-complexity/&#34;&gt;Database Scalability and the Giant Flea: A Lesson in Complexity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/engineering/how-github-uses-codeql-to-secure-github/&#34;&gt;How GitHub uses CodeQL to secure GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2025-02-27 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-27-thursday-assorted-links/</link>
      <pubDate>Thu, 27 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-27-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, Febuary 27:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-engineers-guide-to-controlling-configuration-drift/&#34;&gt;The Engineer&amp;rsquo;s Guide to Controlling Configuration Drift&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Key techniques:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Infrastructure as Code (IaC)&lt;/li&gt;&#xA;&lt;li&gt;Policy as Code (PaC)&lt;/li&gt;&#xA;&lt;li&gt;Compliance as Code&lt;/li&gt;&#xA;&lt;li&gt;Application Configuration Management&lt;/li&gt;&#xA;&lt;li&gt;Configuration Checklist&lt;/li&gt;&#xA;&lt;li&gt;Credential Management&lt;/li&gt;&#xA;&lt;li&gt;Centralized Configuration Management&lt;/li&gt;&#xA;&lt;li&gt;Environment Parity&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2025/02/03/production-engineering/how-precision-time-protocol-ptp-handles-leap-seconds/&#34;&gt;How Precision Time Protocol handles leap seconds&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/observability-isnt-enough-its-time-to-federate-log-data/&#34;&gt;Observability Isn&amp;rsquo;t Enough. It’s Time To Federate Log Data&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;With data federation, you can query data across many different sources without moving it. With this approach,&#xA;no additional pipeline is needed; there are no egress costs and none of the security risks that come with&#xA;migrating data.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2025/02/04/security/data-logs-the-latest-evolution-in-metas-access-tools/&#34;&gt;Data logs: The latest evolution in Meta&amp;rsquo;s access tools&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We created data logs as a solution to provide users who want more granular information with access to data&#xA;stored in Hive. In this context, an individual data log entry is a formatted version of a single row of data&#xA;from Hive that has been processed to make the underlying data transparent and easy to understand.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/open-source-redefines-data-platforms/&#34;&gt;Open Source Redefines Data Platforms&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2025-02-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-26-wednesday-assorted-links/</link>
      <pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-26-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, Febuary 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2025/01/27/what-is-observability-2-0/&#34;&gt;What is observability 2.0?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Key differences between traditional observability and observability 2.0&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Data handling:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Traditional: Relies on separate tools for metrics, logs, and traces, creating silos and requiring manual correlation.&lt;/li&gt;&#xA;&lt;li&gt;2.0: Unifies telemetry data into a single platform, offering a comprehensive view of system health.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Problem detection:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Traditional Uses static thresholds and alerts that are often reactive and miss subtle issues.&lt;/li&gt;&#xA;&lt;li&gt;2.0: Employs AI and machine learning to identify anomalies in real-time, enabling proactive issue resolution.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Focus on context:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Traditional: Provides raw technical data without linking it to broader business outcomes.&lt;/li&gt;&#xA;&lt;li&gt;2.0: Maps telemetry data to business metrics, ensuring decisions align with organizational goals.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Scalability and adaptability:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Traditional Struggles with dynamic environments like Kubernetes and serverless, often requiring custom setups.&lt;/li&gt;&#xA;&lt;li&gt;2.0: Designed for dynamic scaling, adapts with ease to changes in cloud-native architectures.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/announcements/2025/01/21/cloud-native-computing-foundation-announces-cubefs-graduation/&#34;&gt;Cloud Native Computing Foundation Announces CubeFS Graduation&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;CubeFS is an open source distributed storage system that supports access protocols such as POSIX, HDFS, S3,&#xA;and its own REST API. It can be used in many scenarios, including big data, AI/LLMs, container platforms,&#xA;separation of storage and computing for databases and middleware, data sharing, and more. Key features of&#xA;CubeFS include a highly scalable metadata service with strong consistency and multi-tenancy support for&#xA;better resource utilization and tenant isolation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-case-for-telemetry-pipelines/&#34;&gt;What Developers Need to Know About Telemetry Pipelines&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A telemetry pipeline is a system that collects, processes and routes telemetry data (logs, metrics and traces)&#xA;from various sources to the right monitoring and analysis tools. Instead of managing separate agents or collectors&#xA;for different signals, a telemetry pipeline unifies data handling, making observability more efficient and scalable.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/what-are-linux-namespaces-and-how-are-they-used/&#34;&gt;What Are Linux Namespaces and How Are They Used?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Namespaces restrict resources that a containerized process can see so that one process can&amp;rsquo;t see the resources&#xA;being used by another. This feature is crucial to the likes of containers and orchestration tools such as Kubernetes&#xA;because, otherwise, one deployed container would be able to access or view resources used by another.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/system-operators-to-timekeepers-what-will-replace-leap-seconds/&#34;&gt;System Operators to Timekeepers: What Will Replace Leap Seconds?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Earth&amp;rsquo;s rotation, for thousands of years, has mostly slowed, the biggest driver being the changing tides that&#xA;come with the gravitational tug of the moon. Currents in the planet&amp;rsquo;s outer core, which scientists are still&#xA;trying to figure out, also have slowed the spin. But the core can speed up the spin, too, which may be what&amp;rsquo;s&#xA;been happening recently. Additional leap seconds have become a lot less frequent in the past two decades.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-02-25 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-25-tuesday-assorted-links/</link>
      <pubDate>Tue, 25 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-25-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, Febuary 25:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/data-dependent-applications-system-fragmentation/&#34;&gt;Exploring the Inevitable Future of Data-Dependent Applications&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Instead of combining technologies like MongoDB, Redis, Kafka, and application servers, why not skip system&#xA;fragmentation and use a single technology platform? Only code makes these systems run, so why not code for&#xA;just one system?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/simplify-ai-development-with-machine-learning-containers/&#34;&gt;Simplify AI Development with Machine Learning Containers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/security/vulnerability-research/attacks-on-maven-proxy-repositories/&#34;&gt;Attacks on Maven proxy repositories&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;All tested [repository managers] not only store and serve artifacts, but also perform complex parsing and indexing operations&#xA;on them. Therefore, a specially crafted artifact can be used to attack the repository manager that processes it. This opens a&#xA;possibility for XSS, XXE, archive expansion, and path traversal attacks.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/ai-and-ml/github-copilot/modernizing-legacy-code-with-github-copilot-tips-and-examples/&#34;&gt;Modernizing legacy code with GitHub Copilot: Tips and examples&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/ai-and-ml/generative-ai/open-source-ai-is-already-finding-its-way-into-production/&#34;&gt;Open source AI is already finding its way into production&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In our survey of 2,000 enterprise respondents on software development teams across the US, Germany, India, and Brazil, nearly&#xA;everyone said they had experimented with open source AI models at some point.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-02-24 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-24-monday-assorted-links/</link>
      <pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-24-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, Febuary 24:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.tonni.nl/blog/shared-ptr-overuse-cpp&#34;&gt;shared_ptr overuse in C++&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The pitfall can be divided in two:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Passing smart pointers to functions that don&amp;rsquo;t have to deal with ownership&lt;/li&gt;&#xA;&lt;li&gt;Improper use of &lt;code&gt;shared_ptr&lt;/code&gt; in non-owning objects&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/dotnet-9-networking-improvements/&#34;&gt;.NET 9 Networking Improvements&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In this release, we made two impactful performance improvements in HTTP connection pooling.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;We added opt-in support for multiple HTTP/3 connections.&lt;/li&gt;&#xA;&lt;li&gt;We also addressed lock contention in HTTP 1.1 connection pooling (dotnet/runtime#70098).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;One of the main pain points when debugging HTTP traffic of applications using earlier versions of .NET is that the&#xA;application doesn&amp;rsquo;t react to changes in Windows proxy settings.   This issue was mitigated in dotnet/runtime#103364,&#xA;where the &lt;code&gt;HttpClient.DefaultProxy&lt;/code&gt; is set to an instance of Windows proxy that listens for registry changes and&#xA;reloads the proxy settings when notified.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.dotnetcurry.com/aspnet-core/new-features-aspnet-core-9-blazor-dotnet-9&#34;&gt;What&amp;rsquo;s New for ASP.NET Core &amp;amp; Blazor in .NET 9&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Making Static Files Lightning Fast with MapStaticAssets&lt;/li&gt;&#xA;&lt;li&gt;Blazor Gets Even More Interactive and Hybrid-Friendly&lt;/li&gt;&#xA;&lt;li&gt;Simplified Authentication State Management&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sdk/simplify-your-net-data-transfers-with-the-new-azure-storage-data-movement-library/&#34;&gt;Simplify your .NET data transfers with the new Azure Storage Data Movement library&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.semafor.com/article/02/16/2025/new-york-times-goes-all-in-on-internal-ai-tools&#34;&gt;New York Times goes all-in on internal AI tools&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The New York Times is greenlighting the use of AI for its product and editorial staff, saying that internal tools&#xA;could eventually write social copy, SEO headlines, and some code.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2025-02-21 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-21-friday-assorted-links/</link>
      <pubDate>Fri, 21 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-21-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, Febuary 21:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datastax.com/blog/store-knowledge-graph-database&#34;&gt;How to Store a Knowledge Graph in a Database&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A knowledge graph represents information as a set of nodes and the relationships between those nodes.&lt;/p&gt;&#xA;&lt;p&gt;When your source data consists of assets like technical documentation, research publications, or highly&#xA;interconnected websites, a knowledge graph returns better results than a simple vector search. That&amp;rsquo;s&#xA;because a knowledge graph search can traverse links between nodes, finding semantically relevant results&#xA;two or more steps away from the first node.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datastax.com/blog/ai-agents-to-blow-up-the-business-process-layer&#34;&gt;AI Agents Are About to Blow Up the Business Process Layer&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Agentic AI is all about autonomy (think self-driving cars), employing a system of agents to constantly&#xA;adapt to dynamic environments and independently create, execute and optimize results.&lt;/p&gt;&#xA;&lt;p&gt;When agentic AI is applied to business process workflows, it can replace fragile, static business&#xA;processes with dynamic, context-aware automation systems.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/storing-querying-and-keeping-embeddings-updated-options-and-best-practices/&#34;&gt;Storing, querying and keeping embeddings updated: options and best practices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/database-and-ai-solutions-for-keeping-embeddings-updated/&#34;&gt;Database and AI: solutions for keeping embeddings updated&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Using a Database Trigger&lt;/li&gt;&#xA;&lt;li&gt;Using Change Tracking&lt;/li&gt;&#xA;&lt;li&gt;Using an Azure Function Sql Trigger binding&lt;/li&gt;&#xA;&lt;li&gt;Using Azure Logic Apps&lt;/li&gt;&#xA;&lt;li&gt;Using Change Data Capture&lt;/li&gt;&#xA;&lt;li&gt;Using the new Change Event Stream&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/introducing-change-event-streaming-join-the-azure-sql-database-private-preview-for-change-data-streaming/&#34;&gt;Introducing Change Event Streaming: Join the Azure SQL Database Private Preview for Change Data Streaming&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2025-02-20 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-20-thursday-assorted-links/</link>
      <pubDate>Thu, 20 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-20-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, Febuary 20:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/data-infrastructure-not-ai-models-will-drive-it-spend-in-2025/&#34;&gt;Data Infrastructure, Not AI Models, Will Drive IT Spend in 2025&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;As organizations race to implement Artificial Intelligence (AI) initiatives, they’re encountering an unexpected bottleneck:&#xA;the massive cost of data infrastructure required to support AI applications.&lt;/p&gt;&#xA;&lt;p&gt;I’m seeing organizations address these challenges through innovative architectural approaches. One promising direction is&#xA;the adoption of leaderless architectures combined with object storage. This approach eliminates the need for expensive data&#xA;movement by leveraging cloud-native storage solutions that simultaneously serve multiple purposes.&lt;/p&gt;&#xA;&lt;p&gt;Another key strategy involves rethinking how data is organized and accessed. Rather than maintaining separate infrastructures&#xA;for streaming and batch processing, companies are moving toward unified platforms that can efficiently handle both workloads.&#xA;This reduces infrastructure costs and simplifies data governance and access patterns.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/object-store-apps-cloud-natives-freshest-architecture/&#34;&gt;Object Store Apps: Cloud Native&amp;rsquo;s Freshest Architecture&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;An increasing number of start-ups and end-users find that using cloud object storage as the persistence layer saves money and&#xA;engineering time that would otherwise be needed to ensure consistency.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-feds-push-for-webassembly-security-over-ebpf/&#34;&gt;The Feds Push for WebAssembly Security Over eBPF&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;According to a National Institute of Standards and Technology (NIST) paper, “A Data Protection Approach for Cloud-Native&#xA;Applications”  (authors: Wesley Hales from LeakSignal; Ramaswamy Chandramouli, a supervisory computer scientist at NIST),&#xA;WebAssembly could and should be integrated across the cloud native service mesh sphere in particular to enhance security.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/deep-dive-into-deepseek-r1-how-it-works-and-what-it-can-do/&#34;&gt;Deep Dive Into DeepSeek-R1: How It Works and What It Can Do&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;During DeepSeek-R1&amp;rsquo;s training process, it became clear that by rewarding accurate and coherent answers, nascent model&#xA;behaviors like self-reflection, self-verification, long-chain reasoning and autonomous problem-solving point to the&#xA;possibility of emergent reasoning that is learned over time, rather than overtly taught — thus possibly paving the way&#xA;for further breakthroughs in AI research.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/use-azure-cosmos-db-as-a-docker-container-in-ci-cd-pipelines/&#34;&gt;Use Azure Cosmos DB as a Docker container in CI/CD pipelines&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Linux-based Azure Cosmos DB emulator is available as a Docker container and can run on a variety of platforms, including&#xA;ARM64 architectures like Apple Silicon. It allows local development and testing of applications without needing an Azure&#xA;subscription or incurring service costs. You can easily run it as a Docker container, and use it for local development and&#xA;testing.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2025-02-19 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-19-wednesday-assorted-links/</link>
      <pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-19-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, Febuary 19:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2025/02/using-ai-to-design-proteins-is-now-easy-making-enzymes-remains-hard/&#34;&gt;AI used to design a multi-step enzyme that can digest some plastics&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A new paper today describes a success in making a brand-new enzyme with the potential to digest plastics. But it also shows how even a&#xA;simple enzyme may have an extremely complex mechanism—and one that&amp;rsquo;s hard to tackle, even with the latest AI tools.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.microsoft.com/en-us/security/blog/2025/01/13/3-takeaways-from-red-teaming-100-generative-ai-products/&#34;&gt;3 takeaways from red teaming 100 generative AI products&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Generative AI systems amplify existing security risks and introduce new ones&lt;/li&gt;&#xA;&lt;li&gt;Humans are at the center of improving and securing AI&lt;/li&gt;&#xA;&lt;li&gt;Defense in depth is key for keeping AI systems safe&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2025/02/ais-and-robots-should-sound-robotic.html&#34;&gt;AIs and Robots Should Sound Robotic&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We have a simple proposal: all talking AIs and robots should use a ring modulator. In the mid-twentieth century, before it was easy to&#xA;create actual robotic-sounding speech synthetically, ring modulators were used to make actors’ voices sound robotic.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.mend.io/blog/2025-owasp-top-10-for-llm-applications-a-quick-guide/&#34;&gt;2025 OWASP Top 10 for LLM Applications: A Quick Guide&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;LLM01: Prompt injection&lt;/li&gt;&#xA;&lt;li&gt;LLM02: Sensitive information disclosure&lt;/li&gt;&#xA;&lt;li&gt;LLM03: Supply chain&lt;/li&gt;&#xA;&lt;li&gt;LLM04: Data and model poisoning&lt;/li&gt;&#xA;&lt;li&gt;LLM05: Improper output handling&lt;/li&gt;&#xA;&lt;li&gt;LLM06: Excessive agency&lt;/li&gt;&#xA;&lt;li&gt;LLM07: System prompt leakage&lt;/li&gt;&#xA;&lt;li&gt;LLM08: Vector and embedding weaknesses&lt;/li&gt;&#xA;&lt;li&gt;LLM09: Misinformation&lt;/li&gt;&#xA;&lt;li&gt;LLM10: Unbounded consumption&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/cloud-vs-on-prem-which-is-better-for-your-kubernetes-cluster/&#34;&gt;Cloud vs. On-Prem: Which Is Better for Your Kubernetes Cluster?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Cloud solutions offer unparalleled flexibility and ease of scaling, while on-premises setups provide unmatched control and security for&#xA;sensitive workloads.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-02-18 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-18-tuesday-assorted-links/</link>
      <pubDate>Tue, 18 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-18-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, Febuary 18:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/oldnewthing/20250124-00/?p=110805&#34;&gt;A brief and incomplete comparison of memory corruption detection tools&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;ASAN detects a lot more types of memory errors, but it requires that you recompile everything. This can be limiting if you suspect that&#xA;the problem is coming from a component you cannot recompile (say because you aren’t set up to recompile it, or because you don’t have&#xA;the source code). Valgrind and AppVerifier have the advantage that you can turn them on for a process without requiring a recompilation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-mocks-fail-real-environment-testing-for-microservices/&#34;&gt;Why Mocks Fail: Real-Environment Testing for Microservices&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use mocks for edge cases and scenarios requiring controlled inputs.&lt;/li&gt;&#xA;&lt;li&gt;Leverage real environments to validate integration flows, complex API behaviors and performance characteristics against real dependencies.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/gen-ai-patterns/&#34;&gt;Emerging Patterns in Building GenAI Products&lt;/a&gt;:&#xA;&lt;blockquote&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Direct Prompting&lt;/strong&gt;: Send prompts directly from the user to a Foundation LLM&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Embeddings&lt;/strong&gt;: Transform large data blocks into numeric vectors so that embeddings near each other represent related concepts&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Evals&lt;/strong&gt;: Evaluate the responses of an LLM in the context of a specific task&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hybrid Retriever&lt;/strong&gt;: Combine searches using embeddings with other search techniques&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Query Rewriting&lt;/strong&gt;: Use an LLM to create several alternative formulations of a query and search with all the alternatives&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reranker&lt;/strong&gt;: Rank a set of retrieved document fragments according to their usefulness and send the best of them to the LLM.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Retrieval Augmented Generation (RAG)&lt;/strong&gt;: Retrieve relevant document fragments and include these when prompting the LLM&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2025/01/22/security/how-meta-discovers-data-flows-via-lineage-at-scale/&#34;&gt;How Meta discovers data flows via lineage at scale&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In order to build high-quality data lineage, we developed different techniques to collect data flow signals across different technology&#xA;stacks: static code analysis for different languages, runtime instrumentation, and input and output data matching, etc.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2025/02/sam-altman-lays-out-roadmap-for-openais-long-awaited-gpt-5-model/&#34;&gt;Sam Altman lays out roadmap for OpenAI&amp;rsquo;s long-awaited GPT-5 model&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;GPT-5 will be a system that brings together features from across OpenAI&amp;rsquo;s current AI model lineup, including conventional AI models,&#xA;SR models, and specialized models that do tasks like web search and research.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-02-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/02/2025-02-17-monday-assorted-links/</link>
      <pubDate>Mon, 17 Feb 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/02/2025-02-17-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, Febuary 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bleepingcomputer.com/news/security/time-bandit-chatgpt-jailbreak-bypasses-safeguards-on-sensitive-topics/&#34;&gt;Time Bandit ChatGPT jailbreak bypasses safeguards on sensitive topics&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A ChatGPT jailbreak flaw, dubbed &amp;ldquo;Time Bandit,&amp;rdquo; allows you to bypass OpenAI&amp;rsquo;s safety guidelines when asking&#xA;for detailed instructions on sensitive topics, including the creation of weapons, information on nuclear&#xA;topics, and malware creation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.wired.com/story/treasury-bfs-doge-insider-threat/&#34;&gt;A US Treasury Threat Intelligence Analysis Designates DOGE Staff as &amp;lsquo;Insider Threat&amp;rsquo;&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;An internal email reviewed by WIRED calls DOGE staff&amp;rsquo;s access to federal payments systems &amp;ldquo;the single&#xA;greatest insider threat risk the Bureau of the Fiscal Service has ever faced.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/optimizing-for-developer-productivity-creates-a-winning-devex/&#34;&gt;Optimizing for Developer Productivity Creates a Winning DevEx&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Developer productivity is not about having 50 tools. It&amp;rsquo;s about improving experience, speed and productivity with the right kinds of tools.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/mtp-adoption-frameworks/&#34;&gt;Microsoft.Testing.Platform: Now Supported by All Major .NET Test Frameworks&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Microsoft.Testing.Platform is a lightweight and portable alternative to VSTest for running tests in all contexts, including continuous&#xA;integration (CI) pipelines, CLI, Visual Studio Test Explorer, and VS Code Text Explorer. The Microsoft.Testing.Platform is embedded&#xA;directly in your test projects, and there’s no other app dependencies, such as &lt;code&gt;vstest.console&lt;/code&gt; or &lt;code&gt;dotnet test&lt;/code&gt; needed to run your&#xA;tests.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2025/02/openais-secret-weapon-against-nvidia-dependence-takes-shape/&#34;&gt;OpenAI&amp;rsquo;s secret weapon against Nvidia dependence takes shape&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;OpenAI is entering the final stages of designing its long-rumored AI processor with the aim of decreasing the company&amp;rsquo;s dependence on&#xA;Nvidia hardware, according to a Reuters report released Monday. The ChatGPT creator plans to send its chip designs to Taiwan Semiconductor&#xA;Manufacturing Co. (TSMC) for fabrication within the next few months, but the chip has not yet been formally announced.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-01-21 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-21-tuesday-assorted-link/</link>
      <pubDate>Tue, 21 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-21-tuesday-assorted-link/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, January 21:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/extending-cicd-and-gitops-for-better-k8s-app-deployments/&#34;&gt;Extending CI/CD and GitOps for Better K8s App Deployments&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2025/01/ai-mistakes-are-very-different-from-human-mistakes.html&#34;&gt;AI Mistakes Are Very Different from Human Mistakes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2025/01/trump-announces-500b-stargate-ai-infrastructure-project-with-agi-aims/&#34;&gt;Trump announces $500B &amp;ldquo;Stargate&amp;rdquo; AI infrastructure project with AGI aims&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3586r0.html&#34;&gt;The Plethora of Problems With [C++] Profiles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2025/01/22/why-all-developers-should-adopt-a-safety-critical-mindset/&#34;&gt;Why all developers should adopt a safety-critical mindset&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-01-20 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-20-monday-assorted-link/</link>
      <pubDate>Mon, 20 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-20-monday-assorted-link/</guid>
      <description>&lt;p&gt;Assorted links for Monday, January 20:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/strava-engineering/the-boring-option-4a7c6ad16ab8&#34;&gt;The Boring Option: Migrating Segment Efforts Storage at Strava&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2020/12/10/developer-tools/probabilistic-flakiness/&#34;&gt;How do you test your tests?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2020/12/09/data-center-engineering/how-facebook-keeps-its-large-scale-infrastructure-hardware-up-and-running/&#34;&gt;How Facebook keeps its large-scale infrastructure hardware up and running&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/JUring-IO_uring-Java&#34;&gt;JUring: Experimental IO_uring For Java With Big Performance Gains&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;JUring is a high-performance Java library that provides bindings to Linux&amp;rsquo;s io_uring asynchronous I/O interface using Java&amp;rsquo;s&#xA;Foreign Function &amp;amp; Memory API. Doing Random reads JUring achieves 33% better performance than Java NIO FileChannel operations&#xA;for local files and 78% better performance for remote files.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/developer-skills/application-development/how-we-built-the-github-skyline-cli-extension-using-github/&#34;&gt;How we built the GitHub Skyline CLI extension using GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2025-01-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-17-friday-assorted-link/</link>
      <pubDate>Fri, 17 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-17-friday-assorted-link/</guid>
      <description>&lt;p&gt;Assorted links for Friday, January 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stripe.com/blog/payment-api-design&#34;&gt;Stripe&amp;rsquo;s payments APIs: The first 10 years&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/life-of-a-netflix-partner-engineer-the-case-of-extra-40-ms-b4c2dd278513&#34;&gt;Life of a Netflix Partner Engineer — The case of the extra 40 ms&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.engineering/scaling-datastores-at-slack-with-vitess/&#34;&gt;Scaling Datastores at Slack with Vitess&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/riskified-technology/how-to-build-a-ci-cd-process-that-deploys-on-kubernetes-and-focuses-on-developer-independence-7dc4c20984a&#34;&gt;How to Build a CI/CD Process That Deploys on Kubernetes and Focuses on Developer Independence&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloudsols.medium.com/the-role-profiles-pattern-across-infrastructure-as-code-3d8910dcd3c9&#34;&gt;The Role-Profiles Pattern Across Infrastructure as Code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2025-01-16 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-16-thursday-assorted-link/</link>
      <pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-16-thursday-assorted-link/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, January 16:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/842385/&#34;&gt;Fast commits for ext4&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Linux 5.10 release included a change that is expected to significantly increase the&#xA;performance of the ext4 filesystem; it goes by the name &amp;ldquo;fast commits&amp;rdquo; and introduces a&#xA;new, lighter-weight journaling method.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://msrc.microsoft.com/blog/2021/01/building-faster-amd64-memset-routines/&#34;&gt;Building Faster AMD64 Memset Routines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/nuget/concepts/dependency-resolution&#34;&gt;How NuGet resolves package dependencies&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/developer-effectiveness.html&#34;&gt;Maximizing Developer Effectiveness&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://brandur.org/fragments/offset-pagination&#34;&gt;What&amp;rsquo;s good about offset pagination; designing parallel cursor-based web APIs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2025-01-15 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-15-wednesday-assorted-links/</link>
      <pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-15-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, January 15:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/cloud-pue-comparing-aws-azure-and-gcp-global-regions/&#34;&gt;Cloud PUE: Comparing AWS, Azure and GCP Global Regions&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;New data reveals how efficiently the major cloud providers run and cool their data centers&#xA;&amp;ndash; from AWS&amp;rsquo;s and Azure&amp;rsquo;s tropical struggles to Google&amp;rsquo;s industry-leading performance.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pages.cs.wisc.edu/~vijayc/nofs.htm&#34;&gt;The No-Order File System&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In this paper, we introduce the No-Order File System (NoFS), a simple, lightweight file&#xA;system that employs a novel technique called backpointer based consistency to provide&#xA;crash consistency without ordering writes as they go to disk.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineeringblog.yelp.com/2021/01/whose-code-is-it-anyway.html&#34;&gt;Whose Code is it Anyway?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In order to measure the engineering effectiveness of Yelp, we need to measure the&#xA;effectiveness of its organizations and the teams that make up those organizations. But&#xA;how do we know what a team is responsible for? We needed a way to assign an owner to&#xA;something (let’s call this an entity) that we want to measure. Once an entity has an&#xA;owner, we can collect metrics on that entity and derive the health score (i.e.,&#xA;effectiveness) for that owner. These metrics can then be aggregated by team,&#xA;organization, or even the entire Engineering division, so that we can identify areas&#xA;that we can collectively improve. And this is how the Ownership microservice was born.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.corellium.com/blog/linux-m1&#34;&gt;How we ported Linux to the M1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.tweag.io/blog/2018-03-15-bazel-nix/&#34;&gt;Nix + Bazel = fully reproducible, incremental builds&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-01-14 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-14-tuesday-assorted-links/</link>
      <pubDate>Tue, 14 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-14-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, January 14:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://justine.lol/ape.html&#34;&gt;αcτµαlly pδrταblε εxεcµταblε&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;One day, while studying old code, I found out that it&amp;rsquo;s possible to encode Windows Portable Executable&#xA;files as a UNIX Sixth Edition shell script, due to the fact that the Thompson Shell didn&amp;rsquo;t use a&#xA;shebang line. Once I realized it&amp;rsquo;s possible to create a synthesis of the binary formats being used by&#xA;Unix, Windows, and MacOS, I couldn&amp;rsquo;t resist the temptation of making it a reality, since it means that&#xA;high-performance native code can be almost as pain-free as web apps.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.det.life/i-spent-4-hours-learning-how-netflix-operates-apache-iceberg-at-scale-c93a9f94c539&#34;&gt;I spent 4 hours learning how Netflix operates Apache Iceberg at scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/security/application-security/how-to-secure-your-github-actions-workflows-with-codeql/&#34;&gt;How to secure your GitHub Actions workflows with CodeQL&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;To help prevent the introduction of vulnerabilities, identify them in existing workflows, and even fix&#xA;them using GitHub Copilot Autofix, CodeQL support has been added for GitHub Actions.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/culture/2025/01/how-the-uk-was-connected-to-the-internet-for-the-first-time/&#34;&gt;How the UK was connected to the Internet for the first time&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/open-source/git/highlights-from-git-2-48/&#34;&gt;Highlights from Git 2.48&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The open source Git project just released Git 2.48. Here is GitHub&amp;rsquo;s look at some of the most&#xA;interesting features and changes introduced since last time.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-01-13 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-13-monday-assorted-links/</link>
      <pubDate>Mon, 13 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-13-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, January 13:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gustedt.wordpress.com/2025/01/06/simple-defer-ready-to-use/&#34;&gt;Simple defer, ready to use&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;With this post I will concentrate on the here and now: how to use C&amp;rsquo;s future&#xA;lifesaving &lt;code&gt;defer&lt;/code&gt; feature with existing tools and compilers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://omeranson.github.io/blog/2022/06/12/cleanup-attribute-in-C&#34;&gt;Cleanup Attribute in C&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In this blog post I explore &lt;code&gt;__attribute__((cleanup(...))).&lt;/code&gt; I discuss what it does, how&#xA;it does it, why use it, performance considerations, and finish by saying it&amp;rsquo;s absolutely&#xA;fantastic.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bitsaboutmoney.com/archive/debanking-and-debunking/&#34;&gt;Debanking (and Debunking?)&lt;/a&gt;: An&#xA;entertaining and fairly deep explanation of what debanking is and why it occurs.  And I learned&#xA;a useful new word: &lt;em&gt;sontaku&lt;/em&gt;.&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Japanese has a beautiful word, sontaku, for the attitude and actions a diligent subordinate&#xA;would take without his superior&amp;rsquo;s explicit instruction, believing them to anticipate his&#xA;boss&amp;rsquo; desires.  Sontaku is a core skill in the American professional class.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bitsaboutmoney.com/archive/seeing-like-a-bank/&#34;&gt;Seeing like a Bank&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bitsaboutmoney.com/archive/bond-villain-compliance-strategy/&#34;&gt;The Bond villain compliance strategy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2025-01-10 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-10-friday-assorted-links/</link>
      <pubDate>Fri, 10 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-10-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, January 10:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://people.kernel.org/kees/colliding-with-the-sha-prefix-of-linuxs-initial-git-commit&#34;&gt;Colliding with the SHA prefix of Linux&amp;rsquo;s initial Git commit&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;There was a recent discussion about how Linux&amp;rsquo;s &amp;ldquo;Fixes&amp;rdquo; tag, which traditionally uses the 12 character commit SHA&#xA;prefix, has an ever increasing chance of collisions. There are already 11-character collisions, and Geert wanted to&#xA;raise the minimum short id to 16 characters.&lt;/p&gt;&#xA;&lt;p&gt;Tools like linux-next&amp;rsquo;s &amp;ldquo;Fixes tag checker&amp;rdquo;, the Linux CNA&amp;rsquo;s commit parser, and my own CVE lifetime analysis scripts do&#xA;programmatic analysis of the &amp;ldquo;Fixes&amp;rdquo; tag and had no support for collisions (even shorter existing collisions).&lt;/p&gt;&#xA;&lt;p&gt;So, in an effort to fix these tools, I broke them with commit 1da177e4c3f4 (“docs: git SHA prefixes are for humans”):&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/FreeBSD-Considers-Rust-Base&#34;&gt;FreeBSD Considers Making Use Of Rust Within Its Base System&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-architects-guide-to-open-table-formats-and-object-storage/&#34;&gt;The Architect&amp;rsquo;s Guide to Open Table Formats and Object Storage&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.honeycomb.io/blog/alerts-are-fundamentally-messy&#34;&gt;Alerts Are Fundamentally Messy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cs.cmu.edu/~pavlo/blog/2025/01/2024-databases-retrospective.html&#34;&gt;Databases in 2024: A Year in Review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2025-01-09 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-09-thursday-assorted-links/</link>
      <pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-09-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, January 9:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/LLVM-Telemetry-Framework&#34;&gt;LLVM 20 Merges An Initial Telemetry Framework&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/linux-an-intro-to-the-flatpak-universal-package-manager/&#34;&gt;Linux: An Intro to the Flatpak Universal Package Manager&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.imperialviolet.org/tourofwebauthn/tourofwebauthn.html&#34;&gt;A Tour of WebAuthn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/932415/&#34;&gt;Fanotify and hierarchical storage management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/infrastructure-as-code-in-2024-why-its-still-so-terrible/&#34;&gt;Infrastructure as Code in 2024: Why It&amp;rsquo;s Still So Terrible&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2025-01-08 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-08-wednesday-assorted-links/</link>
      <pubDate>Wed, 08 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-08-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, January 8:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/amexs-faas-uses-webassembly-instead-of-containers/&#34;&gt;Amex&amp;rsquo;s FaaS Uses WebAssembly Instead of Containers&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A key reason behind Amex&amp;rsquo;s adoption of WebAssembly is that WebAssembly demonstrated superior performance metrics&#xA;compared to containers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/enterprise-software/devsecops/enhance-build-security-and-reach-slsa-level-3-with-github-artifact-attestations/&#34;&gt;Enhance build security and reach SLSA Level 3 with GitHub Artifact Attestations&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Supply-chain Levels for Software Artifacts (SLSA) framework &amp;hellip; provides a comprehensive, step-by-step methodology&#xA;for building integrity and provenance guarantees into your software supply chain.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/introducing-configurable-metaflow-d2fb8e9ba1c6&#34;&gt;Introducing Configurable Metaflow&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Standing on the shoulders of our extensive cloud infrastructure, Metaflow facilitates easy access to data, compute, and&#xA;production-grade workflow orchestration, as well as built-in best practices for common concerns such as collaboration,&#xA;versioning, dependency management, and observability, which teams use to setup ML/AI experiments and systems that work&#xA;for them. As a result, Metaflow users at Netflix have been able to run millions of experiments over the past few years&#xA;without wasting time on low-level concerns.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-feds-push-webassembly-for-cloud-native-security/&#34;&gt;The Feds Push WebAssembly for Cloud Native Security&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;According to a National Institute of Standards and Technology (NIST) paper, “A Data Protection Approach for Cloud-Native&#xA;Applications,” released earlier this year, WebAssembly could and should be integrated across the cloud native service&#xA;mesh sphere in particular to enhance security.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/research/self-designing-software/&#34;&gt;Self-Designing Software&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Exploring ways to include a software system as an active member of its own design team, able to reason about its own&#xA;design and to synthesize better variants of its own building blocks as it encounters different deployment conditions.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2025-01-07 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-07-tuesday-assorted-links/</link>
      <pubDate>Tue, 07 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-07-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, January 7:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/12/18/what-is-inference-parallelism-and-how-it-works/&#34;&gt;What is Inference Parallelism and how it works&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Inference parallelism aims to distribute the computational workload of AI models, particularly deep learning models,&#xA;across multiple processing units such as GPUs.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/open-source-innovation-comes-to-time-series-data-compression/&#34;&gt;Open Source Innovation Comes to Time-Series Data Compression&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;NetApp Instaclustr collaborated with the University of Canberra through the OpenSI initiative to develop the Advanced&#xA;Time Series Compressor (ATSC) — an open source innovation that fundamentally reimagines high-volume time-series data&#xA;compression.&lt;/p&gt;&#xA;&lt;p&gt;ATSC implements a sophisticated lossy compression approach. Rather than storing complete data sets, it generates&#xA;mathematical functions that closely approximate the original data patterns, storing only the essential parameters of&#xA;these functions. This approach is paired with granular configurability — users can precisely tune their desired level&#xA;of accuracy, balancing storage efficiency with data fidelity based on their specific use cases.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/what-do-you-lose-when-you-abandon-the-cloud/&#34;&gt;What Do You Lose When You Abandon the Cloud?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;High-profile moves from 37signals (the company behind Basecamp and HEY) and GEICO have sparked a renewed interest in&#xA;cloud repatriation.&lt;/p&gt;&#xA;&lt;p&gt;One sometimes overlooked advantage of moving to the cloud is that it allows you to pay for resources when they are&#xA;needed, for example, as new customers come online. Spending moves from upfront CAPEX (buying new machines in anticipation&#xA;of success) to OPEX (paying for additional servers on demand).&lt;/p&gt;&#xA;&lt;p&gt;Another thing to weigh up is pace of innovation — both from the cloud provider and from the consumer.&lt;/p&gt;&#xA;&lt;p&gt;The Zynga example [of moving from the cloud to on-prem, then back to the cloud] highlights several other trade-offs. One&#xA;to consider is that if you are running your own data centers, you need to be able to hire the right people and retain&#xA;them.&lt;/p&gt;&#xA;&lt;p&gt;There is another set of trade-offs around security. Keeping servers up to date, and guarding against intrusions, is&#xA;time-consuming work that big cloud providers are very experienced in.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-all-the-major-cloud-platforms-are-the-same/&#34;&gt;Why All the Major Cloud Platforms Are the Same&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Each provider brought unique strengths and strategic priorities to the table, creating differentiation initially, but&#xA;eventually converging on a consistent baseline of functionality.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/12/19/developer-tools/glean-open-source-code-indexing/&#34;&gt;Indexing code at scale with Glean&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;How is Glean different?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Glean doesn’t decide for you what data you can store.&lt;/li&gt;&#xA;&lt;li&gt;Glean’s query language is very general.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2025-01-06 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-06-monday-assorted-links/</link>
      <pubDate>Mon, 06 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-06-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, January 6:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/12/17/managing-large-scale-redis-clusters-on-kubernetes-with-an-operator-kuaishous-approach/&#34;&gt;Managing large-scale Redis clusters on Kubernetes with an operator – Kuaishou&amp;rsquo;s approach&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/supercharge-your-rag-app-with-agentic-hybrid-search/&#34;&gt;Supercharge Your RAG App With Agentic Hybrid Search&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;By using structured metadata and letting an LLM choose the best retrieval method for each query, you can turn your RAG&#xA;app into a better assistant.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/cloud-efficiency-at-netflix-f2a142955f83&#34;&gt;Cloud Efficiency at Netflix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/part-1-a-survey-of-analytics-engineering-work-at-netflix-d761cfd551ee&#34;&gt;Part 1: A Survey of Analytics Engineering Work at Netflix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/12/18/ios/how-we-think-about-threads-ios-performance/&#34;&gt;How we think about Threads&amp;rsquo; iOS performance&lt;/a&gt;:&#xA;Key metrics: %FIRE (Frustrating image-render experience), TTNC (Time-to-network content), cPSR (Creation-publish success rate)&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2025-01-03 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-03-friday-assorted-links/</link>
      <pubDate>Fri, 03 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-03-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, January 3:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/apache-pinot-brings-real-time-analysis-to-columnar-data/&#34;&gt;Apache Pinot Brings Real Time Analysis to Columnar Data&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Pinot was born to solve the problem of &amp;ldquo;running analytical queries for hundreds of millions of users at scale, in a&#xA;low-cost manner,&amp;rdquo; explained Chinmay Soman, head of product for StarTree, which offers a fully managed cloud native&#xA;version of Pinot.&lt;/p&gt;&#xA;&lt;p&gt;Pinot brings &amp;ldquo;simplification in the data stack,&amp;rdquo; Soman said in an interview with TNS. &amp;ldquo;The problem is not new. It&amp;rsquo;s been&#xA;solved by many legacy technologies. What Pinot brings is the simplification and the scale for these problems.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/genai-is-quickly-reinventing-it-operations-leaving-many-behind/&#34;&gt;GenAI is Quickly Reinventing IT Operations, Leaving Many Behind&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;GenAI can significantly transform IT Operations Management by proactively providing context-rich insights, accurate&#xA;predictions, and actionable recommendations for managing the IT landscape.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/how-to-create-and-use-an-ai-git-agent/&#34;&gt;How to Create and Use an AI Git Agent&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/12/16/platform-engineering-needs-observability-heres-why/&#34;&gt;Platform Engineering needs Observability: here&amp;rsquo;s why&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Observability offers real-time insights into system behavior, allowing teams to proactively identify and address issues&#xA;before they affect users. By adopting observability, platform engineering teams can improve system resilience, sustain&#xA;uninterrupted user experiences during peak events, and uphold operational stability.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://0pointer.net/blog/announcing-systemd-v257.html&#34;&gt;Announcing systemd v257&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2025-01-02 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2025/01/2025-01-02-thursday-assorted-links/</link>
      <pubDate>Thu, 02 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2025/01/2025-01-02-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, January 2:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/design-token-based-ui-architecture.html&#34;&gt;Design Token-Based UI Architecture&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Design tokens are design decisions as data and serve as a single source of truth for design and engineering.&#xA;Utilizing deployment pipelines, they enable automated code generation across platforms, allowing for faster&#xA;updates and improved consistency in design.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://security.googleblog.com/2024/11/retrofitting-spatial-safety-to-hundreds.html&#34;&gt;Retrofitting spatial safety to hundreds of millions of lines of C++&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;[W]e&amp;rsquo;re working towards bringing spatial memory safety into as many of our C++ codebases as possible, including&#xA;Chrome and the monolithic codebase powering our services.&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Building on the successful deployment of hardened libc++ in Chrome in 2022, we&amp;rsquo;ve now made it default across our&#xA;server-side production systems.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/12/13/reconsidering-kubernetes-deployments-when-operators-are-overkill/&#34;&gt;Reconsidering Kubernetes deployments: when operators are overkill&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;TL:DR: Kubernetes Operators are powerful but can be overkill for simple deployments. Explore alternatives like Helm,&#xA;ArgoCD, and Devtron to streamline your Kubernetes deployments without sacrificing efficiency.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/securely-deploy-and-run-multiple-tenants-on-kubernetes/&#34;&gt;Securely Deploy and Run Multiple Tenants on Kubernetes&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Three fundamental options:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Namespace-Based Isolation With Network Policies, RBAC and Security Controls&lt;/li&gt;&#xA;&lt;li&gt;Cluster-Level Isolation&lt;/li&gt;&#xA;&lt;li&gt;Virtual Clusters&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/blogcacm/ai-driven-code-review-enhancing-developer-productivity-and-code-quality/&#34;&gt;AI-Driven Code Review: Enhancing Developer Productivity and Code Quality&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;AI-driven code review tools are changing traditional development and helping teams build better software.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-12-10 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/12/2024-12-10-tuesday-assorted-links/</link>
      <pubDate>Tue, 10 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/12/2024-12-10-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, December 10:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/benchmark-llm-application-performance-with-langchain/&#34;&gt;Benchmark LLM Application Performance with LangChain&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/forget-all-cloud-or-all-on-prem-embrace-hybrid-for-agility-and-cost-savings/&#34;&gt;Forget All-Cloud or All-On-Prem: Embrace Hybrid for Agility and Cost Savings&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The core idea behind hybrid cloud is straightforward: use cloud environments where&#xA;rapid scaling and frequent changes are essential and rely on on-premises systems&#xA;for stable, predictable workloads.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.bazel.build/2024/12/09/bazel-8-release.html&#34;&gt;Bazel 8.0 Released&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/openai-video-generator-is-now-publicly-available&#34;&gt;You Can Now Try Out Sora, OpenAI&amp;rsquo;s AI Video Generator&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/local-ai-models-with-dotnet-aspire/&#34;&gt;Using Local AI models with .NET Aspire&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-12-09 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/12/2024-12-09-monday-assorted-links/</link>
      <pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/12/2024-12-09-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, December 9:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/enhancing-container-security-with-docker-scout-and-secure-repositories/&#34;&gt;Enhancing Container Security with Docker Scout and Secure Repositories&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/engineering/architecture-optimization/breaking-down-cpu-speed-how-utilization-impacts-performance/&#34;&gt;Breaking down CPU speed: How utilization impacts performance&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/dotnet9-openapi/&#34;&gt;OpenAPI document generation in .NET 9&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/evaluate-the-quality-of-your-ai-applications-with-ease/&#34;&gt;Evaluate the quality of your AI applications with ease&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/11/27/kubernetes-for-databases-weighing-the-pros-and-cons/&#34;&gt;Kubernetes for databases: weighing the pros and cons&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-12-06 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/12/2024-12-06-friday-assorted-links/</link>
      <pubDate>Fri, 06 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/12/2024-12-06-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, December 6:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-api-first-matters-in-an-ai-driven-world/&#34;&gt;Why API-First Matters in an AI-Driven World&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/elasticsearch-was-great-but-vector-databases-are-the-future/&#34;&gt;Elasticsearch Was Great, But Vector Databases Are the Future&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/new-vector-search-full-text-search-and-hybrid-search-features-in-azure-cosmos-db-for-nosql/&#34;&gt;New Vector Search, Full Text Search, and Hybrid Search Features in Azure Cosmos DB for NoSQL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/toyota-motor-corporation-innovates-design-development-with-multi-agent-ai-system-and-cosmos-db/&#34;&gt;How Toyota uses Azure Cosmos DB to power their multi-agent AI system for enhanced productivity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cosmosdb/introducing-the-new-linux-based-azure-cosmos-db-emulator-preview/&#34;&gt;Introducing the new Linux-based Azure Cosmos DB Emulator (Preview)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-12-05 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/12/2024-12-05-thursday-assorted-links/</link>
      <pubDate>Thu, 05 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/12/2024-12-05-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, December 5:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/you-have-an-sbom-what-are-the-next-steps/&#34;&gt;You Have an SBOM — What Are the Next Steps?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/accelerating-ai-development-with-the-docker-ai-catalog/&#34;&gt;Accelerating AI Development with the Docker AI Catalog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/11/12/security/how-meta-built-large-scale-cryptographic-monitoring/&#34;&gt;How Meta built large-scale cryptographic monitoring&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/top-7-tools-for-building-multimodal-ai-applications/&#34;&gt;Top 7 Tools for Building Multimodal AI Applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/enhancing-ai-agents-adding-instructions-tasks-and-memory/&#34;&gt;Enhancing AI Agents: Adding Instructions, Tasks and Memory&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-12-04 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/12/2024-12-04-wednesday-assorted-links/</link>
      <pubDate>Wed, 04 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/12/2024-12-04-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, December 4:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/top-costly-cloud-mistakes-and-how-to-sidestep-them/&#34;&gt;Top Costly Cloud Mistakes — and How To Sidestep Them&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-companies-are-ditching-the-cloud-the-rise-of-cloud-repatriation/&#34;&gt;Why Companies Are Ditching the Cloud: The Rise of Cloud Repatriation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/exciting-announcement-public-preview-of-native-vector-support-in-azure-sql-database/&#34;&gt;Exciting Announcement: Public Preview of Native Vector Support in Azure SQL Database!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/sql-vector-store-data-ingestion-and-retrieval-using-azure-logic-apps/&#34;&gt;RAG with SQL Vector Store: A Low-Code/No-Code Approach using Azure Logic Apps&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/improve-microservices-with-these-new-load-balancing-strategies/&#34;&gt;Improve Microservices With These New Load Balancing Strategies&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-12-03 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/12/2024-12-03-tuesday-assorted-links/</link>
      <pubDate>Tue, 03 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/12/2024-12-03-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, December 3:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/janakiramm/agent-framework&#34;&gt;Agent Framework&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Agent Framework is a Python framework for building capable, context-aware AI&#xA;agents. It provides a flexible foundation for creating AI agents with distinct&#xA;personas, managed instructions, conversational memory, and strategic planning&#xA;capabilities.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linuxfoundation.org/hubfs/eBPF/ControlPlane%20%E2%80%94%20eBPF%20Security%20Threat%20Model.pdf&#34;&gt;eBPF Security Threat Model&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/experts-share-best-practices-for-building-terraform-modules/&#34;&gt;Experts Share Best Practices for Building Terraform Modules&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/api-mocking-is-essential-to-effective-change-management/&#34;&gt;API Mocking Is Essential to Effective Change Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/11/04/opentelemetry-is-expanding-into-ci-cd-observability/&#34;&gt;OpenTelemetry Is expanding into CI/CD observability&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We’ve been talking about the need for a common &amp;ldquo;language&amp;rdquo; for reporting and&#xA;observing CI/CD pipelines for years, and finally, we see the first &amp;ldquo;words&amp;rdquo; of&#xA;this language entering the &amp;ldquo;dictionary&amp;rdquo; of observability – the OpenTelemetry&#xA;open specification. With the recent release of OpenTelemetry&amp;rsquo;s Semantic&#xA;Conventions, v1.27.0, you can find designated attributes for reporting CI/CD&#xA;pipelines.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-12-02 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/12/2024-12-02-monday-assorted-links/</link>
      <pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/12/2024-12-02-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, December 2:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/11/20/cloud-neutral-postgres-databases-with-kubernetes-and-cloudnativepg/&#34;&gt;Cloud Neutral Postgres Databases with Kubernetes and CloudNativePG&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/observe-simplifies-k8s-troubleshooting-with-kubernetes-explorer/&#34;&gt;Observe Simplifies K8s Troubleshooting With Kubernetes Explorer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/platform-engineering-a-workshop-to-help-map-your-strategy/&#34;&gt;Platform Engineering: A Workshop to Help Map Your Strategy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blogsystem5.substack.com/p/dos-memory-models&#34;&gt;Revisiting the DOS memory models&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-Kernel-Bottlenecks-Mold&#34;&gt;Linux Kernel Performance Bottlenecks Spotted By Mold Developer&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The key takeaways of the performance bottlenecks within the Linux kernel that were noticed by Rui Ueyama include:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;exit(2) takes a few hundred milliseconds for a large process&lt;/li&gt;&#xA;&lt;li&gt;Writing to a fresh file is slower than writing to an existing file&lt;/li&gt;&#xA;&lt;li&gt;Lack of a safe system-wide semaphore&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-11-29 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-29-friday-assorted-links/</link>
      <pubDate>Fri, 29 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-29-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, November 29:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://irenezhang.net/blog/2019/05/21/demikernel.html&#34;&gt;The Case for a High-level Kernel-Bypass I/O Abstraction&lt;/a&gt;: Related to &lt;a href=&#34;https://github.com/microsoft/demikernel&#34;&gt;Demikernel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/chaos-under-control-addressing-cloud-infrastructure-drift/&#34;&gt;Chaos Under Control: Addressing Cloud Infrastructure Drift&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/ignite-2024-microsoft-debuts-sql-server-2025-integrates-azure-sql-into-fabric/&#34;&gt;Ignite 2024: Microsoft Debuts SQL Server 2025, Integrates Azure SQL into Fabric&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.bazel.build/2024/11/19/bazelcon-recap.html&#34;&gt;BazelCon 2024 Recap: Recordings and Birds of a Feather Session Notes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/11/19/emerging-trends-in-the-cloud-native-ecosystem/&#34;&gt;Emerging trends in the cloud native ecosystem&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Cloud Cost Control Gets Cool: FinOps is the New Black&lt;/li&gt;&#xA;&lt;li&gt;Are Your Devs Drowning in Tools? IDPs Are the Life Raft!&lt;/li&gt;&#xA;&lt;li&gt;Beyond Silos: Open Standards Unify Observability&lt;/li&gt;&#xA;&lt;li&gt;Cloud-native Security: A New High-stakes Game&lt;/li&gt;&#xA;&lt;li&gt;The Future is Green: Why Sustainable IT is No Longer Optional&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-11-28 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-28-thursday-assorted-links/</link>
      <pubDate>Thu, 28 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-28-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, November 28:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/overview?tabs=bicep&#34;&gt;What is Bicep?&lt;/a&gt;: Looks like an Azure-only Terraform.&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Bicep is a domain-specific language that uses declarative syntax to deploy Azure resources. In a Bicep&#xA;file, you define the infrastructure you want to deploy to Azure and then use that file throughout the&#xA;development lifecycle to repeatedly deploy that infrastructure. Your resources are deployed in a&#xA;consistent manner.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/netflixs-distributed-counter-abstraction-8d0c45eb66b2&#34;&gt;Netflix&amp;rsquo;s Distributed Counter Abstraction&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/11/javascript-developers-targeted-by-hundreds-of-malicious-code-libraries/&#34;&gt;Hundreds of code libraries posted to NPM try to install malware on dev machines&lt;/a&gt;: Make sure you SHA-lock your dependencies!&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kubuszok.com/2019/from-string-to-ast-parsing/&#34;&gt;From String to AST: parsing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://fabiensanglard.net/quake3/index.php&#34;&gt;Quake 3 Source Code Review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-11-27 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-27-wednesday-assorted-links/</link>
      <pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-27-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, November 27:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-k8s-eviction-works-resource-management-gone-wrong/&#34;&gt;How K8s Eviction Works: Resource Management Gone Wrong&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/netflix-engineers-rethink-mock-testing-for-graphql/&#34;&gt;Netflix Engineers Rethink Mock Testing for GraphQL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-to-track-dora-metrics-in-an-internal-developer-portal/&#34;&gt;How To Track DORA Metrics in an Internal Developer Portal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/internal-developer-portals-should-be-internal-developer-hubs/&#34;&gt;Internal Developer Portals Should Be Internal Developer Hubs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/ise/three-ways-to-simplify-cicd-pipelines-on-github-actions/&#34;&gt;Three Ways to Simplify CI/CD Pipelines on GitHub Actions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-11-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-26-tuesday-assorted-links/</link>
      <pubDate>Tue, 26 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-26-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, November 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://biowpn.github.io/bioweapon/2024/11/12/what-does-f-x-mean.html&#34;&gt;What does f(x) mean in C++?&lt;/a&gt;: A vivid example of just how complex of a language C++ is.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/scaling-from-simple-to-complex-cache-challenges-and-solutions/&#34;&gt;Scaling From Simple to Complex Cache: Challenges and Solutions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.honeycomb.io/blog/engineers-checklist-logging-best-practices&#34;&gt;An Engineer&amp;rsquo;s Checklist of Logging Best Practices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/kloudfuse-3-0-an-all-in-one-observability-platform-emerges/&#34;&gt;Kloudfuse 3.0: an All-in-One Observability Platform Emerges&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/testcontainers-cloud-vs-docker-in-docker-for-testing-scenarios/&#34;&gt;Why Testcontainers Cloud Is a Game-Changer Compared to Docker-in-Docker for Testing Scenarios&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-11-25 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-25-monday-assorted-links/</link>
      <pubDate>Mon, 25 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-25-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, November 25:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/introducing-the-dotnet-aspire-community-toolkit/&#34;&gt;Introducing the .NET Aspire Community Toolkit&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The team behind the Community Toolkit wanted to create a place where third parties&#xA;could contribute their own integrations and extensions to the .NET Aspire ecosystem.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/csharp13-calling-methods-is-easier-and-faster/&#34;&gt;Calling methods is easier and faster with C# 13 params collections&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;C# 13 fulfills a long standing feature request by allowing &lt;code&gt;params&lt;/code&gt; to be any of the&#xA;collections supported by collection expressions, rather than just arrays.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/announcing-dotnet-9/&#34;&gt;Announcing .NET 9&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datastax.com/blog/graph-rag-how-to-squeeze-more-value-from-ai&#34;&gt;Graph RAG: How To Squeeze More Value From AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datastax.com/blog/streaming-langchain-langflow-overview&#34;&gt;How to Support Streaming in AI Applications with LangChain and Langflow&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-11-22 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-22-friday-assorted-links/</link>
      <pubDate>Fri, 22 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-22-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, November 22:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/SubscriberLink/993828/eb9b437bf7604da3/&#34;&gt;Kernel optimization with BOLT&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Generally, developers think about how the data structures for their programs will be arranged in memory;&#xA;it is less common for them to consider how the code is arranged. There are exceptions, including the Linux&#xA;kernel developers, but most times the focus is on the data cache. The instruction cache is much smaller&#xA;than the data cache and has not grown much over time, maybe doubling from 32KB to 64KB on Intel CPUs over&#xA;the last 20 years. But, for large applications that do not spend most of their time in tight loops, the&#xA;layout of code in memory matters a lot, so BOLT can make a major difference, he said.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/cache-vs-database-has-performance-converged/&#34;&gt;Cache vs. Database: Has Performance Converged?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Both memcached and ScyllaDB maximized disks and network bandwidth while being stressed under similar&#xA;conditions, sustaining similar performance overall.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.resonatehq.io/deterministic-simulation-testing&#34;&gt;Deterministic Simulation Testing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pushtoprod.substack.com/p/netflix-terrifying-concurrency-bug&#34;&gt;How We Built a Self-Healing System to Survive a Terrifying Concurrency Bug At Netflix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://duckdb.org/2024/11/14/optimizers.html&#34;&gt;Optimizers: The Low-Key MVP&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The query optimizer is an important part of any analytical database system as it provides considerable&#xA;performance improvements compared to hand-optimized queries, even as the state of your data changes.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-11-21 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-21-thursday-assorted-links/</link>
      <pubDate>Thu, 21 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-21-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, November 21:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-you-no-longer-need-cloud-security-posture-management/&#34;&gt;Why You No Longer Need Cloud Security Posture Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/news-insights/product-news/bringing-developer-choice-to-copilot/&#34;&gt;Bringing developer choice to Copilot with Anthropic&amp;rsquo;s Claude 3.5 Sonnet, Google&amp;rsquo;s Gemini 1.5 Pro, and OpenAI&amp;rsquo;s o1-preview&lt;/a&gt;: It seems the general trend is towards multi-model choice.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/11/01/kubectl-logs-tail-a-guide-to-tailing-kubernetes-logs/&#34;&gt;Kubectl logs tail: a guide to tailing Kubernetes logs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/ai-testing-more-coverage-fewer-bugs-new-risks/&#34;&gt;AI Testing: More Coverage, Fewer Bugs, New Risks&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/proactive-monitoring-will-maximize-your-cloud-storage-efficiency/&#34;&gt;Proactive Monitoring Will Maximize Your Cloud Storage Efficiency&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-11-20 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-20-wednesday-assorted-links/</link>
      <pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-20-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, November 20:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/a-look-at-gradios-ai-playground-for-machine-learning-devs/&#34;&gt;A Look at Gradio&amp;rsquo;s AI Playground for Machine Learning Devs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/architecting-the-modern-app-a-case-for-simplicity/&#34;&gt;Architecting the Modern App: A Case for Simplicity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/making-adding-ai-apps-with-postgres-easier-for-developers/&#34;&gt;Making Adding AI Apps with Postgres Easier for Developers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/alternatives-to-cloud-dbaas-what-to-look-for/&#34;&gt;Alternatives to Cloud DBaaS: What to Look For&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/10/29/the-business-value-of-a-kubernetes-based-platform/&#34;&gt;The business value of a Kubernetes-based platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-11-19 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-19-tuesday-assorted-links/</link>
      <pubDate>Tue, 19 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-19-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, November 19:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://shivangsnewsletter.com/p/why-doesnt-cloudflare-use-containers&#34;&gt;Why doesn&amp;rsquo;t Cloudflare use containers in their Workers platform infrastructure?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/p99conf-how-ebpf-could-make-faster-database-systems/&#34;&gt;P99Conf: How eBPF Could Make Faster Database Systems&lt;/a&gt;: Basically this meanings running the database in kernel mode as an eBPF module.  At that point, why not use a &lt;a href=&#34;https://en.wikipedia.org/wiki/Unikernel&#34;&gt;unikernel&lt;/a&gt;?&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dora.dev/research/2024/dora-report/&#34;&gt;2024 DORA Report&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/4-ways-organizations-can-simplify-their-devops-pipeline/&#34;&gt;4 Ways Organizations Can Simplify Their DevOps Pipeline&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/dont-trust-security-in-ai-generated-code/&#34;&gt;Don&amp;rsquo;t Trust Security in AI-Generated Code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-11-18 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-18-monday-assorted-links/</link>
      <pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-18-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, November 18:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.circle-lang.org/draft-profiles.html&#34;&gt;Why Safety Profiles Failed&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/feds-critical-software-must-drop-c-c-by-2026-or-face-risk/&#34;&gt;Feds: Critical Software Must Drop C/C++ by 2026 or Face Risk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/github-ai-models-dotnet-semantic-kernel/&#34;&gt;Unlocking the Power of GitHub Models in .NET with Semantic Kernel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/cars/2024/10/generative-ai-is-coming-to-google-maps-google-earth-waze/&#34;&gt;Generative AI is coming to Google Maps, Google Earth, Waze&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2025/10/31/a-brief-summary-of-language-model-finetuning/&#34;&gt;A brief summary of language model finetuning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-11-15 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-15-friday-assorted-links/</link>
      <pubDate>Fri, 15 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-15-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, November 15:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-to-create-software-diagrams-with-chatgpt-and-claude/&#34;&gt;How To Create Software Diagrams With ChatGPT and Claude&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/VMware-Workstation-KVM&#34;&gt;VMware Workstation Shifting From Proprietary Code To Using Upstream KVM&lt;/a&gt;: I see a lot of &amp;ldquo;as open source evolves, replace proprietary internal code with open source code&amp;rdquo;-type projects at work.  This probably should be written up as an expected, natural evolution of a software system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sql/announcing-eap-native-vector-support-in-azure-sql-database/&#34;&gt;Announcing EAP for Vector Support in Azure SQL Database&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/openai-chatgpt-web-search-now-available&#34;&gt;You Can Now Search the Internet With ChatGPT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.opencost.io/&#34;&gt;OpenCost: Open source cost monitoring for cloud native environments&lt;/a&gt;: Cost monitoring for Kubernetes&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-11-14 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-14-thursday-assorted-links/</link>
      <pubDate>Thu, 14 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-14-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, November 14:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linus-2.6p-Faster-Scale-Patch&#34;&gt;Linus Torvalds Lands A 2.6% Performance Improvement With Minor Linux Kernel Patch&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/graphrag-101-increasing-genai-accuracy-and-completeness/&#34;&gt;GraphRAG 101: Increasing GenAI Accuracy and Completeness&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/ise/multitenant-genai-gateway-using-apim/&#34;&gt;Building a Multi-tenant GenAI gateway using APIM&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/ai-needs-more-than-a-vector-database/&#34;&gt;AI Needs More Than a Vector Database&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cncf.io/blog/2024/10/31/cultivating-a-successful-engineering-culture-with-platform-engineering/&#34;&gt;Cultivating a successful engineering culture with Platform Engineering&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-11-13 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-13-wednesday-assorted-links/</link>
      <pubDate>Wed, 13 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-13-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, November 13:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2024/10/github-copilot-moves-beyond-openai-models-to-support-claude-3-5-gemini/&#34;&gt;GitHub Copilot moves beyond OpenAI models to support Claude 3.5, Gemini&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.google/technology/ai/difference-cpu-gpu-tpu-trillium/&#34;&gt;Ask a Techspert: What&amp;rsquo;s the difference between a CPU, GPU and TPU?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/introducing-microsoft-extensions-vector-data/&#34;&gt;Introducing Microsoft.Extensions.VectorData Preview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/pulse/spooky-data-distance-simson-garfinkel-nrt9e/&#34;&gt;Spooky Data at a Distance&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-metadata-and-fine-tuning-are-key-to-scaling-nlq-to-sql/&#34;&gt;Why Metadata and Fine-Tuning Are Key To Scaling NLQ to SQL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>CMake Implementation of OpenSSF Compiler Hardening Options</title>
      <link>https://www.stevenengelhardt.com/2024/11/12/cmake-implementation-of-openssf-compiler-hardening-options/</link>
      <pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2024/11/12/cmake-implementation-of-openssf-compiler-hardening-options/</guid>
      <description>&lt;p&gt;This post describes how to implement the OpenSSF &lt;a href=&#34;https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++.html&#34;&gt;Compiler Options Hardening Guide for C and C++&lt;/a&gt;&#xA;in CMake.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-11-12 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-12-tuesday-assorted-links/</link>
      <pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-12-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, November 12:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/from-iac-to-cloud-management-pulumis-evolution-story/&#34;&gt;From IaC to Cloud Management: Pulumi&amp;rsquo;s Evolution Story&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-platform-engineers-are-embracing-webassembly-for-serverless/&#34;&gt;Why Platform Engineers Are Embracing WebAssembly for Serverless&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/shift-left-meets-kafka-testing-event-driven-microservices/&#34;&gt;Shift Left Meets Kafka: Testing Event-Driven Microservices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/make-workloads-not-infrastructure-redefining-k8s-platforms/&#34;&gt;Make Workloads, Not Infrastructure: Redefining K8s Platforms&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2024/10/the-new-york-times-shows-how-ai-can-aid-reporters-without-replacing-them/&#34;&gt;How The New York Times is using generative AI as a reporting tool&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-11-11 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-11-monday-assorted-links/</link>
      <pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-11-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, November 11:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/3-frameworks-for-role-based-access-control/&#34;&gt;3 Frameworks for Role-Based Access Control&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/use-these-ai-workflows-to-reduce-your-technical-debt/&#34;&gt;Use These AI Workflows To Reduce Your Technical Debt&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/lessons-from-humanas-migration-to-hcp-terraform-cloud/&#34;&gt;Lessons From Humana&amp;rsquo;s Migration to HCP Terraform Cloud&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/will-data-privacy-die-in-the-age-of-genai/&#34;&gt;Will Data Privacy Die in the Age of GenAI?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/speed-means-nothing-without-real-feedback/&#34;&gt;Speed Means Nothing Without Real Feedback&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Move Semantics for IDisposable Part 2</title>
      <link>https://www.stevenengelhardt.com/2024/11/11/move-semantics-for-idisposable-part-2/</link>
      <pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2024/11/11/move-semantics-for-idisposable-part-2/</guid>
      <description>&lt;p&gt;After trying out the &lt;code&gt;Movable&amp;lt;TResource&amp;gt;&lt;/code&gt; type from &lt;a href=&#34;https://www.stevenengelhardt.com/2024/11/08/move-semantics-for-idisposable/&#34;&gt;Move Semantics for IDisposable&lt;/a&gt;&#xA;I discovered a fatal flaw in its implementation: it is incompatible with &lt;code&gt;struct&lt;/code&gt;&#xA;memberwise copy semantics.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Friday 2024-11-08 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-08-friday-assorted-links/</link>
      <pubDate>Fri, 08 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-08-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, November 8:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.uber.com/blog/real-time-push-platform/&#34;&gt;Uber&amp;rsquo;s Real-Time Push Platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/data-mesh-principles.html&#34;&gt;Data Mesh Principles and Logical Architecture&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.heyal.co.uk/unit-testing-helm-charts/&#34;&gt;How to unit-test your helm charts with Golang&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rclone/rclone&#34;&gt;RClone: A command-line program to sync files and directories to and from different cloud storage providers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.scylladb.com/2017/10/05/io-access-methods-scylla/&#34;&gt;Different I/O Access Methods for Linux, What We Chose for ScyllaDB, and Why&lt;/a&gt;: This post predates io_uring which is probably the modern preference.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Move Semantics for IDisposable</title>
      <link>https://www.stevenengelhardt.com/2024/11/08/move-semantics-for-idisposable/</link>
      <pubDate>Fri, 08 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2024/11/08/move-semantics-for-idisposable/</guid>
      <description>&lt;p&gt;&lt;em&gt;See also &lt;a href=&#34;https://www.stevenengelhardt.com/2024/11/11/move-semantics-for-idisposable-part-2/&#34;&gt;Move Semantics for IDisposable Part 2&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;C++ 11 introduced the concept of move semantics to model transfer of ownership.&#xA;Rust includes transfer of ownership as a key component of its type system.&#xA;C# could benefit from something similar for &lt;code&gt;IDisposable&lt;/code&gt; types.  This blog&#xA;post explores some options on how to handle this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-11-07 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-07-thursday-assorted-links/</link>
      <pubDate>Thu, 07 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-07-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, November 7:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://boyter.org/posts/bloom-filter/&#34;&gt;Bloom Filters - Much, much more than a space efficient hashmap!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/how-netflix-scales-its-api-with-graphql-federation-part-1-ae3557c187e2&#34;&gt;How Netflix Scales its API with GraphQL Federation (Part 1)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/how-netflix-scales-its-api-with-graphql-federation-part-2-bbe71aaec44a&#34;&gt;How Netflix Scales its API with GraphQL Federation (Part 2)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/evolving-container-security-with-linux-user-namespaces-afbe3308c082&#34;&gt;Evolving Container Security With Linux User Namespaces&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/blog/engineering/data-management/datahub-popular-metadata-architectures-explained&#34;&gt;DataHub: Popular metadata architectures explained&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-11-06 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-06-wednesday-assorted-links/</link>
      <pubDate>Wed, 06 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-06-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, November 6:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/enterprise-software/devops/improving-how-we-deploy-github/&#34;&gt;Improving how we deploy GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/pinterest-engineering/scaling-cache-infrastructure-at-pinterest-422d6d294ece&#34;&gt;Scaling Cache Infrastructure at Pinterest&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://web.stanford.edu/~ouster/cgi-bin/papers/threads.pdf&#34;&gt;Why Threads Are A Bad Idea (for most purposes)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cockroachlabs.com/blog/how-we-built-spatial-indexing/&#34;&gt;How we built scalable spatial data and spatial indexing in CockroachDB&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://murphye.medium.com/serverless-cassandra-aws-keyspaces-and-azure-cosmos-db-in-comparison-e63d1bf94afb&#34;&gt;Serverless Cassandra: AWS Keyspaces and Azure Cosmos DB in Comparison&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-11-05 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-05-tuesday-assorted-links/</link>
      <pubDate>Tue, 05 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-05-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, November 5:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.threatmodelingmanifesto.org/&#34;&gt;Threat Modeling Manifesto&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://technology.doximity.com/articles/buildpacks-vs-dockerfiles&#34;&gt;Buildpacks vs Dockerfiles: Exploring the tradeoffs of building container images at scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/blogs/opensource/how-the-bottlerocket-build-system-works/&#34;&gt;How the Bottlerocket build system works&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.lawrencejones.dev/compress-everything/&#34;&gt;How we compress Pub/Sub messages and more, saving a load of money&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sudhir.io/the-big-little-guide-to-message-queues&#34;&gt;The Big Little Guide to Message Queues&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-11-04 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-04-monday-assorted-links/</link>
      <pubDate>Mon, 04 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-04-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, November 4:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/02/23/data-infrastructure/silent-data-corruption/&#34;&gt;Mitigating the effects of silent data corruption at scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sudolabs.com/insights/automated-release-process-for-lerna-monorepo&#34;&gt;Automated release process for Lerna monorepo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://phoenixnap.com/blog/devops-trends&#34;&gt;Top 10 DevOps Trends in 2024&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://nextlinklabs.com/resources/insights/kubernetes-ci-cd-gitlab-with-helm&#34;&gt;Building a Kubernetes CI/CD Pipeline with GitLab and Helm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://grpc.io/blog/wireshark/&#34;&gt;Analyzing gRPC messages using Wireshark&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-11-01 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/11/2024-11-01-friday-assorted-links/</link>
      <pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/11/2024-11-01-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, November 1:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.brendangregg.com/blog//2024-10-29/ai-flame-graphs.html&#34;&gt;AI Flame Graphs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://despairlabs.com/blog/posts/2024-10-27-openzfs-dedup-is-good-dont-use-it/&#34;&gt;OpenZFS deduplication is good now and you shouldn&amp;rsquo;t use it&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://opendal.apache.org/&#34;&gt;Apache OpenDAL: Open Data Access Layer: Access data freely&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://technicalwriting.dev/data/embeddings.html&#34;&gt;Embeddings are underrated&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Embeddings aren&amp;rsquo;t exactly new, but they have become much more widely accessible in the last couple years.&#xA;What embeddings offer to technical writers is the ability to discover connections between texts at&#xA;previously impossible scales.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-to-fail-at-microservices/&#34;&gt;How To Fail at Microservices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-10-31 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-31-thursday-assorted-links/</link>
      <pubDate>Thu, 31 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-31-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, October 31:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-future-of-apis-lessons-in-security-composability-ai/&#34;&gt;The Future of APIs: Lessons in Security, Composability, AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-apollo-makes-llms-more-reliable-with-graphql/&#34;&gt;How Apollo Makes LLMs More Reliable with GraphQL&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;GraphQL&amp;rsquo;s structured query language proves to be an ideal match for AI tools, offering&#xA;more reliable and focused results compared to broader LLM applications.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/oldnewthing/20241028-00/?p=110428&#34;&gt;How useful is the hint passed to the std::unordered_… collections?&lt;/a&gt;: An unsorted followup on &lt;a href=&#34;https://devblogs.microsoft.com/oldnewthing/20230522-00/?p=108226&#34;&gt;Speeding up the insertion of a sorted (or mostly-sorted) key list into a std::map or other ordered associative container&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.pinecone.io/learn/vector-database/&#34;&gt;What is a Vector Database &amp;amp; How Does it Work? Use Cases + Examples&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.confluent.io/learn/retrieval-augmented-generation-rag/&#34;&gt;What is Retrieval-Augmented Generation (RAG)?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-10-30 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-30-wednesday-assorted-links/</link>
      <pubDate>Wed, 30 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-30-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, October 30:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/finding-the-right-data-architecture-for-rag-pipelines/&#34;&gt;Finding the Right Data Architecture for RAG Pipelines&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Event streaming is ideal for RAG pipelines that feed generative AI applications&#xA;the contextual data they need to produce accurate, timely results.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-to-run-databases-on-kubernetes-an-8-step-guide/&#34;&gt;How to Run Databases on Kubernetes: An 8-Step Guide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/ai-code-assistants-are-moving-beyond-auto-complete-heres-whats-next/&#34;&gt;AI Code Assistants Are Moving Beyond Auto-Complete: Here&amp;rsquo;s What&amp;rsquo;s Next&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.memorysafety.org/blog/rustls-performance-outperforms/&#34;&gt;Rustls Outperforms OpenSSL and BoringSSL&lt;/a&gt;: Is there something intrinsic to Rust, or is this an artifact of more time spent on optimization?&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cerbos.dev/blog/zero-trust-authorization&#34;&gt;What is zero trust authorization?&lt;/a&gt;: This doesn&amp;rsquo;t seem novel to me &amp;ndash; it seems obvious and is how I&amp;rsquo;ve architected software for 15+ years.&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Never trust, always verify: The ZTA model presumes that no entity—be it a user, device, or software—warrants automatic confidence,&#xA;irrespective of their physical position or historical clearance levels. Each request for entry must undergo scrutiny.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-10-29 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-29-tuesday-assorted-links/</link>
      <pubDate>Tue, 29 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-29-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, October 29:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/internal-developer-portals-is-open-source-enough/&#34;&gt;Internal Developer Portals: Is Open Source Enough?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-to-stop-worrying-and-start-loving-databases-on-kubernetes/&#34;&gt;How To Stop Worrying and Start Loving Databases on Kubernetes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.mend.io/blog/all-about-rag-what-it-is-and-how-to-keep-it-secure/&#34;&gt;All About RAG: What It Is and How to Keep It Secure&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/platform-engineering-why-youre-doing-it-wrong/&#34;&gt;Platform Engineering: Why You’re Doing It Wrong&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/why-duplicating-environments-for-microservices-backfires/&#34;&gt;Why Duplicating Environments for Microservices Backfires&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-10-28 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-28-monday-assorted-links/</link>
      <pubDate>Mon, 28 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-28-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, October 28:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/10/22/security/ipls-privacy-preserving-storage-for-your-whatsapp-contacts/&#34;&gt;IPLS: Privacy-preserving storage for your WhatsApp contacts&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.unibas.ch/en/News-Events/News/Uni-Research/New-discovery-reveals-how-diatoms-capture-CO2-so-effectively-.html&#34;&gt;New discovery reveals how diatoms capture CO&lt;sub&gt;2&lt;/sub&gt; so effectively&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/&#34;&gt;What Color is Your Function?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/angulars-approach-to-partial-hydration/&#34;&gt;Angular’s Approach to Partial Hydration&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Rather than fully hydrate the application immediately, partial hydration allows developers to identify&#xA;portions of their application — maybe a footer or something that a user will not immediately need to&#xA;see — and rather than ship all of the JavaScript in the app, it &amp;ldquo;hydrates&amp;rdquo; only the parts that are&#xA;needed immediately.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/blogs/opensource/aws-welcomes-the-opensearch-foundation/&#34;&gt;AWS Welcomes the OpenSearch Software Foundation&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;OpenSearch, the popular open source, Apache 2.0-licensed, search and analytics suite, is celebrating a&#xA;significant milestone - transferring OpenSearch to the OpenSearch Software Foundation, a community-driven&#xA;initiative under the Linux Foundation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-10-25 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-25-friday-assorted-links/</link>
      <pubDate>Fri, 25 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-25-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, October 25:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/building-github-copilot-into-visual-studio/&#34;&gt;How we build GitHub Copilot into Visual Studio&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.moertel.com/posts/2024-08-23-sampling-with-sql.html&#34;&gt;Sampling with SQL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/10/basecamp-maker-37signals-says-its-cloud-exit-will-save-it-10m-over-5-years/&#34;&gt;Basecamp-maker 37Signals says its &amp;ldquo;cloud exit&amp;rdquo; will save it $10M over 5 years&lt;/a&gt;: The cloud is many things, but &amp;ldquo;cheap&amp;rdquo; is not one of them.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.ftc.gov/news-events/news/press-releases/2024/08/federal-trade-commission-announces-final-rule-banning-fake-reviews-testimonials&#34;&gt;Federal Trade Commission Announces Final Rule Banning Fake Reviews and Testimonials&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.forbes.com/sites/craigsmith/2024/10/16/department-of-anti-hype-no-china-hasnt-broken-military-encryption-with-quantum-computers/&#34;&gt;Debunking Hype: China Hasn&amp;rsquo;t Broken Military Encryption With Quantum&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-10-24 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-24-thursday-assorted-links/</link>
      <pubDate>Thu, 24 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-24-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, October 24:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://security.googleblog.com/2024/10/safer-with-google-advancing-memory.html&#34;&gt;Safer with Google: Advancing Memory Safety&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.rust-lang.org/2024/10/17/Rust-1.82.0.html&#34;&gt;Announcing Rust 1.82.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/aws-makes-etl-disappear-for-aurora-postgresql-dynamodb/&#34;&gt;AWS Makes ETL Disappear for Aurora PostgreSQL, DynamoDB&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;This week, Amazon Web Services introduced new integrations with its Amazon Aurora PostgreSQL and Amazon DynamoDB&#xA;database management services that allow them to share data with the Amazon Redshift data warehouse services,&#xA;without the need to set up ETL (Extract, Transform and Load) workflows between them.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.ftc.gov/news-events/news/press-releases/2024/10/federal-trade-commission-announces-final-click-cancel-rule-making-it-easier-consumers-end-recurring&#34;&gt;Federal Trade Commission Announces Final &amp;ldquo;Click-to-Cancel&amp;rdquo; Rule Making It Easier for Consumers to End Recurring Subscriptions and Memberships&lt;/a&gt;: Since Loper Bright Enterprises v. Raimondo overturned the Chevron doctrine, I expect this rule to be challenged immediately.  &lt;strong&gt;Update 2024-10-29&lt;/strong&gt;: &lt;a href=&#34;https://www.techdirt.com/2024/10/29/comcast-charter-sue-ftc-over-efforts-to-make-canceling-services-easier/&#34;&gt;Comcast, Charter Sue FTC Over Efforts To Make Canceling Services Easier&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/the-architects-guide-to-interoperability-in-the-ai-data-stack/&#34;&gt;The Architect&amp;rsquo;s Guide to Interoperability in the AI Data Stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-10-23 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-23-wednesday-assorted-links/</link>
      <pubDate>Wed, 23 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-23-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, October 23:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/10/startup-can-catch-identify-deepfake-video-in-realtime/&#34;&gt;Startup can identify deepfake video in real time&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/announcing-ibm-granite-ai-models-now-available-on-docker-hub/&#34;&gt;Announcing IBM Granite AI Models Now Available on Docker Hub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/graph-rag-how-to-squeeze-more-value-from-ai/&#34;&gt;Graph RAG: How To Squeeze More Value From AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.wired.com/story/kia-web-vulnerability-vehicle-hack-track/&#34;&gt;Millions of Vehicles Could Be Hacked and Tracked Thanks to a Simple Website Bug&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Researchers found a flaw in a Kia web portal that let them track millions of cars, unlock doors, and&#xA;start engines at will—the latest in a plague of web bugs that’s affected a dozen carmakers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://techcommunity.microsoft.com/t5/windows-os-platform-blog/openhcl-the-new-open-source-paravisor/ba-p/4273172&#34;&gt;OpenHCL: the new, open source paravisor&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A paravisor executes within the confidential trust boundary and provides the virtualization and device services&#xA;needed by a general-purpose operating system (OS), enabling existing VM workloads to execute securely without&#xA;requiring continual service of the OS to take advantage of innovative advances in confidential computing&#xA;technology. As confidential computing becomes available on more hardware platforms and evolves, the software&#xA;stack can keep VMs running seamlessly thanks to the paravisor, in much the same way other advances in&#xA;virtualization software enabled VMs to run seamlessly on ever evolving hardware.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-10-22 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-22-tuesday-assorted-links/</link>
      <pubDate>Tue, 22 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-22-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, October 22:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/system-text-json-in-dotnet-9/&#34;&gt;What’s new in System.Text.Json in .NET 9&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The 9.0 release of System.Text.Json includes many features, primarily with a focus on JSON schema and intelligent&#xA;application support. It also includes highly requested enhancements such as nullable reference type support,&#xA;customizing enum member names, out-of-order metadata deserialization and customizing serialization indentation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/oldnewthing/20241015-00/?p=110374&#34;&gt;A quick introduction to return address protection technologies&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/10/north-korean-hackers-use-newly-discovered-linux-malware-to-raid-atms/&#34;&gt;North Korean hackers use newly discovered Linux malware to raid ATMs&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The malware, tracked under the name FASTCash, is a remote access tool that gets installed on payment switches&#xA;inside compromised networks that handle payment card transactions.&lt;/p&gt;&#xA;&lt;p&gt;The purpose of FASTCash is to compromise a key switch inside the complex networks that broker payment&#xA;transactions among merchants and their banks on the one hand and, on the other, the payment card issuers&#xA;who must approve a transaction&amp;hellip; When a compromised card is used to make a fraudulent translation,&#xA;FASTCash tampers with the messages the switch receives from issuers before relaying it back to the&#xA;merchant bank. As a result, issuer messages denying the transaction are changed to approvals.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datastax.com/blog/building-knowledge-graphs-at-production-scale-for-genai&#34;&gt;Building Knowledge Graphs at Production Scale for GenAI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/docker-best-practices-using-arg-and-env-in-your-dockerfiles/&#34;&gt;Docker Best Practices: Using ARG and ENV in Your Dockerfiles&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;If you need to access a variable during the build process but not at runtime, use &lt;code&gt;ARG&lt;/code&gt;. If you need to access&#xA;the variable both during the build and at runtime, or only at runtime, use &lt;code&gt;ENV&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-10-21 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-21-monday-assorted-links/</link>
      <pubDate>Mon, 21 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-21-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, October 21:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/10/persistent-stealthy-linux-malware-has-infected-thousands-since-2021/&#34;&gt;Thousands of Linux systems infected by stealthy malware since 2021&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/10/ai-chatbots-can-read-and-write-invisible-text-creating-an-ideal-covert-channel/&#34;&gt;Invisible text that AI chatbots understand and humans can’t? Yep, it’s a thing.&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The invisible characters, the result of a quirk in the Unicode text encoding standard, create an ideal covert channel&#xA;that can make it easier for attackers to conceal malicious payloads fed into an LLM. The hidden text can similarly&#xA;obfuscate the exfiltration of passwords, financial information, or other secrets out of the same AI-powered bots.&#xA;Because the hidden text can be combined with normal text, users can unwittingly paste it into prompts.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/investigation-of-a-workbench-ui-latency-issue-faa017b4653d&#34;&gt;Investigation of a Workbench UI Latency Issue&lt;/a&gt;: Resolving a UI latency investigation requires from the UI all the way down to the Linux kernel.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://browser.engineering/index.html&#34;&gt;Web Browser Engineering by Pavel Panchekha &amp;amp; Chris Harrelson&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/drasi-project/drasi-platform&#34;&gt;Drasi&lt;/a&gt;: Drasi is a data processing platform that simplifies detecting changes in data and taking immediate action. It is a comprehensive solution that provides built-in capabilities to track system logs and change feeds for specific events, evaluate them for relevance, and automatically initiate appropriate reactions.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-10-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-17-thursday-assorted-links/</link>
      <pubDate>Thu, 17 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-17-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, October 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/10/china-possibly-hacking-us-lawful-access-backdoor.html&#34;&gt;China Possibly Hacking US &amp;ldquo;Lawful Access&amp;rdquo; Backdoor&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Wall Street Journal is reporting that Chinese hackers (Salt Typhoon) penetrated the networks of US broadband providers,&#xA;and might have accessed the backdoors that the federal government uses to execute court-authorized wiretap requests. Those&#xA;backdoors have been mandated by law—CALEA—since 1994.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/security/supply-chain-security/the-second-half-of-software-supply-chain-security-on-github/&#34;&gt;The second half of software supply chain security on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/09/for-the-first-time-since-1882-uk-will-have-no-coal-fired-power-plants/&#34;&gt;For the first time since 1882, UK will have no coal-fired power plants&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/introducing-netflix-timeseries-data-abstraction-layer-31552f6326f8&#34;&gt;Introducing Netflix&amp;rsquo;s TimeSeries Data Abstraction Layer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/10/two-never-before-seen-tools-from-same-group-infect-air-gapped-devices/&#34;&gt;Two never-before-seen tools, from same group, infect air-gapped devices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-10-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-18-friday-assorted-links/</link>
      <pubDate>Thu, 17 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-18-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, October 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/10/china-possibly-hacking-us-lawful-access-backdoor.html&#34;&gt;China Possibly Hacking US &amp;ldquo;Lawful Access&amp;rdquo; Backdoor&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Wall Street Journal is reporting that Chinese hackers (Salt Typhoon) penetrated the networks of US broadband providers,&#xA;and might have accessed the backdoors that the federal government uses to execute court-authorized wiretap requests. Those&#xA;backdoors have been mandated by law—CALEA—since 1994.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/security/supply-chain-security/the-second-half-of-software-supply-chain-security-on-github/&#34;&gt;The second half of software supply chain security on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/09/for-the-first-time-since-1882-uk-will-have-no-coal-fired-power-plants/&#34;&gt;For the first time since 1882, UK will have no coal-fired power plants&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/introducing-netflix-timeseries-data-abstraction-layer-31552f6326f8&#34;&gt;Introducing Netflix&amp;rsquo;s TimeSeries Data Abstraction Layer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/10/two-never-before-seen-tools-from-same-group-infect-air-gapped-devices/&#34;&gt;Two never-before-seen tools, from same group, infect air-gapped devices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-10-16 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-16-wednesday-assorted-links/</link>
      <pubDate>Wed, 16 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-16-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, October 16:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/news-insights/product-news/code-referencing-now-generally-available-in-github-copilot-and-with-microsoft-azure-ai/&#34;&gt;Code referencing now generally available in GitHub Copilot and with Microsoft Azure AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sdk/announcing-the-stable-release-of-the-azure-openai-library-for-net/&#34;&gt;Announcing the stable release of the Azure OpenAI library for .NET&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/microsoft-just-dropped-a-bunch-of-new-copilot-features&#34;&gt;Microsoft Just Dropped a Bunch of New Copilot Features&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/news/faster-integer-programming/&#34;&gt;Faster Integer Programming: A new analysis proves that all integer programs theoretically could be solved much faster than previously guaranteed.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/practice/confidential-container-groups/&#34;&gt;Confidential Container Groups: Implementing confidential computing on Azure container instances.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-10-15 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-15-tuesday-assorted-links/</link>
      <pubDate>Tue, 15 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-15-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, October 15:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/tech-policy/2024/10/artist-appeals-copyright-denial-for-prize-winning-ai-generated-work/&#34;&gt;Artist appeals copyright denial for prize-winning AI-generated work&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/tech-policy/2024/10/neighbors-sue-over-loud-bitcoin-mine/&#34;&gt;Neighbors sue over loud Bitcoin mine&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Hum from 300-megawatt facility allegedly causing stress, lack of sleep.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/open-source/git/highlights-from-git-2-47/&#34;&gt;Highlights from Git 2.47&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.python.org/3.13/whatsnew/3.13.html&#34;&gt;What’s New In Python 3.13&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/tech-policy/2024/10/reports-china-hacked-verizon-and-att-may-have-accessed-us-wiretap-systems/&#34;&gt;Reports: China hacked Verizon and AT&amp;amp;T, may have accessed US wiretap systems&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-10-14 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-14-monday-assorted-links/</link>
      <pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-14-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, October 14:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/10/attackers-exploit-critical-vulnerability-recently-patched-in-zimbra-servers/&#34;&gt;Attackers exploit critical Zimbra vulnerability using cc’d email addresses&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/blogcacm/leveraging-graph-databases-for-fraud-detection-in-financial-systems/&#34;&gt;Leveraging Graph Databases for Fraud Detection in Financial Systems&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Graph databases reveal patterns and relationships that would otherwise be hidden, allowing financial institutions to detect fraud faster and more efficiently.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2024/10/microsofts-new-copilot-vision-ai-experiment-can-see-what-you-browse/&#34;&gt;Microsoft’s new &amp;ldquo;Copilot Vision&amp;rdquo; AI experiment can see what you browse&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/10/the-more-sophisticated-ai-models-get-the-more-likely-they-are-to-lie/&#34;&gt;The more sophisticated AI models get, the more likely they are to lie&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.cloudflare.com/how-cloudflare-auto-mitigated-world-record-3-8-tbps-ddos-attack/&#34;&gt;How Cloudflare auto-mitigated world record 3.8 Tbps DDoS attack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-10-02 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-02-wednesday-assorted-links/</link>
      <pubDate>Wed, 02 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-02-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, October 2:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://middlewarehq.com/blog/nodejs-dora-metrics-faster-deployments-slower-merge-times&#34;&gt;Node.js Dora Metrics: Faster Deployments, Slower Merge Times&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://technology.riotgames.com/news/taxonomy-tech-debt&#34;&gt;A Taxonomy of Tech Debt&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blogs.gentoo.org/mgorny/2024/09/28/the-perils-of-transition-to-64-bit-time_t/&#34;&gt;The perils of transition to 64-bit time_t&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-10-01 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/10/2024-10-01-tuesday-assorted-links/</link>
      <pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/10/2024-10-01-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, October 1:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/09/false-memories-planted-in-chatgpt-give-hacker-persistent-exfiltration-channel/&#34;&gt;Hacker plants false memories in ChatGPT to steal user data in perpetuity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/getting-started-with-testing-and-dotnet-aspire/&#34;&gt;Getting started with testing and .NET Aspire&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/open-source/social-impact/the-10-best-tools-to-green-your-software/&#34;&gt;The 10 best tools to green your software&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.google/technology/ai/notebooklm-google-ai/&#34;&gt;Introducing NotebookLM&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;An AI-first notebook, grounded in your own documents, designed to help you gain insights faster.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.google/technology/ai/notebooklm-audio-overviews/&#34;&gt;NotebookLM now lets you listen to a conversation about your sources&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Our new Audio Overview feature can turn documents, slides, charts and more into engaging discussions with one click.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-09-30 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-30-monday-assorted-links/</link>
      <pubDate>Mon, 30 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-30-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, September 30:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/984599/&#34;&gt;Changes coming in PostgreSQL 17&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://security.googleblog.com/2024/09/eliminating-memory-safety-vulnerabilities-Android.html&#34;&gt;Eliminating Memory Safety Vulnerabilities at the Source&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-CVSS-9.9-Rating&#34;&gt;Unauthenticated RCE Flaw With CVSS 9.9 Rating For Linux Systems Affects CUPS&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A remote unauthenticated attacker can silently replace existing printers&#39;&#xA;(or install new ones) IPP urls with a malicious one, resulting in arbitrary&#xA;command execution (on the computer) when a print job is started (from that&#xA;computer).&amp;quot;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/09/nist-recommends-some-common-sense-password-rules.html&#34;&gt;NIST Recommends Some Common-Sense Password Rules&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/09/microsoft-details-security-privacy-overhaul-for-windows-recall-ahead-of-relaunch/&#34;&gt;Microsoft details security/privacy overhaul for Windows Recall ahead of relaunch&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-09-24 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-24-tuesday-assorted-links/</link>
      <pubDate>Tue, 24 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-24-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, September 24:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=azJm_Y2nbAI&#34;&gt;Let’s Build an Incremental Source Generator With Roslyn, by Stefan Pölz&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/09/vaporizing-plastics-recycles-them-into-nothing-but-gas/&#34;&gt;Vaporizing plastics recycles them into nothing but gas&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://techcommunity.microsoft.com/t5/windows-os-platform-blog/openhcl-evolving-azure-s-virtualization-model/ba-p/4248345&#34;&gt;OpenHCL: Evolving Azure’s virtualization model&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Azure Boost is a revolutionary accelerator system designed by Microsoft that offloads server virtualization&#xA;processes traditionally performed by the hypervisor and host OS onto purpose-built software and hardware.&#xA;This offloading frees up CPU resources for virtual machines, resulting in improved performance and a secure&#xA;foundation for your cloud workloads.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mmoemulator.com/p/going-super-sonic-with-asio/&#34;&gt;Going Super Sonic with Asio: Gotta go fast! Lessons learned for squeezing the most out of Asio for your application&amp;rsquo;s networking.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/09/grid-scale-batteries-theyre-not-just-lithium/&#34;&gt;Grid-scale batteries: They&amp;rsquo;re not just lithium&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;When size and weight don&amp;rsquo;t matter, lots of other battery chemistries can work.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-09-23 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-23-monday-assorted-links/</link>
      <pubDate>Mon, 23 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-23-monday-assorted-links/</guid>
      <description>&lt;p&gt;Today is C++ instrumentation day!&lt;/p&gt;&#xA;&lt;p&gt;Assorted links for Monday, September 23:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html&#34;&gt;Program Instrumentation Options in gcc&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/wolfpld/tracy&#34;&gt;Tracy Profiler&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/google/sanitizers/wiki/AddressSanitizer&#34;&gt;AddressSanitizer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/google/sanitizers/wiki/MemorySanitizer&#34;&gt;MemorySanitizer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://valgrind.org/&#34;&gt;Valgrind&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-09-20 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-20-friday-assorted-links/</link>
      <pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-20-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, September 20:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/02/09/developer-tools/minesweeper/&#34;&gt;Minesweeper automates root cause analysis as a first-line defense against bugs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/02/22/production-engineering/foqs-scaling-a-distributed-priority-queue/&#34;&gt;FOQS: Scaling a distributed priority queue&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/02/17/developer-tools/fix-fast/&#34;&gt;Faster, more efficient systems for finding and fixing regressions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.bazel.build/2021/02/08/rules-fuzzing.html&#34;&gt;Writing fuzz tests with ease using Bazel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/mezzfs-mounting-object-storage-in-netflixs-media-processing-platform-cda01c446ba&#34;&gt;MezzFS — Mounting object storage in Netflix’s media processing platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-09-19 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-19-thursday-assorted-links/</link>
      <pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-19-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, September 19:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/legacy-modernization-gen-ai.html&#34;&gt;Legacy Modernization meets GenAI&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;So far, most attention to Generative Artificial Intelligence (GenAI) in software&#xA;development is on generating code. But we believe there is as much, if not more,&#xA;value in understanding existing code - particularly long-lived, large, and complex&#xA;legacy systems.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/871113/&#34;&gt;User-space interrupts&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The term &amp;ldquo;interrupt&amp;rdquo; brings to mind a signal that originates in the hardware and which is handled&#xA;in the kernel; even software interrupts are a kernel concept. But there is, it seems, a use case&#xA;for enabling user-space processes to send interrupts directly to each other.&lt;/p&gt;&#xA;&lt;p&gt;At its core, Mehta began, the user-space interrupts (or simply &amp;ldquo;user interrupts&amp;rdquo;) feature is a&#xA;fast way to do event signaling. It delivers signals directly to user space, bypassing the kernel&#xA;to achieve lower latency.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infinitepartitions.com/art001.html&#34;&gt;Dissecting the GZIP format&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.x.com/engineering/en_us/topics/infrastructure/2021/storing-and-retrieving-millions-of-ad-impressions-per-second&#34;&gt;Storing and retrieving millions of ad impressions per second&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2021/03/01/sacrificial-architecture-learning-from-abandoned-systems/&#34;&gt;Sacrificial architecture: Learning from abandoned systems&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-09-18 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-18-wednesday-assorted-links/</link>
      <pubDate>Wed, 18 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-18-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, September 18:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/09/microsoft-adds-quantum-resistant-algorithms-to-its-core-crypto-library/&#34;&gt;As quantum computing threats loom, Microsoft updates its core crypto library&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Microsoft has updated a key cryptographic library with two new encryption algorithms designed to withstand attacks from quantum computers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/09/openais-new-reasoning-ai-models-are-here-o1-preview-and-o1-mini/&#34;&gt;OpenAI’s new &amp;ldquo;reasoning&amp;rdquo; AI models are here: o1-preview and o1-mini&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;OpenAI finally unveiled its rumored &amp;ldquo;Strawberry&amp;rdquo; AI language model on Thursday, claiming significant improvements in what it calls&#xA;&amp;ldquo;reasoning&amp;rdquo; and problem-solving capabilities over previous large language models (LLMs). Formally named &amp;ldquo;OpenAI o1,&amp;rdquo; the model&#xA;family will initially launch in two forms, o1-preview and o1-mini, available today for ChatGPT Plus and certain API users.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://chadnauseam.com/coding/pltd/the-good-and-bad-of-cpp-as-a-rust-dev&#34;&gt;The Good and Bad of C++ As a Rust Dev&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/secure-by-design-for-ai/&#34;&gt;Secure by Design for AI: Building Resilient Systems from the Ground Up&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/09/mice-made-transparent-with-a-dye-used-in-doritos/&#34;&gt;Mice made transparent with a dye used in Doritos&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;But now, a team of Stanford University scientists has finally found an agent that can reversibly make skin transparent&#xA;without damaging it. This agent was tartrazine, a popular yellow-orange food dye called FD&amp;amp;C Yellow 5 that is notably&#xA;used for coloring Doritos.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-09-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-17-tuesday-assorted-links/</link>
      <pubDate>Tue, 17 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-17-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Today is a .NET focused day.&lt;/p&gt;&#xA;&lt;p&gt;Assorted links for Tuesday, September 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-9/&#34;&gt;Performance Improvements in .NET 9&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/how-async-await-really-works/&#34;&gt;How Async/Await Really Works in C#&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://maoni0.medium.com/dynamically-adapting-to-application-sizes-2d72fcb6f1ea&#34;&gt;Dynamically Adapting To Application Sizes&lt;/a&gt;: A blog post about advanced garbage collection techniques.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://andrewlock.net/preventing-breaking-changes-in-public-apis-with-publicapigenerator/&#34;&gt;Preventing breaking changes in public APIs with PublicApiGenerator&lt;/a&gt;.  See also &lt;a href=&#34;https://medium.com/workleap/preventing-breaking-changes-in-net-class-libraries-e61ae93b1b46&#34;&gt;Preventing breaking changes in .NET class libraries&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=5KdICNWOfEQ&#34;&gt;A Complete .NET Developer&amp;rsquo;s Guide to Span with Stephen Toub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-09-16 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-16-monday-assorted-links/</link>
      <pubDate>Mon, 16 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-16-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, September 16:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.cloudflare.com/pingora-saving-compute-1-percent-at-a-time/&#34;&gt;A good day to trie-hard: saving compute 1% at a time&lt;/a&gt;: Related repository: &lt;a href=&#34;https://github.com/cloudflare/trie-hard&#34;&gt;GitHub cloudflare/trie-hard&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/noisy-neighbor-detection-with-ebpf-64b1f4b3bbdd&#34;&gt;Noisy Neighbor Detection with eBPF&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/pushy-to-the-limit-evolving-netflixs-websocket-proxy-for-the-future-b468bc0ff658&#34;&gt;Pushy to the Limit: Evolving Netflix’s WebSocket proxy for the future&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.build/lint&#34;&gt;Announcing Linting for Bazel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/fix-c-warnings-and-errors-with-copilot-introducing-ai-assisted-code-fixes-in-visual-studio/&#34;&gt;Fix C++ warnings and errors with Copilot: Introducing AI-Assisted Code Fixes in Visual Studio&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-09-13 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-13-friday-assorted-links/</link>
      <pubDate>Fri, 13 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-13-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, September 13:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/prevent-critical-bugs-with-msvc-code-analysis/&#34;&gt;Prevent Critical Bugs with MSVC Code Analysis&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://clang.llvm.org/docs/RealtimeSanitizer.html&#34;&gt;Clang documentation: RealtimeSanitizer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/practice/trustworthy-ai-using-confidential-federated-learning/&#34;&gt;Trustworthy AI Using Confidential Federated Learning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/blogcacm/fort-knox-your-data-a-guide-to-access-controls/&#34;&gt;Fort Knox Your Data: A Guide to Access Controls&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2024/09/10/gen-ai-llm-create-test-developers-coding-software-code-quality/&#34;&gt;One of the best ways to get value for AI coding tools: generating tests&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-09-12 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-12-thursday-assorted-links/</link>
      <pubDate>Thu, 12 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-12-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, September 12:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://quuxplusone.github.io/blog/2024/08/16/libstdcxx-noexcept-hash/&#34;&gt;&lt;code&gt;noexcept&lt;/code&gt; affects libstdc++’s &lt;code&gt;unordered_set&lt;/code&gt;&lt;/a&gt;: It may be worthwhile to investigate alternative data structure implementations like &lt;a href=&#34;https://www.boost.org/doc/libs/1_85_0/libs/unordered/doc/html/unordered.html&#34;&gt;Boost.Unordered&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;GNU libstdc++’s hash-based associative containers change the struct layout of their nodes depending on the noexceptness of your hash function&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/08/26/data-infrastructure/retinas-real-time-infrastructure-accounting-for-sustainability/&#34;&gt;RETINAS: Real-Time Infrastructure Accounting for Sustainability&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We are introducing a new metric &amp;ndash; real-time server fleet utilization effectiveness —- as part of the RETINAS initiative to help reduce&#xA;emissions and achieve net zero emissions across our value chain in 2030.  This new metric allows us to measure server resource usage&#xA;(e.g., compute, storage) and efficiency in our large-scale data center server fleet in near real-time.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/08/27/security/privacy-aware-infrastructure-purpose-limitation-meta/&#34;&gt;How Meta enforces purpose limitation via Privacy Aware Infrastructure at scale&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Privacy Aware Infrastructure (PAI) offers efficient and reliable first-class privacy constructs embedded in Meta infrastructure to&#xA;address complex privacy issues. For example, we built Policy Zones that apply across our infrastructure to address restrictions on&#xA;data, such as using it only for allowed purposes, providing strong guarantees for limiting the purposes of its processing.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.kernel.org/userspace-api/landlock.html&#34;&gt;Landlock: unprivileged access control&lt;/a&gt;: Landlock is a userspace API provided by the Linux kernel.&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The goal of Landlock is to enable to restrict ambient rights (e.g. global filesystem or network access) for a set of processes.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Intel-EVEX-Faster-strnlen&#34;&gt;Intel Further Speeds Up strnlen() In The GNU C Library For Recent Intel/AMD CPUs&lt;/a&gt;: It&amp;rsquo;s&#xA;incredible that we&amp;rsquo;re &lt;em&gt;still&lt;/em&gt; finding performance improvements in venerable functions like &lt;code&gt;strlen()&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-09-11 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-11-wednesday-assorted-links/</link>
      <pubDate>Wed, 11 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-11-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, September 11:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/building-a-rule-based-platform-to-manage-netflix-membership-skus-at-scale-e3c0f82aa7bc&#34;&gt;Building a Rule-Based Platform to Manage Netflix Membership SKUs at Scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/growth-engineering-at-netflix-creating-a-scalable-offers-platform-69330136dd87&#34;&gt;Growth Engineering at Netflix &amp;ndash; Creating a Scalable Offers Platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/edge-authentication-and-token-agnostic-identity-propagation-514e47e0b602&#34;&gt;Edge Authentication and Token-Agnostic Identity Propagation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/the-netflix-cosmos-platform-35c14d9351ad&#34;&gt;The Netflix Cosmos Platform: Orchestrated Functions as a Microservice&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/beyond-rest-1b76f7c20ef6&#34;&gt;Beyond REST: Rapid Development with GraphQL Microservices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-09-10 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-10-tuesday-assorted-links/</link>
      <pubDate>Tue, 10 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-10-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, September 10:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.ganets.ky/PrettyPrinter/&#34;&gt;Visualizing &lt;code&gt;boost::unordered_map&lt;/code&gt; in GDB, with pretty-printer customization points&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.cryptographyengineering.com/2024/08/25/telegram-is-not-really-an-encrypted-messaging-app/&#34;&gt;Is Telegram really an encrypted messaging app?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;From your perspective as a user, an “encrypted messenger” ensures that each time you start a conversation, your messages will only be readable by the folks you intend to speak with&amp;hellip;  Telegram clearly fails to meet this stronger definition for a simple reason: it does not end-to-end encrypt conversations by default. If you want to use end-to-end encryption in Telegram, you must manually activate an optional end-to-end encryption feature called &amp;ldquo;Secret Chats&amp;rdquo; for every single private conversation you want to have.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.atmosera.com/blog/threat-monitoring-best-practices-for-security/&#34;&gt;Threat Monitoring: Best Practices for Security&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/FUSE-IDMAPPED-Mounts-6.12&#34;&gt;FUSE Adding IDMAPPED Mounts Support In Linux 6.12&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/09/australia-threatens-to-force-companies-to-break-encryption.html&#34;&gt;Australia Threatens to Force Companies to Break Encryption&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-09-09 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/09/2024-09-09-monday-assorted-links/</link>
      <pubDate>Mon, 09 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/09/2024-09-09-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, September 9:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/blogcacm/a-guide-to-managed-backup-and-disaster-recovery/&#34;&gt;A Guide to Managed Backup and Disaster Recovery&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.allthingsdistributed.com/2024/08/continuous-reinvention-a-brief-history-of-block-storage-at-aws.html&#34;&gt;Continuous reinvention: A brief history of block storage at AWS&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;While the much celebrated ideal of a “full stack engineer” is valuable, in deep and complex systems it’s often even more valuable to create cohorts of experts who can collaborate and get really creative across the entire stack and all their individual areas of depth.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.rfleury.com/p/untangling-lifetimes-the-arena-allocator&#34;&gt;Untangling Lifetimes: The Arena Allocator&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/fitness-functions-data-products.html&#34;&gt;Governing data products using fitness functions&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Fitness functions are a powerful automated governance technique we&amp;rsquo;ve applied to data products within the context of a Data Mesh. Since data products serve as the foundational building blocks (architectural quanta) of a data mesh, ensuring robust governance around them significantly increases the chances of a successful data mesh transformation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://vitaut.net/posts/2024/binary-size/&#34;&gt;Honey, I shrunk {fmt}: bringing binary size to 14k and ditching the C++ runtime&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-08-30 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-30-friday-assorted-links/</link>
      <pubDate>Fri, 30 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-30-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, August 30:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-Rust-Sched-To-eBPF&#34;&gt;Reimplementing A Linux Rust Scheduler In eBPF Shows Very Promising Results&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In conclusion, prototyping new schedulers in user-space using Rust and then re-implementing them in BPF can be an effective workflow for designing new specialized schedulers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/introducing-docker-build-checks/&#34;&gt;Introducing Docker Build Checks: Optimize Dockerfiles with Best Practices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/docker-scout-health-scores-security-grading-for-container-images/&#34;&gt;Docker Scout Health Scores: Security Grading for Container Images in Your Docker Hub Repo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/research/50-years-of-queries/&#34;&gt;50 Years of Queries&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A discussion of the evolution of the database industry over the last half century, and why the relational database concepts introduced by E. F. Codd have proven so resilient over several decades.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/blogcacm/operational-and-analytic-data-cycles/&#34;&gt;Operational and Analytic Data Cycles&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The relationship between operational and analytic data systems, and the challenges facing their implementation and management.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-08-29 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-29-thursday-assorted-links/</link>
      <pubDate>Thu, 29 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-29-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, August 29:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bleepingcomputer.com/news/microsoft/zero-click-windows-tcp-ip-rce-impacts-all-systems-with-ipv6-enabled-patch-now/&#34;&gt;Zero-click Windows TCP/IP RCE impacts all systems with IPv6 enabled, patch now&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/open-source/social-impact/automating-open-source-how-ersilia-distributes-ai-models-to-advance-global-health-equity/&#34;&gt;Automating open source: How Ersilia distributes AI models to advance global health equity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/java-21-virtual-threads-dude-wheres-my-lock-3052540e231d&#34;&gt;Java 21 Virtual Threads - Dude, Where’s My Lock?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-6.11-VFS-Fix-5-Year-Bug&#34;&gt;Linux VFS Fix For 5 Year Old Bug That Could Cause Corruption, Security Issues Or Crash&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/OpenZFS-2.2.5-Released&#34;&gt;OpenZFS 2.2.5 Released With Linux 6.9 Support, Some Linux 6.10 Bits&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-08-28 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-28-wednesday-assorted-links/</link>
      <pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-28-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, August 28:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/08/14/production-engineering/how-meta-animates-ai-generated-images-at-scale/&#34;&gt;How Meta animates AI-generated images at scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.livescience.com/technology/artificial-intelligence/new-ai-algorithm-flags-deepfakes-with-98-accuracy-better-than-any-other-tool-out-there-right-now&#34;&gt;New AI algorithm flags deepfakes with 98% accuracy — better than any other tool out there right now&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.mend.io/blog/more-than-100k-sites-impacted-by-polyfill-supply-chain-attack/&#34;&gt;More than 100K sites impacted by Polyfill supply chain attack&lt;/a&gt; &amp;ndash; An important way to protect your supply chain is to lock your dependency to a specific version + hash (e.g. SHA256).  This way the dependency can&amp;rsquo;t be backdoored without you detecting it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/07/providing-security-updates-to-automobile-software.html&#34;&gt;Providing Security Updates to Automobile Software&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/08/nist-releases-first-post-quantum-encryption-algorithms.html&#34;&gt;NIST Releases First Post-Quantum Encryption Algorithms&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-08-27 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-27-tuesday-assorted-links/</link>
      <pubDate>Tue, 27 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-27-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, August 27:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/ise/semantic-routing-using-azure-ai-search/&#34;&gt;Semantic Router using Azure AI Search&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/engineering/engineering-principles/the-ultimate-guide-to-developer-happiness/&#34;&gt;The ultimate guide to developer happiness: Five actionable tips and strategies to supercharge developer happiness—and a more innovative workplace.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/azure-ai-model-catalog-dotnet-inference-sdk/&#34;&gt;Introducing the Azure AI Inference SDK: Access More AI Models with the Azure AI Model Catalog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/ai-and-ml/generative-ai/what-are-ai-agents-and-why-do-they-matter/&#34;&gt;What are AI agents and why do they matter?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/news-insights/product-news/secure-code-more-than-three-times-faster-with-copilot-autofix/&#34;&gt;Found means fixed: Secure code more than three times faster with Copilot Autofix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-08-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-26-monday-assorted-links/</link>
      <pubDate>Mon, 26 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-26-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, August 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.rust-lang.org/2024/08/12/Project-goals.html&#34;&gt;Rust Project goals for 2024&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://muratbuffalo.blogspot.com/2024/08/making-database-systems-usable.html&#34;&gt;Making database systems usable&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.alexreichert.com/blog/finishing&#34;&gt;On finishing things&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://unit42.paloaltonetworks.com/unit-42-ransomware-leak-site-data-analysis/&#34;&gt;Ransomware Review: First Half of 2024&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.build/rulesjs-2&#34;&gt;rules_js 2.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-08-16 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-16-friday-assorted-links/</link>
      <pubDate>Fri, 16 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-16-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, August 16:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.confluent.io/blog/data-dichotomy-rethinking-the-way-we-treat-data-and-services/&#34;&gt;The Data Dichotomy: Rethinking the Way We Treat Data and Services&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://next.redhat.com/2021/03/09/introducing-sigstore-software-signing-for-the-masses/&#34;&gt;Introducing sigstore: software signing for the masses&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.palark.com/chaos-engineering-in-kubernetes-open-source-tools/&#34;&gt;Open Source solutions for chaos engineering in Kubernetes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.gitguardian.com/top-10-file-extensions/&#34;&gt;File types that most commonly contain sensitive information&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.marcolancini.it/2021/blog-security-logging-cloud-environments-aws/&#34;&gt;Security Logging in Cloud Environments - AWS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-08-15 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-15-thursday-assorted-links/</link>
      <pubDate>Thu, 15 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-15-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, August 15:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.x.com/engineering/en_us/topics/open-source/2021/dropping-cache-didnt-drop-cache&#34;&gt;Dropping cache didn&amp;rsquo;t drop cache&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.cash.app/software-security-at-rocketship-pace&#34;&gt;Software Security at Rocketship Pace&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.ncsc.gov.uk/blog-post/what-exactly-should-we-be-logging&#34;&gt;What exactly should we be logging?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kellyshortridge.com/blog/posts/security-decision-trees-with-graphviz/&#34;&gt;Creating Security Decision Trees With Graphviz&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.openpolicyagent.org/&#34;&gt;Open Policy Agent: Policy-based control for cloud native environments&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-08-14 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-14-wednesday-assorted-links/</link>
      <pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-14-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, August 14:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.x.com/engineering/en_us/topics/insights/2021/fusing-elasticsearch-with-neural-networks-to-identify-data&#34;&gt;Fusing Elasticsearch with neural networks to identify data&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2021/04/28/a-technical-deep-dive-on-unified-search/&#34;&gt;Access broader knowledge with Unified Search&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.x.com/engineering/en_us/topics/infrastructure/2021/adopting-rocksdb-within-manhattan&#34;&gt;Adopting RocksDB within Manhattan&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.allthingsdistributed.com/2021/04/s3-strong-consistency.html&#34;&gt;Diving Deep on S3 Consistency&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/netflix-drive-a607538c3055&#34;&gt;Netflix Drive: A file and folder interface for Netflix Cloud Services&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-08-13 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-13-tuesday-assorted-links/</link>
      <pubDate>Tue, 13 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-13-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, August 13:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/04/27/developer-tools/reverse-debugging/&#34;&gt;Reverse debugging at scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://polarsquad.com/blog/why-you-need-a-platform-team-for-kubernetes&#34;&gt;Why you need a platform team for Kubernetes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://opensource.microsoft.com/blog/2021/05/10/making-ebpf-work-on-windows/&#34;&gt;Making eBPF work on Windows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.thoughtworks.com/insights/blog/infrastructure-pipelines&#34;&gt;Infrastructure Pipelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/04/29/developer-tools/rust/&#34;&gt;A brief history of Rust at Facebook&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-08-12 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-12-monday-assorted-links/</link>
      <pubDate>Mon, 12 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-12-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, August 12:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/adding-dotnet-aspire-to-your-existing-dotnet-apps/&#34;&gt;Adding .NET Aspire to your existing .NET apps&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;But .NET Aspire is not just about cutting-edge technology and green-field apps; it’s also about making your current applications more straightforward. With .NET Aspire, you can streamline the startup process, improve monitoring, and increase the reliability of your applications.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.rust-lang.org/2024/08/08/Rust-1.80.1.html&#34;&gt;Announcing Rust 1.80.1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;.NET Cancellation by Stephen Cleary:&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.stephencleary.com/2022/02/cancellation-1-overview.html&#34;&gt;Cancellation, Part 1: Overview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.stephencleary.com/2022/03/cancellation-2-requesting-cancellation.html&#34;&gt;Cancellation, Part 2: Requesting Cancellation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.stephencleary.com/2022/03/cancellation-3-detecting-cancellation.html&#34;&gt;Cancellation, Part 3: Detecting Cancellation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.stephencleary.com/2022/03/cancellation-4-polling.html&#34;&gt;Cancellation, Part 4: Polling&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.stephencleary.com/2024/08/cancellation-5-registration.html&#34;&gt;Cancellation, Part 5: Registration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://techcommunity.microsoft.com/t5/windows-os-platform-blog/networking-improvements-in-windows-server-2025/ba-p/4173564&#34;&gt;Networking improvements in Windows Server 2025&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.etsy.com/codeascraft/machine-learning-in-content-moderation-at-etsy&#34;&gt;Machine Learning in Content Moderation at Etsy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-08-07 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-07-wednesday-assorted-links/</link>
      <pubDate>Wed, 07 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-07-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, August 7:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/07/us-solar-production-soars-by-25-percent-in-just-one-year/&#34;&gt;US solar production soars by 25 percent in just one year&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://techcommunity.microsoft.com/t5/windows-os-platform-blog/securely-design-your-applications-and-protect-your-sensitive/ba-p/4179543&#34;&gt;Securely design your applications and protect your sensitive data with VBS enclaves&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Virtualization Based Security (VBS) is the core feature of Windows used to the high value&#xA;secrets stored within Windows (e.g., Credential Guard). VBS utilizes the Hyper-V hypervisor&#xA;to create an environment that is higher privileged than the rest of the system kernel. Like&#xA;VM isolation, the hypervisor sets memory protections in the second level address tables and&#xA;IOMMU tables to isolate this environment from the rest of the system kernel.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.politico.com/news/2024/07/26/apple-biden-ai-00171502&#34;&gt;Apple signs on to Biden’s responsible AI guidelines&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Apple now joins 15 other major tech companies, including Amazon, Anthropic, Google,&#xA;Inflection, Meta, Microsoft and OpenAI, in committing to responsible AI development&#xA;and rollout.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3199.htm&#34;&gt;N3199: Improved &lt;code&gt;__attribute__((cleanup))&lt;/code&gt; Through &lt;code&gt;defer&lt;/code&gt;&lt;/a&gt;: A proposal&#xA;for a &lt;code&gt;defer&lt;/code&gt; keyword in C.  See also &lt;a href=&#34;https://gustedt.gitlabpages.inria.fr/defer/&#34;&gt;&lt;code&gt;defer&lt;/code&gt; reference implementation for C&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://basit.pro/cpp-object-lifecycle/&#34;&gt;The C++ Object Lifecycle&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-08-06 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-06-tuesday-assorted-links/</link>
      <pubDate>Tue, 06 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-06-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, August 6:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.techradar.com/pro/security/github-token-leak-could-have-put-the-entire-python-language-at-risk&#34;&gt;A GitHub token leak could have put the entire Python language at risk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2024/08/05/this-developer-tool-is-40-years-old-can-it-be-improved/&#34;&gt;This developer tool is 40 years old: can it be improved?&lt;/a&gt; &amp;ndash; can we design a better &lt;code&gt;diff&lt;/code&gt;?&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/08/05/data-center-engineering/dcperf-open-source-benchmark-suite-for-hyperscale-compute-applications/&#34;&gt;DCPerf: An open source benchmark suite for hyperscale compute applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/investigation-of-a-cross-regional-network-performance-issue-422d6218fdf1&#34;&gt;Investigation of a Cross-regional Network Performance Issue&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bitsaboutmoney.com/archive/crowdstrike-bug-hit-banks-hard/&#34;&gt;Why the CrowdStrike bug hit banks hard&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-08-01 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/08/2024-08-01-thursday-assorted-links/</link>
      <pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/08/2024-08-01-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, August 1:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/07/the-first-gpt-4-class-ai-model-anyone-can-download-has-arrived-llama-405b/&#34;&gt;The first GPT-4-class AI model anyone can download has arrived: Llama 405B&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-6.11-EXT4&#34;&gt;EXT4 Has A Very Nice Performance Optimization For Linux 6.11&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-6.11-Lands-getrandom-vDSO&#34;&gt;Linux 6.11 Lands Support For getrandom() In The vDSO&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://people.kernel.org/gustavoars/how-to-use-the-new-counted_by-attribute-in-c-and-linux&#34;&gt;How to use the new counted_by attribute in C (and Linux)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-07-31 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-31-wednesday-assorted-links/</link>
      <pubDate>Wed, 31 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-31-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, July 31:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/07/10/data-infrastructure/machine-learning-ml-prediction-robustness-meta/&#34;&gt;Meta&amp;rsquo;s approach to machine learning prediction robustness&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/news-insights/policy-news-and-insights/advancing-responsible-practices-for-open-source-ai/&#34;&gt;Advancing responsible practices for open source AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/07/16/developer-tools/ai-lab-secrets-machine-learning-engineers-moving-fast/&#34;&gt;AI Lab: The secrets to keeping machine learning engineers moving fast&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/systemd-Auto-Boot-Assessment&#34;&gt;systemd Talks Up Automatic Boot Assessment In Light Of The Crowdstrike-Microsoft Outage&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/GNU-C-Library-Glibc-2.40&#34;&gt;GNU C Library 2.40 Released With New C23 Features &amp;amp; New Performance Tunables&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-07-30 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-30-tuesday-assorted-links/</link>
      <pubDate>Tue, 30 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-30-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, July 30:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/add-ai-to-your-dotnet-apps-easily-with-prompty/&#34;&gt;Add AI to Your .NET Apps Easily with Prompty&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/07/google-will-not-disable-tracking-cookies-in-chrome-after-years-of-trying/&#34;&gt;Google halts its 4-plus-year plan to turn off tracking cookies by default in Chrome&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/tech-policy/2024/07/fcc-details-att-screwups-behind-outage-that-blocked-25000-calls-to-911/&#34;&gt;AT&amp;amp;T failed to test disastrous update that kicked all devices off network&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.brendangregg.com/blog/2024-07-22/no-more-blue-fridays.html&#34;&gt;No More Blue Fridays&lt;/a&gt;: It used to be that reliability&#xA;was achieved by moving code out of kernel mode and into user mode.  eBPF suggests an alternative: allow code to run in kernel&#xA;mode, but in a sandbox.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-07-29 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-29-monday-assorted-links/</link>
      <pubDate>Mon, 29 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-29-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, July 29:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://rr-project.org/&#34;&gt;rr&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;rr aspires to be your primary C/C++ debugging tool for Linux, replacing — well, enhancing — gdb. You record a failure once, then debug the recording, deterministically, as many times as you want. The same execution is replayed every time.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/engineering/engineering-principles/how-we-improved-availability-through-iterative-simplification/&#34;&gt;How we improved availability through iterative simplification&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.bazel.build/2024/07/23/remote-output-service.html&#34;&gt;Introducing Bazel 7.2’s Output Service protocol&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;One of the exciting new features in Bazel 7.2 is support for the Bazel Output Service which allows Bazel to lazily materialize outputs when you access them with normal filesystem operations. This allows you to maintain visibility to the entire output tree while still saving network bandwidth.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/developer-skills/github/how-to-review-code-effectively-a-github-staff-engineers-philosophy/&#34;&gt;How to review code effectively: A GitHub staff engineer’s philosophy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/whats-new-in-aspire-8-1/&#34;&gt;What’s new in .NET Aspire 8.1 for cloud native developers!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-07-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-26-friday-assorted-links/</link>
      <pubDate>Fri, 26 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-26-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, July 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/salesforce-ux/metric-display-standards-54736533c81&#34;&gt;Metric Display Standards: Best practices for presenting numbers that change with time&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sematext.com/blog/cloud-logging-services/&#34;&gt;9 Best Cloud Logging Services for Log Management, Analysis, Monitoring &amp;amp; More (2023 Comparison)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.asyncapi.com/en&#34;&gt;AsyncAPI: Building the future of Event-Driven Architectures (EDA)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://increment.com/reliability/technical-incident-command/&#34;&gt;Embrace your inner incident commander&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developers.soundcloud.com/blog/how-to-successfully-hand-over-systems&#34;&gt;How to Successfully Hand Over Systems&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-07-25 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-25-thursday-assorted-links/</link>
      <pubDate>Thu, 25 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-25-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, July 25:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/miro-engineering/profiling-in-production-to-detect-server-bottlenecks-321919d2da51&#34;&gt;Profiling in production to detect server bottlenecks&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://openslo.com/&#34;&gt;OpenSLO&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;OpenSLO is a service level objective (SLO) language that declaratively defines reliability and performance targets using a simple YAML specification.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sematext.com/blog/java-garbage-collection-logs/&#34;&gt;Understanding Java Garbage Collection Logging: What Are GC Logs and How to Analyze Them&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2021/05/19/rethinking-system-architecture-can-kubernetes-help-to-solve-rewrite-anxiety/&#34;&gt;Using Kubernetes to rethink your system architecture and ease technical debt&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://isthisit.nz/posts/2021/devops-practices-for-continuous-deployment/&#34;&gt;DevOps Practices for Continuous Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-07-24 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-24-wednesday-assorted-links/</link>
      <pubDate>Wed, 24 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-24-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, July 24:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/how-netflix-uses-ebpf-flow-logs-at-scale-for-network-insight-e3ea997dca96&#34;&gt;How Netflix uses eBPF flow logs at scale for network insight&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.allthingsdistributed.com/2021/06/amazon-timestream-time-series-is-the-new-black.html&#34;&gt;Amazon Timestream - Time series is the new black&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2021/05/17/incremental-static-regeneration-building-static-sites-a-little-at-a-time/&#34;&gt;Incremental Static Regeneration: Building static sites a little at a time&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/achieving-observability-in-async-workflows-cd89b923c784&#34;&gt;Achieving observability in async workflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.databricks.com/blog/2021/05/26/introducing-delta-sharing-an-open-protocol-for-secure-data-sharing.html&#34;&gt;Introducing Delta Sharing: An Open Protocol for Secure Data Sharing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-07-23 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-23-tuesday-assorted-links/</link>
      <pubDate>Tue, 23 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-23-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, July 23:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://automerge.org/&#34;&gt;Automerge is a library of data structures for building collaborative applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/maestro-netflixs-workflow-orchestrator-ee13a06f9c78&#34;&gt;Maestro: Netflix’s Workflow Orchestrator&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Maestro is a general-purpose, horizontally scalable workflow orchestrator designed to manage large-scale workflows such as data pipelines and machine learning model training pipelines. It oversees the entire lifecycle of a workflow, from start to finish, including retries, queuing, task distribution to compute engines, etc.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sematext.com/blog/jvm-metrics/&#34;&gt;Key JVM Metrics to Monitor for Peak Java Application Performance&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thesaadahmed.medium.com/thanos-monitoring-with-prometheus-and-grafana-843ed231c8a6&#34;&gt;&amp;ldquo;THANOS&amp;rdquo; — Monitoring with Prometheus and Grafana&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lambda.blinkit.com/reducing-data-transfer-costs-with-a-docker-registry-based-cache-8f93d7e561f3&#34;&gt;Reducing data transfer costs with a Docker registry cache&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-07-22 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-22-monday-assorted-links/</link>
      <pubDate>Mon, 22 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-22-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, July 22:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/07/cloudflare-reports-that-almost-7-of-all-internet-traffic-is-malicious.html&#34;&gt;Cloudflare Reports that Almost 7% of All Internet Traffic Is Malicious&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/07/criminal-gang-physically-assaulting-people-for-their-cryptocurrency.html&#34;&gt;Criminal Gang Physically Assaulting People for Their Cryptocurrency&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doordash.engineering/2021/06/17/leveraging-opentelemetry-for-custom-context-propagation/&#34;&gt;Leveraging OpenTelemetry For Custom Context Propagation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://itnext.io/slos-should-be-easy-say-hi-to-sloth-9c8a225df0d4&#34;&gt;SLOs should be easy, say hi to Sloth&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tammybutow.medium.com/site-reliability-engineering-for-kubernetes-b52877c70fb7&#34;&gt;Site Reliability Engineering for Kubernetes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-07-19 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-19-friday-assorted-links/</link>
      <pubDate>Fri, 19 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-19-friday-assorted-links/</guid>
      <description>&lt;p&gt;Today is (Un)Happy Crowdstrike Day!  Assorted links for Friday, July 19:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/what-is-crowdstrike&#34;&gt;What Is CrowdStrike, the Company Behind Today&amp;rsquo;s Global Tech Outage?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/07/major-outages-at-crowdstrike-microsoft-leave-the-world-with-bsods-and-confusion/&#34;&gt;Major outages at CrowdStrike, Microsoft leave the world with BSODs and confusion&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/how-to-fix-crowdstrike-blue-screen-of-death&#34;&gt;Your IT Department Might Need Your Help Fixing the CrowdStrike Outage&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://old.reddit.com/r/crowdstrike/comments/1e6vmkf/bsod_error_in_latest_crowdstrike_update/&#34;&gt;Reddit CrowdStrike Thread&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.crowdstrike.com/blog/technical-details-on-todays-outage/&#34;&gt;Technical Details on Today’s Outage (Crowdstrike Blog)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;My immediate thoughts are as follows:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Monocultures are inherently fragile and an high-value attack target.  This applies whether you&amp;rsquo;re talking about Windows running 95%+ of desktops, CrowdStrike running 50%+ of Fortune 500 computers, or all Cavendish bananas being genetic clones of each other &amp;ndash; an attack on one can easily become an attack on all.  Sometimes it pays to &lt;em&gt;not&lt;/em&gt; make the same choice as everyone else.  Think &lt;em&gt;security through diversity&lt;/em&gt;.&lt;/li&gt;&#xA;&lt;li&gt;All automatic software deployment processes must &lt;em&gt;always&lt;/em&gt; use progressive deployment with metric-based success gates and a straightforward, regularly-tested rollback process.  If you can&amp;rsquo;t meet these requirements, you don&amp;rsquo;t deserve the ability to deploy your software automatically.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-07-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-17-wednesday-assorted-links/</link>
      <pubDate>Wed, 17 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-17-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, July 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/07/genetic-cloaking-of-healthy-cells-opens-door-to-universal-blood-cancer-therapy/&#34;&gt;Genetic cloaking of healthy cells opens door to universal blood cancer therapy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/07/report-alphabet-close-23-billion-deal-for-cybersecurity-startup-wiz/&#34;&gt;Report: Alphabet close to $23 billion deal for cybersecurity startup Wiz&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/docker-best-practices-choosing-between-run-cmd-and-entrypoint/&#34;&gt;Docker Best Practices: Choosing Between RUN, CMD, and ENTRYPOINT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.kernel.org/filesystems/fsverity.html&#34;&gt;fs-verity: read-only file-based authenticity protection&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/974380/&#34;&gt;Memory-allocation profiling for the kernel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-07-16 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-16-tuesday-assorted-links/</link>
      <pubDate>Tue, 16 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-16-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, July 16:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-6.11-Block-Atomic-Writes&#34;&gt;Linux 6.11 To Introduce Block Atomic Writes - Including NVMe &amp;amp; SCSI Support&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Device-Memory-TCP-Nears&#34;&gt;Device Memory TCP Nears The Finish Line For More Efficient Networked Accelerators&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/07/why-every-quantum-computer-will-need-a-powerful-classical-computer/&#34;&gt;Why every quantum computer will need a powerful classical computer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://turbopuffer.com/blog/turbopuffer&#34;&gt;turbopuffer: fast search on object storage&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/&#34;&gt;Performance Improvements in .NET 6&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-07-15 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-15-monday-assorted-links/</link>
      <pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-15-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, July 15:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://time.com/6982015/bitcoin-mining-texas-health/&#34;&gt;&amp;ldquo;We&amp;rsquo;re Living in a Nightmare:&amp;rdquo; Inside the Health Crisis of a Texas Bitcoin Town&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Ubuntu-24.10-More-Frame-Pointer&#34;&gt;Ubuntu 24.10 To Enable Frame Pointers For More Packages&lt;/a&gt;: tl;dr: don&amp;rsquo;t use &lt;code&gt;-fomit-frame-pointer&lt;/code&gt; anymore.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://behdad.org/text2024/&#34;&gt;State of Text Rendering 2024&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.404media.co/scalpers-are-working-with-hackers-to-liberate-non-transferable-tickets-from-ticketmasters-ecosystem/&#34;&gt;Scalpers Work With Hackers to Liberate Ticketmaster&amp;rsquo;s &amp;lsquo;Non-Transferable&amp;rsquo; Tickets&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-07-09-exploring-the-challenges-in-creating-an-accessible-sortable-list-drag-and-drop/&#34;&gt;Exploring the challenges in creating an accessible sortable list (drag-and-drop)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-07-12 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-12-friday-assorted-links/</link>
      <pubDate>Fri, 12 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-12-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, July 12:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/file-io-improvements-in-dotnet-6/&#34;&gt;File IO improvements in .NET 6&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://innovation.ebayinc.com/tech/engineering/sre-case-study-mysterious-traffic-imbalance/&#34;&gt;SRE Case Study: Mysterious Traffic Imbalance&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/08/06/core-infra/zippydb/&#34;&gt;How we built a general purpose key value store for Facebook with ZippyDB&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://highscalability.com/evolution-of-search-engines-architecture-algolia-new-search/&#34;&gt;Evolution of search engines architecture - Algolia New Search Architecture Part 1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/data-movement-in-netflix-studio-via-data-mesh-3fddcceb1059&#34;&gt;Data Movement in Netflix Studio via Data Mesh&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-07-11 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-11-thursday-assorted-links/</link>
      <pubDate>Thu, 11 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-11-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, July 11:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/microsoft-cpp-code-analysis-with-github-actions/&#34;&gt;Microsoft C++ Code Analysis with GitHub Actions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://techcommunity.microsoft.com/t5/windows-it-pro-blog/how-microsoft-reduced-windows-11-update-size-by-40/ba-p/2839794&#34;&gt;How Microsoft reduced Windows 11 update size by 40%&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2017-03-20-sha-1-collision-detection-on-github-com/&#34;&gt;SHA-1 collision detection on GitHub.com&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/safe-updates-of-client-applications-at-netflix-1d01c71a930c&#34;&gt;Safe Updates of Client Applications at Netflix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/jump-start/data-driven-negotiation-with-slis-slos-and-error-budgets-2-2-e52ebd5a9d4f&#34;&gt;Data-driven negotiation with SLIs, SLOs and Error Budgets (2/2)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-07-10 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-10-wednesday-assorted-links/</link>
      <pubDate>Wed, 10 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-10-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, July 10:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://biriukov.dev/docs/page-cache/0-linux-page-cache-for-sre/&#34;&gt;SRE deep dive into Linux Page Cache&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://inlaymansterms.io/blog/kubernetes-ingress/&#34;&gt;Kubernetes Ingress&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/practical-api-design-at-netflix-part-1-using-protobuf-fieldmask-35cfdc606518&#34;&gt;Practical API Design at Netflix, Part 1: Using Protobuf FieldMask&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/10/20/developer-tools/autonomous-testing/&#34;&gt;Autonomous testing of services at scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/10/26/core-infra/kangaroo/&#34;&gt;Kangaroo: A new flash cache optimized for tiny objects&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-07-09 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-09-tuesday-assorted-links/</link>
      <pubDate>Tue, 09 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-09-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, July 9:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ehandbook.com/a-behind-the-scenes-look-at-how-postmans-data-team-works-fded0b8bfc64&#34;&gt;A Behind-the-Scenes Look at How Postman&amp;rsquo;s Data Team Works&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.heap.io/blog/how-we-saved-millions-in-ssd-costs-by-upgrading-our-filesystem&#34;&gt;How We Saved Millions in SSD Costs by Upgrading Our Filesystem&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.x.com/engineering/en_us/topics/insights/2021/forecasting-sql-query-resource-usage-with-machine-learning&#34;&gt;Forecasting SQL query resource usage with machine learning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html&#34;&gt;Linux x86 Program Start Up or - How the heck do we get to main()? by Patrick Horgan&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.alexellis.io/deploy-without-credentials-using-oidc-and-github-actions/&#34;&gt;Deploy without credentials with GitHub Actions and OIDC&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-07-08 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-08-monday-assorted-links/</link>
      <pubDate>Mon, 08 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-08-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, July 8:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.engineering/infrastructure-observability-for-changing-the-spend-curve/&#34;&gt;Infrastructure Observability for Changing the Spend Curve&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/introduction-to-network-trace-analysis-5-smb-sounds-good-to-me/ba-p/4180024&#34;&gt;Introduction to Network Trace Analysis 5: SMB? Sounds good to me!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/07/the-hunt-for-the-most-efficient-heat-pump-in-the-world/&#34;&gt;The hunt for the most efficient heat pump in the world&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://horovits.medium.com/open-source-for-better-observability-8c65b5630561&#34;&gt;Open Source for Better Observability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://codersociety.com/blog/articles/kubernetes-logging&#34;&gt;Kubernetes Logging in Production&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-07-05 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-05-friday-assorted-links/</link>
      <pubDate>Fri, 05 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-05-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, July 5:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ably.com/blog/best-practices-for-on-call-processes&#34;&gt;Save your engineers&amp;rsquo; sleep: best practices for on-call processes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/&#34;&gt;Timeouts, retries, and backoff with jitter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sudolabs.com/insights/how-we-automatized-our-release-process-into-just-3-clicks&#34;&gt;How we automatized our release process into just 3 clicks&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://backstage.spotify.com/discover/blog/measuring-backstage-success-at-spotify/&#34;&gt;How we measure Backstage success at Spotify&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dev.to/squadcast/golden-signals-monitoring-from-first-principles-kpn&#34;&gt;Golden Signals - Monitoring from first principles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-07-04 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-04-thursday-assorted-links/</link>
      <pubDate>Thu, 04 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-04-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, July 4:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.uber.com/blog/how-we-saved-70k-cores-across-30-mission-critical-services/&#34;&gt;How We Saved 70K Cores Across 30 Mission-Critical Services (Large-Scale, Semi-Automated Go GC Tuning @Uber)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/@ugenef/application-monitoring-with-traefik-prometheus-grafana-and-docker-compose-for-beginners-2fe25d1b60a8&#34;&gt;Application monitoring with Traefik, Prometheus, Grafana, and Docker Compose for beginners&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.honeycomb.io/blog/scaling-kafka-observability-pipelines&#34;&gt;Scaling Kafka at Honeycomb&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.delouw.ch/2020/01/29/using-lvm-cache-for-storage-tiering/&#34;&gt;Using LVM cache for storage tiering&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://highscalability.com/designing-netflix/&#34;&gt;Designing Netflix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-07-03 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-03-wednesday-assorted-links/</link>
      <pubDate>Wed, 03 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-03-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, July 3:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.sommarskog.se/error_handling/Part1.html&#34;&gt;Error and Transaction Handling in SQL Server: Part One – Jumpstart Error Handling&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.sommarskog.se/error_handling/Part2.html&#34;&gt;Error and Transaction Handling in SQL Server: Part Two – Commands and Mechanisms&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.sommarskog.se/error_handling/Part3.html&#34;&gt;Error and Transaction Handling in SQL Server: Part Three – Implementation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2021/12/13/production-engineering/slick/&#34;&gt;SLICK: Adopting SLOs for improved reliability&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;SLICK can help us locate metric and performance data regarding the reliability of a specific service just by knowing its name. It does this by building an index of onboarded services that link to dashboards with standard visualizations to analyze and assess the service reliability. So, with a single click, it becomes possible to know whether a service currently meets or doesn’t meet user expectations. We can then start asking why.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/blog/2021/12/21/admission-controllers-for-container-drift/&#34;&gt;Using Admission Controllers to Detect Container Drift at Runtime&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-07-02 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-02-tuesday-assorted-links/</link>
      <pubDate>Tue, 02 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-02-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, July 2:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/how-to-measure-devsecops-success-key-metrics-explained/&#34;&gt;How to Measure DevSecOps Success: Key Metrics Explained&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Key DevSecOps metrics:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Number of security vulnerabilities over time&lt;/li&gt;&#xA;&lt;li&gt;Compliance with security policies&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/06/making-energy-smart-bricks-from-recycling-waste/&#34;&gt;&amp;ldquo;Energy-smart&amp;rdquo; bricks need less power to make, are better insulation&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;According to the RMIT researchers, &amp;ldquo;Brick kilns worldwide consume 375 million tonnes (~340 million metric tons) of coal in combustion annually, which is equivalent to 675 million tonnes of CO&lt;sub&gt;2&lt;/sub&gt; emission (~612 million metric tons).&amp;rdquo; This exceeds the combined annual carbon dioxide emissions of 130 million passenger vehicles in the US.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/06/researchers-upend-ai-status-quo-by-eliminating-matrix-multiplication-in-llms/&#34;&gt;Researchers upend AI status quo by eliminating matrix multiplication in LLMs&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In the new paper, titled &amp;ldquo;Scalable MatMul-free Language Modeling,&amp;rdquo; the researchers describe creating a custom 2.7 billion parameter model without using MatMul ([matrix multiplication]) that features similar performance to conventional large language models (LLMs). They also demonstrate running a 1.3 billion parameter model at 23.8 tokens per second on a GPU that was accelerated by a custom-programmed FPGA chip that uses about 13 watts of power (not counting the GPU&amp;rsquo;s power draw). The implication is that a more efficient FPGA &amp;ldquo;paves the way for the development of more efficient and hardware-friendly architectures,&amp;rdquo; they write.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/enhancing-netflix-reliability-with-service-level-prioritized-load-shedding-e735e6ce8f7d&#34;&gt;Enhancing Netflix Reliability with Service-Level Prioritized Load Shedding&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We implemented a concurrency limiter within PlayAPI that prioritizes user-initiated requests over prefetch requests without physically sharding the two request handlers. This mechanism uses the partitioning functionality of the open source Netflix/concurrency-limits Java library.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2024/06/27/explaining-generative-language-models-to-almost-anyone/&#34;&gt;Explaining generative language models to (almost) anyone&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-07-01 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/07/2024-07-01-monday-assorted-links/</link>
      <pubDate>Mon, 01 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/07/2024-07-01-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, July 1:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://abseil.io/docs/cpp/atomic_danger#the-danger-of-atomic-operations&#34;&gt;The Danger of Atomic Operations&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Most engineers reach for atomic operations in an attempt to produce some lock-free mechanism. Furthermore, programmers enjoy the intellectual puzzle of using atomic operations. Both of these lead to clever implementations which are almost always ill-advised and often incorrect.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.chainguard.dev/unchained/what-an-sbom-can-do-for-you&#34;&gt;What an SBOM can do for you&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blogs.igalia.com/changwoo/sched-ext-a-bpf-extensible-scheduler-class-part-1/&#34;&gt;sched_ext: a BPF-extensible scheduler class (Part 1)&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;code&gt;sched_ext&lt;/code&gt; allows you to write and run your custom process scheduler optimized for your target workloads and hardware architectures using BPF programs.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blogs.igalia.com/changwoo/sched-ext-scheduler-architecture-and-interfaces-part-2/&#34;&gt;sched_ext: scheduler architecture and interfaces (Part 2)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/06/24/data-infrastructure/leveraging-ai-for-efficient-incident-response/&#34;&gt;Leveraging AI for efficient incident response&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We&amp;rsquo;ve streamlined our investigations through a combination of heuristic-based retrieval and large language model (LLM)-based ranking to provide AI-assisted root cause analysis. During backtesting, this system has achieved promising results: 42% accuracy in identifying root causes for investigations at their creation time related to our web monorepo.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-06-28 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-28-friday-assorted-links/</link>
      <pubDate>Fri, 28 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-28-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, June 28:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/includeos/IncludeOS&#34;&gt;IncludeOS&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;IncludeOS is a minimal unikernel operating system for C++ services running in the cloud and on real hardware. Starting a program with &lt;code&gt;#include &amp;lt;os&amp;gt;&lt;/code&gt; will include a tiny operating system into your service during link-time.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://highscalability.com/designing-uber/&#34;&gt;Designing Uber&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://highscalability.com/designing-tinder/&#34;&gt;Designing Tinder&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/fixing-performance-regressions-before-they-happen-eab2602b86fe&#34;&gt;Fixing Performance Regressions Before they Happen&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/how-we-used-cpp20-to-eliminate-an-entire-class-of-runtime-bugs/&#34;&gt;How we used C++20 to eliminate an entire class of runtime bugs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-06-27 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-27-thursday-assorted-links/</link>
      <pubDate>Thu, 27 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-27-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, June 27:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/rapid-event-notification-system-at-netflix-6deb1d2b57d1&#34;&gt;Rapid Event Notification System at Netflix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.interdb.jp/pg/&#34;&gt;The Internals of PostgreSQL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.getambassador.io/testing-microservices-youre-thinking-about-environment-isolation-all-wrong-84f22034a6ef&#34;&gt;Testing Microservices: You’re Thinking About (Environment) Isolation All Wrong&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.getambassador.io/testing-microservices-isolating-requests-not-environments-with-telepresence-f22535789253&#34;&gt;Testing Microservices: Isolating Requests (Not Environments) with Telepresence&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.getambassador.io/testing-microservices-how-to-share-staging-environments-without-tripping-over-each-other-b07e393eb31c&#34;&gt;Testing Microservices: How to Share Staging Environments without Tripping Over Each Other&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-06-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-26-wednesday-assorted-links/</link>
      <pubDate>Wed, 26 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-26-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, June 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mathieularose.com/ci-cd-pipeline-change-based-testing-yarn-based-monorepo&#34;&gt;Speed Up Your CI/CD Pipeline with Change-Based Testing in a Yarn-Based Monorepo&lt;/a&gt;: I note that only building and testing what changed is one of the core value propositions of &lt;a href=&#34;https://bazel.build/&#34;&gt;Bazel&lt;/a&gt;, but adopting Bazel often requires large investment in engineering and training.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://apitally.io/blog/what-makes-a-good-rest-api&#34;&gt;What makes a good REST API?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/dora-metrics-software-delivery/&#34;&gt;How to use DORA metrics to improve software delivery&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/@lokesh12/dont-get-lost-in-the-metrics-maze-a-practical-guide-to-slos-slis-error-budgets-and-toil-939ecd0181eb&#34;&gt;Don&amp;rsquo;t Get Lost in the Metrics Maze: A Practical Guide to SLOs, SLIs, Error Budgets, and Toil&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.algorithmica.org/hpc/data-structures/s-tree/&#34;&gt;Static B-Trees&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In this section, we generalize the techniques we developed for binary search to static B-trees and accelerate them further using SIMD instructions. In particular, we develop two new implicit data structures:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The first is based on the memory layout of a B-tree, and, depending on the array size, it is up to 8x faster than &lt;code&gt;std::lower_bound&lt;/code&gt; while using the same space as the array and only requiring a permutation of its elements.&lt;/li&gt;&#xA;&lt;li&gt;The second is based on the memory layout of a B+ tree, and it is up to 15x faster than &lt;code&gt;std::lower_bound&lt;/code&gt; while using just 6-7% more memory — or 6-7% of the memory if we can keep the original sorted array.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-06-25 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-25-tuesday-assorted-links/</link>
      <pubDate>Tue, 25 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-25-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, June 25:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/06/radioactive-drugs-strike-cancer-with-precision/&#34;&gt;Radioactive drugs strike cancer with precision&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Pluvicto and Lutathera are both built around small protein sequences, known as peptides. These peptides specifically bind to target receptors on cancer cells—PSMA in the case of prostate cancer and somatostatin receptors in the case of Lutathera—and deliver radiation through the decay of unstable lutetium.&lt;/p&gt;&#xA;&lt;p&gt;Administered via infusion into the bloodstream, these drugs circulate throughout the body until they firmly attach to the surfaces of tumor cells they encounter. Anchored at these target sites, the lutetium isotope then releases two types of radiation that aid in cancer treatment. The primary emission consists of beta particles, high-energy electrons capable of penetrating tumors and surrounding cells, tearing into DNA and causing damage that ultimately triggers cell death.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-MM-Local-Kernel-Allocs&#34;&gt;Amazon Exploring MM-Local Memory Allocations To Help With Current/Future Speculation Attacks&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Back in 2019 after various speculation-based CPU vulnerabilities began coming to light, Amazon engineers proposed process-local memory allocations for hiding KVM secrets. They were striving for an alternative mitigation for vulnerabilities like L1TF by essentially providing some memory regions for kernel allocations out of view/access from other kernel code. Amazon engineers this week laid out a new proposal after five years of ongoing Linux kernel improvements for MM-local memory allocations for dealing with current and future speculation-based cross-process attacks.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://typespec.io/&#34;&gt;TypeSpec&lt;/a&gt;: An API design language that either competes with, or augments, OpenAPI.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/riskified-technology/optimize-kubernetes-pods-startup-time-using-volumesnapshots-c0a2b7d39a29&#34;&gt;Optimize Kubernetes Pods&amp;rsquo; Startup Time Using VolumeSnapshots&lt;/a&gt;: If your K8S application uses enormous, static data sources, using VolumeSnapshots may speed up its launch time significantly.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mathieularose.com/gitops-cicd-github-actions&#34;&gt;Building a GitOps CI/CD Pipeline with GitHub Actions (SOC 2)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-06-24 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-24-monday-assorted-links/</link>
      <pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-24-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, June 24:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/oldnewthing/20240618-00/?p=109910&#34;&gt;The time smart quotes prevented the entire Office division from committing code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/video-annotator-building-video-classifiers-using-vision-language-models-and-active-learning-8ebdda0b2db4&#34;&gt;Video annotator: a framework for efficiently building video classifiers using vision-language models and active learning&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We introduce a novel framework, Video Annotator (VA), which leverages active learning techniques and zero-shot capabilities of large vision-language models to guide users to focus their efforts on progressively harder examples, enhancing the model’s sample efficiency and keeping costs low.&lt;/p&gt;&#xA;&lt;p&gt;VA seamlessly integrates model building into the data annotation process, facilitating user validation of the model before deployment, therefore helping with building trust and fostering a sense of ownership. VA also supports a continuous annotation process, allowing users to rapidly deploy models, monitor their quality in production, and swiftly fix any edge cases by annotating a few more examples and deploying a new model version.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/06/19/data-infrastructure/parameter-vulnerability-factor-pvf-ai-silent-data-corruption/&#34;&gt;PVF: A novel metric for understanding AI systems’ vulnerability against SDCs in model parameters&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Parameter vulnerability factor (PVF) is a novel metric we’ve introduced with the aim to standardize the quantification of AI model vulnerability against parameter corruptions.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.build/keeping-main-green&#34;&gt;Keeping main green in a monorepo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2024/06/researchers-describe-how-to-tell-if-chatgpt-is-confabulating/&#34;&gt;Researchers describe how to tell if ChatGPT is confabulating&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;hellip;[T]he researchers focus on what they call semantic entropy. This evaluates all the statistically likely answers evaluated by the LLM and determines how many of them are semantically equivalent. If a large number all have the same meaning, then the LLM is likely uncertain about phrasing but has the right answer. If not, then it is presumably in a situation where it would be prone to confabulation and should be prevented from doing so.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-06-21 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-21-friday-assorted-links/</link>
      <pubDate>Fri, 21 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-21-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, June 21:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/06/13/web/mlow-metas-low-bitrate-audio-codec/&#34;&gt;MLow: Meta&amp;rsquo;s low bitrate audio codec&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;After nearly two years of active development and testing, we are proud to announce Meta Low Bitrate audio codec, aka MLow, which achieves two-times-better quality than Opus (POLQA MOS 1.89 vs 3.9 @ 6kbps WB). Even more importantly, we are able to achieve this great quality while keeping MLow&amp;rsquo;s computational complexity 10 percent lower than that of Opus.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-06-13-unlocking-the-power-of-unstructured-data-with-rag/&#34;&gt;Unlocking the power of unstructured data with RAG&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;To make the most of their unstructured data, development teams are turning to retrieval-augmented generation, or RAG, a method for customizing large language models (LLMs). They can use RAG to keep LLMs up to date with organizational knowledge and the latest information available on the web. They can also use RAG and LLMs to surface and extract insights from unstructured data.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/lxc-vs-docker/&#34;&gt;LXC vs. Docker: Which One Should You Use?&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;LXC is not typically used for application development but for scenarios requiring full OS functionality or direct hardware integration. Its ability to provide isolated and secure environments with minimal overhead makes it suitable for infrastructure virtualization where traditional VMs might be too resource-intensive.&lt;/p&gt;&#xA;&lt;p&gt;Docker&amp;rsquo;s utility in supporting rapid development cycles and complex architectures makes it a valuable tool for developers aiming to improve efficiency and operational consistency in their projects.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://frereit.de/aes_gcm/&#34;&gt;AES-GCM and breaking it on nonce reuse&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/ise/next-level-clean-architecture-boilerplate/&#34;&gt;Next-Level Boilerplate: An Inside Look Into Our .Net Clean Architecture Repo&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Clean architecture is a widely adopted opinionated way to structure your code and to separate the concerns of the application into layers. The main idea is to separate the business logic from the infrastructure and presentation layers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-06-20 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-20-thursday-assorted-links/</link>
      <pubDate>Thu, 20 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-20-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, June 20:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-06-11-how-we-improved-push-processing-on-github/&#34;&gt;How we improved push processing on GitHub&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A push triggers a Kafka event, which is fanned out via independent consumers to many isolated jobs that can process the event without worrying about any other consumers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/blogcacm/leveraging-rust-in-high-performance-web-services/&#34;&gt;Leveraging Rust in High-Performance Web Services&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Rust&amp;rsquo;s ownership model is a fundamental feature that enhances both speed and safety. Every value in Rust has a unique owner, responsible for its cleanup when it’s no longer needed. This eliminates the need for a garbage collector and ensures efficient memory management. The ownership rules are enforced at compile time, which means there’s no runtime overhead.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/systemd-256&#34;&gt;systemd 256 Released With run0, systemd-vpick, importctl &amp;amp; Other New Features&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/06/12/production-engineering/maintaining-large-scale-ai-capacity-meta/&#34;&gt;Maintaining large-scale AI capacity at Meta&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Outside of special cases, Meta maintains its fleet of clusters using a technique called maintenance trains. This is used for all capacity, including compute and storage capacity. A small number of servers are taken out of production and maintained with all applicable upgrades. Trains provide the guarantee that all capacity minus one maintenance domain is up and running 24/7, thus providing capacity predictability. This is mandatory for all capacity that is used for online and recurring training.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/06/12/data-infrastructure/training-large-language-models-at-scale-meta/&#34;&gt;How Meta trains large language models at scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-06-19 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-19-wednesday-assorted-links/</link>
      <pubDate>Wed, 19 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-19-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, June 19:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-06-03-arm64-on-github-actions-powering-faster-more-efficient-build-systems/&#34;&gt;Arm64 on GitHub Actions: Powering faster, more efficient build systems&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Developers can now take advantage of Arm-based hardware hosted by GitHub to build and deploy their release assets anywhere Arm architecture is used. Best of all, these runners are priced at 37% less than our x64 Linux and Windows runners.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/develop-kubernetes-operators-in-java-without-breaking-a-sweat/&#34;&gt;Develop Kubernetes Operators in Java without Breaking a Sweat&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/blogcacm/the-energy-footprint-of-humans-and-large-language-models/&#34;&gt;The Energy Footprint of Humans and Large Language Models&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Assuming an 8-hour workday and considering 260 workdays per year brings the annual energy cost of one person’s hour of daily work to around 6 kWh[a].&lt;/p&gt;&#xA;&lt;p&gt;Now for the energy cost of running an LLM. We have set a target of 250 words in an hour. LLMs generate tokens, parts of words, so if we use the standard ratio (for English) of 0.75 words per token, our target for one hour of work is around 333 tokens. Measurements with Llama 65B reported around 4 Joules per output token [4]. This leads to 1,332 Joules for 333 tokens, about 0.00037 kWh.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/06/microsoft-makes-recall-feature-off-by-default-after-security-and-privacy-backlash/&#34;&gt;Microsoft is reworking Recall after researchers point out its security problems&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Microsoft&amp;rsquo;s upcoming Recall feature in Windows 11 has generated a wave of controversy this week following early testing that revealed huge security holes. The initial version of Recall saves screenshots and a large plaintext database tracking everything that users do on their PCs, and in the current version of the feature, it&amp;rsquo;s trivially easy to steal and view that database and all of those screenshots for any user on a given PC, even if you don&amp;rsquo;t have administrator access. Recall also does little to nothing to redact sensitive information from its screenshots or that database.&lt;/p&gt;&#xA;&lt;p&gt;First and most significantly, the company says that Recall will be opt-in by default, so users will need to decide to turn it on. It may seem like a small change, but many users never touch the defaults on their PCs, and for Recall to be grabbing all of that data by default definitely puts more users at risk of having their data stolen unawares.&lt;/p&gt;&#xA;&lt;p&gt;The company also says it&amp;rsquo;s adding additional protections to Recall to make the data harder to access. You&amp;rsquo;ll need to enable Windows Hello to use Recall, and you&amp;rsquo;ll need to authenticate via Windows Hello (whether it&amp;rsquo;s a face-scanning camera, fingerprint sensor, or PIN) each time you want to open the Recall app to view your data.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/build-gen-ai-with-dotnet-8/&#34;&gt;Building Generative AI apps with .NET 8&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-06-18 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-18-tuesday-assorted-links/</link>
      <pubDate>Tue, 18 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-18-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, June 18:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/05/22/data-infrastructure/composable-data-management-at-meta/&#34;&gt;Composable data management at Meta&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;By providing a reusable, state-of-the-art execution engine that is engine- and dialect-agnostic (i.e, it can be integrated with any data system and extended to follow any SQL-dialect semantic), Velox quickly received attention from the open-source community. Beyond our initial collaborators from IBM/Ahana, Intel, and Voltron Data, today more than 200 individual collaborators from more than 20 companies around the world participate in Velox’s continued development.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/05/physicists-find-a-possible-way-to-get-warped-space-but-no-drive/&#34;&gt;New warp drive concept does twist space, doesn’t move us very fast&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A team of physicists has discovered that it’s possible to build a real, actual, physical warp drive and not break any known rules of physics. One caveat: the vessel doing the warping can’t exceed the speed of light, so you’re not going to get anywhere interesting any time soon. But this research still represents an important advance in our understanding of gravity.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/05/biggest-windows-11-update-in-2-years-nearly-finalized-enters-release-preview/&#34;&gt;Biggest Windows 11 update in 2 years nearly finalized, enters Release Preview&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Windows 11 24H2 includes an updated compiler, kernel, and scheduler, all lower-level system changes made at least in part to better support Arm-based PCs. Existing Windows-on-Arm systems should also see a 10 or 20 percent performance boost when using x86 applications, thanks to improvements in the translation layer (which Microsoft is now calling Prism).&lt;/p&gt;&#xA;&lt;p&gt;There are more user-visible changes, too. 24H2 includes Sudo for Windows, the ability to create TAR and 7-zip archives from the File Explorer, Wi-Fi 7 support, a new “energy saver” mode, and better support for Bluetooth Low Energy Audio. It also allows users to run the Copilot AI chatbot in a regular resizable window that can be pinned to the taskbar instead of always giving it a dedicated strip of screen space.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://graphite.dev/blog/bitkeeper-linux-story-of-git-creation&#34;&gt;BitKeeper, Linux, and licensing disputes: How Linus wrote Git in 14 days&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/tech-policy/2024/05/another-us-state-repeals-law-that-protected-isps-from-municipal-competition/&#34;&gt;Another US state repeals law that protected ISPs from municipal competition&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Minnesota this week eliminated two laws that made it harder for cities and towns to build their own broadband networks. The state-imposed restrictions were repealed in an omnibus commerce policy bill signed on Tuesday by Gov. Tim Walz, a Democrat.&lt;/p&gt;&#xA;&lt;p&gt;Minnesota was previously one of about 20 states that imposed significant restrictions on municipal broadband. The number can differ depending on who&amp;rsquo;s counting because of disagreements over what counts as a significant restriction. But the list has gotten smaller in recent years because states including Arkansas, Colorado, and Washington repealed laws that hindered municipal broadband.&lt;/p&gt;&#xA;&lt;p&gt;The Minnesota bill enacted this week struck down a requirement that municipal telecommunications networks be approved in an election with 65 percent of the vote. The law is over a century old, the Institute for Local Self-Reliance&amp;rsquo;s Community Broadband Network Initiative wrote yesterday.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-06-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-17-monday-assorted-links/</link>
      <pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-17-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, June 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/dotnet-aspire-general-availability/&#34;&gt;General Availability of .NET Aspire: Simplifying .NET Cloud-Native Development&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;.NET Aspire brings together tools, templates, and NuGet packages that help you build distributed applications in .NET more easily.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/dotnet-build-2024-announcements/&#34;&gt;.NET Announcements and Updates from Microsoft Build 2024&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Here’s a look at our updates &amp;amp; announcements:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Artificial Intelligence: End-to-end scenarios for building AI-enabled applications, embracing the AI ecosystem, and deep integration with cloud services.&lt;/li&gt;&#xA;&lt;li&gt;.NET Aspire: for building cloud-native distributed applications, releasing today.&lt;/li&gt;&#xA;&lt;li&gt;C# 13: Improvements to much loved C# features to make them even better for you.&lt;/li&gt;&#xA;&lt;li&gt;Performance: Reducing memory and execution time with critical benchmarks.&lt;/li&gt;&#xA;&lt;li&gt;Enhancements to .NET libraries and frameworks including ASP.NET Core, Blazor, .NET MAUI, and more.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/05/we-get-more-useful-energy-out-of-renewables-than-fossil-fuels/&#34;&gt;We get more useful energy out of renewables than fossil fuels&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A new study by researchers at the UK&amp;rsquo;s University of Leeds, however, suggests that &amp;hellip; renewables already produce more net energy than the fossil fuels they&amp;rsquo;re displacing. The key to understanding why is that it&amp;rsquo;s much easier to do useful things with electricity than it is with a hunk of coal or a glob of crude oil.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/docker-documentation-ai-powered-assistant/&#34;&gt;Docker Documentation Gets an AI-Powered Assistant&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;We recently launched a new tool to enhance Docker documentation: an AI-powered documentation assistant incorporating kapa.ai. Docker Docs AI is designed to get you the information you need by providing instant, accurate answers to your Docker-related questions directly within our documentation pages.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-6.10-FUSE&#34;&gt;FUSE Adds VirtIO-FS Multi-Queue For ~5x Performance Win With Linux 6.10&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;With making use of multiple queues, the VirtIO-FS file-system code can be up to 5~5.5x faster for read and write performance.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-06-14 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-14-friday-assorted-links/</link>
      <pubDate>Fri, 14 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-14-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, June 14:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Intel-MTL-EPP-Tuning-64&#34;&gt;Updated Intel Meteor Lake Tuning For Linux Shows Huge Performance/Power Improvements&lt;/a&gt;.  It is a minor tweak to the default Energy Performance Preference (EPP) value within the Intel P-State CPU frequency scaling driver.&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;It&amp;rsquo;s like magic with one line of code changed in the Linux kernel that Intel is reporting up to 19% performance improvement for Intel Core Ultra &amp;ldquo;Meteor Lake&amp;rdquo; and up to an 11% improvement in performance per Watt. Or in another EPP mode, the power consumption during video playback can be reduced by 52%!&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/06/tripping-the-light-fantastic-light-paintings-help-illuminate-air-pollution-risks/&#34;&gt;These light paintings let us visualize invisible clouds of air pollution&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Light painting is a technique used in both art and science that involves taking long-exposure photographs while moving some kind of light source—a small flashlight, perhaps, or candles or glowsticks—to essentially trace an image with light. A UK collaboration of scientists and artists has combined light painting with low-cost air pollution sensors to visualize concentrations of particulate matter (PM) in select locations in India, Ethiopia, and Wales. The objective is to creatively highlight the health risks posed by air pollution, according to a new paper published in the journal Nature Communications.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marginalrevolution.com/marginalrevolution/2024/05/gpt-4-beats-psychologists-on-a-new-test-of-social-intelligence.html?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=gpt-4-beats-psychologists-on-a-new-test-of-social-intelligence&#34;&gt;GPT-4 beats psychologists on a new test of social intelligence&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;There were significant differences in SI between psychologists and AI’s ChatGPT-4 and Bing. ChatGPT-4 exceeded 100% of all the psychologists, and Bing outperformed 50% of PhD holders and 90% of bachelor’s holders. The differences in SI between Google Bard and bachelor students were not significant, whereas the differences with PhDs were significant; Where 90% of PhD holders excel on Google Bird.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/wasm-vs-docker/&#34;&gt;Wasm vs. Docker: Performant, Secure, and Versatile Containers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marginalrevolution.com/marginalrevolution/2024/05/battery-arbitrage.html?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=battery-arbitrage&#34;&gt;Battery Arbitrage&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;NYTimes: Since 2020, California has installed more giant batteries than anywhere in the world apart from China. They can soak up excess solar power during the day and store it for use when it gets dark.&lt;/p&gt;&#xA;&lt;p&gt;Those batteries play a pivotal role in California’s electric grid, partially replacing fossil fuels in the evening. Between 7 p.m. and 10 p.m. on April 30, for example, batteries supplied more than one-fifth of California’s electricity and, for a few minutes, pumped out 7,046 megawatts of electricity, akin to the output from seven large nuclear reactors.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-06-13 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-13-thursday-assorted-links/</link>
      <pubDate>Thu, 13 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-13-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, June 13:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Microsoft-WSL2-2024-Features&#34;&gt;Microsoft Rolling Out New Windows Subsystem For Linux &amp;ldquo;WSL&amp;rdquo; Features For 2024&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Windows Subsystem for Linux is now automatically releasing stored memory in WSL back for use by Windows. This automatic memory reclaim support is a great addition and makes Windows behave better especially for systems with limited amounts of RAM. Without this support in memory hungry situations like with Docker it was possible for WSL2 to exhaust all of the system&amp;rsquo;s physical memory.&lt;/p&gt;&#xA;&lt;p&gt;Windows Subsystem for Linux has also enabled DNS tunneling by default for improved network support.&lt;/p&gt;&#xA;&lt;p&gt;Meanwhile in experimental form is support for automatic disk reclaim and a new mirrored networking mode that provides for features like IPv6 support.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cnn.com/2024/06/03/investing/new-york-stock-exchange-technical-issue/index.html&#34;&gt;New York Stock Exchange says bizarre glitch that showed Berkshire Hathaway down 99.97% has been resolved&lt;/a&gt;.  Reversibility is an important feature of financial systems which naive blockchain systems deliberately forego.&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;For nearly two hours, Berkshire Hathaway&amp;rsquo;s Class A shares were listed as trading at just $185.10 — a price that would represent a loss of 99.97%. Berkshire closed at $627,400 on Friday.&lt;/p&gt;&#xA;&lt;p&gt;NYSE announced it has decided to &amp;ldquo;bust,&amp;rdquo; or cancel, all &amp;ldquo;erroneous&amp;rdquo; trades for Berkshire between 9:50 am ET and 9:51 am ET at or below $603,718.30. The exchange said that ruling is not eligible for appeal and indicated it could cancel other trades.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Microsoft-Azure-Linux-3.0-Pre&#34;&gt;Microsoft Releases Azure Linux 3.0 Preview&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Azure Linux 3.0 shifts from the aging Linux 5.15 kernel to the newer Linux 6.6 LTS kernel as well as significant updates to OpenSSL, systemd, Runc, and other components. Azure Linux 3.0 is also now defaulting to SELinux&amp;rsquo;s enforcing mode by default.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/openai-dotnet-library/&#34;&gt;Announcing the official OpenAI library for .NET&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Today, the OpenAI team released their first beta, version 2.0.0-beta.1, of the official OpenAI library for .NET. Features include:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Support for the entire OpenAI API, including Assistants v2 and Chat Completions&lt;/li&gt;&#xA;&lt;li&gt;Support for GPT-4o, OpenAI’s latest flagship model&lt;/li&gt;&#xA;&lt;li&gt;Extensibility to enable the community to build libraries on top&lt;/li&gt;&#xA;&lt;li&gt;Sync and async APIs for ease of use and efficiency&lt;/li&gt;&#xA;&lt;li&gt;Access to streaming completions via &lt;code&gt;IAsyncEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/06/climate-wise-it-was-a-full-year-of-exceptional-months/&#34;&gt;We&amp;rsquo;ve just had a year in which every month was a record-setter&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Yesterday, the European Union&amp;rsquo;s Copernicus Earth-monitoring service announced that we&amp;rsquo;ve now gone a full year where every single month has been the warmest version of that month since we&amp;rsquo;ve had enough instruments in place to track global temperatures.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-06-12 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-12-wednesday-assorted-links/</link>
      <pubDate>Wed, 12 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-12-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, June 12:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/05/fracking-wastewater-has-shocking-amount-of-clean-energy-mineral-lithium/&#34;&gt;Fracking wastewater has &amp;ldquo;shocking&amp;rdquo; amount of clean-energy mineral lithium&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A study from researchers at the National Energy Technology Laboratory shows the wastewater produced by Pennsylvania&amp;rsquo;s unconventional wells could contain enough lithium to meet 38 to 40 percent of current domestic consumption.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/catching-up-on-microsoft-build-2024-essential-sessions-for-dotnet-developers/&#34;&gt;Catch Up on Microsoft Build 2024: Essential Sessions for .NET Developers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/highlights-from-microsoft-build/&#34;&gt;Highlights from Microsoft Build: Docker&amp;rsquo;s Innovations with AI and Windows on Arm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/05/google-cloud-explains-how-it-accidentally-deleted-a-customer-account/&#34;&gt;Google Cloud explains how it accidentally deleted a customer account&lt;/a&gt;.  The Google blog post is entitled&#xA;&lt;a href=&#34;https://cloud.google.com/blog/products/infrastructure/details-of-google-cloud-gcve-incident&#34;&gt;Sharing details on a recent incident impacting one of our customers&lt;/a&gt; which is a ridiculous understatement.&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;During the initial deployment of a Google Cloud VMware Engine (GCVE) Private Cloud for the customer using an internal tool, there was an inadvertent misconfiguration of the GCVE service by Google operators due to leaving a parameter blank. This had the unintended and then unknown consequence of defaulting the customer’s GCVE Private Cloud to a fixed term, with automatic deletion at the end of that period. The incident trigger and the downstream system behavior have both been corrected to ensure that this cannot happen again.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marginalrevolution.com/marginalrevolution/2024/05/ai-passes-the-restaurant-review-turing-test.html?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=ai-passes-the-restaurant-review-turing-test&#34;&gt;AI passes the restaurant review Turing test&lt;/a&gt;.  We are rapidly entering an era where we won&amp;rsquo;t be able to believe &lt;em&gt;anything&lt;/em&gt; &amp;ndash; articles, photos, videos, voice recordings &amp;ndash; is genuine and original.  Are you prepared?&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In a series of experiments for a new study, Kovács found that a panel of human testers was unable to distinguish between reviews written by humans and those written by GPT-4, the LLM powering the latest iteration of ChatGPT. In fact, they were more confident about the authenticity of AI-written reviews than they were about human-written reviews.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-06-11 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-11-tuesday-assorted-links/</link>
      <pubDate>Tue, 11 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-11-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, June 11:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/experimental-windows-containers-support-for-buildkit-released-in-v0-13-0/&#34;&gt;Experimental Windows Containers Support for BuildKit Released in v0.13.0&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;BuildKit is a toolkit for converting source code to build artifacts (like container images) in an efficient, expressive, and repeatable manner.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/05/openai-training-its-next-major-ai-model-forms-new-safety-committee/&#34;&gt;OpenAI training its next major AI model, forms new safety committee&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;On Monday, OpenAI announced the formation of a new &amp;ldquo;Safety and Security Committee&amp;rdquo; to oversee risk management for its projects and operations. The announcement comes as the company says it has &amp;ldquo;recently begun&amp;rdquo; training its next frontier model, which it expects to bring the company closer to its goal of achieving artificial general intelligence (AGI), though some critics say AGI is farther off than we might think. It also comes as a reaction to two weeks of public setbacks for the company.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Flamenco-dot-NET-Ubuntu&#34;&gt;Canonical Developing &amp;ldquo;Flamenco&amp;rdquo; For Enhancing .NET Developer Experience On Ubuntu&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;Flamenco is a CLI tool that helps toolchain developers manage many different package versions and releases from a single debian folder source tree.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-05-29-github-and-jfrog/&#34;&gt;GitHub and JFrog partner to unify code and binaries for DevSecOps&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Together, we&amp;rsquo;ve built an integration that includes intuitive navigation and traceability between source code and binaries, CI/CD with GitHub Actions and JFrog Artifactory, and a unified view of security findings across the software supply chain. By providing full control and visibility across the entire software supply chain, we are accelerating our joint vision of making developers’ lives easier and happier.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/AWS-Cloud-Breaks-Fedora-Mirrors&#34;&gt;Amazon Cloud Traffic Is Suffocating Fedora&amp;rsquo;s Mirrors&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A massive uptick in traffic to Fedora&amp;rsquo;s package mirrors is causing problems for the Linux distribution. Some five million additional systems have started putting additional strain on Fedora&amp;rsquo;s mirror resources since March and appear to be coming from Amazon&amp;rsquo;s cloud.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-06-10 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/06/2024-06-10-monday-assorted-links/</link>
      <pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/06/2024-06-10-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, June 10:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/05/federal-agency-warns-critical-linux-vulnerability-being-actively-exploited/&#34;&gt;Federal agency warns critical Linux vulnerability being actively exploited&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The vulnerability, tracked as CVE-2024-1086 and carrying a severity rating of 7.8 out of a possible 10, allows people who have already gained a foothold inside an affected system to escalate their system privileges. It’s the result of a use-after-free error, a class of vulnerability that occurs in software written in the C and C++ languages when a process continues to access a memory location after it has been freed or deallocated. Use-after-free vulnerabilities can result in remote code or privilege escalation.&lt;/p&gt;&#xA;&lt;p&gt;The vulnerability, which affects Linux kernel versions 5.14 through 6.6, resides in the NF_tables, a kernel component enabling the Netfilter, which in turn facilitates a variety of network operations, including packet filtering, network address [and port] translation (NA[P]T), packet logging, userspace packet queueing, and other packet mangling. It was patched in January, but as the CISA advisory indicates, some production systems have yet to install it. At the time this Ars post went live, there were no known details about the active exploitation.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/05/googles-ai-overview-is-flawed-by-design-and-a-new-company-blog-post-hints-at-why/&#34;&gt;Google&amp;rsquo;s AI Overview is flawed by design, and a new company blog post hints at why&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Here we see the fundamental flaw of the system: &amp;ldquo;AI Overviews are built to only show information that is backed up by top web results.&amp;rdquo; The design is based on the false assumption that Google&amp;rsquo;s page-ranking algorithm favors accurate results and not SEO-gamed garbage. Google Search has been broken for some time, and now the company is relying on those gamed and spam-filled results to feed its new AI model.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/06/online-privacy-and-overfishing.html&#34;&gt;Online Privacy and Overfishing&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Internet surveillance, and the resultant loss of privacy, is following the same trajectory. Just as certain fish populations in the world’s oceans have fallen 80 percent, from previously having fallen 80 percent, from previously having fallen 80 percent (ad infinitum), our expectations of privacy have similarly fallen precipitously. The pervasive nature of modern technology makes surveillance easier than ever before, while each successive generation of the public is accustomed to the privacy status quo of their youth. What seems normal to us in the security community is whatever was commonplace at the beginning of our careers.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marginalrevolution.com/marginalrevolution/2024/06/more-on-the-danish-mortgage-system.html?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=more-on-the-danish-mortgage-system&#34;&gt;The Danish Mortgage System Avoids Lock-In&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Recall that in the Danish system each mortgage is backed by a matching bond. As a consequence, mortgage holders have two ways to pay a mortgage: 1) hold the mortgage and pay the monthly payments or 2) buy the matching bond and, in effect, extinguish the mortgage. The latter option is valuable because when interest rates rise, the price of mortgages fall.&lt;/p&gt;&#xA;&lt;p&gt;&amp;hellip;Danish sellers are able to earn a &lt;em&gt;profit&lt;/em&gt; when they trade in their low mortgage rates for more-expensive ones, making it easier to move even when rates rise.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/06/vaccines-dont-cause-autism-but-the-lie-wont-die-in-fact-its-getting-worse/&#34;&gt;Vaccines don’t cause autism, but the lie won’t die. In fact, it&amp;rsquo;s getting worse.&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In all, it&amp;rsquo;s a bleak finding that bodes poorly for the collective health of Americans, who are now seeing rises in cases of measles and other vaccine-preventable illnesses. Additional surveys by the APPC in 2021, 2022, and 2023 identified a slight increase in the number of survey takers who specifically believe, falsely, that the MMR (measles, mumps, and rubella) vaccine causes autism. In 2021, 9 percent of respondents falsely indicated that MMR vaccine causes autism, responding that the statement was &amp;ldquo;definitely true&amp;rdquo; (2 percent) or &amp;ldquo;probably true&amp;rdquo; (7 percent). In 2023, 12 percent of respondents fell into those categories, 2 percent for &amp;ldquo;definitely true&amp;rdquo; and 10 percent for &amp;ldquo;probably true.&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Since the start of 2024, the US has seen a steady march of measles infections nationwide. As of May 31, the CDC has recorded 146 cases across 21 states. Of those cases, 64 were part of a large outbreak in Chicago, which was declared over on May 30.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-05-22 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/05/2024-05-22-wednesday-assorted-links/</link>
      <pubDate>Wed, 22 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/05/2024-05-22-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, May 22:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blogs.cfainstitute.org/investor/2024/05/07/investment-returns-are-not-random/&#34;&gt;Investment Returns Are NOT Random&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/health/why-running-slower-isnt-always-the-answer&#34;&gt;Why Running Slower Isn&amp;rsquo;t Always the Answer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/how-to-set-up-a-home-security-camera-system-without-using-the-cloud&#34;&gt;How to Set Up a Home Security Camera System Without Using the Cloud&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/the-best-custom-gpts-to-make-chatgpt-even-more-useful&#34;&gt;The Best Custom GPTs to Make ChatGPT Even More Useful&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-05-09-how-ai-enhances-static-application-security-testing-sast/&#34;&gt;How AI enhances static application security testing (SAST)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2024/05/13/why-do-only-a-small-percentage-of-genai-projects-actually-make-it-into-production/&#34;&gt;Why do only a small percentage of GenAI projects actually make it into production?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/data-fetch-spa.html&#34;&gt;Data Fetching Patterns in Single-Page Applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/axboe/liburing/wiki/What&#39;s-new-with-io_uring-in-6.10&#34;&gt;What&amp;rsquo;s new with io-uring in 6.10&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-05-21 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/05/2024-05-21-tuesday-assorted-links/</link>
      <pubDate>Tue, 21 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/05/2024-05-21-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, May 21:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/05/ssh-backdoor-has-infected-400000-linux-servers-over-15-years-and-keeps-on-spreading/&#34;&gt;Linux maintainers were infected for 2 years by SSH-dwelling backdoor with huge reach&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/building-your-cpp-code-with-cmake-in-vs-code/&#34;&gt;Building your C++ Code with CMake in VS Code&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/pure-virtual-cpp-2024-recordings-available/&#34;&gt;Pure Virtual C++ 2024 Recordings Now Available&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/05/microsoft-launches-ai-chatbot-for-spies/&#34;&gt;Microsoft launches AI chatbot for spies&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/05/critical-vulnerabilities-in-big-ip-appliances-leave-big-networks-open-to-intrusion/&#34;&gt;Critical vulnerabilities in BIG-IP appliances leave big networks open to intrusion&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/05/chatgpt-4o-lets-you-have-real-time-audio-video-conversations-with-emotional-chatbot/&#34;&gt;Major ChatGPT-4o update allows audio-video talks with an &amp;ldquo;emotional&amp;rdquo; AI chatbot&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/05/before-launching-gpt-4o-broke-records-on-chatbot-leaderboard-under-a-secret-name/&#34;&gt;Before launching, GPT-4o broke records on chatbot leaderboard under a secret name&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/05/gmails-ai-powered-email-summaries-can-dig-through-your-inbox-for-you/&#34;&gt;AI in Gmail will sift through emails, provide search summaries, send emails&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/tech-policy/2024/05/sophisticated-25m-ethereum-heist-took-about-12-seconds-doj-says/&#34;&gt;MIT students stole $25M in seconds by exploiting ETH blockchain bug, DOJ says&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/04/the-rise-of-large.html&#34;&gt;The Rise of Large-Language-Model Optimization&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-05-20 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/05/2024-05-20-monday-assorted-links/</link>
      <pubDate>Mon, 20 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/05/2024-05-20-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, May 20:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/05/microsoft-plans-to-lock-down-windows-dns-like-never-before-heres-how/&#34;&gt;Microsoft plans to lock down Windows DNS like never before. Here’s how.&lt;/a&gt;: The framework is called Zero Trust DNS (ZTDNS)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/oldnewthing/20240510-00/?p=109742&#34;&gt;An informal comparison of the three major implementations of &lt;code&gt;std::string&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/05/google-cloud-accidentally-nukes-customer-account-causes-two-weeks-of-downtime/&#34;&gt;&amp;ldquo;Unprecedented&amp;rdquo; Google Cloud event wipes out customer account and its backups&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/slacks-ai-features-analyze-private-conversations&#34;&gt;Slack Is Using Your Private Conversations to Train Its AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Cloudflare-Golang-PGO&#34;&gt;Cloudflare Praises Golang PGO For Significant CPU Savings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Torvalds-Arithmetic-Overflows&#34;&gt;Torvalds Voices Thoughts On Linux Mitigating Unexpected Arithmetic Overflows/Underflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-6.10-IO_uring&#34;&gt;IO-uring Bringing Better Send Zero-Copy Performance With Linux 6.10&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Rust-VFS-Linux-V2-Now-With-EXT2&#34;&gt;Microsoft Engineer Ports EXT2 File-System Driver To Rust&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://go.dev/blog/chacha8rand&#34;&gt;Secure Randomness in Go 1.22&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/932060/&#34;&gt;FUSE passthrough for file I/O&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-05-10 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/05/2024-05-10-friday-assorted-links/</link>
      <pubDate>Fri, 10 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/05/2024-05-10-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, May 10:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/@maciej.pocwierz/how-an-empty-s3-bucket-can-make-your-aws-bill-explode-934a383cb8b10&#34;&gt;How an empty S3 bucket can make your AWS bill explode&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://brooker.co.za/blog/2024/04/25/memorydb.html&#34;&gt;MemoryDB: Speed, Durability, and Composition.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/ml-model-monitoring-in-production-best-practices/&#34;&gt;Best practices for monitoring ML models in production&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/05/microsoft-developing-mai-1-language-model-that-may-compete-with-openai-report/&#34;&gt;New Microsoft AI model may challenge GPT-4 and Google Gemini&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/05/novel-attack-against-virtually-all-vpn-apps-neuters-their-entire-purpose/&#34;&gt;Novel attack against virtually all VPN apps neuters their entire purpose&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gaming/2024/05/hackers-discover-how-to-reprogram-nes-tetris-from-within-the-game/&#34;&gt;Hackers discover how to reprogram NES Tetris from within the game&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.tbray.org/ongoing/When/202x/2024/05/05/On-Storage&#34;&gt;Storage Churn&lt;/a&gt;: Some thoughts on alternative cloud storage services&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.techdirt.com/2024/05/02/was-there-a-trojan-horse-hidden-in-section-230-all-along-that-could-enable-adversarial-interoperability/&#34;&gt;Was There A Trojan Horse Hidden In Section 230 All Along That Could Enable Adversarial Interoperability?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://vittorioromeo.info/index/blog/adts_over_exceptions.html&#34;&gt;Why choose sum types over exceptions?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://brooker.co.za/blog/2022/02/28/retries.html&#34;&gt;Fixing retries with token buckets and circuit breakers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-05-09 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/05/2024-05-09-thursday-assorted-links/</link>
      <pubDate>Thu, 09 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/05/2024-05-09-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, May 9:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-05-02-dependabot-on-github-actions-and-self-hosted-runners-is-now-generally-available/&#34;&gt;Dependabot on GitHub Actions and self-hosted runners is now generally available&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.figma.com/blog/speeding-up-build-times/&#34;&gt;Speeding up C++ build times&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/why-openai-replaced-chatgpt-plugins-with-gpts&#34;&gt;Why OpenAI Replaced ChatGPT Plugins With GPTs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/ise/data-mapping-for-more-robustness/&#34;&gt;Making an Application More Robust With Data Mapping&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bitsaboutmoney.com/archive/the-business-of-wallets/&#34;&gt;The business of wallets&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Regulators strongly prefer that deposits stay within the regulated banking sector. The single largest reason is that they’re worried that households’ immediately accessible stored funds stay safe and accessible. A major follow-up reason, less understood by non-specialists, is that regulated banks are bound to a long list of consumer protection items on the &lt;em&gt;transaction&lt;/em&gt; level, not the &lt;em&gt;institution&lt;/em&gt; level. A lot of the abuse in the economy happens in $50 and $5,000 increments, rather than multi-billion dollar increments. Regulators sleep happier knowing that this abuse happens at companies with teams of operators standing. Those operators will groan and chalk a disputed transaction, instance of fraud, or glitch in the matrix up to the operational losses budget rather than sticking a user with it.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/pinterest-engineering/how-we-built-text-to-sql-at-pinterest-30bad30dabff&#34;&gt;How we built Text-to-SQL at Pinterest&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.cloudflare.com/alerts-observability&#34;&gt;Minimizing on-call burnout through alerts observability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://everythingdevops.dev/what-is-amazon-resource-name-arn/&#34;&gt;What Is Amazon Resource Name (ARN)?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.honeycomb.io/blog/opentelemetry-best-practices-naming&#34;&gt;OpenTelemetry Best Practices #1: Naming&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.honeycomb.io/blog/opentelemetry-best-practices-agents-sidecars-collectors&#34;&gt;OpenTelemetry Best Practices #2 Agents, Sidecars, Collectors, Coded Instrumentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-05-08 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/05/2024-05-08-wednesday-assorted-links/</link>
      <pubDate>Wed, 08 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/05/2024-05-08-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, May 8:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/ise/dev-containers/&#34;&gt;Development Containers Simplified&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-04-29-highlights-from-git-2-45/&#34;&gt;Highlights from Git 2.45&lt;/a&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;If you are interested in how Git stores data behind the scenes, here is the &lt;a href=&#34;https://github.com/git/git/blob/v2.45.0/Documentation/technical/reftable.txt&#34;&gt;reftable storage specification&lt;/a&gt; for the new reftable storage backend&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/systemd-run0&#34;&gt;systemd Rolling Out &lt;code&gt;run0&lt;/code&gt; As sudo Alternative&lt;/a&gt;: From what I can tell from the summary, &lt;code&gt;run0&lt;/code&gt; &lt;em&gt;should&lt;/em&gt; be more secure than &lt;code&gt;sudo&lt;/code&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Detailed commentary from Lennart Poterring is &lt;a href=&#34;https://mastodon.social/@pid_eins/112353324518585654&#34;&gt;here&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://news.opensuse.org/2024/04/12/learn-from-the-xz-backdoor/&#34;&gt;What we need to take away from the XZ Backdoor&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/new-dockerfile-capabilities-v1-7-0/&#34;&gt;Get started with the latest updates for Dockerfile syntax (v1.7.0)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/msvc-address-sanitizer-adoption-in-nets-coreclr/&#34;&gt;MSVC Address Sanitizer adoption in .NET’s CoreCLR&lt;/a&gt;: I want to use significantly more static and dynamic analysis in my occasional C++ use&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/visual-studio-features-for-c-header-files-and-modules/&#34;&gt;Visual Studio features for C++ Header Files and Modules&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://straightforwardsql.com/posts/how-to-audit-data-modifications-with-surgical-precision/&#34;&gt;How to audit data modifications with surgical precision&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/05/storing-energy-with-compressed-air-is-about-to-have-its-moment-of-truth/&#34;&gt;Storing energy with compressed air is about to have its moment of truth&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-05-02-introducing-artifact-attestations-now-in-public-beta/&#34;&gt;Introducing Artifact Attestations–now in public beta&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-05-07 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/05/2024-05-07-tuesday-assorted-links/</link>
      <pubDate>Tue, 07 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/05/2024-05-07-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, May 7:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/streamline-container-build-dotnet-8/&#34;&gt;Streamline your container build and publish with .NET 8&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/building-a-scalable-gateway-for-microsoft-ai/&#34;&gt;Building a scalable gateway with .NET for Microsoft AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/ise/profiling-docker-compose-services-through-visual-studio/&#34;&gt;Profiling Docker Compose services through Visual Studio&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/csharp-primary-constructors-refactoring/&#34;&gt;Refactor your C# code with primary constructors&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/whats-new-for-dotnet-in-ubuntu-2404/&#34;&gt;What’s new for .NET in Ubuntu 24.04&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/secure-your-container-build-and-publish-with-dotnet-8/&#34;&gt;Secure your container build and publish with .NET 8&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/azure-sdk/silent-brokered-authentication-on-windows-with-the-azure-identity-libraries/&#34;&gt;Silent, brokered authentication on Windows with the Azure Identity libraries&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/opinion/vendor-locked-devops-strategies/&#34;&gt;Vendor-Locked DevOps Strategies&lt;/a&gt;: Personally I think vendor lock-in is mostly overblown.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-04-09-4-ways-github-engineers-use-github-copilot/&#34;&gt;4 ways GitHub engineers use GitHub Copilot&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://16bpp.net/blog/post/the-performance-impact-of-cpp-final-keyword/&#34;&gt;The Performance Impact of C++&amp;rsquo;s &lt;code&gt;final&lt;/code&gt; Keyword&lt;/a&gt;: tl;dr, &lt;code&gt;final&lt;/code&gt; isn&amp;rsquo;t always faster, and modern CPU performance defies intuition so always test &amp;amp; measure.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-05-06 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/05/2024-05-06-monday-assorted-links/</link>
      <pubDate>Mon, 06 May 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/05/2024-05-06-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, May 6:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://brooker.co.za/blog/2023/11/27/about-time.html&#34;&gt;It&amp;rsquo;s About Time!&lt;/a&gt;: Some discussions about the use of time in system designs.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doordash.engineering/2023/08/15/bpfagent-ebpf-for-monitoring-at-doordash/&#34;&gt;BPFAgent: eBPF for Monitoring at DoorDash&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/best-practices-to-prevent-alert-fatigue/&#34;&gt;Best practices to prevent alert fatigue&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/dyninno/streamlining-and-implementing-incident-management-at-dyninno-c8ea06327f3a&#34;&gt;Streamlining and Implementing Incident Management at Dyninno&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.gartner.com/en/articles/what-is-platform-engineering&#34;&gt;What is Platform Engineering?&lt;/a&gt; by Gartner&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://firehydrant.com/blog/improving-signals-speed-and-resilience-through-pressure-testing/&#34;&gt;Inside the gamedays: how we tested Signals for reliability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/the-making-of-ves-the-cosmos-microservice-for-netflix-video-encoding-946b9b3cd300&#34;&gt;The Making of VES: the Cosmos Microservice for Netflix Video Encoding&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/04/researchers-make-a-plastic-that-includes-bacteria-that-can-digest-it/&#34;&gt;Researchers make a plastic that includes bacteria that can digest it&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cisa.gov/sites/default/files/2024-04/CSRB_Review_of_the_Summer_2023_MEO_Intrusion_Final_508c.pdf&#34;&gt;Review of the Summer 2023 Microsoft Exchange Online Intrusion by the Cyber Safety Review Board&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.nytimes.com/2024/04/23/technology/general-motors-spying-driver-data-consent.html&#34;&gt;How G.M. Tricked Millions of Drivers Into Being Spied On (Including Me)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-04-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-26-friday-assorted-links/</link>
      <pubDate>Fri, 26 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-26-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, April 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://datasketches.apache.org/&#34;&gt;Apache DataSketches: A software library of stochastic streaming algorithms&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sysdig.com/blog/2022-cloud-native-security-usage-report/&#34;&gt;Sysdig 2022 Cloud-Native Security and Usage Report: Stay on Top of Risks as You Scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/komodorio/validkube&#34;&gt;validkube: Validkube combines the best open-source tools to help ensure Kubernetes YAML best practices, hygiene &amp;amp; security&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infoq.com/articles/kubernetes-stateful-applications/&#34;&gt;Best Practices for Running Stateful Applications on Kubernetes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://12factor.net/&#34;&gt;The Twelve-Factor App&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infoq.com/articles/multi-runtime-microservice-architecture/&#34;&gt;Multi-Runtime Microservices Architecture&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infoq.com/news/2020/03/multi-runtime-microservices/&#34;&gt;What Comes after Microservices? Multi-Runtime Microservices with Bilgin Ibryam at QCon London&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.theregister.com/2020/03/04/microservices_last_resort/&#34;&gt;Microservices guru warns devs that trendy architecture shouldn&amp;rsquo;t be the default for every app, but &amp;lsquo;a last resort&amp;rsquo;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.christianposta.com/microservices/istio-as-an-example-of-when-not-to-do-microservices/&#34;&gt;Istio as an Example of When Not to Do Microservices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infoq.com/podcasts/domain-oriented-data/&#34;&gt;Zhamak Dehghani on Data Mesh, Domain-Oriented Data, and Building Data Platforms&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-04-25 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-25-thursday-assorted-links/</link>
      <pubDate>Thu, 25 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-25-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, April 25:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.salesforce.com/onboarding-slos-for-salesforce-services-299b6cf2d8e8/&#34;&gt;Onboarding SLOs for Salesforce services&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/curiefense/curiefense&#34;&gt;Curiefense: An application security platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/engineering/grpc-dns-and-load-balancing-incident/&#34;&gt;It&amp;rsquo;s always DNS&amp;hellip; except when it&amp;rsquo;s not: A deep dive through gRPC, Kubernetes, and AWS networking&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.symops.com/post/terraform-pipeline-with-github-actions-and-github-oidc-for-aws&#34;&gt;Set up a Terraform Pipeline with GitHub Actions and GitHub OIDC for AWS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://security.googleblog.com/2022/04/improving-software-supply-chain.html&#34;&gt;Improving software supply chain security with tamper-proof builds&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/how-netflix-content-engineering-makes-a-federated-graph-searchable-5c0c1c7d7eaf&#34;&gt;How Netflix Content Engineering makes a federated graph searchable&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2022/12/22/the-complete-guide-to-protecting-your-apis-with-oauth2/&#34;&gt;The complete guide to protecting your APIs with OAuth2 (part 1)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sematext.com/blog/docker-java-tutorial/&#34;&gt;How to Use Docker to Containerize Java Web Applications: Tutorial for Beginners&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2022/03/17/production-engineering/silent-errors/&#34;&gt;Detecting silent errors in the wild: Combining two novel approaches to quickly detect silent data corruptions at scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/oz123/awesome-c&#34;&gt;Awesome C: A curated list of C good stuff&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-04-24 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-24-wednesday-assorted-links/</link>
      <pubDate>Wed, 24 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-24-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, April 24:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/workday-engineering/pharos-the-observability-platform-at-workday-a2c0355a9427&#34;&gt;Pharos: The Observability Platform at Workday&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.uber.com/blog/how-we-halved-go-monorepo-ci-build-time/&#34;&gt;How We Halved Go Monorepo CI Build Time&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infoq.com/articles/devops-and-cloud-trends-2022/&#34;&gt;DevOps and Cloud InfoQ Trends Report – June 2022&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://documentation.suse.com/sbp/server-linux/html/SBP-SLSA4/index.html&#34;&gt;SLSA: Securing the Software Supply Chain&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://maturitymodel.security.aws.dev/en/model/&#34;&gt;AWS Security Maturity Model&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://un.curl.dev/&#34;&gt;Uncurled – everything I know and learned about running and maintaining Open Source projects for three decades.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.build/bazelrc-flags&#34;&gt;.bazelrc flags you should enable&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://openfeature.dev/&#34;&gt;OpenFeature: Standardizing Feature Flagging for Everyone&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.etsy.com/codeascraft/building-a-platform-for-serving-recommendations-at-etsy&#34;&gt;Building a Platform for Serving Recommendations at Etsy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://openvalue.blog/posts/2022/03/17/observability_4_jvm_frameworks_with_grafana_java_kotlin/&#34;&gt;Observability 4 JVM Frameworks with Grafana in Java and Kotlin&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-04-23 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-23-tuesday-assorted-links/</link>
      <pubDate>Tue, 23 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-23-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, April 23:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://automation.baldacchino.net/cost-optimising-your-architecture-on-azure-practical-design-steps-for-builders-to-cost-optimise-your-tech-stack/&#34;&gt;Cost Optimisation In The Cloud – Practical Design Steps For Architects and Developers – Part 1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://automation.baldacchino.net/cost-optimising-your-architecture-on-azure-practical-design-steps-for-builders-to-cost-optimise-your-tech-stack-part-2/&#34;&gt;Cost Optimisation In The Cloud – Practical Design Steps For Architects and Developers – Part 2&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.cloudflare.com/optimizing-tcp-for-high-throughput-and-low-latency/&#34;&gt;Optimizing TCP for high WAN throughput while preserving low latency&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.engineering/circuit-breakers/&#34;&gt;Slowing Down to Speed Up – Circuit Breakers for Slack&amp;rsquo;s CI/CD&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://isthisit.nz/posts/2022/delivery-lead-time-in-practice/&#34;&gt;Delivery Lead Time In Practice&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.hashicorp.com/state-of-the-cloud&#34;&gt;HashiCorp 2023 State of Cloud Strategy Survey: Cloud maturity drives operational efficiency&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.cockroachlabs.com/blog/startup-reference-architecture/&#34;&gt;Application architecture: A quick guide for startups&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.ffwll.ch/2022/08/locking-hierarchy.html&#34;&gt;Locking Engineering Hierarchy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.ffwll.ch/2022/07/locking-engineering.html&#34;&gt;Locking Engineering Principles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.singlestoneconsulting.com/blog/a-look-at-azops-for-azure-infrastructure-management&#34;&gt;A Look at AzOps for Azure Infrastructure Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-04-22 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-22-monday-assorted-links/</link>
      <pubDate>Mon, 22 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-22-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, April 22:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2022/08/29/developer-tools/improving-metas-slo-workflows-with-data-annotations/&#34;&gt;Improving Meta&amp;rsquo;s SLO workflows with data annotations&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/patterns-of-distributed-systems/request-batch.html&#34;&gt;Patterns of Distributed Systems: Request Batch&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/patterns-of-distributed-systems/fixed-partitions.html&#34;&gt;Patterns of Distributed Systems: Fixed Partitions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/patterns-of-distributed-systems/emergent-leader.html&#34;&gt;Patterns of Distributed Systems: Emergent Leader&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/patterns-of-distributed-systems/clock-bound-wait.html&#34;&gt;Patterns of Distributed Systems: Clock-Bound Wait&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.etsy.com/codeascraft/faster-ml-experimentation-at-etsy-with-interleaving&#34;&gt;Faster ML Experimentation at Etsy with Interleaving&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.etsy.com/codeascraft/towards-machine-learning-observability-at-etsy&#34;&gt;Towards Machine Learning Observability at Etsy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/announcing-builtin-container-support-for-the-dotnet-sdk/&#34;&gt;Announcing built-in container support for the .NET SDK&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.vikramoberoi.com/a-primer-on-roaring-bitmaps-what-they-are-and-how-they-work/&#34;&gt;A primer on Roaring bitmaps: what they are and how they work&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://semaphoreci.com/blog/terraform&#34;&gt;A Developer&amp;rsquo;s Guide to Terraform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-04-19 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-19-friday-assorted-links/</link>
      <pubDate>Fri, 19 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-19-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, April 19:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stripe.com/blog/api-versioning&#34;&gt;APIs as infrastructure: future-proofing Stripe with versioning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.build/versioning-releases-from-a-monorepo&#34;&gt;Versioning releases from a monorepo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kellyshortridge.com/blog/posts/securing-the-supply-chain-of-nothing/&#34;&gt;Securing the Supply Chain of Nothing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/does-the-gitops-emperor-have-no-clothes/&#34;&gt;Does the GitOps Emperor Have No Clothes?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/ninjavan-tech/ninja-vans-monitoring-stack-3cba0139bf32&#34;&gt;Ninja Van&amp;rsquo;s monitoring stack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.engineering/continuous-load-testing/&#34;&gt;Continuous Load Testing: Building a culture of performance with Koi Pond&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/microsoft/oss-ssc-framework/blob/main/specification/framework.md&#34;&gt;Open Source Software (OSS) Secure Supply Chain (SSC) Framework Simplified Requirements&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2022-08-29-gits-database-internals-i-packed-object-store/&#34;&gt;Git&amp;rsquo;s database internals I: packed object store&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2022-09-13-scaling-gits-garbage-collection/&#34;&gt;Scaling Git&amp;rsquo;s garbage collection&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2022/09/06/data-center-engineering/viewing-the-world-as-a-computer-global-capacity-management/&#34;&gt;Viewing the world as a computer: Global capacity management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-04-18 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-18-thursday-assorted-links/</link>
      <pubDate>Thu, 18 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-18-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, April 18:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/riskified-technology/how-to-roll-your-kafka-cluster-with-zero-downtime-and-no-data-loss-770fd0a35971&#34;&gt;How to Roll Your Kafka Cluster With Zero Downtime and No Data Loss&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.symops.com/post/risk-assessment-aws-iam&#34;&gt;Risk Assessments for AWS Access are Not Just for Large Companies&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/how-doordash-governs-its-infrastructure-with-open-policy-agent/&#34;&gt;How DoorDash Governs Its Infrastructure with Open Policy Agent&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/state-of-aws-security/&#34;&gt;State of AWS Security: A Look Into Real-World AWS Environments&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.honeycomb.io/blog/future-ops-platform-engineering&#34;&gt;The Future of Ops Is Platform Engineering&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/blog/products/devops-sre/dora-2022-accelerate-state-of-devops-report-now-out&#34;&gt;Announcing the 2022 Accelerate State of DevOps Report: A deep dive into security&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://iximiuz.com/en/posts/containers-distroless-images/&#34;&gt;What&amp;rsquo;s Inside Of a Distroless Container Image: Taking a Deeper Look&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://betterprogramming.pub/creating-a-human-and-machine-freindly-logging-format-bb6d4bb01dca&#34;&gt;The Art of Logging: Creating a human- and machine-friendly logging format&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.thoughtworks.com/insights/blog/data-strategy/how-to-select-technology-data-mesh&#34;&gt;How to select technology for Data Mesh&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2022/11/30/data-infrastructure/static-analysis-sql-queries/&#34;&gt;Enabling static analysis of SQL queries at Meta&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-04-17 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-17-wednesday-assorted-links/</link>
      <pubDate>Wed, 17 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-17-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, April 17:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.chainguard.dev/unchained/introducing-wolfi-the-first-linux-un-distro&#34;&gt;Introducing Wolfi: The first Linux (un)distro designed for securing the software supply chain&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://home.robusta.dev/blog/top-kubectl-plugin-list&#34;&gt;The Top 5 kubectl Plugins by GitHub Stars&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://innovation.ebayinc.com/tech/engineering/why-and-how-ebay-pivoted-to-opentelemetry/&#34;&gt;Why and How eBay Pivoted to OpenTelemetry&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kubernetes.io/blog/2022/12/01/runtime-observability-opentelemetry/&#34;&gt;Boosting Kubernetes container runtime observability with OpenTelemetry&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://octopus.com/blog/common-mistakes-devops-metrics&#34;&gt;Common mistakes in DevOps metrics&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://iximiuz.ck.page/posts/container-tools-tips-and-tricks-issue-2&#34;&gt;Container Tools, Tips, and Tricks - Issue #2&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/blogs/opensource/introducing-finch-an-open-source-client-for-container-development/&#34;&gt;Introducing Finch: An Open Source Client for Container Development&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/seeing-through-hardware-counters-a-journey-to-threefold-performance-increase-2721924a2822&#34;&gt;Seeing through hardware counters: a journey to threefold performance increase&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://research.contrary.com/reports/evolution-of-devops&#34;&gt;The Evolution of DevOps&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.symops.com/post/just-in-time-access-least-privilege-cloud&#34;&gt;The Importance of Just-in-Time Access for Least Privilege in the Cloud&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-04-16 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-16-tuesday-assorted-links/</link>
      <pubDate>Tue, 16 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-16-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, April 16:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/compliance/shared-responsibility-model/&#34;&gt;Shared Responsibility Model&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.build/estimating-bazel-cicd&#34;&gt;Estimating the effort to build a Bazel CI/CD&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.shaped.ai/blog/the-secret-sauce-of-tik-toks-recommendations&#34;&gt;The Secret Sauce of Tik-Tok&amp;rsquo;s Recommendations&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/01/26/data-infrastructure/tulip-modernizing-metas-data-platform/&#34;&gt;Tulip: Modernizing Meta’s data platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-02-02-how-the-github-docs-team-uses-github-projects/&#34;&gt;How the GitHub Docs team uses GitHub Projects&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/axboe/liburing/wiki/io_uring-and-networking-in-2023&#34;&gt;io_uring and networking in 2023&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-02-06-the-technology-behind-githubs-new-code-search/&#34;&gt;The technology behind GitHub&amp;rsquo;s new code search&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/fast-and-furious-doubling-down-on-sbom-drift/&#34;&gt;Fast and Furious: Doubling Down on SBOM Drift&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doordash.engineering/2023/01/10/how-doordash-upgraded-a-heuristic-with-ml-to-save-thousands-of-canceled-orders/&#34;&gt;How DoorDash Upgraded a Heuristic with ML to Save Thousands of Canceled Orders&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/bondora-engineering-and-data/how-to-increase-deployment-observability-and-simplify-deployment-pipelines-3b271e57ff3f&#34;&gt;How to Increase Deployment Observability and Simplify Deployment Pipelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-04-15 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-15-monday-assorted-links/</link>
      <pubDate>Mon, 15 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-15-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, April 15:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.trailofbits.com/2023/02/14/curl-audit-fuzzing-libcurl-command-line-interface/&#34;&gt;cURL audit: How a joke led to significant findings&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bobbytables.io/p/incident-travel-time&#34;&gt;Incident travel time: The real investment is how fast you get there&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.hashicorp.com/blog/introducing-hermes-an-open-source-document-management-system&#34;&gt;Introducing Hermes, An Open Source Document Management System&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://horovits.medium.com/unreadable-metrics-why-you-cant-find-anything-in-your-monitoring-dashboards-12fcc23d34c8&#34;&gt;Unreadable Metrics: Why You Can’t Find Anything in Your Monitoring Dashboards: A Guide to Effective Dashboard Design for DevOps and SRE&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sematext.com/blog/core-web-vitals/&#34;&gt;A Complete Guide to Google’s Core Web Vitals and How to Optimize Them&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://betterprogramming.pub/why-you-should-use-structured-logging-format-47a388711316&#34;&gt;What Are Structured Logs and How Do They Improve Performance?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.nslookup.io/learning/the-life-of-a-dns-query-in-kubernetes/&#34;&gt;The life of a DNS query in Kubernetes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/riskified-technology/building-a-staging-environment-for-data-teams-855700fa390f&#34;&gt;Building a Staging Environment for Data Teams&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.morling.dev/blog/getting-started-with-java-development-2023/&#34;&gt;Getting Started With Java Development in 2023 — An Opinionated Guide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://aws.amazon.com/builders-library/fairness-in-multi-tenant-systems/&#34;&gt;Fairness in multi-tenant systems&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-04-12 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-12-friday-assorted-links/</link>
      <pubDate>Fri, 12 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-12-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, April 12:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://chainloop.dev/blog/software-supply-chain-attestation-easy-way&#34;&gt;Software Supply Chain Attestation the Easy Way&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infoq.com/presentations/incident-command-system/&#34;&gt;How Many Is Too Much? Exploring Costs of Coordination During Outages&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/govtech-edu/how-we-keep-our-government-apps-running-with-high-reliability-a-peek-at-our-incident-management-fe1386d0fa43&#34;&gt;How We Keep Our Government Apps Running With High Reliability: A Peek at Our Incident Management Strategy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lukeshaughnessy.medium.com/infrastructure-as-code-is-not-the-answer-cfaf4882dcba&#34;&gt;Infrastructure as Code is Not the Answer!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://spacelift.io/blog/terraform-best-practices&#34;&gt;20 Terraform Best Practices to Improve your TF workflow&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ocurity.com/blog/sboms-with-dracon/&#34;&gt;SBoMs with Dracon, cheaper, faster, more accurate, better&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.gitguardian.com/files/the-state-of-secrets-sprawl-report-2023&#34;&gt;The State of Secrets Sprawl 2023&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/pulse/cogs-problem-michael-stahnke/&#34;&gt;The COGS Problem&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.build/bazelrc-presets&#34;&gt;Presets for bazelrc&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.container-solutions.com/biggest-cloud-native-strategy-mistake&#34;&gt;The Biggest Cloud Native Strategy Mistake&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-04-11 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-11-thursday-assorted-links/</link>
      <pubDate>Thu, 11 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-11-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, April 11:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/969003/&#34;&gt;GNU Stow 2.4.0 released&lt;/a&gt; &amp;ndash; I use stow whenever I&amp;rsquo;m installing custom-compiled software.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/04/security-vulnerability-of-html-emails.html&#34;&gt;Security Vulnerability of HTML Emails&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The email your manager received and forwarded to you was something completely innocent, such as a potential customer asking a few questions. All that email was supposed to achieve was being forwarded to you. However, the moment the email appeared in your inbox, it changed. The innocent pretext disappeared and the real phishing email became visible. A phishing email you had to trust because you knew the sender and they even confirmed that they had forwarded it to you.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/improved-alerting-with-atlas-streaming-eval-e691c60dc61e&#34;&gt;Improved Alerting with Atlas Streaming Eval&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://vittorioromeo.info/index/blog/adts_over_exceptions.html&#34;&gt;Why choose sum types over exceptions?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://grayduck.mn/2023/04/17/refresh-vs-long-lived-access-tokens/&#34;&gt;Refresh vs. Long-lived Access Tokens&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developers.redhat.com/articles/2023/04/12/why-you-should-use-iouring-network-io&#34;&gt;Why you should use io_uring for network I/O&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.exhypothesi.com/clocks-and-causality/&#34;&gt;Clocks and Causality - Ordering Events in Distributed Systems&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.twitter.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm&#34;&gt;Twitter&amp;rsquo;s Recommendation Algorithm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-03-28-introducing-self-service-sboms/&#34;&gt;Introducing self-service SBOMs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/rightsize-kubernetes-workloads/&#34;&gt;Practical tips for rightsizing your Kubernetes workloads&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-04-10 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-10-wednesday-assorted-links/</link>
      <pubDate>Wed, 10 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-10-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, April 10:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/oldnewthing/20240403-00/?p=109607&#34;&gt;Windows debugger trick: Breaking when a specific debugger message is printed&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-04-03-security-research-without-ever-leaving-github-from-code-scanning-to-cve-via-codespaces-and-private-vulnerability-reporting/&#34;&gt;Security research without ever leaving GitHub: From code scanning to CVE via Codespaces and private vulnerability reporting&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2024/04/03/developers-with-ai-assistants-need-to-follow-the-pair-programming-model/&#34;&gt;Developers with AI assistants need to follow the pair programming model&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/how-copilot-is-being-used-by-the-time-travel-debugging-team-for-repetitive-c-coding/&#34;&gt;How Copilot is being used by the Time Travel Debugging team for repetitive C++ coding&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bitsaboutmoney.com/archive/anatomy-of-credit-card-rewards-programs/&#34;&gt;Anatomy of a credit card rewards program&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stackoverflow.blog/2024/04/04/how-do-mixture-of-experts-layers-affect-transformer-models/&#34;&gt;How do mixture-of-experts layers affect transformer models?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-04-04-what-is-retrieval-augmented-generation-and-what-does-it-do-for-generative-ai/&#34;&gt;What is retrieval-augmented generation, and what does it do for generative AI?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://research.swtch.com/xz-timeline&#34;&gt;Timeline of the xz open source attack&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.404media.co/xz-backdoor-bullying-in-open-source-software-is-a-massive-security-vulnerability/&#34;&gt;Bullying in Open Source Software Is a Massive Security Vulnerability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/reverse-searching-netflixs-federated-graph-222ac5d23576&#34;&gt;Reverse Searching Netflix’s Federated Graph&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-04-09 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-09-tuesday-assorted-links/</link>
      <pubDate>Tue, 09 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-09-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, April 9:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lwn.net/Articles/959562/&#34;&gt;OpenBSD system-call pinning&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.abortretry.fail/p/the-rise-and-fall-of-silicon-graphics&#34;&gt;The Rise and Fall of Silicon Graphics&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.digitalocean.com/blog/fine-grained-rbac-for-github-action-workflows-hashicorp-vault&#34;&gt;Fine-grained RBAC for GitHub Action workflows With GitHub OIDC and HashiCorp Vault&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.getport.io/blog/using-the-platform-engineering-maturity-model-to-evaluate-your-investment-in-internal-developer-platforms&#34;&gt;Using the Platform Engineering Maturity Model to Understand the Commitment Required for an Internal Developer Platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/best-practices-for-monitoring-software-testing/&#34;&gt;Best practices for monitoring software testing in CI/CD&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://isovalent.com/blog/post/file-monitoring-with-ebpf-and-tetragon-part-1/&#34;&gt;File Monitoring with eBPF and Tetragon (Part 1)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.tabnine.com/blog/documentation-as-code-principles-workflow-and-challenges/&#34;&gt;Documentation as code: Principles, workflow, and challenges&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sourcegraph.com/blog/the-lifecycle-of-a-code-ai-completion&#34;&gt;The lifecycle of a code AI completion&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/04/what-we-know-about-the-xz-utils-backdoor-that-almost-infected-the-world/&#34;&gt;What we know about the xz Utils backdoor that almost infected the world&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-04-02-bringing-enterprise-level-security-and-even-more-power-to-github-hosted-runners/&#34;&gt;Bringing enterprise-level security and even more power to GitHub-hosted runners&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-04-08 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-08-monday-assorted-links/</link>
      <pubDate>Mon, 08 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-08-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, April 8:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/GNU-Coreutils-9.5-Released&#34;&gt;GNU Coreutils 9.5 Can Yield 10~20% Throughput Boost For cp, mv &amp;amp; cat Commands&lt;/a&gt;: The speed increase is by increasing the default block size from 128KiB to 256KiB.  Anyone still working in 4KiB or 64KiB blocks?  Time to increase!&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/tech-policy/2024/03/why-every-federal-agency-must-now-appoint-a-chief-ai-officer/&#34;&gt;Biden orders every US agency to appoint a chief AI officer&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;As chief AI officers, appointees will serve as senior advisers on AI initiatives, monitoring and inventorying all agency uses of AI. They must conduct risk assessments to consider whether any AI uses are impacting &amp;ldquo;safety, security, civil rights, civil liberties, privacy, democratic values, human rights, equal opportunities, worker well-being, access to critical resources and services, agency trust and credibility, and market competition,&amp;rdquo; OMB said.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/oregon-passed-right-to-repair-law&#34;&gt;Oregon Just Passed a Monumental &amp;lsquo;Right to Repair&amp;rsquo; Law&lt;/a&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;[W]hat sets this Oregon law apart from the other three states is that is bans &amp;ldquo;parts pairing,&amp;rdquo; a term that describes when companies prevent unauthorized parts from functioning in their devices.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/bing-on-dotnet-8-the-impact-of-dynamic-pgo/&#34;&gt;Bing on .NET 8: The Impact of Dynamic PGO&lt;/a&gt;: .NET continues to deliver significant performance improvements release after release, with near-perfect backwards compatibility.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/03/google-says-the-pixel-8-will-get-its-new-ai-model-but-ram-usage-is-a-concern/&#34;&gt;Google says running AI models on phones is a huge RAM hog&lt;/a&gt;: Is it possible that the largest barrier to Artificial General Intelligence (AGI) will be the amount of computing resources (RAM, GPU, electricity, etc.) necessary to run it?&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/why-the-department-of-justice-cares-about-green-bubbles-on-iphones&#34;&gt;Why the Department of Justice Cares About Green Bubbles on iPhones&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bitbashing.io/gc-for-systems-programmers.html&#34;&gt;Garbage Collection for Systems Programmers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/redis-makes-intelligent-apps-smarter-and-consistent/&#34;&gt;Making AI powered .NET apps more consistent and intelligent with Redis&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://developers.redhat.com/articles/2024/04/03/improvements-static-analysis-gcc-14-compiler#&#34;&gt;Improvements to static analysis in the GCC 14 compiler&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.build/run-tools-installed-by-bazel&#34;&gt;Running local tools installed by Bazel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-04-05 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-05-friday-assorted-links/</link>
      <pubDate>Fri, 05 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-05-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, April 5:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90&#34;&gt;Scaling up the Prime Video audio/video monitoring service and reducing costs by 90%&lt;/a&gt; &amp;ndash; a case study of moving from distributed microservices back to a monolith application&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.primevideotech.com/cloud-and-scale/shaping-live-sports-publishing-traffic-through-a-distributed-scheduling-system&#34;&gt;Shaping live sports publishing traffic through a distributed scheduling system&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/debugging-a-fuse-deadlock-in-the-linux-kernel-c75cd7989b6d&#34;&gt;Debugging a FUSE deadlock in the Linux kernel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://voithos.io/articles/enum-class-bitmasks/&#34;&gt;Enum Class Bitmasks&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sluongng.hashnode.dev/bazel-in-ci-part-1-commit-under-test&#34;&gt;Bazel in CI (Part 1): Commit Under Test&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sluongng.hashnode.dev/bazel-in-ci-part-2-worker-setup&#34;&gt;Bazel in CI (Part 2): Worker Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sluongng.hashnode.dev/bazel-caching-explained-pt-3-repository-cache&#34;&gt;Bazel Caching Explained (pt. 3): Repository Cache&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://stripe.com/blog/fast-secure-builds-choose-two&#34;&gt;Fast builds, secure builds. Choose two.&lt;/a&gt; &amp;ndash; How &lt;a href=&#34;https://www.stripe.com&#34;&gt;Stripe&lt;/a&gt; uses Bazel for build and test pipelines.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bazel.build/about/roadmap&#34;&gt;Bazel roadmap&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.dev/rules-oci&#34;&gt;Introducing rules_oci&lt;/a&gt; &amp;ndash; A replacement for rules_docker which builds container images.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-04-04 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-04-thursday-assorted-links/</link>
      <pubDate>Thu, 04 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-04-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, April 4:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://turso.tech/blog/why-sqlite-is-so-great-for-the-edge-ee00a3a9a55f&#34;&gt;Why SQLite is so great for the edge&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://faun.pub/opentelemetry-the-star-of-kubecon-2023-c1e2b504850d&#34;&gt;OpenTelemetry: The Star of KubeCon 2023&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/StanzaSystems/awesome-load-management&#34;&gt;Awesome Load Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/pinterest-engineering/warden-real-time-anomaly-detection-at-pinterest-210c122f6afa&#34;&gt;Warden: Real Time Anomaly Detection at Pinterest&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://determinate.systems/posts/open-policy-agent/&#34;&gt;Packaging Open Policy Agent policies with Nix&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sematext.com/blog/opensearch-vs-solr/&#34;&gt;OpenSearch vs Solr: Which One Is Better to Use?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/7-core-elements-of-an-internal-developer-platform/&#34;&gt;7 Core Elements of an Internal Developer Platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/native-frame-rate-playback-6c87836a948&#34;&gt;Native Frame Rate Playback &amp;ndash; Netflix Technology Blog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-06-02-applying-gitops-principles-to-your-operations/&#34;&gt;Applying GitOps principles to your operations&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-06-01-highlights-from-git-2-41/&#34;&gt;Highlights from Git 2.41&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-04-03 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-03-wednesday-assorted-links/</link>
      <pubDate>Wed, 03 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-03-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, April 3:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software&#34;&gt;Imaginary Problems Are the Root of Bad Software&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://octopus.com/blog/devops-uses-capability-not-maturity&#34;&gt;DevOps uses a capability model, not a maturity model&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.pulumi.com/blog/reducing-our-error-rate/&#34;&gt;Read Every Single Error&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.container-solutions.com/incident-write-ups-they-want-to-read&#34;&gt;Ditch the Template: Incident Write-ups They Want to Read&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://samwho.dev/load-balancing/&#34;&gt;Load Balancing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sematext.com/blog/ubuntu-monitoring-tools/&#34;&gt;10+ Best Tools &amp;amp; Systems for Monitoring Ubuntu Server Performance (2023 Comparison)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/riskified-technology/how-we-improved-our-monitoring-stack-with-only-a-few-small-changes-66c5a489fd67&#34;&gt;How We Improved Our Monitoring Stack With Only a Few Small Changes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.symops.com/post/aws-vault&#34;&gt;What Every Developer Should Know About AWS Vault&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.chainguard.dev/unchained/move-over-dockerfiles-the-new-way-to-craft-containers&#34;&gt;Move over, Dockerfiles! The new way to craft containers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://anonymoushash.vmbrasseur.com/2023/04/24/software-bill-of-materials-sbom&#34;&gt;Software Bill of Materials (SBOM)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-04-02 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-02-tuesday-assorted-links/</link>
      <pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-02-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, April 2:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2023/07/ars-on-aws-02/&#34;&gt;How we host Ars Technica in the cloud, part two: The software&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2023/08/ars-on-aws-03/&#34;&gt;Hosting Ars, part three: CI/CD, or how I learned to stop worrying and love DevOps&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/08/09/ml-applications/scaling-instagram-explore-recommendations-system/&#34;&gt;Scaling the Instagram Explore recommendations system&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/08/08/security/how-meta-is-improving-password-security-and-preserving-privacy/&#34;&gt;How Meta is improving password security and preserving privacy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/08/07/developer-tools/fixit-2-linter-meta/&#34;&gt;Fixit 2: Meta&amp;rsquo;s next-generation auto-fixing linter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-08-09-four-tips-to-keep-your-github-actions-workflows-secure/&#34;&gt;Four tips to keep your GitHub Actions workflows secure&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-08-02-how-we-build-containerized-services-at-github-using-github/&#34;&gt;How we build containerized services at GitHub using GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-07-27-scaling-merge-ort-across-github/&#34;&gt;Scaling merge-ort across GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-07-19-metrics-for-issues-pull-requests-and-discussions/&#34;&gt;Metrics for issues, pull requests, and discussions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-07-17-prompt-engineering-guide-generative-ai-llms/&#34;&gt;A developer&amp;rsquo;s guide to prompt engineering and LLMs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-04-01 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/04/2024-04-01-monday-assorted-links/</link>
      <pubDate>Mon, 01 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/04/2024-04-01-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, April 1:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/03/thousands-of-servers-hacked-in-ongoing-attack-targeting-ray-ai-framework/&#34;&gt;Thousands of servers hacked in ongoing attack targeting Ray AI framework&lt;/a&gt;: Researchers say it&amp;rsquo;s the first known in-the-wild attack targeting AI workloads.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://abstraction.blog/2023/06/13/cloud-alerting-strategy&#34;&gt;An Alerting strategy for the cloud&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.reverberate.org/2021/04/21/musttail-efficient-interpreters.html&#34;&gt;Parsing Protobuf at 2+GB/s: How I Learned To Love Tail Calls in C&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.research.google/2023/08/advances-in-document-understanding.html&#34;&gt;Advances in document understanding&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.imperialviolet.org/2023/07/23/u2f-to-passkeys.html&#34;&gt;From U2F to passkeys&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/protecting-secrets-with-docker/&#34;&gt;Protecting Secrets with Docker&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/improve-docker-compose-modularity-with-include/&#34;&gt;Improve Docker Compose Modularity with &lt;code&gt;include&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/container-security-and-why-it-matters/&#34;&gt;Container Security and Why It Matters&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/cppblog/vcpkg-integration-with-the-github-dependency-graph/&#34;&gt;vcpkg integration with the GitHub dependency graph&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/08/15/developer-tools/immortal-objects-for-python-instagram-meta/&#34;&gt;Introducing Immortal Objects for Python&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-03-29 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-29-friday-assorted-links/</link>
      <pubDate>Fri, 29 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-29-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, March 29:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/how-to-use-ai-offline-with-jan&#34;&gt;Use &amp;lsquo;Jan&amp;rsquo; to Chat With AI Without the Privacy Concerns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/uncovering-mainframe-seams.html&#34;&gt;Uncovering the Seams in Mainframes for Incremental Modernisation: A Case Study of Legacy Displacement&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/03/26/android/instagram-threads-hdr-photos/&#34;&gt;Bringing HDR photo support to Instagram and Threads&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/is-your-container-image-really-distroless/&#34;&gt;Is Your Container Image Really Distroless?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/containerd-vs-docker/&#34;&gt;containerd vs. Docker: Understanding Their Relationship and How They Work Together&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/oldnewthing/20240327-00/?p=109580&#34;&gt;Some choices for encrypting data so that it can be decrypted only by the same user or computer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/money/how-to-open-backdoor-roth-ira-and-when-you-should&#34;&gt;How to Start a &amp;lsquo;Backdoor&amp;rsquo; Roth IRA (and When You Should)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gaming/2024/03/microsoft-opens-a-crack-in-console-gamings-decades-old-walled-garden/&#34;&gt;Microsoft opens a crack in console gaming’s decades-old walled garden&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/gadgets/2024/03/intel-microsoft-discuss-plans-to-run-copilot-locally-on-pcs-instead-of-in-the-cloud/&#34;&gt;Intel, Microsoft discuss plans to run Copilot locally on PCs instead of in the cloud&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/03/quantum-computing-progress-higher-temps-better-error-correction/&#34;&gt;Quantum computing progress: Higher temps, better error correction&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-03-28 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-28-thursday-assorted-links/</link>
      <pubDate>Thu, 28 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-28-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, March 28:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://redmonk.com/sogrady/2024/03/08/language-rankings-1-24/&#34;&gt;The RedMonk Programming Language Rankings: January 2024&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.figma.com/blog/how-figmas-databases-team-lived-to-tell-the-scale/&#34;&gt;How Figma&amp;rsquo;s databases team lived to tell the scale&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/tblx-insider/global-products-global-monitoring-terraform-strategies-for-seamless-grafana-dashboards-1e8c2af68512&#34;&gt;Global products, global monitoring: Terraform Strategies for Seamless Grafana Dashboards Across Regions&lt;/a&gt; &amp;ndash; this feels like using Terraform as the core of a &lt;a href=&#34;https://about.gitlab.com/topics/gitops/&#34;&gt;GitOps&lt;/a&gt; strategy, which doesn&amp;rsquo;t sound like too bad of an idea to me&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/03/licensing-ai-engineers.html&#34;&gt;Licensing AI Engineers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.thecodewhisperer.com/permalink/tdd-youre-probably-doing-it-just-fine&#34;&gt;TDD: You&amp;rsquo;re Probably Doing It Just Fine&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/news/governments-setting-limits-on-ai/&#34;&gt;Governments Setting Limits on AI: Many countries and regions are considering, or trying to implement, regulations on the training and use of artificial intelligence&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cacm.acm.org/research/combining-machine-learning-and-lifetime-based-resource-management-for-memory-allocation-and-beyond/&#34;&gt;Combining Machine Learning and Lifetime-Based Resource Management for Memory Allocation and Beyond&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-03-25-how-to-use-github-copilot-in-your-ide-tips-tricks-and-best-practices/&#34;&gt;How to use GitHub Copilot in your IDE: Tips, tricks, and best practices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/03/hackers-can-extract-secret-encryption-keys-from-apples-mac-chips/&#34;&gt;Unpatchable vulnerability in Apple chip leaks secret encryption keys&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/work/use-hawthorne-effect-to-increase-productivity&#34;&gt;Use the &amp;lsquo;Hawthorne Effect&amp;rsquo; to Increase Your Productivity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-03-27 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-27-wednesday-assorted-links/</link>
      <pubDate>Wed, 27 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-27-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, March 27:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/SDL3-SDL_Storage-API-Merged&#34;&gt;SDL Storage API Merged For SDL 3.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.brendangregg.com/blog//2024-03-17/the-return-of-the-frame-pointers.html&#34;&gt;The Return of the Frame Pointers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/sequential-testing-keeps-the-world-streaming-netflix-part-2-counting-processes-da6805341642&#34;&gt;Sequential A/B Testing Keeps the World Streaming Netflix Part 2: Counting Processes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/03/18/data-infrastructure/logarithm-logging-engine-ai-training-workflows-services-meta/&#34;&gt;Logarithm: A logging engine for AI training workflows and services&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/03/ai-and-the-evolution-of-social-media.html&#34;&gt;AI and the Evolution of Social Media&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gofetch.fail/&#34;&gt;GoFetch: Breaking Constant-Time Cryptographic Implementations Using Data Memory-Dependent Prefetchers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-03-20-found-means-fixed-introducing-code-scanning-autofix-powered-by-github-copilot-and-codeql/&#34;&gt;Found means fixed: Introducing code scanning autofix, powered by GitHub Copilot and CodeQL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://news.un.org/en/story/2024/03/1147831&#34;&gt;UN General Assembly adopts landmark resolution on artificial intelligence&lt;/a&gt; &amp;ndash; sadly, this is a nonbinding agreement and thus effectively toothless&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.brendangregg.com/blog//2024-03-24/linux-crisis-tools.html&#34;&gt;Linux Crisis Tools&lt;/a&gt; &amp;ndash; install these Linux tools on your production servers &lt;em&gt;before&lt;/em&gt; a crisis hits&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.srepath.com/danger-of-unreliable-platform-engineering/&#34;&gt;The Danger of Unreliable Platforms (with Jade Rubick)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-03-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-26-tuesday-assorted-links/</link>
      <pubDate>Tue, 26 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-26-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, March 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/03/12/data-center-engineering/building-metas-genai-infrastructure/&#34;&gt;Building Meta’s GenAI Infrastructure&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://firehydrant.com/blog/improving-signals-speed-and-resilience-through-pressure-testing/&#34;&gt;Inside the gamedays: how we tested Signals for reliability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-11-08-the-state-of-open-source-and-ai/&#34;&gt;Octoverse: The state of open source and rise of AI in 2023&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/get-started-with-dotnet-ai-quickstarts/&#34;&gt;Get started with .NET 8 and AI using new quickstart tutorials&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.nytimes.com/2024/03/11/technology/carmakers-driver-tracking-insurance.html&#34;&gt;Automakers Are Sharing Consumers’ Driving Behavior With Insurance Companies&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/generate-dotnet-secrets-automatically-from-azure-deployment/&#34;&gt;Generate Local .NET Secrets from Azure Deployments&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.dev/preventing-production-code-depending-on-experiments&#34;&gt;Preventing production code depending on experiments&lt;/a&gt; &amp;ndash; Bazel specific&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=aOVtyU3jz_c&#34;&gt;SMB for Linux with SMB3 POSIX extensions (FOSDEM 2024)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/Linux-6.9-FUSE-Passthrough&#34;&gt;FUSE Passthrough Mode Merged For Linux 6.9&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.dev/codeowners-and-bazel&#34;&gt;CODEOWNERS and Bazel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-03-25 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-25-monday-assorted-links/</link>
      <pubDate>Mon, 25 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-25-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, March 25:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.esquire.com/entertainment/music/a46871755/james-kaplan-miles-davis-3-shades-of-blue-excerpt/&#34;&gt;Miles Davis and the Recording of a Jazz Masterpiece&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.dev/releasing-bazel-rulesets-rust&#34;&gt;Publishing Bazel rules that depend on tools: take 2&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/revolutionize-your-ci-cd-pipeline-integrating-testcontainers-and-bazel/&#34;&gt;Revolutionize Your CI/CD Pipeline: Integrating Testcontainers and Bazel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kottke.org/24/03/how-the-great-green-wall-is-holding-back-the-sahara-desert&#34;&gt;How the Great Green Wall is Holding Back the Sahara Desert&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://depot.dev/blog/buildkit-in-depth&#34;&gt;BuildKit in depth: Docker&amp;rsquo;s build engine explained&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://scaledagiledevops.com/&#34;&gt;Scaled Agile DevOps Maturity Framework&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.brendangregg.com/blog//2024-03-10/ebpf-documentary.html&#34;&gt;eBPF Documentary&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.brendangregg.com/blog//2023-04-28/ebpf-security-issues.html&#34;&gt;eBPF Observability Tools Are Not Security Tools&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bughunters.google.com/blog/6368559657254912/llvm-s-rfc-c-buffer-hardening-at-google&#34;&gt;LLVM&amp;rsquo;s &amp;lsquo;RFC: C++ Buffer Hardening&amp;rsquo; at Google&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://herbsutter.com/2024/03/11/safety-in-context/&#34;&gt;C++ safety, in context&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-03-22 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-22-friday-assorted-links/</link>
      <pubDate>Fri, 22 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-22-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, March 22:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sites.google.com/view/compromptmized&#34;&gt;ComPromptMized: Unleashing Zero-click Worms that Target GenAI-Powered Applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/evolving-from-rule-based-classifier-machine-learning-powered-auto-remediation-in-netflix-data-039d5efd115b&#34;&gt;Evolving from Rule-based Classifier: Machine Learning Powered Auto Remediation in Netflix Data Platform&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://kotaku.com/chrono-trigger-remake-yoshinori-kitase-1851305873&#34;&gt;&lt;em&gt;Chrono Trigger&lt;/em&gt; Director Asks What Fans Would Want In A Remake&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-03-04-keeping-repository-maintainer-information-accurate/&#34;&gt;Keeping repository maintainer information accurate&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/cars/2024/03/carmakers-must-bring-back-buttons-to-get-good-safety-scores-in-europe/&#34;&gt;European crash tester says carmakers must bring back physical controls&lt;/a&gt;.  When shopping for cars, I insist on physical controls.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-03-21 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-21-thursday-assorted-links/</link>
      <pubDate>Thu, 21 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-21-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, March 21:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.dev/fetching-ml-models-under-bazel&#34;&gt;Fetching ML models under Bazel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/security/2024/03/hugging-face-the-github-of-ai-hosted-code-that-backdoored-user-devices/&#34;&gt;Hugging Face, the GitHub of AI, hosted code that backdoored user devices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/ai/2024/03/researchers-create-ai-worms-that-can-spread-from-one-system-to-another/&#34;&gt;Researchers create AI worms that can spread from one system to another&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/work/set-anti-goals-to-get-more-done&#34;&gt;You Should Set &amp;lsquo;Anti-goals&amp;rsquo; Too&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bitsaboutmoney.com/archive/financial-systems-take-a-holiday/&#34;&gt;Financial systems take a holiday&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/03/12/data-center-engineering/building-metas-genai-infrastructure/&#34;&gt;Building Meta’s GenAI Infrastructure&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://martinfowler.com/articles/measuring-developer-productivity-humans.html&#34;&gt;Measuring Developer Productivity via Humans&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.brendangregg.com/blog//2023-04-28/ebpf-security-issues.html&#34;&gt;eBPF Observability Tools Are Not Security Tools&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bughunters.google.com/blog/6368559657254912/llvm-s-rfc-c-buffer-hardening-at-google&#34;&gt;LLVM&amp;rsquo;s &amp;lsquo;RFC: C++ Buffer Hardening&amp;rsquo; at Google&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://herbsutter.com/2024/03/11/safety-in-context/&#34;&gt;C++ safety, in context&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-03-20 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-20-wednesday-assorted-links/</link>
      <pubDate>Wed, 20 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-20-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, March 20:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://opensource.zalando.com/restful-api-guidelines/#_zalando_restful_api_and_event_guidelines&#34;&gt;Zalando RESTful API and Event Guidelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/zalando/zally&#34;&gt;Zally: A minimalistic, simple-to-use OpenAPI 2 and 3 linter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://depot.dev/blog/dockerfile-linting-issues&#34;&gt;Top 10 common Dockerfile linting issues&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cloud.google.com/blog/products/devops-sre/announcing-the-2023-state-of-devops-report&#34;&gt;2023 State of DevOps Report: Culture is everything&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://doordash.engineering/2023/08/15/bpfagent-ebpf-for-monitoring-at-doordash/&#34;&gt;BPFAgent: eBPF for Monitoring at DoorDash&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://media.defense.gov/2023/Dec/06/2003352724/-1/-1/0/THE-CASE-FOR-MEMORY-SAFE-ROADMAPS-TLP-CLEAR.PDF&#34;&gt;The Case for Memory Safe Roadmaps: Why Both C-Suite Executives and Technical Experts Need to Take Memory Safe Coding Seriously&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://open-std.org/JTC1/SC22/WG21/docs/papers/2023/p2816r0.pdf&#34;&gt;P2816R0: Safety Profiles: Type-and-resource Safe programming in ISO Standard C++&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/cpp/safeint/safeint-library?view=msvc-170&#34;&gt;SafeInt: A portable library that can be used with MSVC, GCC or Clang to help prevent integer overflows that might result when the application performs mathematical operations.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.social/about/blog/03-12-2024-stackable-moderation&#34;&gt;Bluesky&amp;rsquo;s Stackable Approach to Moderation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://alexandrehtrb.github.io/posts/2024/03/http2-and-http3-explained/&#34;&gt;HTTP/2 and HTTP/3 explained&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-03-19 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-19-tuesday-assorted-links/</link>
      <pubDate>Tue, 19 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-19-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, March 19:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.syntasso.io/post/platform-engineering-orchestrating-applications-platforms-and-infrastructure&#34;&gt;Platform Engineering: Orchestrating Applications, Platforms, and Infrastructure&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.palark.com/sre-troubleshooting-ceph-systemd-containerd/&#34;&gt;Recent troubleshooting cases from our SREs, part 5. An unexpected crash due to unrelated software changes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/riskified-technology/elevating-microservices-testing-and-development-using-dynamicenv-852ffeeacff2&#34;&gt;Elevating Microservices Testing and Development using DynamicEnv&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://axolo.co/blog/p/code-review-security-checklist&#34;&gt;Code Review Security Checklist&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/ossf/malicious-packages&#34;&gt;OpenSSF Malicious Packages&lt;/a&gt; &amp;ndash; A collection of reports of malicious packages identified in Open Source package repositories, consumable via the Open Source Vulnerability (OSV) format.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sematext.com/blog/elasticsearch-opensearch-solr-alternatives/&#34;&gt;11 Small Search Platforms: Powerful Alternatives to Elasticsearch, OpenSearch, and Solr&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/migrating-netflix-to-graphql-safely-8e1e4d4f1e72&#34;&gt;Migrating Netflix to GraphQL Safely&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://matduggan.com/were-all-doing-metrics-wrong/&#34;&gt;Monitoring is a Pain&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.juxt.pro/blog/event-driven-architecture/&#34;&gt;Classifying Event Driven Architecture&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/riskified-technology/how-riskified-manages-schemas-and-handles-standardization-fda9eb236e28&#34;&gt;How to Manage Schemas and Handle Standardization&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-03-18 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-18-monday-assorted-links/</link>
      <pubDate>Mon, 18 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-18-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, March 18:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://spectrum.ieee.org/history-of-power-grid&#34;&gt;This Clock Made Power Grids Possible&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.trailofbits.com/2024/03/01/toward-more-effective-curl-fuzzing/&#34;&gt;How we applied advanced fuzzing techniques to cURL&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-02-29-keeping-secrets-out-of-public-repositories/&#34;&gt;GitHub is enabling secret push protection for all users&lt;/a&gt;.  This means that, by default, GitHub will detect and help prevent developers from accidentally committing secrets to repositories.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.whitehouse.gov/oncd/briefing-room/2024/02/26/press-release-technical-report/&#34;&gt;White House: Future Software Should be Memory Safe&lt;/a&gt;.  The pressure on C/C++ continues to grow.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/information-technology/2024/02/wikipedia-downgrades-cnets-reliability-rating-after-ai-generated-articles/&#34;&gt;AI-generated articles prompt Wikipedia to downgrade CNET’s reliability rating&lt;/a&gt;.  I did not realize that CNET was posting AI-written articles, but I am not shocked.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.technoblather.ca/aws-lambda-nodejs-debug-apigw-cold-start-timeout/&#34;&gt;Solving Cold Start Timeouts with AWS Lambda and API Gateway&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://wso2.com/whitepapers/transactions-in-a-microservice-world/&#34;&gt;Transactions in a Microservice World&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.engineering/service-delivery-index-a-driver-for-reliability/&#34;&gt;Service Delivery Index: A Driver for Reliability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://greenlight-engineering.medium.com/from-blind-spots-to-clear-insights-the-evolution-of-observability-tools-and-practices-at-225e5f87faf&#34;&gt;From Blind Spots to Clear Insights: The Evolution of Observability Tools and Practices at Greenlight&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/static-web-application-monitoring-best-practices/&#34;&gt;Best practices for monitoring static web applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-03-15 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-15-friday-assorted-links/</link>
      <pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-15-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, March 15:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/10/31/data-infrastructure/automating-data-removal/&#34;&gt;Automating data removal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-10-26-5-tips-for-making-your-github-profile-page-accessible/&#34;&gt;5 tips for making your GitHub profile page accessible&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-10-23-how-to-gain-insight-into-your-project-contributors/&#34;&gt;How to gain insight into your project contributors&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/streaming-sql-in-data-mesh-0d83f5a00d08&#34;&gt;Streaming SQL in Data Mesh&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.dev/integration-testing-oci&#34;&gt;Integration testing your container images with Bazel&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/zero-configuration-service-mesh-with-on-demand-cluster-discovery-ac6483b52a51&#34;&gt;Zero Configuration Service Mesh with On-Demand Cluster Discovery&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/debugging-net-apps-with-time-travel-debugging-ttd/&#34;&gt;Debugging .NET Apps with Time Travel Debugging (TTD)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/if-p99-latency-is-bs-whats-the-alternative/&#34;&gt;If P99 Latency Is BS, What’s the Alternative?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://wso2.com/blogs/thesource/exploring-event-driven-architecture-a-beginners-guide-for-cloud-native-developers/&#34;&gt;Exploring Event-Driven Architecture: A Beginner&amp;rsquo;s Guide for Cloud Native Developers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://enterprisecontract.dev/posts/a-taste-of-policies/&#34;&gt;A Taste of Policies&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-03-14 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-14-thursday-assorted-links/</link>
      <pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-14-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, March 14:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.palark.com/prometheus-centralized-storage-mimir/&#34;&gt;Prometheus and centralized storage: When you need it, how it works, and what Mimir is&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.palark.com/prometheus-architecture-tsdb/&#34;&gt;Prometheus and its storage: Architecture, challenges, and solutions&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.stephencleary.com/2023/11/configureawait-in-net-8.html&#34;&gt;ConfigureAwait in .NET 8&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-10-30-the-architecture-of-todays-llm-applications/&#34;&gt;The architecture of today’s LLM applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/10/24/data-infrastructure/automating-dead-code-cleanup/&#34;&gt;Automating dead code cleanup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://best.openssf.org/SCM-BestPractices/&#34;&gt;Source Code Management Platform Configuration Best Practices&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/blogs/2018/03/23/text-buffer-reimplementation&#34;&gt;Visual Studio Code 1.21 Text Buffer Reimplementation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-10-03-3-strategies-to-expand-your-threat-model-and-secure-your-supply-chain/&#34;&gt;3 strategies to expand your threat model and secure your supply chain&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.stephencleary.com/2023/09/memory-mapped-files-overlaid-structs.html&#34;&gt;Memory-Mapped Files and Overlaid Structs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.engineering/traffic-101-packets-mostly-flow/&#34;&gt;Traffic 101: Packets Mostly Flow&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-03-13 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-13-wednesday-assorted-links/</link>
      <pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-13-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, March 13:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/qa-patrick-debois-on-the-past-present-and-future-of-devops/&#34;&gt;Q&amp;amp;A: Patrick Debois on the Past, Present and Future of DevOps&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.permit.io/blog/zanzibar-vs-opa&#34;&gt;Google Zanzibar vs OPA - Graph vs. Code Based Authorization&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://matt-rickard.com/infrastructure-as-code-will-be-written-by-ai&#34;&gt;Infrastructure as Code Will be Written by AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://semaphoreci.com/blog/state-of-devops-2023&#34;&gt;State of DevOps 2023 Highlights&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.heavybit.com/library/article/generative-ai-incident-response-devops&#34;&gt;Incident Response and DevOps in the Age of Generative AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.opencontext.com/blog/threads-of-the-next-wave-of-devops&#34;&gt;Threads of the next wave of DevOps&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=qW1I6q-4vFg&#34;&gt;Better DevOps with Generative AI (VMUG 2023 preso)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.infoq.com/podcasts/adam-jacob-devops-modelling-infrastructure/&#34;&gt;Adam Jacob Discusses DevOps, Modelling Infrastructure, and Increasing Collaboration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/software-delivery-enablement-not-developer-productivity/&#34;&gt;Software Delivery Enablement, Not Developer Productivity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://wso2.com/library/blogs/the-api-gateway-and-the-future-of-cloud-native-applications/&#34;&gt;The API Gateway and the Future of Cloud Native Applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-03-12 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-12-tuesday-assorted-links/</link>
      <pubDate>Tue, 12 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-12-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, March 12:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://abstraction.blog/2023/11/22/intuitive-documentation-strategy&#34;&gt;An intuitive documentation strategy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jack-vanlightly.com/blog/2023/11/14/the-architecture-of-serverless-data-systems&#34;&gt;The Architecture Of Serverless Data Systems&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.honeycomb.io/wp-content/uploads/2023/11/Web-Performance-KubeCon-NA-2023.pdf&#34;&gt;A Practical Guide to Debugging Browser Performance with OpenTelemetry&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.spiceworks.com/tech/devops/guest-article/what-do-developers-need-to-know-about-kubernetes-anyway/&#34;&gt;What Do Developers Need to Know About Kubernetes, Anyway?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://firehydrant.com/blog/your-guide-to-better-incident-status-pages/&#34;&gt;Your guide to better incident status pages&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/cpp/code-quality/build-reliable-secure-programs?view=msvc-170&#34;&gt;Build reliable and secure C++ programs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-09-26-how-github-uses-github-actions-and-actions-larger-runners-to-build-and-test-github-com/&#34;&gt;How GitHub uses GitHub Actions and Actions larger runners to build and test GitHub.com&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.dev/releasing-bazel-rulesets&#34;&gt;Releasing Bazel rulesets that publish tools&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.systeminit.com/blog-second-wave-devops/&#34;&gt;Second Wave DevOps&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.arresteddevops.com/the-new-devops/&#34;&gt;The New DevOps With Adam Jacob&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-03-11 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-11-monday-assorted-links/</link>
      <pubDate>Mon, 11 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-11-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, March 11:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.stevencanplan.com/2024/02/why-courtyard-buildings-arent-allowed-in-chicago-anymore/&#34;&gt;Why courtyard buildings aren’t allowed in Chicago anymore&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.phoronix.com/news/FUSE-Passthrough-In-6.9-Next&#34;&gt;FUSE Passthrough Support May Land For Linux 6.9 To Help Boost I/O Performance&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2023-12-07-upgrading-github-com-to-mysql-8-0/&#34;&gt;Upgrading GitHub.com to MySQL 8.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/dotnet-8-networking-improvements/&#34;&gt;.NET 8 Networking Improvements&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/kubernetes-cpu-requests-limits/&#34;&gt;A deep dive into CPU requests and limits in Kubernetes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.schneier.com/blog/archives/2024/03/surveillance-through-push-notifications.html&#34;&gt;Surveillance through Push Notifications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.docker.com/blog/are-containers-only-for-microservices-myth-debunked/&#34;&gt;Are Containers Only for Microservices? Myth Debunked&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-03-06-how-github-uses-merge-queue-to-ship-hundreds-of-changes-every-day/&#34;&gt;How GitHub uses merge queue to ship hundreds of changes every day&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/@letathenasleep/alerting-the-dos-and-don-ts-for-effective-observability-139db9fb49d1&#34;&gt;Sofia&amp;rsquo;s Observability Odyssey: The Do&amp;rsquo;s and Don&amp;rsquo;ts for Effective Observability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://jepsen.io/consistency&#34;&gt;Consistency Models&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-03-08 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-08-friday-assorted-links/</link>
      <pubDate>Fri, 08 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-08-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, March 8:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devpost.com/software/signal0ne&#34;&gt;Signal0ne: Quick, seamless and automated insights powered debugging for contenerized apps.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://highscalability.com/the-swedbank-outage-shows-that-change-controls-dont-work/&#34;&gt;The Swedbank Outage shows that Change Controls don&amp;rsquo;t work&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/wp-content/uploads/2023/12/TheLabyrinthEncryptedMessageStorageProtocol_12-6-2023.pdf&#34;&gt;The Labyrinth Encrypted Message Storage Protocol&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/wp-content/uploads/2023/12/MessengerEnd-to-EndEncryptionOverview_12-6-2023.pdf&#34;&gt;Messenger End-to-End Encryption Overview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/12/06/security/building-end-to-end-security-for-messenger/&#34;&gt;Building end-to-end security for Messenger&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-03-07 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-07-thursday-assorted-links/</link>
      <pubDate>Thu, 07 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-07-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, March 7:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/2-diving-deeper-into-psyberg-stateless-vs-stateful-data-processing-1d273b3aaefb&#34;&gt;Diving Deeper into Psyberg: Stateless vs Stateful Data Processing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/incremental-processing-using-netflix-maestro-and-apache-iceberg-b8ba072ddeeb&#34;&gt;Incremental Processing using Netflix Maestro and Apache Iceberg&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/building-resilient-cloud-services-with-dotnet-8/&#34;&gt;Building resilient cloud services with .NET 8&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/announcing-dotnet-chiseled-containers/&#34;&gt;Announcing .NET Chiseled Containers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/announcing-ef8/&#34;&gt;Entity Framework Core 8 (EF8) is available today&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-03-06 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-06-wednesday-assorted-links/</link>
      <pubDate>Wed, 06 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-06-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, March 6:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.devgenius.io/a-new-paradigm-for-dynamic-configuration-management-krm-kcl-specification-53b1e1db1e0f&#34;&gt;A New Paradigm for Dynamic Configuration Management — KRM KCL Specification&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://thenewstack.io/top-5-best-practices-for-naming-opentelemetry-attributes/&#34;&gt;Top 5 Best Practices for Naming OpenTelemetry Attributes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/whats-new-in-our-code-coverage-tooling/&#34;&gt;What’s New in Our Code Coverage Tooling?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/1-streamlining-membership-data-engineering-at-netflix-with-psyberg-f68830617dd1&#34;&gt;Streamlining Membership Data Engineering at Netflix with Psyberg&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/3-psyberg-automated-end-to-end-catch-up-260fbe366fe2&#34;&gt;Psyberg: Automated end to end catch up&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-03-05 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-05-tuesday-assorted-links/</link>
      <pubDate>Tue, 05 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-05-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, March 5:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-01-03-our-move-to-generated-sdks/&#34;&gt;Our move to generated SDKs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/12/19/core-infra/how-meta-built-the-infrastructure-for-threads/&#34;&gt;How Meta built the infrastructure for Threads&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2023/12/19/data-infrastructure/hawkeye-ai-debugging-meta/&#34;&gt;AI debugging at Meta with HawkEye&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-01-05-5-ways-to-make-your-devsecops-strategy-developer-friendly/&#34;&gt;5 ways to make your DevSecOps strategy developer-friendly&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.aspect.dev/custom-download-headers&#34;&gt;rctx.download custom headers coming to Bazel 7.1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-03-04 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-04-monday-assorted-links/</link>
      <pubDate>Mon, 04 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-04-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, March 4:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++&#34;&gt;Compiler Options Hardening Guide for C and C++&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/resilience-and-chaos-engineering/&#34;&gt;Resilience and chaos engineering&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dominikberner.ch/cmake-library-setup/&#34;&gt;CMake line by line - Creating a library&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://devblogs.microsoft.com/dotnet/introducing-ms-test-runner/&#34;&gt;Introducing the MSTest Runner – CLI, Visual Studio, &amp;amp; More&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://johnstawinski.com/2024/01/11/playing-with-fire-how-we-executed-a-critical-supply-chain-attack-on-pytorch/&#34;&gt;Playing with Fire – How We Executed a Critical Supply Chain Attack on Python&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Friday 2024-03-01 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/03/2024-03-01-friday-assorted-links/</link>
      <pubDate>Fri, 01 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/03/2024-03-01-friday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Friday, March 1:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/sequential-a-b-testing-keeps-the-world-streaming-netflix-part-1-continuous-data-cba6c7ed49df&#34;&gt;Sequential A/B Testing Keeps the World Streaming Netflix Part 1: Continuous Data&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/introducing-safetest-a-novel-approach-to-front-end-testing-37f9f88c152d&#34;&gt;Introducing SafeTest: A Novel Approach to Front End Testing&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/2024-02-14-fixing-security-vulnerabilities-with-ai/&#34;&gt;Fixing security vulnerabilities with AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.x.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm&#34;&gt;Twitter&amp;rsquo;s Recommendation Algorithm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.x.com/engineering/en_us/topics/infrastructure/2022/stability-and-scalability-for-search&#34;&gt;Stability and scalability for search&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Thursday 2024-02-29 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/02/2024-02-29-thursday-assorted-links/</link>
      <pubDate>Thu, 29 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/02/2024-02-29-thursday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Thursday, February 29:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://isburmistrov.substack.com/p/all-you-need-is-wide-events-not-metrics&#34;&gt;All you need is Wide Events, not &amp;ldquo;Metrics, Logs and Traces&amp;rdquo;&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://slack.engineering/the-scary-thing-about-automating-deploys/&#34;&gt;The Scary Thing About Automating Deploys&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.datadoghq.com/blog/best-practices-to-prevent-alert-fatigue/&#34;&gt;Best practices to prevent alert fatigue&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://cd.foundation/blog/2023/10/12/speed-up-container-image-builds-tekton-pipelines/&#34;&gt;Speed Up Container Image Builds in Tekton Pipelines&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.atspotify.com/2023/10/switching-build-systems-seamlessly/&#34;&gt;Switching Build Systems, Seamlessly&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Wednesday 2024-02-28 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/02/2024-02-28-wednesday-assorted-links/</link>
      <pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/02/2024-02-28-wednesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Wednesday, February 28:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://netflixtechblog.com/announcing-bpftop-streamlining-ebpf-performance-optimization-6a727c1ae2e5&#34;&gt;Announcing bpftop: Streamlining eBPF performance optimization&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://news.yahoo.com/elon-musk-tunnel-reportedly-oozing-211736291.html&#34;&gt;Elon Musk&amp;rsquo;s Tunnel Reportedly Oozing With Skin-Burning Chemical Sludge&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://nerdist.com/article/wendys-surge-pricing-experiments-to-begin-uber-style-by-2025/&#34;&gt;Wendy&amp;rsquo;s Threatens Surge Pricing, Uber-Style&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ciechanow.ski/airfoil/&#34;&gt;Airfoil&lt;/a&gt; &amp;ndash; How do airplanes fly?&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lifehacker.com/tech/googles-ai-can-now-create-video-games&#34;&gt;Google&amp;rsquo;s AI Can Make You a Custom Video Game&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Tuesday 2024-02-27 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/02/2024-02-27-tuesday-assorted-links/</link>
      <pubDate>Tue, 27 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/02/2024-02-27-tuesday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Tuesday, February 27:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.oversecured.com/Introducing-MavenGate-a-supply-chain-attack-method-for-Java-and-Android-applications&#34;&gt;Introducing MavenGate: a supply chain attack method for Java and Android applications&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://medium.com/@vincesackschen/writing-an-excellent-postmortem-8534409f6e0d&#34;&gt;Writing an Excellent Postmortem&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://graphite.dev/blog/why-ban-merge-commits&#34;&gt;Why large companies and fast-moving startups are banning merge commits&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://semaphoreci.com/blog/data-lineage-big-data&#34;&gt;Understanding Data Lineage in Big Data: Challenges, Solutions, and Its Impact on Data Quality&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Monday 2024-02-26 Assorted Links</title>
      <link>https://www.stevenengelhardt.com/links/2024/02/2024-02-26-monday-assorted-links/</link>
      <pubDate>Mon, 26 Feb 2024 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/links/2024/02/2024-02-26-monday-assorted-links/</guid>
      <description>&lt;p&gt;Assorted links for Monday, February 26:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://engineering.fb.com/2024/02/06/developer-tools/dotslash-simplified-executable-deployment/&#34;&gt;DotSlash: Simplified executable deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arstechnica.com/science/2024/02/surprising-link-found-between-niacin-and-risk-of-heart-attack-and-stroke/&#34;&gt;Surprising link found between niacin and risk of heart attack and stroke&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.honeycomb.io/blog/alerts-are-fundamentally-messy&#34;&gt;Alerts Are Fundamentally Messy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.creekservice.org/articles/2024/01/08/json-schema-evolution-part-1.html&#34;&gt;Evolving JSON Schemas - Part I&lt;/a&gt; and &lt;a href=&#34;https://www.creekservice.org/articles/2024/01/09/json-schema-evolution-part-2.html&#34;&gt;Part II&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.chainguard.dev/unchained/images-as-code-the-pursuit-of-declarative-image-builds&#34;&gt;Images as Code: The pursuit of declarative image builds&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Downloading Private Release Assets from GitHub</title>
      <link>https://www.stevenengelhardt.com/2023/05/23/practical-bazel-downloading-private-release-assets-from-github/</link>
      <pubDate>Tue, 23 May 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/05/23/practical-bazel-downloading-private-release-assets-from-github/</guid>
      <description>&lt;p&gt;Downloading a private release asset from GitHub given only its name&#xA;and tag requires a complicated series of interactions with the GitHub&#xA;API.  This blog post explains how to write two repository rules&#xA;which make dealing with private release assets in Bazel easy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Use multirun for parallel execution</title>
      <link>https://www.stevenengelhardt.com/2023/03/09/practical-bazel-use-multirun-for-parallel-execution/</link>
      <pubDate>Thu, 09 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/03/09/practical-bazel-use-multirun-for-parallel-execution/</guid>
      <description>&lt;p&gt;A quick tip on how to execute multiple run commands in parallel.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Using Clang 12 C&#43;&#43; Toolchain on Ubuntu 20.04</title>
      <link>https://www.stevenengelhardt.com/2023/03/08/practical-bazel-using-clang-12-c-toolchain-on-ubuntu-20.04/</link>
      <pubDate>Wed, 08 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/03/08/practical-bazel-using-clang-12-c-toolchain-on-ubuntu-20.04/</guid>
      <description>&lt;p&gt;This blog post explains how to use a custom C++ toolchain based on&#xA;clang 12 with libc++-12 in Bazel on Ubuntu 20.04.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Testing Rulesets with Docker Compose-Based Buildfarm</title>
      <link>https://www.stevenengelhardt.com/2023/03/07/practical-bazel-testing-rulesets-with-docker-compose-based-buildfarm/</link>
      <pubDate>Tue, 07 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/03/07/practical-bazel-testing-rulesets-with-docker-compose-based-buildfarm/</guid>
      <description>&lt;p&gt;Bazel supports scaling out builds with a remote execution system.  Unfortunately,&#xA;it is very easy for ruleset authors to release rules that work when executed&#xA;locally but do not work when executed remotely.  This blog post explains ruleset&#xA;authors can set up a simple remote execution system to verify that their&#xA;rulesets work correctly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Supporting Trinary Stamp Attributes</title>
      <link>https://www.stevenengelhardt.com/2023/03/06/practical-bazel-supporting-trinary-stamp-attributes/</link>
      <pubDate>Mon, 06 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/03/06/practical-bazel-supporting-trinary-stamp-attributes/</guid>
      <description>&lt;p&gt;In Bazel, &lt;em&gt;stamping&lt;/em&gt; is the process of embedding additional information into built&#xA;binaries, such as the source control revision or other workspace-related information.&#xA;Rules that support stamping typically include an integer &lt;code&gt;stamp&lt;/code&gt; attribute, where&#xA;&lt;code&gt;1&lt;/code&gt; means &amp;ldquo;always stamp&amp;rdquo;, &lt;code&gt;0&lt;/code&gt; means &amp;ldquo;never stamp&amp;rdquo;, and &lt;code&gt;-1&lt;/code&gt; means &amp;ldquo;use the Bazel&#xA;build &lt;code&gt;--stamp&lt;/code&gt; flag.  This blog post explains how to write a rule that supports&#xA;these values.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Custom Bazel Make Variables</title>
      <link>https://www.stevenengelhardt.com/2023/03/03/practical-bazel-custom-bazel-make-variables/</link>
      <pubDate>Fri, 03 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/03/03/practical-bazel-custom-bazel-make-variables/</guid>
      <description>&lt;p&gt;Many Bazel attributes support the use of predefined variables&#xA;and functions such as &lt;code&gt;@D&lt;/code&gt; for output directory or&#xA;&lt;code&gt;$(location //foo:bar)&lt;/code&gt; to get the path to a label.  But what&#xA;if you want to apply some sort of tranformation to these&#xA;variables, or define your own custom make variables?  This&#xA;blog post explains how.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Retrieving Secrets from Netrc in Custom Rules</title>
      <link>https://www.stevenengelhardt.com/2023/03/02/practical-bazel-retrieving-secrets-from-netrc-in-custom-rules/</link>
      <pubDate>Thu, 02 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/03/02/practical-bazel-retrieving-secrets-from-netrc-in-custom-rules/</guid>
      <description>&lt;p&gt;Bazel developers are currently working on adding the ability to&#xA;&lt;a href=&#34;https://github.com/bazelbuild/bazel/issues/15013&#34;&gt;retrieve secrets using a credential-helper executable&lt;/a&gt;, similar&#xA;to how other tools like Docker and Git handle managing secrets.&#xA;Until then, the recommended approach is to store secrets in&#xA;&lt;code&gt;~/.netrc&lt;/code&gt;.  This blog post explains how to write a custom Bazel&#xA;rule which reads secrets from &lt;code&gt;~/.netrc&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: local_archive() Workspace Rule</title>
      <link>https://www.stevenengelhardt.com/2023/03/01/practical-bazel-local_archive-workspace-rule/</link>
      <pubDate>Wed, 01 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/03/01/practical-bazel-local_archive-workspace-rule/</guid>
      <description>&lt;p&gt;In general, one should never check in binary artifacts into Git; it is better&#xA;to retrieve them from an artifact repository or a website using &lt;code&gt;http_archive()&lt;/code&gt;.&#xA;However, sometimes convenience is more important than ideological purity.&#xA;To handle these cases, I wrote a simple workspace rule named &lt;code&gt;local_archive()&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Comparing Collections for Equivalence in sh_test()</title>
      <link>https://www.stevenengelhardt.com/2023/02/28/practical-bazel-comparing-collections-for-equivalence-in-sh_test/</link>
      <pubDate>Tue, 28 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/02/28/practical-bazel-comparing-collections-for-equivalence-in-sh_test/</guid>
      <description>&lt;p&gt;When writing Bazel tests using &lt;code&gt;sh_test()&lt;/code&gt;, I often find myself needing to compare&#xA;two collections for equivalence.  For example, I might compare a directory listing&#xA;against a set of expected files or directories, or the list of files and directories&#xA;in a &lt;code&gt;.tar&lt;/code&gt; file against a set of expected items.  This blog post provides some tips&#xA;and tricks as to how to do so.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Using Bazel&#39;s Bash Runfiles Library</title>
      <link>https://www.stevenengelhardt.com/2023/02/27/practical-bazel-using-bazels-bash-runfiles-library/</link>
      <pubDate>Mon, 27 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/02/27/practical-bazel-using-bazels-bash-runfiles-library/</guid>
      <description>&lt;p&gt;Dealing with Bazel &lt;a href=&#34;https://bazel.build/extending/rules#runfiles&#34;&gt;runfiles&lt;/a&gt; is one of the most annoying things about using Bazel.&#xA;Fortunately, Bazel provides a library to make resolving runfiles from Bash scripts&#xA;easy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Using Bazel&#39;s Bash Unittest Framework</title>
      <link>https://www.stevenengelhardt.com/2023/02/26/practical-bazel-using-bazels-bash-unittest-framework/</link>
      <pubDate>Sun, 26 Feb 2023 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2023/02/26/practical-bazel-using-bazels-bash-unittest-framework/</guid>
      <description>&lt;p&gt;&lt;code&gt;sh_test&lt;/code&gt; is my most commonly used test rule by far.  It is the easiest way to&#xA;write quick-and-dirty tests and works nearly everywhere.  For anything beyond&#xA;the most trivial tests, I use Bazel&amp;rsquo;s Bash unit test framework.  This explains&#xA;what the framework is and how to use it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Start with Official Rules Template</title>
      <link>https://www.stevenengelhardt.com/2022/11/18/practical-bazel-start-with-official-rules-template/</link>
      <pubDate>Fri, 18 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2022/11/18/practical-bazel-start-with-official-rules-template/</guid>
      <description>&lt;p&gt;A quick tip for today:&lt;/p&gt;&#xA;&lt;p&gt;When creating a new ruleset, particularly on GitHub, start with the&#xA;&lt;a href=&#34;https://github.com/bazel-contrib/rules-template&#34;&gt;official Bazel rules template&lt;/a&gt;.  It includes a number of features&#xA;out of the box that are rather tiresome to implement yourself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Using Rulesets from Non-Public GitHub Repositories</title>
      <link>https://www.stevenengelhardt.com/2022/11/09/practical-bazel-using-rulesets-from-non-public-github-repositories/</link>
      <pubDate>Wed, 09 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2022/11/09/practical-bazel-using-rulesets-from-non-public-github-repositories/</guid>
      <description>&lt;p&gt;At work, we have a number of custom-written Bazel rulesets stored in organization&#xA;repositories on GitHub&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.  This post explains how we use these non-public&#xA;rulesets in our Bazel projects.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Building Multiple Workspaces in CI</title>
      <link>https://www.stevenengelhardt.com/2022/10/18/practical-bazel-building-multiple-workspaces-in-ci/</link>
      <pubDate>Tue, 18 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2022/10/18/practical-bazel-building-multiple-workspaces-in-ci/</guid>
      <description>&lt;p&gt;For most Bazel projects, I strongly recommend using a single Bazel&#xA;workspace per source code repository.  However, it can be occasionally&#xA;useful to nest multiple workspaces within a single repository.  For&#xA;example, when I&amp;rsquo;m writing Bazel rulesets, I will often create test&#xA;cases that contain own workspace with a slightly different configuration&#xA;in order to test various workspace-level configuration settings&#xA;for the ruleset, while maintaining a root workspace which is the&#xA;primary workspace for the ruleset.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Use a Single .bazelrc With Multiple Configurations</title>
      <link>https://www.stevenengelhardt.com/2022/10/17/practical-bazel-use-a-single-.bazelrc-with-multiple-configurations/</link>
      <pubDate>Mon, 17 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2022/10/17/practical-bazel-use-a-single-.bazelrc-with-multiple-configurations/</guid>
      <description>&lt;p&gt;Bazel users commonly need to manage multiple different configurations&#xA;when building and testing software, such as:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A configuration that is used by developers on their own PCs, which often has&#xA;debug mode turned on&lt;/li&gt;&#xA;&lt;li&gt;A configuration that is used by the continuous integration (CI) default&#xA;build and test pipeline, which often builds in release mode&lt;/li&gt;&#xA;&lt;li&gt;A configuration for generating a tagged, version release, which often has&#xA;stamping enabled&lt;/li&gt;&#xA;&lt;li&gt;(Perhaps many more)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Implementing compilation_mode in Rules</title>
      <link>https://www.stevenengelhardt.com/2022/10/13/practical-bazel-implementing-compilation_mode-in-rules/</link>
      <pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2022/10/13/practical-bazel-implementing-compilation_mode-in-rules/</guid>
      <description>&lt;p&gt;As developers know, virtually all compilers support the notion&#xA;of compilation mode, e.g.. whether to compile the code in debug&#xA;or release mode.  In Bazel, this concept is built natively into&#xA;the build system itself.  When compiling software using &lt;code&gt;bazel build&lt;/code&gt;,&#xA;one can select a compilation mode using the &lt;code&gt;--compilation_mode&lt;/code&gt;&#xA;(often shorted to &lt;code&gt;-c&lt;/code&gt;) flag.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Isolating Ruleset&#39;s Public Interface</title>
      <link>https://www.stevenengelhardt.com/2022/10/12/practical-bazel-isolating-rulesets-public-interface/</link>
      <pubDate>Wed, 12 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2022/10/12/practical-bazel-isolating-rulesets-public-interface/</guid>
      <description>&lt;p&gt;When writing a custom Bazel ruleset, it is important to carefully&#xA;separate its public interface from its private implementation&#xA;and be deliberate and careful about changes to the public&#xA;interface.  Here&amp;rsquo;s the pattern I use when I&amp;rsquo;m writing rulesets to&#xA;handle this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Depending on a System-Provided C/C&#43;&#43; Library</title>
      <link>https://www.stevenengelhardt.com/2021/09/22/practical-bazel-depending-on-a-system-provided-c-cpp-library/</link>
      <pubDate>Wed, 22 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2021/09/22/practical-bazel-depending-on-a-system-provided-c-cpp-library/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s say you are using Bazel to build a C program which links against&#xA;a system-provided version of &lt;a href=&#34;https://curl.se/libcurl/&#34;&gt;libcurl&lt;/a&gt;, the multiprotocol file transfer&#xA;library.  What is the best way to link your program against this library&#xA;within Bazel?  This blog post provides an answer to that question.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: A Starting CI Pipeline</title>
      <link>https://www.stevenengelhardt.com/2021/09/14/practical-bazel-a-starting-ci-pipeline/</link>
      <pubDate>Tue, 14 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2021/09/14/practical-bazel-a-starting-ci-pipeline/</guid>
      <description>&lt;p&gt;This post describes a pattern for implementing a continuous integration&#xA;(CI) pipeline using Bazel.  This pattern is my starting point whenever&#xA;I set up a new Bazel-based project in CI, after which I add any&#xA;project-specific pipeline customizations.&lt;/p&gt;&#xA;&lt;p&gt;This pipeline is purely about the CI (build to release) stages of a&#xA;pipeline.  A full continuous delivery (CD) pipeline, which includes&#xA;deployment, will be discussed in a later post.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: A Successful Build is a Quiet Build</title>
      <link>https://www.stevenengelhardt.com/2021/09/04/practical-bazel-a-successful-build-is-a-quiet-build/</link>
      <pubDate>Sat, 04 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2021/09/04/practical-bazel-a-successful-build-is-a-quiet-build/</guid>
      <description>&lt;p&gt;In Bazel, a successful build should be a quiet build.  While build failures&#xA;should, of course, print ample information to &lt;code&gt;stderr&lt;/code&gt; to aide in troubleshooting,&#xA;any custom Bazel code you write should &lt;em&gt;not&lt;/em&gt; output progress information to &lt;code&gt;stdout&lt;/code&gt;&#xA;or &lt;code&gt;stderr&lt;/code&gt;.  Let Bazel be responsible for overall build progress reporting.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Use Awesome Bazel to find rules</title>
      <link>https://www.stevenengelhardt.com/2020/12/01/practical-bazel-use-awesome-bazel-to-find-rules/</link>
      <pubDate>Tue, 01 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/12/01/practical-bazel-use-awesome-bazel-to-find-rules/</guid>
      <description>&lt;p&gt;A quick tip for today:&lt;/p&gt;&#xA;&lt;p&gt;Use &lt;a href=&#34;https://awesomebazel.com/&#34;&gt;Awesome Bazel&lt;/a&gt; to find new Bazel rulesets, tooling, and resources.&#xA;Don&amp;rsquo;t be afraid to submit PRs to &lt;a href=&#34;https://github.com/jin/awesome-bazel&#34;&gt;its GitHub repo&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: A Simpler Way to Wrap Run Targets</title>
      <link>https://www.stevenengelhardt.com/2020/11/20/practical-bazel-a-simpler-way-to-wrap-run-targets/</link>
      <pubDate>Fri, 20 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/11/20/practical-bazel-a-simpler-way-to-wrap-run-targets/</guid>
      <description>&lt;p&gt;Yesterday, &lt;a href=&#34;https://www.stevenengelhardt.com/2020/11/19/practical-bazel-wrapping-run-targets-to-provide-additional-context/&#34;&gt;I explained how you can wrap a &lt;code&gt;bazel run&lt;/code&gt; target with&#xA;a &lt;code&gt;sh_binary()&lt;/code&gt; to execute arbitrary code both before and after&#xA;the run target&lt;/a&gt;, which is particularly useful for retrieving secrets&#xA;from a secret management system and passing them to the run target.&lt;/p&gt;&#xA;&lt;p&gt;If you are passing secrets via environment variables that are retrieved&#xA;by command-line programs, there&amp;rsquo;s an even easier way to do it &amp;ndash; use the&#xA;&lt;code&gt;command&lt;/code&gt; rule from &lt;a href=&#34;https://github.com/atlassian/bazel-tools&#34;&gt;Atlassian&amp;rsquo;s bazel-tools repo&lt;/a&gt; and its&#xA;&lt;code&gt;raw_environment&lt;/code&gt; attribute.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Wrapping Run Targets to Provide Additional Context</title>
      <link>https://www.stevenengelhardt.com/2020/11/19/practical-bazel-wrapping-run-targets-to-provide-additional-context/</link>
      <pubDate>Thu, 19 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/11/19/practical-bazel-wrapping-run-targets-to-provide-additional-context/</guid>
      <description>&lt;p&gt;An executable rule which can be executed via &lt;code&gt;bazel run&lt;/code&gt; is the natural&#xA;way to model interactions with external systems in Bazel such as uploading&#xA;build artifacts to a remote artifact repository.  For example, imagine&#xA;a &lt;code&gt;rules_artifactory&lt;/code&gt; ruleset which includes a rule &lt;code&gt;artifactory_push()&lt;/code&gt;&#xA;executable rule which uploads a compiled &lt;code&gt;.dpkg&lt;/code&gt; to an &lt;a href=&#34;https://jfrog.com/artifactory/&#34;&gt;Artifactory&lt;/a&gt;&#xA;apt repository, or a &lt;a href=&#34;https://github.com/bazelbuild/rules_docker&#34;&gt;&lt;code&gt;rules_docker&lt;/code&gt; ruleset&lt;/a&gt; which has a rule&#xA;&lt;code&gt;docker_push()&lt;/code&gt; which pushes a Docker image to a remote image repository.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Writing a Rule That Supports Both Build and Run</title>
      <link>https://www.stevenengelhardt.com/2020/11/13/practical-bazel-writing-a-rule-that-supports-both-build-and-run/</link>
      <pubDate>Fri, 13 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/11/13/practical-bazel-writing-a-rule-that-supports-both-build-and-run/</guid>
      <description>&lt;p&gt;When I first started writing custom Bazel rules, I often created&#xA;separate rules for the &lt;code&gt;build&lt;/code&gt; and &lt;code&gt;run&lt;/code&gt; commands in Bazel.  This&#xA;was a mistake.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Use ctx.actions.args() to Form Arguments Lists</title>
      <link>https://www.stevenengelhardt.com/2020/11/12/practical-bazel-use-ctx.actions.args-to-form-arguments-lists/</link>
      <pubDate>Thu, 12 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/11/12/practical-bazel-use-ctx.actions.args-to-form-arguments-lists/</guid>
      <description>&lt;p&gt;When writing custom rules, you often need to invoke executables with&#xA;argument lists.  For example, let&amp;rsquo;s say you are writing a custom rule&#xA;that executes &lt;code&gt;gcc&lt;/code&gt; to compile a set of input source files.  You&#xA;&lt;em&gt;could&lt;/em&gt; write:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Changing Behavior on Windows</title>
      <link>https://www.stevenengelhardt.com/2020/11/05/practical-bazel-changing-behavior-on-windows/</link>
      <pubDate>Thu, 05 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/11/05/practical-bazel-changing-behavior-on-windows/</guid>
      <description>&lt;p&gt;Bazel started on Linux and Mac OS, and most people use Bazel on these&#xA;platforms exclusively, but Bazel can execute on Windows as well.  However,&#xA;Windows has enough idiosynchatic differences that writing a single,&#xA;operating-system agnostic rule that executes on both Windows and Linux/Mac&#xA;is quite hard.  Often it is easiest to have the rule detect whether&#xA;it is running on Windows and execute different behavior.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Prefix All Generated Files</title>
      <link>https://www.stevenengelhardt.com/2020/11/04/practical-bazel-prefix-all-generated-files/</link>
      <pubDate>Wed, 04 Nov 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/11/04/practical-bazel-prefix-all-generated-files/</guid>
      <description>&lt;p&gt;When writing a custom rule that generates files, be sure to add&#xA;prefixes to all filenames so that multiple instances of your rule&#xA;can be instantiated within the same Bazel package.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Enable Bash Strict Mode</title>
      <link>https://www.stevenengelhardt.com/2020/10/30/practical-bazel-enable-bash-strict-mode/</link>
      <pubDate>Fri, 30 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/30/practical-bazel-enable-bash-strict-mode/</guid>
      <description>&lt;p&gt;One tends to write a lot of Bash scripts when using Bazel.  In&#xA;order to make these scripts more robust, enable&#xA;&lt;a href=&#34;http://redsymbol.net/articles/unofficial-bash-strict-mode/&#34;&gt;Bash&amp;rsquo;s unofficial strict mode&lt;/a&gt; by starting all scripts&#xA;like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Force Line Endings to LF</title>
      <link>https://www.stevenengelhardt.com/2020/10/29/practical-bazel-force-line-endings-to-lf/</link>
      <pubDate>Thu, 29 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/29/practical-bazel-force-line-endings-to-lf/</guid>
      <description>&lt;p&gt;Bazel requires all files to end with LF (not CR-LF) in order to work correctly.&lt;/p&gt;&#xA;&lt;p&gt;If you are performing cross-platform Bazel development with Windows users, you&#xA;can force this setting for &lt;em&gt;all&lt;/em&gt; text files in your repo by creating a&#xA;&lt;code&gt;.gitattributes&lt;/code&gt; file with the following content:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Excluding Part of Tree</title>
      <link>https://www.stevenengelhardt.com/2020/10/28/practical-bazel-excluding-part-of-tree/</link>
      <pubDate>Wed, 28 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/28/practical-bazel-excluding-part-of-tree/</guid>
      <description>&lt;p&gt;Quick Bazel tip for today:  If you want to build everything &lt;em&gt;except&lt;/em&gt; for a specific&#xA;subtree, you can prefix the subtree you want to exclude with a &lt;code&gt;-&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For example, to build everything except for &lt;code&gt;//client_access_library/...&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;bazel build -- //... -//client_access_library/...&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Use a Specific Version of Bazel</title>
      <link>https://www.stevenengelhardt.com/2020/10/27/practical-bazel-use-specific-version-of-bazel/</link>
      <pubDate>Tue, 27 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/27/practical-bazel-use-specific-version-of-bazel/</guid>
      <description>&lt;p&gt;Bazel&amp;rsquo;s philosophy strongly encourages binding to exact, specific versions of all&#xA;third-party dependencies to help ensure reproducible builds.  As Bazel users,&#xA;we must remember to &lt;em&gt;extend this philosophy to Bazel itself&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When setting up a Bazel-based build system, you should choose a specific version&#xA;of Bazel and require all developers and the build system to use it.  This can&#xA;be done in a few ways:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Use &lt;a href=&#34;https://github.com/bazelbuild/bazelisk&#34;&gt;Bazelisk&lt;/a&gt; and a &lt;code&gt;.bazelversion&lt;/code&gt; file (recommended)&lt;/li&gt;&#xA;&lt;li&gt;Installing a specific version of Bazel as part of your build and developer&#xA;VM images / docker containers&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;With the first approach, upgrades to Bazel can then be treated like any other&#xA;upgrade: submit a pull request to the repo which updates the value in the&#xA;&lt;code&gt;.bazelversion&lt;/code&gt; file and runs the full continuous integration pipeline.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: path or short_path?</title>
      <link>https://www.stevenengelhardt.com/2020/10/22/practical-bazel-path-or-short_path/</link>
      <pubDate>Thu, 22 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/22/practical-bazel-path-or-short_path/</guid>
      <description>&lt;p&gt;When writing custom Bazel rules, you spend a lot of time either&#xA;reading or writing Bazel &lt;a href=&#34;https://docs.bazel.build/versions/master/skylark/lib/File.html&#34;&gt;&lt;code&gt;File&lt;/code&gt;&lt;/a&gt; objects.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;File&lt;/code&gt; objects have two properties for accessing the underlying&#xA;file path: &lt;a href=&#34;https://docs.bazel.build/versions/master/skylark/lib/File.html#path&#34;&gt;&lt;code&gt;File.path&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://docs.bazel.build/versions/master/skylark/lib/File.html#short_path&#34;&gt;&lt;code&gt;File.short_path&lt;/code&gt;&lt;/a&gt;.  When&#xA;writing custom rules, I often chose one of the two properties at&#xA;random, and switched to the other if it didn&amp;rsquo;t work right.&lt;/p&gt;&#xA;&lt;p&gt;I wrote some simple custom rules to test the various combination&#xA;of rule types and file types to determine when I should use &lt;code&gt;path&lt;/code&gt;&#xA;or &lt;code&gt;short_path&lt;/code&gt;.  The custom rules used bash script templates&#xA;that were populated with file paths, such as:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Start with Genrules</title>
      <link>https://www.stevenengelhardt.com/2020/10/21/practical-bazel-start-with-genrules/</link>
      <pubDate>Wed, 21 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/21/practical-bazel-start-with-genrules/</guid>
      <description>&lt;p&gt;Bazel is a powerful yet complicated system, and it can be intimidating&#xA;to newcomers.&lt;/p&gt;&#xA;&lt;p&gt;While the &lt;a href=&#34;https://docs.bazel.build/versions/master/guide.html&#34;&gt;Bazel user guide&lt;/a&gt; and &lt;a href=&#34;https://docs.bazel.build/versions/3.7.0/user-manual.html&#34;&gt;user manual&lt;/a&gt; preach the benefits&#xA;of giving Bazel full control over your build process by rewriting&#xA;all build processes using Bazel-native rulesets (as Google reportedly does&#xA;internally), this is an immense amount of work.  Specifically, if you&#xA;are integrating third-party software into your Bazel-based build&#xA;process, reverse engineering and rewriting the third-party project&amp;rsquo;s&#xA;build system into Bazel can easily take days &amp;ndash; and then you need to&#xA;maintain it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Practical Bazel: Introduction</title>
      <link>https://www.stevenengelhardt.com/2020/10/20/practical-bazel-introduction/</link>
      <pubDate>Tue, 20 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/20/practical-bazel-introduction/</guid>
      <description>&lt;p&gt;In 2020, I led the redesign and re-implementation of the object storage&#xA;system behind &lt;a href=&#34;https://www.relativity.com/ediscovery-software/relativityone/&#34;&gt;RelativityOne&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As part of this project we reengineered the &lt;a href=&#34;https://en.wikipedia.org/wiki/Continuous_delivery&#34;&gt;continuous delivery&lt;/a&gt;&#xA;pipeline of the service to embrace the philosophy of a service-wide&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Monorepo&#34;&gt;monorepo&lt;/a&gt; with a &lt;a href=&#34;https://bazel.build/&#34;&gt;Bazel&lt;/a&gt;-based build system.  We chose Bazel&#xA;because we wanted a build system that could support many different&#xA;languages (the service has code written in C, C#, Python, Go, Terraform,&#xA;Packer, and other languages&amp;hellip;) while remaining fast and correct.&lt;/p&gt;</description>
    </item>
    <item>
      <title>COVID-19&#39;s Effect on Alcohol Sales</title>
      <link>https://www.stevenengelhardt.com/2020/10/19/covid-effect-on-alcohol-sales/</link>
      <pubDate>Mon, 19 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/19/covid-effect-on-alcohol-sales/</guid>
      <description>&lt;p&gt;Alcohol sales in the United States showed a clear and predictable&#xA;pattern year-over-year &amp;hellip; until 2020.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://www.stevenengelhardt.com/images/2020/10/alcohol-sales.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;I&amp;rsquo;ve certainly been doing my part to bend the curve.&lt;/p&gt;&#xA;&lt;p&gt;Source: &lt;a href=&#34;https://fred.stlouisfed.org/series/MRTSSM4453USN&#34;&gt;FRED&amp;rsquo;s series on Retail Sales: Beer, Wine, and Liquor Stores&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dialect Quiz Results</title>
      <link>https://www.stevenengelhardt.com/2020/10/16/dialect-quiz-results/</link>
      <pubDate>Fri, 16 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/16/dialect-quiz-results/</guid>
      <description>&lt;p&gt;Here are the results I got when I took &lt;a href=&#34;https://www.nytimes.com/interactive/2014/upshot/dialect-quiz-map.html&#34;&gt;New York Times dialect quiz test&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://www.stevenengelhardt.com/images/2020/10/dialect-quiz-results.png&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Eerily accurate.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implication of Copyrightable APIs</title>
      <link>https://www.stevenengelhardt.com/2020/10/15/implication-of-copyrightable-apis/</link>
      <pubDate>Thu, 15 Oct 2020 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2020/10/15/implication-of-copyrightable-apis/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;The Supreme Court&amp;rsquo;s eight justices on Wednesday seemed skeptical of Google&#39;&#xA;argument that application programming interfaces (APIs) are not protected&#xA;by copyright law. The high court was hearing oral arguments in Google&amp;rsquo;s&#xA;decade-long legal battle with Oracle. Oracle argues that Google infringed&#xA;its copyright in the Java programming language when it re-implemented Java&#xA;APIs for use by Android app developers.&lt;/p&gt;&#xA;&lt;p&gt;The stakes in the case are high for Google, which could owe Oracle billions&#xA;of dollars in damages. More importantly, an Oracle win could reshape how&#xA;copyright law treats APIs, giving incumbents the power to lock out&#xA;competitors who want to build compatible software.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Streaming Percentiles 3.1.0 Released</title>
      <link>https://www.stevenengelhardt.com/2019/03/29/streaming-percentiles-3-1-0-released/</link>
      <pubDate>Fri, 29 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2019/03/29/streaming-percentiles-3-1-0-released/</guid>
      <description>&lt;p&gt;Version 3.1.0 of the &lt;a href=&#34;https://github.com/sengelha/streaming-percentiles&#34;&gt;streaming percentiles library&lt;/a&gt; has been released.&lt;/p&gt;&#xA;&lt;p&gt;The streaming percentiles library is a cross-platform, multi-language&#xA;(C++ and JavaScript) implementation of a number of online (single-pass)&#xA;percentile algorithms.  This version of the streaming percentiles library&#xA;adds support for copy construction, assignment, move construction, and&#xA;move assignment on all analytics classes.&lt;/p&gt;&#xA;&lt;p&gt;This change allows you to put streaming analytics classes into STL containers,&#xA;such as:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;stmpct/gk.hpp&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;vector&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;stmpct&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gk&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;algs&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;algs&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;emplace_back&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.01&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;algs&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;emplace_back&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.05&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;auto&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#f57900&#34;&gt;g&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;algs&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;rand&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;());&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p95&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;quantile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.95&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Approx. 95th percentile for current epsilon&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It also allows you to efficiently move the state of an algorithm&#xA;from one object to another without copying, as in:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating Percentiles on Streaming Data Part 8: Parameterizing Algorithms on Measurement Type</title>
      <link>https://www.stevenengelhardt.com/2018/12/21/calculating-percentiles-on-streaming-data-part-8-parameterizing-algorithms-on-measurement-type/</link>
      <pubDate>Fri, 21 Dec 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/12/21/calculating-percentiles-on-streaming-data-part-8-parameterizing-algorithms-on-measurement-type/</guid>
      <description>&lt;p&gt;This is part 8/8 of my &lt;em&gt;Calculating Percentiles on Streaming Data&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;As mentioned in &lt;a href=&#34;https://www.stevenengelhardt.com/2018/03/19/calculating-percentiles-on-streaming-data-part-6-building-a-c-and-javascript-library-from-a-single-codebase/&#34;&gt;part 6 of this series&lt;/a&gt;, I have published a C++ and JavaScript library which&#xA;implements a number of streaming percentile algorithms on GitHub at &lt;a href=&#34;https://github.com/sengelha/streaming-percentiles&#34;&gt;https://github.com/sengelha/streaming-percentiles&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Versions 1.x and 2.x of the C++ library required all measurements to use the type &lt;code&gt;double&lt;/code&gt;,&#xA;and usage of the algorithms looked something like this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;stmpct/gk.hpp&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;epsilon&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;stmpct&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;gk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;epsilon&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;rand&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;());&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p50&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;quantile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.5&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Approx. median&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p95&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;quantile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.95&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Approx. 95th percentile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For version 3.x of the library, I have modified the algorithms to be&#xA;parameterized by type so that they are not limited to &lt;code&gt;double&lt;/code&gt;.  The&#xA;algorithms now may be used by type which implements a few simple&#xA;requirements: it must be default constructible, copy constructible,&#xA;assignable, and implement &lt;code&gt;operator&amp;lt;&lt;/code&gt;.  This means that they can now&#xA;be used with &lt;code&gt;float&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;long double&lt;/code&gt;, a custom number type, or&#xA;even &lt;code&gt;std::string&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Streaming Percentiles Library</title>
      <link>https://www.stevenengelhardt.com/projects/streaming-percentiles-library/</link>
      <pubDate>Sun, 21 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/projects/streaming-percentiles-library/</guid>
      <description>&lt;p&gt;At various points in my career, I have created or managed systems which&#xA;need to perform calculations on enormous amounts of numeric data in&#xA;real-time.  Whether I was running a &lt;a href=&#34;https://varnish-cache.org/&#34;&gt;Varnish&lt;/a&gt; cluster that served&#xA;30,000 requests per second or writing financial analytics which needed&#xA;to calculate aggregates on terabytes of price and return data in a few&#xA;seconds, a common need emerged: how can I calcalate aggregates on&#xA;large amounts of numeric data in a single pass?&lt;/p&gt;</description>
    </item>
    <item>
      <title>D3 Latency Heatmap</title>
      <link>https://www.stevenengelhardt.com/projects/d3-latency-heatmap/</link>
      <pubDate>Fri, 19 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/projects/d3-latency-heatmap/</guid>
      <description>&lt;p&gt;In the fall of 2017, I was researching a performance problem with a job&#xA;queueing system.  I was trying to figure out how I could better visualize&#xA;the response time of the system in order to understand what was going on&#xA;and I ran across the excellent article &lt;a href=&#34;http://www.brendangregg.com/HeatMaps/latency.html&#34;&gt;Brandon Gregg&amp;rsquo;s Latency Heat Maps&lt;/a&gt;.&#xA;I could not find an easy-to-use, reusable latency heat map chart&#xA;component, so I decided to make my own in &lt;a href=&#34;https://d3js.org/&#34;&gt;d3.js&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moved Link Aggregation to Bitly</title>
      <link>https://www.stevenengelhardt.com/2018/04/22/moved-link-aggregation-to-bitly/</link>
      <pubDate>Sun, 22 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/04/22/moved-link-aggregation-to-bitly/</guid>
      <description>&lt;p&gt;I have decided to move my link aggregation efforts, such as they are, to &lt;a href=&#34;http://www.bitly.com&#34;&gt;Bitly&lt;/a&gt;, and to leave this blog for original content.  &lt;a href=&#34;https://twitter.com/sengelha&#34;&gt;Follow me on Twitter&lt;/a&gt; if you&amp;rsquo;re interested in tracking these links in the future.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unit Testing Emscripten Library in Browser Using CMake and Nightwatch.JS</title>
      <link>https://www.stevenengelhardt.com/2018/04/17/unit-testing-emscripten-library-in-browser-using-cmake-and-nightwatch-js/</link>
      <pubDate>Tue, 17 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/04/17/unit-testing-emscripten-library-in-browser-using-cmake-and-nightwatch-js/</guid>
      <description>&lt;p&gt;In a &lt;a href=&#34;https://www.stevenengelhardt.com/2018/04/14/creating-umd-module-from-emscripten-using-cmake/&#34;&gt;previous blog post&lt;/a&gt;, I described how I took Emscripten-created JS and turned it into an &lt;a href=&#34;https://github.com/umdjs/umd&#34;&gt;UMD module&lt;/a&gt;.  One of the reasons I did this was because I wanted more control over the generated JavaScript and for it to be usable in more contexts, such as with the &lt;a href=&#34;http://requirejs.org/&#34;&gt;RequireJS module loader&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As I am a responsible developer, I desired to create a number of automated unit tests to ensure that the client-visible API for my Emscripten module works as I intended.  I began by searching for a browser automated test framework and settled upon &lt;a href=&#34;http://nightwatchjs.org/&#34;&gt;Nightwatch.js&lt;/a&gt;.  Now I just had to figure out how to get Nightwatch.js tests running in my existing, &lt;a href=&#34;https://cmake.org/&#34;&gt;CMake&lt;/a&gt;-based build system.  Here&amp;rsquo;s how I did it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating UMD Module from Emscripten using CMake</title>
      <link>https://www.stevenengelhardt.com/2018/04/14/creating-umd-module-from-emscripten-using-cmake/</link>
      <pubDate>Sat, 14 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/04/14/creating-umd-module-from-emscripten-using-cmake/</guid>
      <description>&lt;p&gt;By default, &lt;a href=&#34;https://github.com/kripken/emscripten&#34;&gt;Emscripten&lt;/a&gt; creates a module which can be used from both Node.JS and the browser, but it has the following issues:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The module pollutes the global namespace&lt;/li&gt;&#xA;&lt;li&gt;The module is created with the name &lt;code&gt;Module&lt;/code&gt; (in my case, I require &lt;code&gt;streamingPercentiles&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;The module cannot be loaded by some module loaders such as &lt;a href=&#34;http://requirejs.org/&#34;&gt;require.js&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;While the above issues can (mostly) be corrected by using &lt;code&gt;–s MODULARIZE=1&lt;/code&gt;, it changes the semantics of the resulting JavaScript file, as the module now returns a function rather than an object. For example, code which previously read &lt;code&gt;var x = new Module.Klass()&lt;/code&gt; would become &lt;code&gt;var x = new Module().Klass()&lt;/code&gt;. I found this semantic change unacceptable, so I decided to abandon Emscripten&amp;rsquo;s &lt;code&gt;-s MODULARIZE=1&lt;/code&gt; option in favor of hand-crafting a &lt;a href=&#34;https://github.com/umdjs/umd&#34;&gt;UMD module&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Board Games for Family Night</title>
      <link>https://www.stevenengelhardt.com/2018/04/05/board-games-for-family-night/</link>
      <pubDate>Thu, 05 Apr 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/04/05/board-games-for-family-night/</guid>
      <description>&lt;p&gt;Playing board games is a major hobby of mine. Every year I look forward to attending &lt;a href=&#34;https://www.gencon.com/&#34;&gt;Gen Con&lt;/a&gt;, where I aggressively shop the dings and dents section of &lt;a href=&#34;https://www.coolstuffinc.com/&#34;&gt;CoolStuffInc&lt;/a&gt; and play as many new games as I can.&lt;/p&gt;&#xA;&lt;p&gt;We enjoy playing board games as a family. I&amp;rsquo;ve been playing board games with my daughter since she was four; she&amp;rsquo;s eight now, and quite the gamer. One of the things we&amp;rsquo;ve learned is that the recommended age range on a board game is merely a &lt;em&gt;recommendation&lt;/em&gt;: the only real challenge for my daughter in playing advanced games was how well she was able to read.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating Percentiles on Streaming Data Part 7: Cormode-Korn-Muthukrishnan-Srivastava</title>
      <link>https://www.stevenengelhardt.com/2018/03/29/calculating-percentiles-on-streaming-data-part-7-cormode-korn-muthukrishnan-srivastava/</link>
      <pubDate>Thu, 29 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/03/29/calculating-percentiles-on-streaming-data-part-7-cormode-korn-muthukrishnan-srivastava/</guid>
      <description>&lt;p&gt;This is part 7/8 of my &lt;em&gt;Calculating Percentiles on Streaming Data&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;In 2005, Graham Cormode, Flip Korn, S. Muthukrishnan, and Divesh Srivastava published a paper called &lt;em&gt;Effective Computation of Biased Quantiles over Data Streams&lt;/em&gt; [CKMS05]. This paper took the Greenwald-Khanna algorithm [GK01] and made the following notable changes:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Generalized the algorithm to work with arbitrary &lt;em&gt;targeted quantiles&lt;/em&gt;, where a targeted quantile is a combination of a quantile $\phi$ and a maximum allowable error $\epsilon$. The algorithm will maintain the summary data structure $\mathsf{S}$ such that it will maintain each targeted quantile with the appropriate error rate.&lt;/li&gt;&#xA;&lt;li&gt;Simplified the &lt;code&gt;Compress()&lt;/code&gt; operation by removing the concept of banding.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The paper also demonstrated that the new, more generalized algorithm could handle the following cases with ease:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating Percentiles on Streaming Data Part 6: Building a C&#43;&#43; and JavaScript Library from a Single Codebase</title>
      <link>https://www.stevenengelhardt.com/2018/03/19/calculating-percentiles-on-streaming-data-part-6-building-a-c-and-javascript-library-from-a-single-codebase/</link>
      <pubDate>Mon, 19 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/03/19/calculating-percentiles-on-streaming-data-part-6-building-a-c-and-javascript-library-from-a-single-codebase/</guid>
      <description>&lt;p&gt;This is part 6/8 of my &lt;em&gt;Calculating Percentiles on Streaming Data&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;For the past 10 days or so, I&amp;rsquo;ve been working on the build process of my &lt;a href=&#34;https://www.stevenengelhardt.com/2018/03/09/calculating-percentiles-on-streaming-data-part-5-c-library/&#34;&gt;C++&lt;/a&gt; and &lt;a href=&#34;https://www.stevenengelhardt.com/2018/03/08/calculating-percentiles-on-streaming-data-part-4-javascript-packages/&#34;&gt;JavaScript&lt;/a&gt; streaming analytics libraries. Using the magic of &lt;a href=&#34;https://github.com/kripken/emscripten&#34;&gt;Emscripten&lt;/a&gt;, I have been able to combine both libraries into a single, C++ codebase, from which I can compile both the C++ and JavaScript versions of the library. Furthermore, I was able to do this without breaking backwards compatibility of the JavaScript library. I also made a number of other improvements to the compilation process, such as providing &lt;a href=&#34;https://github.com/sengelha/streaming-percentiles-cpp/releases&#34;&gt;precompiled binaries&lt;/a&gt; and supporting both shared and static libraries.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating Percentiles on Streaming Data Part 5: C&#43;&#43; Library</title>
      <link>https://www.stevenengelhardt.com/2018/03/09/calculating-percentiles-on-streaming-data-part-5-c-library/</link>
      <pubDate>Fri, 09 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/03/09/calculating-percentiles-on-streaming-data-part-5-c-library/</guid>
      <description>&lt;p&gt;This is part 5/8 of my &lt;em&gt;Calculating Percentiles on Streaming Data&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;I have created a reusable C++ library which contains my implementation of the streaming percentile algorithms found within this blog post and published it to GitHub. Here&amp;rsquo;s what using it looks like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;stmpct/gk.hpp&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;namespace&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;stmpct&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;epsilon&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;gk&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;epsilon&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;rand&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;());&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p50&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;quantile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.5&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Approx. median&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p95&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;quantile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.95&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Approx. 95th percentile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can find it here:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://github.com/sengelha/streaming-percentiles-cpp/&#34;&gt;Source code on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Calculating Percentiles on Streaming Data Part 4: JavaScript Library</title>
      <link>https://www.stevenengelhardt.com/2018/03/08/calculating-percentiles-on-streaming-data-part-4-javascript-packages/</link>
      <pubDate>Thu, 08 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/03/08/calculating-percentiles-on-streaming-data-part-4-javascript-packages/</guid>
      <description>&lt;p&gt;This is part 4/8 of my &lt;em&gt;Calculating Percentiles on Streaming Data&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;I have created a reusable JavaScript library which contains my implementation of the streaming percentile algorithms found within this blog post and published it to GitHub and NPM. Here&amp;rsquo;s what using it looks like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sp&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;require&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a40000&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;streaming&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;percentiles&lt;/span&gt;&lt;span style=&#34;color:#a40000&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// epsilon is allowable error. As epsilon becomes smaller, the&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// accuracy of the approximations improves, but the class consumes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// more memory.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;epsilon&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gk&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sp&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;epsilon&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1000&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;gk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;insert&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;Math&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;random&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;());&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p50&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;quantile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.5&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Approx. median&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;p95&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;gk&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;quantile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0.95&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Approx. 95th percentile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can find it here:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating Percentiles on Streaming Data Part 3: Visualizing Greenwald-Khanna</title>
      <link>https://www.stevenengelhardt.com/2018/03/07/calculating-percentiles-on-streaming-data-part-3-visualizing-greenwald-khanna/</link>
      <pubDate>Wed, 07 Mar 2018 23:37:38 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/03/07/calculating-percentiles-on-streaming-data-part-3-visualizing-greenwald-khanna/</guid>
      <description>&lt;p&gt;This is part 3/8 of my &lt;em&gt;Calculating Percentiles on Streaming Data&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;In an effort to better understand the Greenwald-Khanna [&lt;a href=&#34;#GK01&#34;&gt;GK01&lt;/a&gt;] algorithm, I created a series of visualizations of the cumulative distribution functions of a randomly-generated, normally-distributed data set with $\mu$ = 0 and $\sigma$ = 1, as the number of random numbers $n$ increases from 1 to 1,000.&lt;/p&gt;&#xA;&lt;p&gt;The way to read these visualizations is to find the percentile you are looking for on the y-axis, then trace horizontally to find the vertical line on the chart which intersects this location, then read the value from the x-axis.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating Percentiles on Streaming Data Part 2: Notes on Implementing Greenwald-Khanna</title>
      <link>https://www.stevenengelhardt.com/2018/03/07/calculating-percentiles-on-streaming-data-part-2-notes-on-implementing-greenwald-khanna/</link>
      <pubDate>Wed, 07 Mar 2018 16:19:29 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/03/07/calculating-percentiles-on-streaming-data-part-2-notes-on-implementing-greenwald-khanna/</guid>
      <description>&lt;p&gt;This is part 2/8 of my &lt;em&gt;Calculating Percentiles on Streaming Data&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;The most famous algorithm for calculating percentiles on streaming data appears to be Greenwald-Khanna [&lt;a href=&#34;#GK01&#34;&gt;GK01&lt;/a&gt;]. I spent a few days implementing the Greenwald-Khanna algorithm from the paper and I discovered a few things I wanted to share.&lt;/p&gt;&#xA;&lt;h1 id=&#34;insert-operation&#34;&gt;Insert Operation&lt;/h1&gt;&#xA;&lt;p&gt;The insert operation is defined in [&lt;a href=&#34;#GK01&#34;&gt;GK01&lt;/a&gt;] as follows:&lt;/p&gt;&#xA;&lt;dl&gt;&#xA;&lt;dt&gt;INSERT($v$)&lt;/dt&gt;&#xA;&lt;dd&gt;Find the smallest $i$, such that $v_{i-1} \leq v &amp;lt; v_i$, and insert the tuple $ t_x = (v_x, g_x, \Delta_x) = (v, 1, \lfloor 2 \epsilon n \rfloor) $, between $t_{i-1}$ and $t_i$. Increment $s$. As a special case, if $v$ is the new minimum or the maximum observation seen, then insert $(v, 1, 0)$.&lt;/dd&gt;&#xA;&lt;/dl&gt;&#xA;&lt;p&gt;However, when I implemented this operation, I noticed via testing that there were certain queries I could not fulfill. For example, consider applying Greenwald-Khanna with $\epsilon = 0.1$ to the sequence of values ${11, 20, 18, 5, 12, 6, 3, 2}$, and then apply &lt;strong&gt;QUANTILE($\phi = 0.5$)&lt;/strong&gt;. This means that $r = \lceil \phi n \rceil = \lceil 0.5 \times 8 \rceil = 4$ and $\epsilon n = 0.1 \times 8 = 0.8$. There is no $i$ that satisfies both $r &amp;ndash; r_{min}(v_i) \leq \epsilon n$ and $r_{max}(v_i) &amp;ndash; r \leq \epsilon n$, as you can see below:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Calculating Percentiles on Streaming Data Part 1: Introduction</title>
      <link>https://www.stevenengelhardt.com/2018/03/06/calculating-percentiles-on-streaming-data-part-1-introduction/</link>
      <pubDate>Tue, 06 Mar 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/03/06/calculating-percentiles-on-streaming-data-part-1-introduction/</guid>
      <description>&lt;p&gt;This is part 1/8 of my &lt;em&gt;Calculating Percentiles on Streaming Data&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;Suppose that you are dealing with a system which processes one million requests per second, and you&amp;rsquo;d like to calculate the median percentile response time over the last 24 hours.&lt;/p&gt;&#xA;&lt;p&gt;The naive approach would be to store every response time, sort them all, and then return the value in the middle. Unfortunately, this approach would require manipulating 1,000,000 * 60 * 60 * 24 = 86.4 billion values &amp;ndash; almost certainly too many to fit into RAM, and thus rather unwieldy to work with. This begs the question &amp;ldquo;Is it possible to compute quantiles &lt;em&gt;without&lt;/em&gt; storing every observation?&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Visualizing Latency Part 4: Official D3 Latency Heatmap Page</title>
      <link>https://www.stevenengelhardt.com/2018/01/12/visualizing-latency-part-4-official-d3-latency-heatmap-page/</link>
      <pubDate>Fri, 12 Jan 2018 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2018/01/12/visualizing-latency-part-4-official-d3-latency-heatmap-page/</guid>
      <description>&lt;p&gt;This post is part 4/4 of my &lt;em&gt;Visualizing Latency&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;Allow me to wrap up my visualizing latency post series by noting that my official D3 latency heatmap repository is at &lt;a href=&#34;https://github.com/sengelha/d3-latency-heatmap/&#34;&gt;https://github.com/sengelha/d3-latency-heatmap/&lt;/a&gt;. Monitor this repository for future developments to the D3 latency heatmap chart.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Visualizing Latency Part 3: Rendering Event Data</title>
      <link>https://www.stevenengelhardt.com/2017/12/01/visualizing-latency-part-3-rendering-event-data/</link>
      <pubDate>Fri, 01 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2017/12/01/visualizing-latency-part-3-rendering-event-data/</guid>
      <description>&lt;p&gt;This post is part 3/4 of my &lt;em&gt;Visualizing Latency&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;Now that I have &lt;a href=&#34;https://www.stevenengelhardt.com/2017/11/15/visualizing-latency-part-1-d3-latency-heatmap/&#34;&gt;introduced the D3 latency heatmap chart component&lt;/a&gt; and &lt;a href=&#34;https://www.stevenengelhardt.com/2017/11/16/visualizing-latency-part-2-binning/&#34;&gt;explained what binning is&lt;/a&gt;, I can discuss the primary use case of the chart: rendering event data.&lt;/p&gt;&#xA;&lt;h1 id=&#34;what-is-event-data&#34;&gt;What is event data&lt;/h1&gt;&#xA;&lt;p&gt;First, I must explain what I mean by event data. For a fuller treatment, please read &lt;a href=&#34;https://blog.keen.io/analytics-for-hackers-how-to-think-about-event-data-cabeefe1f3d9&#34;&gt;Analytics For Hackers: How To Think About Event Data&lt;/a&gt;, but allow me to summarize: Event data describes actions performed by entities. It has three key pieces of information: action, timestamp, and state. It is typically rich, denormalized, nested, schemaless, append-only, and frequently extremely large. Some examples of event data include system log records, financial market trades, crime records, or user activities within an application.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Visualizing Latency Part 2: What is Binning?</title>
      <link>https://www.stevenengelhardt.com/2017/11/16/visualizing-latency-part-2-binning/</link>
      <pubDate>Thu, 16 Nov 2017 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2017/11/16/visualizing-latency-part-2-binning/</guid>
      <description>&lt;p&gt;This post is part 2/4 of my &lt;em&gt;Visualizing Latency&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;As mentioned in &lt;a href=&#34;http://www.brendangregg.com/HeatMaps/latency.html&#34;&gt;Brendan Gregg&amp;rsquo;s Latency Heat Maps&lt;/a&gt; page, a latency heat map is a visualization where each column of data is a histogram of the observations for that time interval. Using Brendan Gregg&amp;rsquo;s visualization:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://www.stevenengelhardt.com/images/2017/11/latency_heatmap_visualization.png&#34; alt=&#34;Latency Heatmap Visualization&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;As with histograms, the key decision that needs to be made when using a latency heat map is how to &lt;em&gt;bin&lt;/em&gt; the data. Binning is the process of dividing the entire range of values into a series of intervals and then counting how many values fall into each interval. That said, there is no &amp;ldquo;best&amp;rdquo; number of bins, and different bin sizes can reveal different features of the data. Ultimately, the number of bins depends on the distribution of your data set as well as the size of the rendering area.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Visualizing Latency Part 1: Introduction</title>
      <link>https://www.stevenengelhardt.com/2017/11/15/visualizing-latency-part-1-d3-latency-heatmap/</link>
      <pubDate>Wed, 15 Nov 2017 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2017/11/15/visualizing-latency-part-1-d3-latency-heatmap/</guid>
      <description>&lt;p&gt;This post is part 1/4 of my &lt;em&gt;Visualizing Latency&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;A &lt;strong&gt;latency heatmap&lt;/strong&gt; is a particularly useful tool for visualizing latency. For a great treatment of latency heatmaps, please read &lt;a href=&#34;http://www.brendangregg.com/HeatMaps/latency.html&#34;&gt;Brendan Gregg&amp;rsquo;s Latency Heat Maps&lt;/a&gt; page and the ACM Queue article &lt;a href=&#34;https://queue.acm.org/detail.cfm?id=1809426&#34;&gt;Visualizing System Latency&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;On the right, you can see a latency heatmap generated from a job queueing system which shows a number of interesting properties, not least of which is that the system appears to be getting slower over time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data-Driven Code Generation of Unit Tests Part 5: Closing Thoughts</title>
      <link>https://www.stevenengelhardt.com/2017/07/05/data-driven-code-generation-of-unit-tests-part-5-closing-thoughts/</link>
      <pubDate>Wed, 05 Jul 2017 19:16:22 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2017/07/05/data-driven-code-generation-of-unit-tests-part-5-closing-thoughts/</guid>
      <description>&lt;p&gt;This post is part 5/5 of my &lt;em&gt;Data-Driven Code Generation of Unit Tests&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-1-background/&#34;&gt;previous&lt;/a&gt; &lt;a href=&#34;https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-2-c-cmake-jinja2-boost/&#34;&gt;posts&lt;/a&gt; &lt;a href=&#34;https://www.stevenengelhardt.com/2017/07/03/data-driven-code-generation-of-unit-tests-part-3-java-maven-stringtemplate-junit/&#34;&gt;in&lt;/a&gt; &lt;a href=&#34;https://www.stevenengelhardt.com/2017/07/05/data-driven-code-generation-of-unit-tests-part-4-c-msbuild-t4-ms-unit-test/&#34;&gt;this&lt;/a&gt; series, I walked through the idea of performing data-driven code generation for unit tests, as well as how I implemented it in three different programming languages and build systems.  This post contains some final thoughts about the effort.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Was it worth it?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Almost certainly.  Although it required substantial up-front effort to set up the unit test generators, this approach found numerous, previously-undetected bugs both within my implementation of the calculation library as well as with legacy implementations. It is straightforward to write code generators that test all possible combinations of parameters to the calculations, ensuring that the resulting code coverage is excellent. Adding tests for a new calculation is as straightforward as adding a line to a single file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data-Driven Code Generation of Unit Tests Part 4: C#, MSBuild, T4, MS Unit Test</title>
      <link>https://www.stevenengelhardt.com/2017/07/05/data-driven-code-generation-of-unit-tests-part-4-c-msbuild-t4-ms-unit-test/</link>
      <pubDate>Wed, 05 Jul 2017 16:56:13 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2017/07/05/data-driven-code-generation-of-unit-tests-part-4-c-msbuild-t4-ms-unit-test/</guid>
      <description>&lt;p&gt;This post is part 4/5 of my &lt;em&gt;Data-Driven Code Generation of Unit Tests&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;This blog post explains how I used C#, &lt;a href=&#34;https://msdn.microsoft.com/en-us/library/dd393574.aspx&#34;&gt;MSBuild&lt;/a&gt;, &lt;a href=&#34;https://msdn.microsoft.com/en-us/library/bb126445.aspx&#34;&gt;T4 Text Templates&lt;/a&gt;, and the &lt;a href=&#34;https://msdn.microsoft.com/en-us/library/hh598960.aspx&#34;&gt;Microsoft Unit Test Framework for Managed Code&lt;/a&gt; to perform data-driven code generation of unit tests for a financial performance analytics library. If you haven&amp;rsquo;t read it already, I recommend starting with &lt;a href=&#34;https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-1-background/&#34;&gt;Part 1: Background&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As mentioned in &lt;a href=&#34;https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-2-c-cmake-jinja2-boost/&#34;&gt;Part 2: C++, CMake, Jinja2, Boost&lt;/a&gt;, all performance analytics metadata is stored in a single file called &lt;code&gt;metadata.csv&lt;/code&gt;. This file drives all code generation and is what helps ensure inter-platform consistency.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data-Driven Code Generation of Unit Tests Part 3: Java, Maven, StringTemplate, JUnit</title>
      <link>https://www.stevenengelhardt.com/2017/07/03/data-driven-code-generation-of-unit-tests-part-3-java-maven-stringtemplate-junit/</link>
      <pubDate>Mon, 03 Jul 2017 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2017/07/03/data-driven-code-generation-of-unit-tests-part-3-java-maven-stringtemplate-junit/</guid>
      <description>&lt;p&gt;This post is part 3/5 of my &lt;em&gt;Data-Driven Code Generation of Unit Tests&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;This blog post explains how I used Java, &lt;a href=&#34;https://maven.apache.org/&#34;&gt;Apache Maven&lt;/a&gt;, &lt;a href=&#34;http://www.stringtemplate.org/&#34;&gt;StringTemplate&lt;/a&gt;, and &lt;a href=&#34;http://junit.org/junit4/&#34;&gt;JUnit&lt;/a&gt; to perform data-driven code generation of unit tests for a financial performance analytics library. If you haven&amp;rsquo;t read it already, I recommend starting with &lt;a href=&#34;https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-1-background/&#34;&gt;Part 1: Background&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;As mentioned in &lt;a href=&#34;https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-2-c-cmake-jinja2-boost/&#34;&gt;Part 2: C++, CMake, Jinja2, Boost&lt;/a&gt;, all performance analytics metadata is stored in a single file called &lt;code&gt;metadata.csv&lt;/code&gt;. This file drives all code generation and is what helps ensure inter-platform consistency.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data-Driven Code Generation of Unit Tests Part 2: C&#43;&#43;, CMake, Jinja2, Boost</title>
      <link>https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-2-c-cmake-jinja2-boost/</link>
      <pubDate>Fri, 30 Jun 2017 20:22:36 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-2-c-cmake-jinja2-boost/</guid>
      <description>&lt;p&gt;This post is part 2/5 of my &lt;em&gt;Data-Driven Code Generation of Unit Tests&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;This blog post explains how I used &lt;a href=&#34;https://cmake.org/&#34;&gt;CMake&lt;/a&gt;, &lt;a href=&#34;http://jinja.pocoo.org/docs/2.9/&#34;&gt;Jinja2&lt;/a&gt;, and &lt;a href=&#34;http://www.boost.org/doc/libs/1_64_0/libs/test/doc/html/index.html&#34;&gt;the Boost Unit Test framework&lt;/a&gt; to perform data-driven code generation of unit tests for a financial performance analytics library.  If you haven&amp;rsquo;t read it already, I recommend starting with &lt;a href=&#34;https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-1-background/&#34;&gt;Part 1: Background&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;All performance analytics metadata is stored in a single metadata file called &lt;code&gt;metadata.csv&lt;/code&gt;.  This file contains the complete list of calculations, and for each calculation, its settings (i.e. how it differs from other calculations), including properties like:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data-Driven Code Generation of Unit Tests Part 1: Background</title>
      <link>https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-1-background/</link>
      <pubDate>Fri, 30 Jun 2017 16:42:15 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2017/06/30/data-driven-code-generation-of-unit-tests-part-1-background/</guid>
      <description>&lt;p&gt;This post is part 1/5 of my &lt;em&gt;Data-Driven Code Generation of Unit Tests&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;At Morningstar, I created a multi-language, cross-platform performance analytics library which implements both &lt;a href=&#34;https://en.wikipedia.org/wiki/Online_algorithm&#34;&gt;online&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Online_algorithm&#34;&gt;offline&lt;/a&gt; implementations of a number of common financial analytics such as &lt;a href=&#34;http://www.investopedia.com/terms/a/alpha.asp&#34;&gt;Alpha&lt;/a&gt;, &lt;a href=&#34;http://www.investopedia.com/terms/b/beta.asp&#34;&gt;Beta&lt;/a&gt;, &lt;a href=&#34;http://www.investopedia.com/terms/r/r-squared.asp&#34;&gt;R-Squared&lt;/a&gt;, &lt;a href=&#34;http://www.investopedia.com/terms/s/sharperatio.asp&#34;&gt;Sharpe Ratio&lt;/a&gt;, &lt;a href=&#34;http://www.investopedia.com/terms/s/sortinoratio.asp&#34;&gt;Sortino Ratio&lt;/a&gt;, and &lt;a href=&#34;http://www.investopedia.com/terms/t/treynorratio.asp&#34;&gt;Treynor Ratio&lt;/a&gt; (more on this library later).  The library relies almost exclusively on a comprehensive suite of automated unit tests to validate its correctness.  I quickly found that maintaining a nearly-identical battery of unit tests in three different programming languages was a chore, and I had a hunch that I could use a common technique to deal with this problem: &lt;strong&gt;code generation&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Future (circa 2010) Parallel Programming Models</title>
      <link>https://www.stevenengelhardt.com/2015/12/26/future-circa-2010-parallel-programming-models/</link>
      <pubDate>Sat, 26 Dec 2015 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2015/12/26/future-circa-2010-parallel-programming-models/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://joeduffyblog.com/&#34;&gt;Joe Duffy&lt;/a&gt; regularly posts amazing material which is well ahead of our time, such as his current &lt;a href=&#34;http://joeduffyblog.com/2015/11/03/blogging-about-midori/&#34;&gt;blog post series about Midori&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d like to call out this particular &lt;a href=&#34;http://joeduffyblog.com/2010/12/04/sayonara-volatile/&#34;&gt;assertion&lt;/a&gt; made by him way back in 2010:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;[D]evelopers must move towards single-threaded programming models connected through message passing, optionally with provably race-free fine-grained parallelism inside of those single-threaded worlds.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Add &amp;ldquo;async/await everywhere&amp;rdquo; and you can sign me up!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Threading is a Poor Concurrency Programming Model</title>
      <link>https://www.stevenengelhardt.com/2015/06/03/threading-is-a-poor-concurrency-programming-model/</link>
      <pubDate>Wed, 03 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2015/06/03/threading-is-a-poor-concurrency-programming-model/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s why I try to avoid thread-based programming models for expressing concurrency:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The opponents of thread-based systems line up several drawbacks. For Ousterhout, who probably published the most well-known rant against threads [Ous96], the extreme difficulty of developing correct concurrent code&amp;ndash;even for programming experts&amp;ndash;is the most harmful trait of threads. As soon as a multi-threaded system shares a single state between multiple threads, coordination and synchronization becomes an imperative. Coordination and synchronization requires locking primitives, which in turn brings along additional issues. Erroneous locking introduces deadlocks or livelocks, and threatens the liveness of the application. Choosing the right locking granularity is also source of trouble. Too coarse locks slow down concurrent code and lead to degraded sequential execution. By contrast, too fine locks increase the danger of deadlocks/livelocks and increase locking overhead. Concurrent components based on threads and locks are not composable. Given two different components that are thread-safe, a composition of them is not thread-safe per se. For instance, placing circular dependencies between multi-threaded components unknowingly can introduce severe deadlocks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 17: Videotaped API Review</title>
      <link>https://www.stevenengelhardt.com/2015/03/04/exploring-the-net-corefx-part-17-videotaped-api-review/</link>
      <pubDate>Wed, 04 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2015/03/04/exploring-the-net-corefx-part-17-videotaped-api-review/</guid>
      <description>&lt;p&gt;This is part 17/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;Microsoft&amp;rsquo;s .NET Core team has posted a videotaped &lt;a href=&#34;http://channel9.msdn.com/Series/NET-Framework/NET-Core-API-Review-2015-01-14&#34;&gt;API review session&lt;/a&gt; where they show how they review API enhancement suggestions. I thought the video was quite educational.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 16: Platform-Specific Builds Using Compile-Time Polymorphism</title>
      <link>https://www.stevenengelhardt.com/2015/03/01/exploring-the-net-corefx-part-16-platform-specific-builds-using-compile-time-polymorphism/</link>
      <pubDate>Sun, 01 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2015/03/01/exploring-the-net-corefx-part-16-platform-specific-builds-using-compile-time-polymorphism/</guid>
      <description>&lt;p&gt;This is part 16/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;While .NET has historically been limited to Windows machines, &lt;a href=&#34;http://www.mono-project.com/&#34;&gt;Mono&lt;/a&gt; notwithstanding, the introduction of the &lt;a href=&#34;https://github.com/dotnet/coreclr&#34;&gt;cross-platform .NET Core runtime&lt;/a&gt; has introduced the possibility of running .NET Core applications on Unix machines. With this possibility, developers may have the need of writing platform-specific code.&lt;/p&gt;&#xA;&lt;p&gt;One way to write platform-specific code is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Define a conceptual base class which will have an identical name and methods across all platforms. This does &lt;em&gt;not&lt;/em&gt; need to be a C# &lt;code&gt;interface&lt;/code&gt;, as we will be using compile-time rather than run-time polymorphism.&lt;/li&gt;&#xA;&lt;li&gt;Provide an implementation of this class for each target platform.&lt;/li&gt;&#xA;&lt;li&gt;Use build-time conditions to include the platform-specific class based on target compilation platform.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;An example from the .NET Core is the &lt;code&gt;System.Console.ConsolePal&lt;/code&gt; class from the &lt;code&gt;System.Console&lt;/code&gt; library. The library includes two implementations of this class:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 15: Using Non-Generic Factory Classes to Enable Type Inference</title>
      <link>https://www.stevenengelhardt.com/2015/02/18/exploring-the-net-corefx-part-15-using-non-generic-factory-classes-to-enable-type-inference/</link>
      <pubDate>Wed, 18 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2015/02/18/exploring-the-net-corefx-part-15-using-non-generic-factory-classes-to-enable-type-inference/</guid>
      <description>&lt;p&gt;This is part 15/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;While C# supports type inference for generic methods, it does &lt;em&gt;not&lt;/em&gt; support type inference for constructors. In other words, while this code works:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FooFactory&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Create&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;myObj&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FooFactory&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Create&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;212&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This code does not:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;readonly&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;field&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;field&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;obj&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;212&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// DOES NOT WORK&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For more background on why this is, see &lt;a href=&#34;http://stackoverflow.com/questions/3570167/why-cant-the-c-sharp-constructor-infer-type&#34;&gt;this StackOverflow post&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Because of this, every generic type in System.Collections.Immutable includes a factory class of the same name which makes construction more convenient. For example:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 14: Inside Immutable Collections</title>
      <link>https://www.stevenengelhardt.com/2015/02/13/exploring-the-net-corefx-part-14-inside-immutable-collections/</link>
      <pubDate>Fri, 13 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2015/02/13/exploring-the-net-corefx-part-14-inside-immutable-collections/</guid>
      <description>&lt;p&gt;This is part 14/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;Back in 2013, Immo Landwerth and Andrew Arnott recorded a Going Deep video called &lt;a href=&#34;http://channel9.msdn.com/Shows/Going+Deep/Immo-Landwerth-and-Andrew-Arnott-Inside-Immutable-Collections&#34;&gt;Inside Immutable Collections&lt;/a&gt; which describes how and why System.Collections.Immutable is built the way it is. It&amp;rsquo;s great background material to understand System.Collections.Immutable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 13: ImmutableList is an AVL Tree</title>
      <link>https://www.stevenengelhardt.com/2015/01/13/exploring-the-net-corefx-part-13-immutablelist-is-an-avl-tree/</link>
      <pubDate>Tue, 13 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2015/01/13/exploring-the-net-corefx-part-13-immutablelist-is-an-avl-tree/</guid>
      <description>&lt;p&gt;This is part 13/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;Most implementations of &lt;code&gt;IList&lt;/code&gt;, including &lt;code&gt;System.Collections.Generic.List&lt;/code&gt;, are dynamic arrays. &lt;code&gt;System.Collections.Immutable.ImmutableList&lt;/code&gt; is different &amp;ndash; it is an AVL tree. This results in significantly different performance characteristics:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;          &lt;th&gt;&lt;code&gt;List&lt;/code&gt;&lt;/th&gt;&#xA;          &lt;th&gt;&lt;code&gt;ImmutableList&lt;/code&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Indexing&lt;/td&gt;&#xA;          &lt;td&gt;O(1)&lt;/td&gt;&#xA;          &lt;td&gt;O(log n)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Append&lt;/td&gt;&#xA;          &lt;td&gt;O(1) average, O(n) worst-case&lt;/td&gt;&#xA;          &lt;td&gt;O(log n)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Insert at arbitrary index&lt;/td&gt;&#xA;          &lt;td&gt;O(n)&lt;/td&gt;&#xA;          &lt;td&gt;O(log n)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Remove&lt;/td&gt;&#xA;          &lt;td&gt;O(n)&lt;/td&gt;&#xA;          &lt;td&gt;O(log n)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Memory layout&lt;/td&gt;&#xA;          &lt;td&gt;Contiguous for value types&lt;/td&gt;&#xA;          &lt;td&gt;Non-contiguous&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;The data structure behind &lt;code&gt;ImmutableList&lt;/code&gt; was likely chosen so that modifications to the list are non-destructive and require minimal data copying.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 12: Aggressive Inlining</title>
      <link>https://www.stevenengelhardt.com/2015/01/05/exploring-the-net-corefx-part-12-aggressive-inlining/</link>
      <pubDate>Mon, 05 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2015/01/05/exploring-the-net-corefx-part-12-aggressive-inlining/</guid>
      <description>&lt;p&gt;This is part 12/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;In C++, the &lt;code&gt;inline&lt;/code&gt; keyword allows a developer to provide a hint to the compiler that a particular method should be inlined. C# has the identical ability but uses an attribute instead:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;SecurePooledObject&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;....&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c4a000&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c4a000&#34;&gt;    [MethodImpl(MethodImplOptions.AggressiveInlining)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;IsOwned&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TCaller&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;ref&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TCaller&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;caller&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;where&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TCaller&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;struct&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ISecurePooledObjectUser&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;caller&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;PoolUserId&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_owner&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In System.Collections.Immutable, this attribute is used highly selectively &amp;ndash; only once, in fact.&lt;/p&gt;&#xA;&lt;h1 id=&#34;recommendations&#34;&gt;Recommendations&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In rare cases, consider using &lt;code&gt;MethodImpl(MethodImplOptions.AggressiveInlining)&lt;/code&gt; to suggest to the .NET runtime that a particular method should be inlined.&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Win32 LD_PRELOAD</title>
      <link>https://www.stevenengelhardt.com/projects/win32-ld_preload/</link>
      <pubDate>Sat, 20 Dec 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/projects/win32-ld_preload/</guid>
      <description>&lt;p&gt;Many versions of UNIX have a useful concept built in to their dynamic linker: by setting an environment variable (usually LD_PRELOAD), a user can force a shared library to load before all others. While I wasn’t able to figure out how to exactly replicate this functionality on Windows, I found a snippit on page 794 of &lt;em&gt;Programming Applications for Microsoft Windows: Fourth Edition&lt;/em&gt;, by Jeffrey Richter, on how to come close. On this page, Mr. Richter explains a way to force an executable to load a dynamic library before it begins executing code. While this is only one of several ways he suggests to achieve this goal, I was drawn to this one because it seemed the most flexible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 11: Code Contracts</title>
      <link>https://www.stevenengelhardt.com/2014/12/17/exploring-the-net-corefx-part-11-code-contracts/</link>
      <pubDate>Wed, 17 Dec 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/12/17/exploring-the-net-corefx-part-11-code-contracts/</guid>
      <description>&lt;p&gt;This is part 11/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;In 2008, &lt;a href=&#34;http://research.microsoft.com&#34;&gt;Microsoft Research&lt;/a&gt; published Code Contracts, which provide a language-agnostic way to express coding assumptions in .NET programs. The assumptions take the form of pre-conditions, post-conditions, and object invariants.&lt;/p&gt;&#xA;&lt;p&gt;Here is a simple example of code which uses Code Contracts:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;System.Diagnostics.Contracts&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;StringUtils&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Append&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;Contract&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Requires&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;s1&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;Contract&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Requires&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;s2&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;Contract&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Ensures&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Contract&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Result&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;()&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s1&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Code Contracts assertions are not limited to runtime enforcement. They may instead be enforced by &lt;em&gt;compile-time static analysis&lt;/em&gt;. For example, it is very simple to annotate methods with Code Contracts, set up a continuous integration (CI) server to perform static analysis, and fail the build if there are any failed assertions. This gives us the best of both worlds: a guarantee our code enforces our assumptions with essentially &lt;em&gt;zero&lt;/em&gt; runtime penalty.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 10: Performance Tuning Enumeration</title>
      <link>https://www.stevenengelhardt.com/2014/12/02/exploring-the-net-corefx-part-10-performance-tuning-enumeration/</link>
      <pubDate>Tue, 02 Dec 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/12/02/exploring-the-net-corefx-part-10-performance-tuning-enumeration/</guid>
      <description>&lt;p&gt;This is part 10/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;The .NET Core&amp;rsquo;s &lt;code&gt;System.Collections.Immutable.ImmutableArray&lt;/code&gt; provides two enumerators. The first has been highly tuned for speed, and the second is a fallback for compatibility when it is required.&lt;/p&gt;&#xA;&lt;p&gt;The high-performance enumerator uses the following performance optimizations:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The enumerator is a &lt;code&gt;struct&lt;/code&gt;, rather than a &lt;code&gt;class&lt;/code&gt;, so that it is stack-allocated rather than heap-allocated.&lt;/li&gt;&#xA;&lt;li&gt;The enumerator does &lt;em&gt;not&lt;/em&gt; implement &lt;code&gt;IEnumerator&lt;/code&gt; or &lt;code&gt;IEnumerator&lt;/code&gt;, as this would require it to implement &lt;code&gt;IDisposable&lt;/code&gt;. By not implementing &lt;code&gt;IDisposable&lt;/code&gt; the iterator will inline during &lt;code&gt;foreach&lt;/code&gt; loops..&lt;/li&gt;&#xA;&lt;li&gt;The enumerator does &lt;em&gt;not&lt;/em&gt; use range checks in &lt;code&gt;Enumerator.Current&lt;/code&gt;; it requires on .NET&amp;rsquo;s array range checks to throw an exception instead.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The high-performance enumerator is called &lt;code&gt;ImmutableArray.Enumerator&lt;/code&gt;, which is returned by &lt;code&gt;ImmutableArray.GetEnumerator()&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 9: Immutable Collections and the Builder Pattern</title>
      <link>https://www.stevenengelhardt.com/2014/12/01/exploring-the-net-corefx-part-9-immutable-collections-and-the-builder-pattern/</link>
      <pubDate>Mon, 01 Dec 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/12/01/exploring-the-net-corefx-part-9-immutable-collections-and-the-builder-pattern/</guid>
      <description>&lt;p&gt;This is part 9/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;Using the &lt;a href=&#34;http://en.wikipedia.org/wiki/Builder_pattern&#34;&gt;builder pattern&lt;/a&gt; to allow for easier construction of &lt;a href=&#34;http://java.dzone.com/articles/immutability-with-builder-design-pattern&#34;&gt;immutable&lt;/a&gt; &lt;a href=&#34;http://cantina.co/immutable-objects-and-the-builder-pattern/&#34;&gt;objects&lt;/a&gt; &lt;a href=&#34;http://stackoverflow.com/questions/12405474/immutable-objects-builder&#34;&gt;is&lt;/a&gt; &lt;a href=&#34;http://jlordiales.wordpress.com/2012/12/13/the-builder-pattern-in-practice/&#34;&gt;well-known&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The .NET Core&amp;rsquo;s immutable collections assembly, &lt;code&gt;System.Collections.Immutable&lt;/code&gt;, also uses the builder pattern, but for a slightly different reason: to improve the performance of making many changes to the collection. This is possible because, unlike the immutable collection itself, the builder pattern does &lt;em&gt;not&lt;/em&gt; need to maintain the immutable collection&amp;rsquo;s invariants after each modification. The builder pattern merely needs to reestablish the invariants of the immutable collection upon the publishing of the results.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 8: NullReferenceException Performance Tricks</title>
      <link>https://www.stevenengelhardt.com/2014/11/28/exploring-the-net-corefx-part-8-nullreferenceexception-performance-tricks/</link>
      <pubDate>Fri, 28 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/11/28/exploring-the-net-corefx-part-8-nullreferenceexception-performance-tricks/</guid>
      <description>&lt;p&gt;This is part 8/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;The .NET Core&amp;rsquo;s &lt;code&gt;System.Collections.Immutable.ImmutableArray&lt;/code&gt; class implements an immutable wrapper around a normal C# managed array. This looks something like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ImmutableArray&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;array&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ImmutableArray.array&lt;/code&gt; is lazy-initialized.&lt;/p&gt;&#xA;&lt;p&gt;Within the &lt;code&gt;ImmutableArray&lt;/code&gt; class, there are a number of methods which have the precondition that &lt;code&gt;ImmutableArray.array&lt;/code&gt; must be initialized. These preconditions must be checked before the method begins processing to make sure we handle invalid states correctly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 7: Reference Versus Structural Equality</title>
      <link>https://www.stevenengelhardt.com/2014/11/27/exploring-the-net-corefx-part-7-reference-versus-structural-equality/</link>
      <pubDate>Thu, 27 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/11/27/exploring-the-net-corefx-part-7-reference-versus-structural-equality/</guid>
      <description>&lt;p&gt;This is part 7/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;In &lt;a href=&#34;https://www.stevenengelhardt.com/2014/11/24/exploring-the-net-corefx-part-6-use-iequatable-for-higher-performance-equals/&#34;&gt;the previous post&lt;/a&gt;, I referenced &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/ms132123%28v=vs.110%29.aspx&#34;&gt;&lt;code&gt;EqualityComparer.Default&lt;/code&gt;&lt;/a&gt;. If &lt;code&gt;T&lt;/code&gt; does not implement &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/ms131187(v=vs.110).aspx&#34;&gt;&lt;code&gt;IEquatable&lt;/code&gt;&lt;/a&gt;, &lt;code&gt;EqualityComparer.Default&lt;/code&gt; will use the framework-defined &lt;code&gt;Object.Equals()&lt;/code&gt;, which implements &lt;em&gt;reference&lt;/em&gt; equality.&lt;/p&gt;&#xA;&lt;p&gt;However, many times you want to compare two types for &lt;em&gt;structural&lt;/em&gt; equality (i.e. identical content) rather than reference equality (i.e. two references point to the same instance of the class). The interface &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/system.collections.istructuralequatable%28v=vs.110%29.aspx&#34;&gt;&lt;code&gt;IStructuralEquatable&lt;/code&gt;&lt;/a&gt; was defined to allow a class to explicitly implement structural, rather than reference equality. Related classes include &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/System.Collections.IStructuralComparable.aspx&#34;&gt;&lt;code&gt;IStructuralComparable&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/system.collections.structuralcomparisons%28v=vs.110%29.aspx&#34;&gt;&lt;code&gt;StructuralComparisons&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 6: Use IEquatable for Higher-Performance Equals()</title>
      <link>https://www.stevenengelhardt.com/2014/11/24/exploring-the-net-corefx-part-6-use-iequatable-for-higher-performance-equals/</link>
      <pubDate>Mon, 24 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/11/24/exploring-the-net-corefx-part-6-use-iequatable-for-higher-performance-equals/</guid>
      <description>&lt;p&gt;This is part 6/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s say you are writing a custom &lt;code&gt;IList&lt;/code&gt; which contains the following code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;MyList&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;IList&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;array&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;IndexOf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;item&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;array&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Length&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;array&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;].&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Equals&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;item&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above code uses &lt;code&gt;T&lt;/code&gt;&amp;ldquo;s implementation of &lt;code&gt;Object.Equals()&lt;/code&gt;, which is defined as:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;virtual&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Equals&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Object&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;obj&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If &lt;code&gt;T&lt;/code&gt; is a value type, it will be automatically boxed by the compiler, which has a slight performance cost. However, if you knew that &lt;code&gt;T&lt;/code&gt; implemented &lt;code&gt;IEquatable&lt;/code&gt;, then &lt;em&gt;you could avoid the boxing entirely&lt;/em&gt;. For example, this code would be slightly better performing than the above for value types:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 5: Keep Indexers Trivial to Allow JIT Optimization</title>
      <link>https://www.stevenengelhardt.com/2014/11/21/exploring-the-net-corefx-part-5-keep-indexers-trivial-to-allow-jit-optimization/</link>
      <pubDate>Fri, 21 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/11/21/exploring-the-net-corefx-part-5-keep-indexers-trivial-to-allow-jit-optimization/</guid>
      <description>&lt;p&gt;This is part 5/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;This is a simple recommendation based on observations from System.Collections.Immutable.&lt;/p&gt;&#xA;&lt;h1 id=&#34;recommendations&#34;&gt;Recommendations&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Keep the implementation of an indexer as trivial as possible to allow the JIT optimization of removing array bounds checking to work. For example, &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; check if a member variable is null; just use it and allow the &lt;code&gt;NullReferenceException&lt;/code&gt; to happen naturally.  In other words, use:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;get&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;array&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;not:&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 4: The Requires Convenience Class</title>
      <link>https://www.stevenengelhardt.com/2014/11/20/exploring-the-net-corefx-part-4-the-requires-convenience-class/</link>
      <pubDate>Thu, 20 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/11/20/exploring-the-net-corefx-part-4-the-requires-convenience-class/</guid>
      <description>&lt;p&gt;This is part 4/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;The System.Collections.Immutable project in the .NET CoreFX includes a convenience class called Requires, which looks like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Requires&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c4a000&#34;&gt;    [DebuggerStepThrough]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;NotNull&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;([&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ValidatedNotNull&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parameterName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;where&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// ensures value-types aren&amp;#39;t passed to a null checking method&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;value&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ArgumentNullException&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;parameterName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This allows other methods to write code like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bar&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Requires&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NotNull&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;bar&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 3: Making Methods Debugger-Friendly</title>
      <link>https://www.stevenengelhardt.com/2014/11/19/exploring-the-net-corefx-part-3-making-methods-debugger-friendly/</link>
      <pubDate>Wed, 19 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/11/19/exploring-the-net-corefx-part-3-making-methods-debugger-friendly/</guid>
      <description>&lt;p&gt;This is part 3/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;System.Collections.Immutable uses a number of attributes to make it more debugger-friendly. Here are the key attributes:&lt;/p&gt;&#xA;&lt;h1 id=&#34;debuggerstepthrough&#34;&gt;DebuggerStepThrough&lt;/h1&gt;&#xA;&lt;p&gt;Occasionally a method is so simple that it doesn&amp;rsquo;t make sense to have the debugger step into it. The &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerstepthroughattribute%28v=vs.110%29.aspx&#34;&gt;System.Diagnostics.DebuggerStepThroughAttribute&lt;/a&gt; instructs the debugger to step through the code instead of stepping into the code.&lt;/p&gt;&#xA;&lt;p&gt;Here is an example from System.Collections.Immutable:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;internal&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Requires&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c4a000&#34;&gt;    [DebuggerStepThrough]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Range&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;condition&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;parameterName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;condition&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;FailRange&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;parameterName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;message&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;debuggerbrowsable&#34;&gt;DebuggerBrowsable&lt;/h1&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerbrowsableattribute%28v=vs.110%29.aspx&#34;&gt;System.Diagnostics.DebuggerBrowsableAttribute&lt;/a&gt; determines if and how a member is displayed in the debugger variable windows.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 2: Cache ThreadLocal Variables in Locals</title>
      <link>https://www.stevenengelhardt.com/2014/11/18/exploring-the-net-corefx-part-2-cache-threadlocal-variables-in-locals/</link>
      <pubDate>Tue, 18 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/11/18/exploring-the-net-corefx-part-2-cache-threadlocal-variables-in-locals/</guid>
      <description>&lt;p&gt;This is part 2/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Thread-local_storage&#34;&gt;Thread-local storage&lt;/a&gt; allows you to mark a global or static variable as local to a thread. In Win32, thread-local storage is provided by the functions &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/windows/desktop/ms686801%28v=vs.85%29.aspx&#34;&gt;TlsAlloc&lt;/a&gt;, &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/windows/desktop/ms686812%28v=vs.85%29.aspx&#34;&gt;TlsGetValue&lt;/a&gt;, &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/windows/desktop/ms686818%28v=vs.85%29.aspx&#34;&gt;TlsSetValue&lt;/a&gt;, and &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/windows/desktop/ms686804%28v=vs.85%29.aspx&#34;&gt;TlsFree&lt;/a&gt;. Similarly, C# provides &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/system.threadstaticattribute%28v=vs.110%29.aspx&#34;&gt;System.ThreadStaticAttribute&lt;/a&gt; and &lt;a href=&#34;http://msdn.microsoft.com/en-us/library/dd642243%28v=vs.110%29.aspx&#34;&gt;System.Threading.ThreadLocal&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, thread-local storage comes at a cost. Reading or writing a thread-local variable is far more expensive than reading or writing a local variable. System.Collections.Immutable uses a trick or two to help ameliorate this expense. For example, System.Collections.Immutable caches thread-local variables in local variables in a method to avoid unnecessary TLS hits on repeated access. Here&amp;rsquo;s some sample code which implements this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exploring the .NET CoreFX Part 1: Annotate Pure Methods With PureAttribute</title>
      <link>https://www.stevenengelhardt.com/2014/11/17/exploring-the-net-corefx-part-1-annotate-pure-methods-with-pureattribute/</link>
      <pubDate>Mon, 17 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/11/17/exploring-the-net-corefx-part-1-annotate-pure-methods-with-pureattribute/</guid>
      <description>&lt;p&gt;This is part 1/17 of my &lt;em&gt;Exploring the .NET CoreFX&lt;/em&gt; series.&lt;/p&gt;&#xA;&lt;p&gt;A pure method is a method that does not make any visible state changes.&lt;/p&gt;&#xA;&lt;p&gt;John Carmack, in his article &lt;a href=&#34;http://gamasutra.com/view/news/169296/Indepth_Functional_programming_in_C.php&#34;&gt;In-Depth: Functional Programming in C++&lt;/a&gt;, notes many advantages of pure functions:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Pure functions have a lot of nice properties.&lt;/p&gt;&#xA;&lt;p&gt;Thread safety. A pure function with value parameters is completely thread safe. With reference or pointer parameters, even if they are const, you do need to be aware of the danger that another thread doing non-pure operations might mutate or free the data, but it is still one of the most powerful tools for writing safe multithreaded code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Power of Central Banks</title>
      <link>https://www.stevenengelhardt.com/2014/05/14/the-power-of-central-banks/</link>
      <pubDate>Wed, 14 May 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/05/14/the-power-of-central-banks/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;In Europe, the transformation in the sovereign debt market since Mario Draghi&amp;rsquo;s &amp;ldquo;whatever it takes&amp;rdquo; promise in July 2012 has been remarkable. &lt;strong&gt;Ireland, which just exited an IMF bailout program in December, can now issue 5-year debt at yields well below 5-year Treasuries.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; &lt;cite&gt;PIMCO Secular Outlook, May 2014 &amp;ndash; The New Neutral&lt;/cite&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Put all Maven dependency versions in properties</title>
      <link>https://www.stevenengelhardt.com/2014/05/02/put-all-maven-dependency-versions-in-properties/</link>
      <pubDate>Fri, 02 May 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/05/02/put-all-maven-dependency-versions-in-properties/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://struts.apache.org/release/2.3.x/docs/security-bulletins.html&#34;&gt;Because&lt;/a&gt; &lt;a href=&#34;http://support.springsource.com/security/&#34;&gt;security&lt;/a&gt; &lt;a href=&#34;http://www.oracle.com/technetwork/topics/security/alerts-086861.html&#34;&gt;vulnerabilities&lt;/a&gt; &lt;a href=&#34;http://heartbleed.com/&#34;&gt;in&lt;/a&gt; &lt;a href=&#34;http://tomcat.apache.org/security-7.html&#34;&gt;third-party&lt;/a&gt; &lt;a href=&#34;http://www.cvedetails.com/vulnerability-list/&#34;&gt;software&lt;/a&gt; &lt;a href=&#34;http://www.pcworld.com/article/2069080/ruby-on-rails-security-updates-patch-xss-dos-vulnerabilities.html&#34;&gt;are&lt;/a&gt; &lt;a href=&#34;http://www.php.net/manual/en/security.current.php&#34;&gt;so&lt;/a&gt; &lt;a href=&#34;http://www.ubuntu.com/usn/&#34;&gt;common&lt;/a&gt;, it is important to manage the versions of your dependencies and to be prepared to upgrade them quickly. For Maven projects, I recommend putting the versions of all your dependencies in the properties section of your &lt;code&gt;pom.xml&lt;/code&gt;. Furthermore, for libraries which require multiple dependency entries in &lt;code&gt;pom.xml&lt;/code&gt;, this allows you to ensure you use the same version for all of those dependencies.&lt;/p&gt;&#xA;&lt;p&gt;For example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;project&lt;/span&gt; &lt;span style=&#34;color:#c4a000&#34;&gt;xmlns=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#c4a000&#34;&gt;xmlns:xsi=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#c4a000&#34;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;spring.version&amp;gt;&lt;/span&gt;3.2.6.RELEASE&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/spring.version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;jackson.version&amp;gt;&lt;/span&gt;2.2.3&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/jackson.version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;!-- spring --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-core&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${spring.version}&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-beans&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${spring.version}&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-context&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${spring.version}&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;!-- Jackson --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.core&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-core&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${jackson.version}&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.core&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-annotations&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${jackson.version}&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.core&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-databind&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;${jackson.version}&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Publishing a Java Servlet to Azure Website Using Maven</title>
      <link>https://www.stevenengelhardt.com/2014/05/01/publishing-a-java-servlet-to-azure-website-using-maven/</link>
      <pubDate>Thu, 01 May 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/05/01/publishing-a-java-servlet-to-azure-website-using-maven/</guid>
      <description>&lt;p&gt;This blog post shows how to publish a Java Servlet, encapsulated in a WAR file, to an Azure Web Site using FTP via Maven.&lt;/p&gt;&#xA;&lt;p&gt;The first step will be to generate a simple servlet using Maven:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mvn archetype:generate -DgroupId=com.example -DartifactId=hello-world -DarchetypeArtifactId=maven-archetype-webapp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates a simple, Hello World application in the hello-world directory. We can verify it works by running it in a local servlet container using the instructions found in &lt;a href=&#34;https://www.stevenengelhardt.com/2014/04/30/supporting-mvn-jettyrun-in-maven-applications/&#34;&gt;Supporting mvn jetty:run in Maven applications&lt;/a&gt;. Add the Jetty maven plugin to pom.xml under the build section:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Supporting mvn jetty:run in Maven applications</title>
      <link>https://www.stevenengelhardt.com/2014/04/30/supporting-mvn-jettyrun-in-maven-applications/</link>
      <pubDate>Wed, 30 Apr 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/04/30/supporting-mvn-jettyrun-in-maven-applications/</guid>
      <description>&lt;p&gt;When I&amp;rsquo;m writing a Java servlet using &lt;a href=&#34;http://maven.apache.org/&#34;&gt;Maven&lt;/a&gt;, I find it convenient to be able to run the Java servlet in a local servlet container for testing purposes. This is very easy to do using the &lt;a href=&#34;http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html&#34;&gt;Jetty Maven plugin&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;To add the Jetty Maven plugin to your project, modify &lt;code&gt;pom.xml&lt;/code&gt; as follows:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.eclipse.jetty&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jetty-maven-plugin&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;9.2.0.M0&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can then run your project in Jetty using the following command:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Work Email Statistics Through 2013-12-31</title>
      <link>https://www.stevenengelhardt.com/2014/04/28/work-email-statistics-through-2013-12-31/</link>
      <pubDate>Mon, 28 Apr 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/04/28/work-email-statistics-through-2013-12-31/</guid>
      <description>&lt;p&gt;In a &lt;a href=&#34;https://www.stevenengelhardt.com/2013/01/02/work-email-statistics/&#34;&gt;previous post&lt;/a&gt;, I noted that I have a copy of every single email I&amp;rsquo;ve sent or received at work since mid-2003. Here is the updated chart of the number of work emails I send and receive per year through December 31, 2013.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://www.stevenengelhardt.com/images/2014/04/emails-by-year.png&#34; alt=&#34;Emails by Year&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the same data charted by month:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://www.stevenengelhardt.com/images/2014/04/emails-by-month.png&#34; alt=&#34;Emails by Month&#34;&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;This data was calculated by a simple Outlook PST parsing program I wrote called &lt;a href=&#34;https://github.com/sengelha/pststats&#34;&gt;pststats&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Handbrake to Encode Blu-Rays for the Roku</title>
      <link>https://www.stevenengelhardt.com/2014/04/27/using-handbrake-to-encode-blu-rays-for-the-roku/</link>
      <pubDate>Sun, 27 Apr 2014 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2014/04/27/using-handbrake-to-encode-blu-rays-for-the-roku/</guid>
      <description>&lt;p&gt;This post is a sibling of my earlier post &lt;a href=&#34;https://www.stevenengelhardt.com/2013/12/02/using-handbrake-to-encode-for-the-roku/&#34;&gt;Using Handbrake to Encode DVDs for the Roku&lt;/a&gt; and contains the settings I use for Blu-Ray movies. The instructions apply to Handbrake 0.9.9.&lt;/p&gt;&#xA;&lt;p&gt;Once again, start with the &lt;strong&gt;High Profile preset&lt;/strong&gt; and then make the following changes:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Output Settings&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Container&lt;/strong&gt; = Mp4&lt;/li&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;Large File Size&lt;/strong&gt; is checked&lt;/li&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;Web Optimized&lt;/strong&gt; is checked&lt;/li&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;iPod 5G Support&lt;/strong&gt; is unchecked&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Picture&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Anamorphic&lt;/strong&gt; = Strict (all Blu-Rays I&amp;rsquo;ve seen are 1920x1080)&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Cropping =&lt;/strong&gt; Automatic.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Filters&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Detelecine&lt;/strong&gt; = Off&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Decomb&lt;/strong&gt; = Fast&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Deinterlace&lt;/strong&gt; = Off&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Denoise&lt;/strong&gt; = Off&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Deblock&lt;/strong&gt; = Off&lt;/li&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;Grayscale&lt;/strong&gt; is unchecked&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Video&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Video Codec&lt;/strong&gt; = H.264 (x264)&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Framerate (FPS)&lt;/strong&gt; = Same as source&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Constant Framerate&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Quality&lt;/strong&gt; = Constant Quality of RF:20&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Optimise Video&lt;/strong&gt; = Use Advanced Tab instead&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Audio&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Create two audio tracks. The first audio track will have:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Source&lt;/strong&gt; = AC3 5.1 (which is what you should have ripped from your DVD)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Codec&lt;/strong&gt; = AAC (faac)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bitrate&lt;/strong&gt; = 160&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Samplerate&lt;/strong&gt; = Auto&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Mixdown&lt;/strong&gt; = Stereo&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;DRC&lt;/strong&gt; = 1.5&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Gain&lt;/strong&gt; = 0&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;The second audio track will have:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Source&lt;/strong&gt; = AC3 5.1&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Codec&lt;/strong&gt; = AC3 Passthru&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Subtitles&lt;/strong&gt;, keep everything empty. I do not handle subtitles.&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Chapters&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;Create chapter markers&lt;/strong&gt; is checked&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Advanced&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Encoding:&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Reference Frames&lt;/strong&gt; = 3 (Default)&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Maximum B-Frames&lt;/strong&gt; = 3 (Default)&lt;/li&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;CABAC&lt;/strong&gt; is checked&lt;/li&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;8×8 Transform&lt;/strong&gt; is checked&lt;/li&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;Weighted P-Frames&lt;/strong&gt; is checked&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Pyramidal B-Frames&lt;/strong&gt; = Normal (Default)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Analysis&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Adaptive B-Frames&lt;/strong&gt; = Optimal&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Adaptive Direct Mode&lt;/strong&gt; = Automatic&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Motion Est Method&lt;/strong&gt; = Hexagon (Default)&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Subpixel Motion Est&lt;/strong&gt; = 7: RD in all frames&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Motion Est Range&lt;/strong&gt; to 16&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Partition Type&lt;/strong&gt; = Most (Default)&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Trellis&lt;/strong&gt; = Encode Only (Default)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;Psychovisual&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Adaptive Quant Strength&lt;/strong&gt; = Middle&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Rate Distortion&lt;/strong&gt; = Middle&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Psychovisual Trellis&lt;/strong&gt; = Leftmost Setting&lt;/li&gt;&#xA;&lt;li&gt;Ensure &lt;strong&gt;No DCT-Decimate&lt;/strong&gt; is unchecked&lt;/li&gt;&#xA;&lt;li&gt;Set &lt;strong&gt;Deblocking&lt;/strong&gt; = 0 (Default), 0 (Default)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;In &lt;strong&gt;x264 Encoder Options&lt;/strong&gt;, set it to &lt;code&gt;b-adapt=2:rc-lookahead=50:direct=auto&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Using Handbrake to Encode DVDs for the Roku</title>
      <link>https://www.stevenengelhardt.com/2013/12/02/using-handbrake-to-encode-for-the-roku/</link>
      <pubDate>Mon, 02 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/12/02/using-handbrake-to-encode-for-the-roku/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; 2014-04-27 10:00 PM: See also &lt;a href=&#34;https://www.stevenengelhardt.com/2014/04/27/using-handbrake-to-encode-blu-rays-for-the-roku/&#34;&gt;Using Handbrake to Encode Blu-Rays for the Roku&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;In a &lt;a href=&#34;https://www.stevenengelhardt.com/2013/07/07/ffmpeg-encoding-for-the-roku/&#34;&gt;previous post&lt;/a&gt;, I noted that I use &lt;a href=&#34;http://www.ffmpeg.org/&#34;&gt;ffmpeg&lt;/a&gt; to convert DVDs to MP4s which will play on my &lt;a href=&#34;http://www.roku.com/&#34;&gt;Roku&lt;/a&gt;. I recently encountered two problems with this approach. First, the resulting MP4s only include a stereo audio track, so are highly sub-optimal for surround sound systems. Second, for a yet-undetermined reason, &lt;a href=&#34;http://www.plexapp.com/&#34;&gt;Plex&lt;/a&gt; (my current preferred media client) will transcode the videos rather than play them directly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Instrumenting a Java Web Application with JMX</title>
      <link>https://www.stevenengelhardt.com/2013/11/25/instrumenting-a-java-web-application-with-jmx/</link>
      <pubDate>Mon, 25 Nov 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/11/25/instrumenting-a-java-web-application-with-jmx/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html&#34;&gt;Java Management Extensions (JMX)&lt;/a&gt; is a technology for managing and monitoring Java applications. JMX instructs application developers how to instrument their applications to expose metrics and management mechanisms, and instructs operations teams how to collect metrics and manage Java applications. JMX is ubiquitous: there are a large number of off-the-shelf commercial and open source tools which speak JMX.&lt;/p&gt;&#xA;&lt;p&gt;This article is intended for application developers to introduce JMX, to teach them how to create some simple metrics via JMX, and to encourage them to thoroughly instrument their applications with JMX.; This article uses only J2SE 5 and the Java Servlet specification. There may be better, more efficient, or more appropriate ways to add JMX counters to applications using other frameworks. For example, &lt;a href=&#34;http://www.springsource.org/&#34;&gt;Spring&lt;/a&gt; developers should read &lt;a href=&#34;http://static.springsource.org/spring/docs/2.0.x/reference/jmx.html&#34;&gt;http://static.springsource.org/spring/docs/2.0.x/reference/jmx.html&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Clean Code is Not Threadsafe Code?</title>
      <link>https://www.stevenengelhardt.com/2013/10/05/clean-code-is-not-threadsafe-code/</link>
      <pubDate>Sat, 05 Oct 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/10/05/clean-code-is-not-threadsafe-code/</guid>
      <description>&lt;p&gt;I am currently reading &lt;a href=&#34;http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882&#34;&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt; by Robert C. Martin and I&amp;rsquo;ve noticed a pattern.&lt;/p&gt;&#xA;&lt;p&gt;In Listing 2-1, Martin recommends refactoring this code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;printGuessStatistics&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;candidate&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;number&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;verb&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;pluralModifier&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;number&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;no&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;verb&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;are&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;pluralModifier&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;s&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;else&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;number&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;verb&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;is&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;pluralModifier&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;else&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;number&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Integer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#c4a000&#34;&gt;toString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;count&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;verb&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;are&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;pluralModifier&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;s&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;guessMessage&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#c4a000&#34;&gt;format&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;        &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;There %s %s %s%s&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;verb&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;number&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;candidate&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;pluralModifier&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;print&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;guessMessage&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;into this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ffmpeg encoding for the Roku</title>
      <link>https://www.stevenengelhardt.com/2013/07/07/ffmpeg-encoding-for-the-roku/</link>
      <pubDate>Sun, 07 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/07/07/ffmpeg-encoding-for-the-roku/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Update 2013-12-02:&lt;/strong&gt; I no longer use this method. See &lt;a href=&#34;https://www.stevenengelhardt.com/2013/12/02/using-handbrake-to-encode-for-the-roku/&#34;&gt;this post&lt;/a&gt; for my new method.&lt;/p&gt;&#xA;&lt;p&gt;I have three (someday to be four) &lt;a href=&#34;http://www.roku.com/&#34;&gt;Roku&lt;/a&gt; players at home. I primarily use them to stream Netflix and Amazon Instant Video and to stream MP4s from a home server using &lt;a href=&#34;http://roksbox.com/&#34;&gt;Roksbox&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;My typical workflow is to rip DVDs to VOBs using &lt;a href=&#34;http://www.dvdfab.com/&#34;&gt;Dvdfab&lt;/a&gt;, copy the VOBs to my home server, and then convert them in bulk from VOB to MP4 using &lt;a href=&#34;http://www.ffmpeg.org/&#34;&gt;ffmpeg&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating a Virtual Java RPM</title>
      <link>https://www.stevenengelhardt.com/2013/05/29/creating-a-virtual-java-rpm/</link>
      <pubDate>Wed, 29 May 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/05/29/creating-a-virtual-java-rpm/</guid>
      <description>&lt;p&gt;Some RPMs (e.g. &lt;a href=&#34;http://jpackage.org&#34;&gt;jpackage.org&lt;/a&gt;&amp;rsquo;s &lt;code&gt;tomcat7-7.0.39-1.jpp6.noarch.rpm&lt;/code&gt;) express their dependency upon Java by requiring a RPM that provides capability &lt;code&gt;java&lt;/code&gt; (as opposed to, for example, depending on the existence of a file &lt;code&gt;/usr/bin/java&lt;/code&gt;). On &lt;a href=&#34;http://www.centos.org&#34;&gt;CentOS&lt;/a&gt;, this capability is normally provided by the &lt;code&gt;java-*-openjdk RPM&lt;/code&gt;. Therefore, if you execute &lt;code&gt;# yum install tomcat7&lt;/code&gt; on a clean install of CentOS, yum will install OpenJDK in addition to Tomcat 7.&lt;/p&gt;&#xA;&lt;p&gt;Some people prefer to run the Oracle JRE/JDK instead of OpenJDK. Oracle provides RPMs named &lt;code&gt;jre-&amp;lt;em&amp;gt;version&amp;lt;/em&amp;gt;-linux-x64.rpm&lt;/code&gt; and &lt;code&gt;jdk-&amp;lt;em&amp;gt;version&amp;lt;/em&amp;gt;-linux-x64.rpm&lt;/code&gt; to make installing them easier. Unfortunately, these RPMs do &lt;em&gt;not&lt;/em&gt; provide the capability &lt;code&gt;java&lt;/code&gt;. This means that if you already have the Oracle JRE installed, and you install a RPM which requires the capability &lt;code&gt;java&lt;/code&gt;, the OpenJDK will be unnecessarily installed (and might even become the default!).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pronounciation of GIF</title>
      <link>https://www.stevenengelhardt.com/2013/05/21/pronounciation-of-gif/</link>
      <pubDate>Tue, 21 May 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/05/21/pronounciation-of-gif/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;The Oxford English Dictionary accepts both pronunciations [of the word GIF]. They are wrong. It is a soft &amp;lsquo;G,&amp;rsquo; pronounced &amp;lsquo;jif.&amp;rsquo; End of story.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ndash; &lt;cite&gt;Steve Wilhite, creator of the GIF file format&lt;/cite&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Booting an Acer Aspire easyStore H340 from External USB</title>
      <link>https://www.stevenengelhardt.com/2013/05/19/booting-an-acer-aspire-easystore-h340-from-external-usb/</link>
      <pubDate>Sun, 19 May 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/05/19/booting-an-acer-aspire-easystore-h340-from-external-usb/</guid>
      <description>&lt;p&gt;A couple of years ago I bought a &lt;a href=&#34;http://panam.acer.com/acerpanam/desktop/0000/Acer/AspireeasyStoreH340/AspireeasyStoreH340sp2.shtml&#34;&gt;Acer Aspire easyStore H340&lt;/a&gt; to use as a home &lt;a href=&#34;http://en.wikipedia.org/wiki/Network-attached_storage&#34;&gt;NAS&lt;/a&gt; device. While the H340 came with Windows Server, I decided to replace it with &lt;a href=&#34;http://www.debian.org&#34;&gt;Debian Linux&lt;/a&gt; running on an external USB stick. Besides using it for basic file storage, I use &lt;a href=&#34;http://nginx.org/&#34;&gt;Nginx&lt;/a&gt; to stream MP4s to &lt;a href=&#34;http://www.roku.com/&#34;&gt;Roku&lt;/a&gt; devices throughout my home using &lt;a href=&#34;http://roksbox.com/home/&#34;&gt;Roksbox&lt;/a&gt;; I use &lt;a href=&#34;https://github.com/jasonmc/forked-daapd&#34;&gt;forked-daapd&lt;/a&gt; to stream FLACs to iTunes (albeit with limited success – &lt;a href=&#34;http://www.foobar2000.org/&#34;&gt;foobar2000&lt;/a&gt; pointing to the &lt;a href=&#34;http://en.wikipedia.org/wiki/CIFS&#34;&gt;CIFS&lt;/a&gt; file share works better); and I use &lt;a href=&#34;http://www.crashplan.com/&#34;&gt;CrashPlan&lt;/a&gt; to back up my important data (e.g. pictures) to the Internet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Varnish and Graphite</title>
      <link>https://www.stevenengelhardt.com/2013/04/29/varnish-and-graphite/</link>
      <pubDate>Mon, 29 Apr 2013 23:50:50 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/04/29/varnish-and-graphite/</guid>
      <description>&lt;p&gt;At work we have a reasonably busy &lt;a href=&#34;https://www.varnish-cache.org/&#34;&gt;Varnish&lt;/a&gt; cluster. We hooked it up to &lt;a href=&#34;http://graphite.wikidot.com/&#34;&gt;Graphite&lt;/a&gt; to allow near real-time visualization of how busy it is. Here&amp;rsquo;s a sample of what part of our Graphite dashboard looks like when you look over the past four months:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://www.stevenengelhardt.com/images/2013/04/varnish-prod.png&#34; alt=&#34;Varnish traffic&#34;&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Effects of Windows 2008R2</title>
      <link>https://www.stevenengelhardt.com/2013/04/29/effects-of-windows-2008r2/</link>
      <pubDate>Mon, 29 Apr 2013 12:49:40 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/04/29/effects-of-windows-2008r2/</guid>
      <description>&lt;p&gt;The effects of upgrading a (deliberately unnamed) web application from Windows 2003 to Windows 2008R2:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://www.stevenengelhardt.com/images/2013/04/win2k8r2-perf.png&#34; alt=&#34;Perf of Win2008R2&#34;&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Passive Indexing Wins Again</title>
      <link>https://www.stevenengelhardt.com/2013/04/09/passive-indexing-wins-again/</link>
      <pubDate>Tue, 09 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/04/09/passive-indexing-wins-again/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a bit of a &lt;a href=&#34;http://www.bogleheads.org/&#34;&gt;Boglehead&lt;/a&gt;, and the data appears to back me up. From &lt;a href=&#34;http://www.cbsnews.com/8301-505123_162-57578430/active-managers-lost-again-in-2012/&#34;&gt;http://www.cbsnews.com/8301-505123_162-57578430/active-managers-lost-again-in-2012/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;In 2012, 63 percent of large-cap funds, 80 percent of mid-cap funds and 67 percent of small-cap funds underperformed [relative to their benchmark]. The only asset class to see the majority of active funds outperform was large-cap growth, with 54 percent beating their benchmarks. The worst performance came in mid-cap growth funds where 87 percent failed to outperform.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scaling Varnish</title>
      <link>https://www.stevenengelhardt.com/2013/04/08/scaling-varnish/</link>
      <pubDate>Mon, 08 Apr 2013 03:52:52 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/04/08/scaling-varnish/</guid>
      <description>&lt;p&gt;As seen on &lt;a href=&#34;mailto:varnish-misc@varnish-cache.org&#34;&gt;varnish-misc@varnish-cache.org&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;I read one web testimony of a person who used Varnish to scale a site up to almost 200 million page views a month.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;d like to find someone who has that level of expertise.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;At work we have a Varnish cluster which, during the month of March, served over 17 &lt;em&gt;billion&lt;/em&gt; requests for an average of 6,400 requests/second.&lt;/p&gt;&#xA;&lt;p&gt;This cluster contains two physical machines with 24 cores and 192GB of RAM apiece. These machines have &lt;em&gt;tons&lt;/em&gt; of spare capacity; their load average peaked at approximately 4. We&amp;rsquo;ve even considered virtualizing the cluster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Technology Koans</title>
      <link>https://www.stevenengelhardt.com/2013/04/08/technology-koans/</link>
      <pubDate>Mon, 08 Apr 2013 03:23:38 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/04/08/technology-koans/</guid>
      <description>&lt;p&gt;I find these amusing and thought-provoking:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://stevelosh.com/posts/2013/04/git-koans/&#34;&gt;Git Koans&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://blog.sanctum.geek.nz/vim-koans/&#34;&gt;Vim Koans&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Unix File Extension</title>
      <link>https://www.stevenengelhardt.com/2013/04/05/unix-file-extension/</link>
      <pubDate>Fri, 05 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/04/05/unix-file-extension/</guid>
      <description>&lt;p&gt;This useful little snippet can be used to find the unique list of extensions for all files in a directory and all its subdirectories. I can never remember the precise awk incantation for this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;% find . -type f | awk -F. &amp;#39;{print $NF}&amp;#39; | tr &amp;#39;[:upper:]&amp;#39; &amp;#39;[:lower:]&amp;#39; | sort -u&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>MySQL is (Reportedly) Still Terrible</title>
      <link>https://www.stevenengelhardt.com/2013/02/10/mysql-is-reportedly-still-terrible/</link>
      <pubDate>Sun, 10 Feb 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/02/10/mysql-is-reportedly-still-terrible/</guid>
      <description>&lt;p&gt;Many years ago, when I actually paid attention to such things, I rejected MySQL in favor of PostgreSQL because of the former&amp;rsquo;s terrible defaults (e.g. no ACID guarantees on the default storage engine at the time, MyISAM) and missing features (in 3.23, no subqueries, stored procedures, views, etc.).  The only time I regretted it was when dealing with other software that required MySQL and would not work with PostgreSQL.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://grimoire.ca/mysql/choose-something-else&#34;&gt;Looks like not much has changed&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python Multiprocessing Module and Closures</title>
      <link>https://www.stevenengelhardt.com/2013/01/16/python-multiprocessing-module-and-closures/</link>
      <pubDate>Wed, 16 Jan 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/01/16/python-multiprocessing-module-and-closures/</guid>
      <description>&lt;p&gt;At work, I wrote a Python script which uses the &lt;a href=&#34;http://docs.python.org/2/library/multiprocessing.html&#34;&gt;multiprocessing module&lt;/a&gt; to process many servers in parallel. The code looks something like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;processServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;server&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Do work...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;numParallelTasks&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;servers&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;pool&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;multiprocessing&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Pool&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;processes&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;numParallelTasks&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;results&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;pool&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;processServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;servers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I wanted to pass some extra state to &lt;code&gt;processServer&lt;/code&gt; without using a global variable. My first attempt was to use a closure, so I wrote the following:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;processServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;extraState&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;processServerWorker&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;server&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;):&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Do work, using extraState as needed&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;processServerWorker&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;numParallelTasks&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;servers&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;extraState&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;pool&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;multiprocessing&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Pool&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;processes&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;numParallelTasks&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;results&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;pool&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;processServer&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;extraState&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;servers&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This failed with the following error:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Work Email Statistics</title>
      <link>https://www.stevenengelhardt.com/2013/01/02/work-email-statistics/</link>
      <pubDate>Wed, 02 Jan 2013 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2013/01/02/work-email-statistics/</guid>
      <description>&lt;p&gt;I have a copy of every single email I&amp;rsquo;ve sent or received at work since mid-2003. Here is a chart of the number of work emails I send and receive per year.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;//chart.googleapis.com/chart?cht=bvg&amp;amp;chs=640x300&amp;amp;chxt=x%2Cy&amp;amp;chxl=0%3A%7C2003%7C2004%7C2005%7C2006%7C2007%7C2008%7C2009%7C2010%7C2011%7C2012&amp;amp;chdlp=r&amp;amp;chdl=%23%20Received%7C%23%20Sent&amp;amp;chco=3399CC%2C80C65A&amp;amp;chxr=1%2C0%2C330230&amp;amp;chbh=a&amp;amp;chd=t%3A297%2C2387%2C4104%2C3969%2C10832%2C9344%2C20216%2C91762%2C214816%2C330230%7C974%2C1008%2C1501%2C1691%2C2822%2C2752%2C6372%2C6757%2C8522%2C6573&amp;amp;chds=0%2C350000&amp;amp;chm=N*s*%2C000000%2C0%2C-1%2C10%2C0%7CN*s*%2C000000%2C1%2C-1%2C10%2C0&amp;amp;chtt=%23%20Emails%20Sent%20and%20Received%20By%20Year&amp;amp;chxs=1N*s*&#34; alt=&#34;Work emails per year&#34;&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Loss of Context Leads to Absurdity</title>
      <link>https://www.stevenengelhardt.com/2012/08/08/loss-of-context-leads-to-absurdity/</link>
      <pubDate>Wed, 08 Aug 2012 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2012/08/08/loss-of-context-leads-to-absurdity/</guid>
      <description>&lt;p&gt;Seen in an email:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;A copy of Spongebob seems to be sitting on a file server at Xxxxxxxx.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Spongebob is the codename for an product.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Longest Interactive Command Yet</title>
      <link>https://www.stevenengelhardt.com/2012/08/02/longest-interactive-command-yet/</link>
      <pubDate>Thu, 02 Aug 2012 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2012/08/02/longest-interactive-command-yet/</guid>
      <description>&lt;p&gt;This is perhaps the longest command I&amp;rsquo;ve ever entered on the interactive command line:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[113 sengelha@centosdev-vm]% cd modules/puppet &amp;amp;&amp;amp; git init &amp;amp;&amp;amp; git add --all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;amp;&amp;amp; git commit -m &amp;#34;Initial Commit&amp;#34; &amp;amp;&amp;amp; git remote add origin https://xxxxxxx@x&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xxxxxx/scm/PM/puppet.git &amp;amp;&amp;amp; git push origin master &amp;amp;&amp;amp; cd ../.. &amp;amp;&amp;amp; git rm -r&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;modules/puppet &amp;amp;&amp;amp; rm -rf modules/puppet &amp;amp;&amp;amp; git submodule add https://xxxxxxx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/scm/PM/puppet.git modules/puppet &amp;amp;&amp;amp; git commit -m &amp;#34;Move puppet to submodule&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34; &amp;amp;&amp;amp; git push&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It moves a Puppet module to its own, separate git project and sets up a Git submodule reference to the moved module.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Effects of Akamai</title>
      <link>https://www.stevenengelhardt.com/2012/07/27/effects-of-akamai/</link>
      <pubDate>Fri, 27 Jul 2012 03:09:53 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2012/07/27/effects-of-akamai/</guid>
      <description>&lt;p&gt;The effects of putting a (deliberately unnamed) web service behind &lt;a href=&#34;http://www.akamai.com&#34;&gt;Akamai&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&lt;img src=&#34;https://www.stevenengelhardt.com/images/2012/07/effects-of-akamai.png&#34; alt=&#34;Effects of Akamai&#34;&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Varnish Expiration Thread Lock Contention</title>
      <link>https://www.stevenengelhardt.com/2012/07/27/varnish-expiration-thread-lock-contention/</link>
      <pubDate>Fri, 27 Jul 2012 02:38:11 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2012/07/27/varnish-expiration-thread-lock-contention/</guid>
      <description>&lt;p&gt;I recently helped introduce a &lt;a href=&#34;https://www.varnish-cache.org&#34;&gt;Varnish&lt;/a&gt; cluster at work to offload a significant number of requests from a heavily-trafficked internal web service.  This Varnish cluster serves approximately 10,000 requests/second (with peaks in the 20-30,000 requests/second range) 24x7x365.&lt;/p&gt;&#xA;&lt;p&gt;While working on this project I ran into a few interesting problems with Varnish.  The most interesting one I saw was that Varnish would consume more and more RAM until eventually it would consume all the memory on the box and crash.  Using &lt;a href=&#34;https://www.varnish-cache.org/docs/trunk/reference/varnishstat.html&#34;&gt;varnishstat&lt;/a&gt;, we diagnosed that this was due to unbounded growth of &lt;a href=&#34;https://www.varnish-cache.org/docs/trunk/reference/varnishd.html&#34;&gt;transient storage&lt;/a&gt; within the Varnish process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reader/Writer Lock Pattern</title>
      <link>https://www.stevenengelhardt.com/2010/03/04/readerwriter-lock-pattern/</link>
      <pubDate>Thu, 04 Mar 2010 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2010/03/04/readerwriter-lock-pattern/</guid>
      <description>&lt;p&gt;A reader-writer lock is a lock which will allow multiple concurrent readers but only one writer. A reader-writer lock can be significantly more efficient than a standard mutex if reads on your shared memory far outnumber writes.&lt;/p&gt;&#xA;&lt;p&gt;Reader-writer locks naturally fit together with caches, as caches are only effective if reads far outnumber writes.&lt;/p&gt;&#xA;&lt;p&gt;Here is a general pattern for using a reader-writer lock with a cache:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Acquire a reader lock.&lt;/li&gt;&#xA;&lt;li&gt;Check the cache for the value. If it exists, save the value and go to step 8.&lt;/li&gt;&#xA;&lt;li&gt;Upgrade the reader lock to a writer lock.&lt;/li&gt;&#xA;&lt;li&gt;Check the cache for the value. If it exists, save the value and go to step 7.&lt;/li&gt;&#xA;&lt;li&gt;Calculate the value (expensive, otherwise we wouldn&amp;rsquo;t cache it)&lt;/li&gt;&#xA;&lt;li&gt;Insert the value into the cache.&lt;/li&gt;&#xA;&lt;li&gt;Release the writer lock.&lt;/li&gt;&#xA;&lt;li&gt;Release the reader lock.&lt;/li&gt;&#xA;&lt;li&gt;Return the value.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The reason why we have to check the cache for the value again in step (4) is because of the following possibility (assume step 4 doesn&amp;rsquo;t exist):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Handling Multiple QueryString Parameters With the Same Key in ASP.NET</title>
      <link>https://www.stevenengelhardt.com/2009/09/23/handling-multiple-querystring-parameters-with-the-same-key-in-asp-net/</link>
      <pubDate>Wed, 23 Sep 2009 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2009/09/23/handling-multiple-querystring-parameters-with-the-same-key-in-asp-net/</guid>
      <description>&lt;p&gt;When you are processing an HTTP request in ASP.NET you can retrieve the user-provided query string parameters using the &lt;a href=&#34;https://web.archive.org/web/20101104135712/http://msdn.microsoft.com/en-us/library/system.web.httprequest.querystring.aspx&#34;&gt;HttpRequest.QueryString&lt;/a&gt; property. This property is an instance of the &lt;a href=&#34;https://web.archive.org/web/20101104135712/http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx&#34;&gt;NameValueCollection class&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If the user has provided multiple parameters with the same key in the query string, &lt;code&gt;HttpRequest.QueryString[key]&lt;/code&gt; will return all the values concatenated together with commas. If you would rather process the values individually, use &lt;code&gt;HttpRequest.QueryString.GetValues(key)&lt;/code&gt;, which will return an array of all the provided values.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Balloon Tooltips</title>
      <link>https://www.stevenengelhardt.com/2008/06/12/balloon-tooltips/</link>
      <pubDate>Thu, 12 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2008/06/12/balloon-tooltips/</guid>
      <description>&lt;p&gt;In the Windows XP login screen, the password text box will warn you with a balloon tooltip if you accidentally turn Caps Lock on. The balloon tooltip appears to be a Windows tooltip common control with the &lt;code&gt;TTS_BALLOON&lt;/code&gt; style.&lt;/p&gt;&#xA;&lt;p&gt;To replicate this functionality, I decided to write a function called &lt;code&gt;ShowMsgBalloon()&lt;/code&gt; which, given a control and the various balloon tooltip parameters, creates and shows the balloon tooltip below the control.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Escaping Strings in XPath 1.0</title>
      <link>https://www.stevenengelhardt.com/2008/06/03/escaping-strings-in-xpath-1-0/</link>
      <pubDate>Tue, 03 Jun 2008 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2008/06/03/escaping-strings-in-xpath-1-0/</guid>
      <description>&lt;p&gt;XPath is a language for selecting nodes from an XML document. XPath is used extensively in XSLT and other XML technologies. I also vastly prefer using XPath (e.g. with XPathNavigator) over the XML DOM when manipulating XML in a non-streaming fashion.&lt;/p&gt;&#xA;&lt;p&gt;In XPath, strings must be delimited by either single or double quotes. Given a quote character used to delimit a string, one can&amp;rsquo;t represent that same quote character within the string. This means that if you decide to use single quotes to delimit your XPath string, you couldn&amp;rsquo;t represent the string O&amp;rsquo;Reilly; use double quotes, and you can&amp;rsquo;t represent &amp;ldquo;Hello&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What I Learned Tonight…</title>
      <link>https://www.stevenengelhardt.com/2008/04/05/what-i-learned-tonight/</link>
      <pubDate>Sat, 05 Apr 2008 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2008/04/05/what-i-learned-tonight/</guid>
      <description>&lt;ol&gt;&#xA;&lt;li&gt;Diagnosing &lt;a href=&#34;http://www.microsoft.com/windowsserver2003/iis/default.mspx&#34;&gt;IIS&lt;/a&gt; &lt;a href=&#34;http://en.wikipedia.org/wiki/NTLM&#34;&gt;NTLM&lt;/a&gt; authentication failures is a real pain, until&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;You use &lt;a href=&#34;http://www.microsoft.com/&#34;&gt;Microsoft&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;http://www.microsoft.com/downloads/details.aspx?FamilyID=E90FE777-4A21-4066-BD22-B931F7572E9A&amp;amp;displaylang=en&#34;&gt;Authentication and Access Control Diagnostics&lt;/a&gt; package, which can tell you&amp;hellip;&lt;/li&gt;&#xA;&lt;li&gt;You need to enable &lt;a href=&#34;http://www.io.com/~maus/HttpKeepAlive.html&#34;&gt;HTTP Keep-Alives&lt;/a&gt; for NTLM to work.&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Representing Date/Times as Strings for Non-Human Consumption</title>
      <link>https://www.stevenengelhardt.com/2008/03/08/representing-date-times-as-strings-for-non-human-consumption/</link>
      <pubDate>Sat, 08 Mar 2008 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2008/03/08/representing-date-times-as-strings-for-non-human-consumption/</guid>
      <description>&lt;p&gt;If you ever have the need to represent a date/time (or part of a date/time) as a string for programmatic rather than human consumption (e.g. you are defining a save file format or a network protocol), please use &lt;a href=&#34;http://en.wikipedia.org/wiki/ISO_8601&#34;&gt;ISO 8601&lt;/a&gt; unless you have a very strong reason not to.&lt;/p&gt;&#xA;&lt;p&gt;For more information, please read what the &lt;a href=&#34;http://www.w3.org/TR/NOTE-datetime.html&#34;&gt;W3C has to say about ISO 8601 style date and time formats&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Don&#39;t Forget to Reap your Zombies</title>
      <link>https://www.stevenengelhardt.com/2008/03/07/dont-forget-to-reap-your-zombies/</link>
      <pubDate>Fri, 07 Mar 2008 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2008/03/07/dont-forget-to-reap-your-zombies/</guid>
      <description>&lt;p&gt;I recently received a bug report for my quick-and-dirty TCP debugging tool tcpconndbg where it was creating a large number of &lt;a href=&#34;http://en.wikipedia.org/wiki/Zombie_process&#34;&gt;zombie processes&lt;/a&gt;. The person who filed the bug, Peter Viskup, was even kind enough to send a patch. While this is old news to anyone with extensive Unix programming experience, always remember the following:&lt;/p&gt;&#xA;&lt;p&gt;If you create a child process using &lt;a href=&#34;http://www.opengroup.org/onlinepubs/007908799/xsh/fork.html&#34;&gt;&lt;code&gt;fork()&lt;/code&gt;&lt;/a&gt;, you must either:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Explicitly retrieve the child process&amp;rsquo;s exit code using one of the &lt;code&gt;wait()&lt;/code&gt; functions (e.g. &lt;code&gt;waitpid()&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Tell the system that you aren&amp;rsquo;t interested in the child process&amp;rsquo;s exit code by using either:&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;sigaction()&lt;/code&gt; with the &lt;code&gt;SA_NOCLDWAIT&lt;/code&gt; parameter (preferred)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;signal(SIGCHILD, SIG_IGN);&lt;/code&gt; (for systems which do not support &lt;code&gt;sigaction()&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;As I fixed this bug, I realized I hadn&amp;rsquo;t looked at tcpconndbg in 5 years. My how programming style changes…&lt;/p&gt;</description>
    </item>
    <item>
      <title>Geometric Annual Return in SQL</title>
      <link>https://www.stevenengelhardt.com/2008/01/30/geometric-annual-return-in-sql/</link>
      <pubDate>Wed, 30 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2008/01/30/geometric-annual-return-in-sql/</guid>
      <description>&lt;p&gt;Here is some quick-and-dirty SQL to calculate an &lt;a href=&#34;http://en.wikipedia.org/wiki/Return_on_investment#Average_annual_return_.28geometric.29&#34;&gt;geometric annual return&lt;/a&gt; (as a percent) from a column of monthly returns (in percents).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/* Convert the annualized number back to a percent */&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T3&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AnnHPR&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GeomAnnRet&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/* Annualize the holding period return */&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;POWER&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HPR&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;12&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NumReturns&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AnnHPR&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/* Calculate the holding period return over the time&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;       period.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;       POWER(10, SUM(LOG10(n))) is a simulated PRODUCT(n)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;       aggregate function.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;       The precision of POWER is determined by the precision&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;        of the first argument, so use a lot of decimals. */&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;POWER&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0000000000000000&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;                 &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;SUM&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LOG10&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;MonthReturn&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)))&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HPR&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;           &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;COUNT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NumReturns&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/* Convert all percent returns to multipliers (1% -&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;         1.01) */&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;SELECT&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;MonthPctReturn&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;MonthReturn&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;AS&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T3&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Update 2008-01-30 10:52PM: Here&amp;rsquo;s the equivalent &amp;ldquo;one-liner&amp;rdquo;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>STL Objects and Win32 Module Boundaries</title>
      <link>https://www.stevenengelhardt.com/2008/01/04/stl-objects-and-win32-module-boundaries/</link>
      <pubDate>Fri, 04 Jan 2008 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2008/01/04/stl-objects-and-win32-module-boundaries/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s say you have the following function:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;AppendChar&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ch&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ch&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What happens if this function is exported as an ordinal function from a DLL (not an inlined piece of code inside a header) and you call it from an EXE?&lt;/p&gt;&#xA;&lt;p&gt;It works most of the time. When it doesn&amp;rsquo;t, it corrupts your heap and causes a spectacular mess.&lt;/p&gt;&#xA;&lt;p&gt;In Windows you must free memory with the same allocator that allocated it. However, your EXE may not share the same allocator as the DLL. Perhaps the two modules are linked against different versions of libc, or perhaps one of the modules is using a static version of libc. If your EXE and DLL do not share an allocator and if &lt;code&gt;AppendChar()&lt;/code&gt; resizes the string s, you will almost certainly cause a heap corruption.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Custom-Drawn Win32 Tooltips</title>
      <link>https://www.stevenengelhardt.com/2007/08/29/custom-drawn-win32-tooltips/</link>
      <pubDate>Wed, 29 Aug 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/08/29/custom-drawn-win32-tooltips/</guid>
      <description>&lt;p&gt;Like many common controls, the tooltip control supports custom drawing for maximum flexibility. This is a quick tutorial on how to use the tooltip custom draw facility.&lt;/p&gt;&#xA;&lt;p&gt;First, start with the following scratch program (which is a slightly modified version of Raymond Chen&amp;rsquo;s scratch program):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#define STRICT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;windowsx.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;commctrl.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;tchar.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#define WND_CLASS_NAME TEXT(&amp;#34;Scratch&amp;#34;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;HINSTANCE&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g_hinst&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;BOOL&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;OnCreate&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HWND&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LPCREATESTRUCT&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lpcs&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TRUE&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;OnDestroy&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HWND&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;PostQuitMessage&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;LRESULT&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CALLBACK&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WndProc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HWND&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;UINT&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;uiMsg&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WPARAM&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;wParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                         &lt;span style=&#34;color:#000&#34;&gt;LPARAM&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;switch&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;uiMsg&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;HANDLE_MSG&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WM_CREATE&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;OnCreate&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;HANDLE_MSG&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WM_DESTROY&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;OnDestroy&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;DefWindowProc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;uiMsg&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;wParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;BOOL&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;RegisterWindowClass&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;WNDCLASS&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ATOM&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;atom&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;style&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;lpfnWndProc&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WndProc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;cbClsExtra&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;cbWndExtra&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hInstance&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;g_hinst&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hIcon&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hCursor&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LoadCursor&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;IDC_ARROW&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hbrBackground&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HBRUSH&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;COLOR_WINDOW&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;lpszMenuName&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;lpszClassName&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WND_CLASS_NAME&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;atom&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;RegisterClass&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;wc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;atom&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WINAPI&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_tWinMain&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HINSTANCE&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hinst&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;HINSTANCE&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hinstPrev&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#000&#34;&gt;LPTSTR&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lpCmdLine&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nCmdShow&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;INITCOMMONCONTROLSEX&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;icc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ret&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;EXIT_FAILURE&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;g_hinst&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hinst&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// We will need the tooltip common control&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;icc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;dwSize&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;sizeof&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;icc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;icc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;dwICC&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ICC_WIN95_CLASSES&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;InitCommonControlsEx&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;icc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;RegisterWindowClass&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;HWND&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CreateWindow&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;WND_CLASS_NAME&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;TEXT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Scratch&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;WS_OVERLAPPEDWINDOW&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;CW_USEDEFAULT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CW_USEDEFAULT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;CW_USEDEFAULT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CW_USEDEFAULT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;hinst&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;MSG&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ShowWindow&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hwnd&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nCmdShow&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;while&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetMessage&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000&#34;&gt;TranslateMessage&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000&#34;&gt;DispatchMessage&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;msg&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;ret&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;EXIT_SUCCESS&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ret&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, we&amp;rsquo;ll add a tooltip to this window. We&amp;rsquo;re not going to do anything fancy like tooltip multiplexing so we&amp;rsquo;ll use &lt;code&gt;TTF_SUBCLASS&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Converting C&#43;&#43; Member Functions into Function Objects</title>
      <link>https://www.stevenengelhardt.com/2007/08/28/converting-c-member-functions-into-function-objects/</link>
      <pubDate>Tue, 28 Aug 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/08/28/converting-c-member-functions-into-function-objects/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s say you have a C++ function that takes a function object as a parameter and calls it:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;template&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typename&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;_Fn&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;call_functor&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;_Fn&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;fn&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;fn&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s say you want to pass a class&amp;rsquo;s member function to &lt;code&gt;call_functor()&lt;/code&gt; above, as in:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;C&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;foo&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;cout&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;foo()&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;C&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;call_functor&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a40000&#34;&gt;\&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;What&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;do&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;I&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;put&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;here&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;foo&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;and&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;C&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;foo&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;don&lt;/span&gt;&lt;span style=&#34;color:#a40000&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;work&lt;/span&gt; &lt;span style=&#34;color:#a40000&#34;&gt;\*/&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The STL has a pointer-to-member function adapter called &lt;a href=&#34;http://www.sgi.com/tech/stl/mem_fun_t.html&#34;&gt;&lt;code&gt;std::mem_fun()&lt;/code&gt;&lt;/a&gt; which almost gets us there. Unfortunately, it doesn&amp;rsquo;t quite meet our needs because it requires us to pass a pointer to an instance of C, as in:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Win32: Getting LOGFONT from HFONT</title>
      <link>https://www.stevenengelhardt.com/2007/08/22/win32-getting-logfont-from-hfont/</link>
      <pubDate>Wed, 22 Aug 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/08/22/win32-getting-logfont-from-hfont/</guid>
      <description>&lt;p&gt;To convert a &lt;code&gt;HFONT&lt;/code&gt; to a &lt;code&gt;LOGFONT&lt;/code&gt;, use the GDI function &lt;code&gt;GetObject()&lt;/code&gt;, as in:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;LOGFONT&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ret&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;GetObject&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hfont&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;sizeof&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;lf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;lf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Be sure to check the return value of GetObject&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The code is trivial but the function took me forever to find.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Microsoft’s XmlLite</title>
      <link>https://www.stevenengelhardt.com/2007/07/12/microsofts-xmllite/</link>
      <pubDate>Thu, 12 Jul 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/07/12/microsofts-xmllite/</guid>
      <description>&lt;p&gt;Microsoft has created a new, lightweight C++ XML processing library called&#xA;&lt;a href=&#34;https://msdn2.microsoft.com/en-us/library/ms752838.aspx&#34;&gt;XmlLite&lt;/a&gt;. It includes a streaming XML writing class patterned after&#xA;.NET’s &lt;a href=&#34;http://msdn2.microsoft.com/en-us/library/system.xml.xmlwriter.aspx&#34;&gt;System.Xml.XmlWriter&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This library makes the &lt;code&gt;IXmlWriter&lt;/code&gt; in &lt;a href=&#34;https://www.stevenengelhardt.com/series/implementing-ixmlwriter/&#34;&gt;Implementing IXmlWriter Series&lt;/a&gt;&#xA;obsolete for Windows developers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generating and Parsing Localized Numbers In Windows</title>
      <link>https://www.stevenengelhardt.com/2007/07/11/generating-and-parsing-localized-numbers-in-windows/</link>
      <pubDate>Wed, 11 Jul 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/07/11/generating-and-parsing-localized-numbers-in-windows/</guid>
      <description>&lt;p&gt;While Windows supports dozens or even hundreds of languages, its localization APIs require quite a bit of getting used to. Below is how I solved some common problems related to formatting and parsing a number for a specific locale.&lt;/p&gt;&#xA;&lt;h1 id=&#34;formatting-a-number-for-a-locale&#34;&gt;Formatting a Number for a Locale&lt;/h1&gt;&#xA;&lt;p&gt;The function &lt;a href=&#34;http://msdn2.microsoft.com/en-us/library/ms776317.aspx&#34;&gt;GetNumberFormat()&lt;/a&gt; formats a number for a particular locale. Its simplest usage looks something like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#define ARRAYSIZE(x) ( sizeof(x) / sizeof(x[0]) )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;TCHAR&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;buf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;80&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ret&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;GetNumberFormat&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;LOCALE_USER_DEFAULT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// locale&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;                   &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// dwFlags&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;TEXT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1234567.89&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt;  &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// lpValue&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;                &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// lpFormat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;buf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;                 &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// lpNumberStr&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ARRAYSIZE&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;buf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;       &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// cchNumber&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;ASSERT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ret&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;buf&lt;/code&gt; now contains the number 1234567.89 formatted for the user’s default locale. For example, for the English-United States locale, buf will contain &amp;ldquo;1,234,567.89&amp;rdquo;; for German-Germany, &amp;ldquo;1.234.567,89&amp;rdquo;; for Hindi, &amp;ldquo;12,34,567.89&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>XmlTextWriter Can Produce Invalid XML</title>
      <link>https://www.stevenengelhardt.com/2007/06/16/xmltextwriter-can-produce-invalid-xml/</link>
      <pubDate>Sat, 16 Jun 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/06/16/xmltextwriter-can-produce-invalid-xml/</guid>
      <description>&lt;p&gt;&lt;code&gt;XmlTextWriter&lt;/code&gt; is .NET&amp;rsquo;s class for writing XML in a forward-only streaming manner. It is highly efficient and is the preferred way to generate XML in .NET in most circumstances. I find &lt;code&gt;XmlTextWriter&lt;/code&gt; so useful I wrote a partial C++ implementation of it in Implenting IXmlWriter Series.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, &lt;code&gt;XmlTextWriter&lt;/code&gt; isn&amp;rsquo;t quite as strict as it could be. It will let slip some invalid XML such as duplicate attributes, invalid Unicode characters in the range 0×0 to 0×20, and invalid element and attribute names. You can read about &lt;code&gt;XmlTextWriter&lt;/code&gt;&amp;rsquo;s limitations in the article &lt;a href=&#34;http://msdn2.microsoft.com/en-us/library/k1y7hyy9(vs.71).aspx&#34;&gt;Customized XML Writer Creation&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vista Does Not Virtualize Creation Of Shell Links</title>
      <link>https://www.stevenengelhardt.com/2007/05/24/vista-does-not-virtualize-creation-of-shell-links/</link>
      <pubDate>Thu, 24 May 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/05/24/vista-does-not-virtualize-creation-of-shell-links/</guid>
      <description>&lt;p&gt;Windows Vista developers beware: Vista does not perform file virtualization on the creation of shell links. Consider the following code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Creates a shell link (a.k.a. shortcut) located at swzLinkFile that points to&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// szTargetFile with a description of szDescription.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;BOOL&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CreateLink&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LPCTSTR&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;szTargetFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LPCTSTR&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;szDescription&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LPCOLESTR&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;swzLinkFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;BOOL&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bRet&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FALSE&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;IShellLink&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;psl&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;HRESULT&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CoCreateInstance&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;CLSID_ShellLink&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CLSCTX_INPROC_SERVER&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                                    &lt;span style=&#34;color:#000&#34;&gt;IID_IShellLink&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;psl&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SUCCEEDED&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;IPersistFile&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ppf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;psl&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;QueryInterface&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;IID_IPersistFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ppf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SUCCEEDED&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;psl&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SetPath&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;szTargetFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SUCCEEDED&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;psl&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SetDescription&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;szDescription&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SUCCEEDED&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ppf&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Save&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;swzLinkFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TRUE&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SUCCEEDED&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#000&#34;&gt;bSuccess&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TRUE&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;ppf&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Release&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;psl&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Release&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bSuccess&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// NOTE: Hardcoding C:\WINDOWS and C:\Program Files is a bad practice. Use&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// something like ::SHGetFolderPath().&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;BOOL&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bSuccess&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CreateLink&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;_T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;C:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;WINDOWS&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;SYSTEM32&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;SOL.EXE&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;_T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Shortcut to SOL.EXE&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#4e9a06&#34;&gt;L&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;C:&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;Program Files&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\\&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;sol.lnk&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One might expect that the creation of the file &lt;code&gt;C:\Program Files\sol.lnk&lt;/code&gt; would be silently redirected by Vista using file virtualization and &lt;code&gt;CreateLink()&lt;/code&gt; would succeed, but it doesn&amp;rsquo;t — the call to &lt;code&gt;IPersistFile::Save()&lt;/code&gt; returns &lt;code&gt;E_ACCESSDENIED&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Debugging Crashes in Windows Applications: The Null Pointer Dereference</title>
      <link>https://www.stevenengelhardt.com/2007/04/25/debugging-crashes-in-windows-applications-the-null-pointer-dereference/</link>
      <pubDate>Wed, 25 Apr 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/04/25/debugging-crashes-in-windows-applications-the-null-pointer-dereference/</guid>
      <description>&lt;p&gt;Windows C++ developers remain all too familiar with the standard Windows crash dialog. This post is an attempt to teach developers how to understand the data the crash dialog reports to diagnose difficult issues. A basic understanding of assembly language is assumed; for more background on these topics please read Matt Pietrek&amp;rsquo;s &amp;ldquo;Under The Hood&amp;rdquo; articles in the Microsoft Systems Journal &lt;a href=&#34;https://web.archive.org/web/20070710115542/http://www.microsoft.com/msj/0298/hood0298.aspx&#34;&gt;February 1998&lt;/a&gt; and &lt;a href=&#34;https://web.archive.org/web/20070710115542/http://www.microsoft.com/msj/0698/hood0698.aspx&#34;&gt;June 1998&lt;/a&gt; issues.&lt;/p&gt;&#xA;&lt;p&gt;To begin with, let&amp;rsquo;s write an application that crashes with a null pointer dereference:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Delta Compression Application Programming Interface</title>
      <link>https://www.stevenengelhardt.com/2007/03/12/delta-compression-application-programming-interface/</link>
      <pubDate>Mon, 12 Mar 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/03/12/delta-compression-application-programming-interface/</guid>
      <description>&lt;p&gt;Apparently Microsoft has an API for just about everything. Today I read about Microsoft&amp;rsquo;s &lt;a href=&#34;http://msdn2.microsoft.com/en-us/library/ms811406.aspx&#34;&gt;Delta Compression Application Programming Interface&lt;/a&gt;, an API for creating and applying binary diffs. This API looks ideal for building an application&amp;rsquo;s incremental online update facility.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Win32 Shell Lightweight Utility API (shlwapi.dll)</title>
      <link>https://www.stevenengelhardt.com/2007/02/01/win32-shell-lightweight-utility-api-shlwapi-dll/</link>
      <pubDate>Thu, 01 Feb 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/02/01/win32-shell-lightweight-utility-api-shlwapi-dll/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/shellcc/platform/shell/reference/shlwapi/shlwapi.asp&#34;&gt;Win32 shell lightweight utility API&lt;/a&gt; (&lt;code&gt;shlwapi.dll&lt;/code&gt;) is a cornucopia of useful functions. It appears to be Microsoft&amp;rsquo;s &amp;ldquo;dumping ground&amp;rdquo; for functions without a better home. (I believe Microsoft internal DLL ownership also played a part.) Had I known about &lt;code&gt;shlwapi&lt;/code&gt; years ago, it would have saved me considerable programming effort.&lt;/p&gt;&#xA;&lt;p&gt;Particularly useful are &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/shellcc/platform/shell/reference/shlwapi/version/shcreatestreamonfile.asp&#34;&gt;&lt;code&gt;SHCreateStreamOnFile&lt;/code&gt;&lt;/a&gt;, the &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/shellcc/platform/shell/reference/shlwapi/path/path.asp&#34;&gt;path family of functions&lt;/a&gt; (e.g. &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/shellcc/platform/shell/reference/shlwapi/path/pathcombine.asp&#34;&gt;&lt;code&gt;PathCombine&lt;/code&gt;&lt;/a&gt;), and the &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/shellcc/platform/shell/reference/shlwapi/registry/reg.asp&#34;&gt;registry family of functions&lt;/a&gt; (e.g. &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/shellcc/platform/shell/reference/shlwapi/registry/shreggetpath.asp&#34;&gt;&lt;code&gt;SHRegGetPath&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;However, it appears that Microsoft is slowly moving functionality out of &lt;code&gt;shlwapi&lt;/code&gt; into other places. For example, many of &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/shellcc/platform/shell/reference/shlwapi/string/string.asp&#34;&gt;&lt;code&gt;shlwapi&lt;/code&gt;&amp;rsquo;s string handling functions&lt;/a&gt; have better-designed replacements in Microsoft&amp;rsquo;s safe string library &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/winui/winui/windowsuserinterface/resources/strings.asp&#34;&gt;&lt;code&gt;strsafe&lt;/code&gt;&lt;/a&gt;. Similarly, &lt;code&gt;shlwapi&lt;/code&gt;&amp;rsquo;s &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/shellcc/platform/shell/reference/shlwapi/registry/shreggetvalue.asp&#34;&gt;&lt;code&gt;SHRegGetValue&lt;/code&gt;&lt;/a&gt; has been deprecated in favor of &lt;code&gt;advapi32.dll&lt;/code&gt;&amp;rsquo;s &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/sysinfo/base/reggetvalue.asp&#34;&gt;&lt;code&gt;RegGetValue&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>STL Map Use</title>
      <link>https://www.stevenengelhardt.com/2007/01/25/stl-map-use/</link>
      <pubDate>Thu, 25 Jan 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/01/25/stl-map-use/</guid>
      <description>&lt;p&gt;What&amp;rsquo;s wrong with the following code?&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typename&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typename&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my_pair&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T1&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;first_type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;second_type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;my_pair&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()),&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;second&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;())&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;my_pair&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T1&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;v1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;v2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;v1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;),&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;second&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;v2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;T1&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;first&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;second&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;template&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typename&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typename&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;inline&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;operator&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my_pair&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my_pair&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T2&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;y&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;x&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;second&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;y&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;second&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;my_pair&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...,&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;key_type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value_type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;key_type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value_type&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;map_type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;map_type&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;map&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Use map&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Answer: &lt;code&gt;my_pair&lt;/code&gt; cannot be used as a key for a STL map because the &lt;code&gt;operator&amp;lt;&lt;/code&gt; violates the rule of strict weak ordering. More specifically, the operator is not antisymmetric. Consider the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>STL Vector Use</title>
      <link>https://www.stevenengelhardt.com/2007/01/23/stl-vector-use/</link>
      <pubDate>Tue, 23 Jan 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/01/23/stl-vector-use/</guid>
      <description>&lt;p&gt;I recently wrote a piece of code that looked something like the following:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;NUM_TOTAL_VALUES&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Create vec and reserve NUM_TOTAL_VALUES spaces for later insertion&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;vector&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;vec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;NUM_TOTAL_VALUES&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Insert values into vec&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;NUM_TOTAL_VALUES&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;vec&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;push_back&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(...);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// vec should now have NUM_TOTAL_VALUES values in it (but doesn&amp;#39;t!)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What&amp;rsquo;s wrong with this code?&lt;/p&gt;&#xA;&lt;p&gt;The constructor &lt;code&gt;vector(size_type _Count);&lt;/code&gt; does more than just allocate enough space to store &lt;code&gt;_Count&lt;/code&gt; items — it also inserts &lt;code&gt;_Count&lt;/code&gt; (default constructed) items into the vector. To reserve space without actually inserting values, use &lt;code&gt;reserve()&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managed Wrappers and Hidden Interdependencies</title>
      <link>https://www.stevenengelhardt.com/2007/01/10/managed-wrappers-and-hidden-interdependencies/</link>
      <pubDate>Wed, 10 Jan 2007 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2007/01/10/managed-wrappers-and-hidden-interdependencies/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s say you have the following unmanaged code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#pragma unmanaged&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Stream&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;};&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Conceptual stream class&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;StreamWriter&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;StreamWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Stream&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;pStream&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_pStream&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;pStream&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;StreamWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/* Use m_pStream in some way */&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Stream&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_pStream&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;Stream&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;stream&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;StreamWriter&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;streamWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;stream&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Use streamWriter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// streamWriter is destroyed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// stream is destroyed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that &lt;code&gt;StreamWriter&lt;/code&gt;&amp;rsquo;s destructor uses &lt;code&gt;m_pStream&lt;/code&gt; (perhaps by flushing the stream). This means that the order of destruction is important — &lt;code&gt;StreamWriter&lt;/code&gt; must be destroyed before its underlying &lt;code&gt;Stream&lt;/code&gt; is.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Return XML From ASPX in ASP.NET 1.1</title>
      <link>https://www.stevenengelhardt.com/2006/02/06/how-return-xml-from-aspx-in-asp-net-1-1/</link>
      <pubDate>Mon, 06 Feb 2006 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2006/02/06/how-return-xml-from-aspx-in-asp-net-1-1/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not sure if this is the &amp;ldquo;canonical&amp;rdquo; way to do it but here&amp;rsquo;s a description of how to write an ASP.NET 1.1 ASPX page which returns a XML document (e.g. when writing a home-brewed web service).&lt;/p&gt;&#xA;&lt;p&gt;First, create a new Web Form (I will call it &lt;code&gt;WebService.aspx&lt;/code&gt;). As we will be progamatically generating the XML in the HTTP response rather than sending the (processed) content of the ASPX file, delete everything from the ASPX file but the &lt;code&gt;@Page&lt;/code&gt; directive, so that it looks something like:&lt;/p&gt;</description>
    </item>
    <item>
      <title>XSLT Number Formatting Notes</title>
      <link>https://www.stevenengelhardt.com/2006/02/02/xslt-number-formatting-notes/</link>
      <pubDate>Thu, 02 Feb 2006 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2006/02/02/xslt-number-formatting-notes/</guid>
      <description>&lt;p&gt;When using XSLT&amp;rsquo;s &lt;code&gt;format-number()&lt;/code&gt; function to format a decimal, consider using a zero in the least significant place of the decimal part of your format string. This will allow a number with a 0 integer part to display correctly.&lt;/p&gt;&#xA;&lt;p&gt;For example:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Number&lt;/th&gt;&#xA;          &lt;th&gt;format-number using #,###&lt;/th&gt;&#xA;          &lt;th&gt;format-number using #,##0&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;12345&lt;/td&gt;&#xA;          &lt;td&gt;12,345&lt;/td&gt;&#xA;          &lt;td&gt;12,345&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;5&lt;/td&gt;&#xA;          &lt;td&gt;5&lt;/td&gt;&#xA;          &lt;td&gt;5&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;em&gt;No output!&lt;/em&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;This also applies to decimals:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Number&lt;/th&gt;&#xA;          &lt;th&gt;format-number using #.00&lt;/th&gt;&#xA;          &lt;th&gt;format-number using 0.00&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;5&lt;/td&gt;&#xA;          &lt;td&gt;5.00&lt;/td&gt;&#xA;          &lt;td&gt;5.00&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;          &lt;td&gt;.00 (Note no leading 0)&lt;/td&gt;&#xA;          &lt;td&gt;0.00&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;0.1234&lt;/td&gt;&#xA;          &lt;td&gt;.12 (Note no leading 0)&lt;/td&gt;&#xA;          &lt;td&gt;0.12&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; Exception Handling</title>
      <link>https://www.stevenengelhardt.com/2006/01/30/c-exception-handling/</link>
      <pubDate>Mon, 30 Jan 2006 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2006/01/30/c-exception-handling/</guid>
      <description>&lt;p&gt;Quick quiz: What is the behavior of the following code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#include&lt;/span&gt; &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;argc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;argv&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[])&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;try&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;((&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;char&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;catch&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(...)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;printf&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Caught exception.&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Surprisingly, it depends! As I would expect, on many operating system / compiler combinations (such as &lt;code&gt;gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)&lt;/code&gt; as tested by &lt;a href=&#34;http://www.kgarner.com/posts/&#34;&gt;Keith Garner&lt;/a&gt;), the dereference of the null pointer leads to a &lt;a href=&#34;http://cs-www.bu.edu/help/unix/segmentation_fault.html&#34;&gt;segmentation fault&lt;/a&gt;. However, both Microsoft Visual Studio 6.0 and Visual Studio .NET 2003 print the message &lt;code&gt;Caught exception.&lt;/code&gt; and exit gracefully. Strange!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 14: Supporting Writing To A Stream</title>
      <link>https://www.stevenengelhardt.com/2006/01/10/implementing-ixmlwriter-part-14-supporting-writing-to-a-stream/</link>
      <pubDate>Tue, 10 Jan 2006 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2006/01/10/implementing-ixmlwriter-part-14-supporting-writing-to-a-stream/</guid>
      <description>&lt;p&gt;This is part 14/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Today I will add support for writing the generated XML to a C++ stream to &lt;a href=&#34;https://www.stevenengelhardt.com/2005/12/15/implementing-ixmlwriter-part-13-putting-ixmlwriter-behind-a-pimpl-firewall/&#34;&gt;last time&amp;rsquo;s &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Finally the reason why I&amp;rsquo;ve insisted on calling this series &lt;code&gt;IXmlWriter&lt;/code&gt; (instead of &lt;code&gt;StringXmlWriter&lt;/code&gt;) should become clear: I&amp;rsquo;ve been planning on supporting writing the generated XML to more than just a string. Specifically, today I will add the ability to write the XML to a C++ &lt;a href=&#34;http://www.cplusplus.com/ref/iostream/ostream/&#34;&gt;&lt;code&gt;ostream&lt;/code&gt; object&lt;/a&gt;, a base class in the C++ &lt;a href=&#34;http://www.cplusplus.com/ref/iostream/&#34;&gt;iostream library&lt;/a&gt; which defines a writable stream.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 13: Putting IXmlWriter Behind A Pimpl Firewall</title>
      <link>https://www.stevenengelhardt.com/2005/12/15/implementing-ixmlwriter-part-13-putting-ixmlwriter-behind-a-pimpl-firewall/</link>
      <pubDate>Thu, 15 Dec 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/12/15/implementing-ixmlwriter-part-13-putting-ixmlwriter-behind-a-pimpl-firewall/</guid>
      <description>&lt;p&gt;This is part 13/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;As the private members of &lt;code&gt;IXmlWriter&lt;/code&gt; are getting too numerous and too likely to change by my judgment, today I will put &lt;a href=&#34;https://www.stevenengelhardt.com/2005/12/13/implementing-ixmlwriter-part-12-supporting-pretty-printing/&#34;&gt;last time&amp;rsquo;s &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt; behind a &lt;a href=&#34;http://www.gotw.ca/gotw/024.htm&#34;&gt;compilation firewall (pimpl)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The idea behind the pimpl idiom is to hide as much of the class definition as possible in order to avoid requiring users of the class to recompile if the class&amp;rsquo;s private members are changed. It is accomplished by moving all private members (functions, data, etc.) into a separate class (called the implementation or pimpl class) hidden from the class definition, and replacing these members with an opaque pointer to a forward declaration of this class. It works because a C++ compiler does not need to have the full definition of a class visible in order to allocate space for a pointer to the class; every pointer is a constant, fixed size (often 4 bytes).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 12: Supporting Pretty-Printing</title>
      <link>https://www.stevenengelhardt.com/2005/12/13/implementing-ixmlwriter-part-12-supporting-pretty-printing/</link>
      <pubDate>Tue, 13 Dec 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/12/13/implementing-ixmlwriter-part-12-supporting-pretty-printing/</guid>
      <description>&lt;p&gt;This is part 12/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Today I will add support for pretty-printing to &lt;a href=&#34;https://www.stevenengelhardt.com/2005/12/07/implementing-ixmlwriter-part-11-supporting-namespaces/&#34;&gt;last time&amp;rsquo;s &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Pretty-printing is the addition of whitespace at predetermined locations to make the resulting XML easier to read than when it is all on one line. In the .NET Framework&amp;rsquo;s &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfSystemXmlXmlTextWriterClassTopic.asp&#34;&gt;&lt;code&gt;System.Xml.XmlTextWriter&lt;/code&gt; class&lt;/a&gt;, it is supported by the properties &lt;a href=&#34;http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemxmlxmltextwriterclassformattingtopic.asp&#34;&gt;&lt;code&gt;Formatting&lt;/code&gt;&lt;/a&gt;, which allows you to enable or disable pretty-printing; &lt;a href=&#34;http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemxmlxmltextwriterclassindentationtopic.asp&#34;&gt;&lt;code&gt;Indentation&lt;/code&gt;&lt;/a&gt;, which allows you to specify how many whitespace characters indentation should use; and &lt;a href=&#34;http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemxmlxmltextwriterclassindentchartopic.asp&#34;&gt;&lt;code&gt;IndentChar&lt;/code&gt;&lt;/a&gt;, which allows you to specify the whitespace character to use for indentation. For &lt;code&gt;IXmlWriter&lt;/code&gt;, I instead chose to expose these features exclusively through the constructor. This frees me from the worry of a user trying to change these properties after &lt;code&gt;IXmlWriter&lt;/code&gt; has already begun writing XML, which could produce awkward results. Default parameters are used to make the use of pretty-printing optional and straightforward.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 11: Supporting Namespaces</title>
      <link>https://www.stevenengelhardt.com/2005/12/07/implementing-ixmlwriter-part-11-supporting-namespaces/</link>
      <pubDate>Wed, 07 Dec 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/12/07/implementing-ixmlwriter-part-11-supporting-namespaces/</guid>
      <description>&lt;p&gt;This is part 11/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Today I will add support for namespaces to &lt;a href=&#34;https://www.stevenengelhardt.com/2005/12/02/implementing-ixmlwriter-part-10-supporting-writecomment/&#34;&gt;last time&amp;rsquo;s &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Namespaces are defined by the W3C recommendation &lt;a href=&#34;http://www.w3.org/TR/REC-xml-names/&#34;&gt;Namespaces in XML&lt;/a&gt;. Using namespaces requires two parts: a namespace declaration, which associates a prefix with a namespace name (a user-defined, ideally globally-unique string which defines the namespace, often in the form of a URL); and the assignment of XML elements and attributes to this namespace by using the aforementioned prefix.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 10: Supporting WriteComment()</title>
      <link>https://www.stevenengelhardt.com/2005/12/02/implementing-ixmlwriter-part-10-supporting-writecomment/</link>
      <pubDate>Fri, 02 Dec 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/12/02/implementing-ixmlwriter-part-10-supporting-writecomment/</guid>
      <description>&lt;p&gt;This is part 10/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Today I will add support for the function &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfsystemxmlxmltextwriterclasswritecommenttopic.asp&#34;&gt;&lt;code&gt;WriteComment()&lt;/code&gt;&lt;/a&gt; to &lt;a href=&#34;https://www.stevenengelhardt.com/2005/11/22/implementing-ixmlwriter-part-9-supporting-writestartdocument-and-writeenddocument/&#34;&gt;last time&amp;rsquo;s &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Quoting from &lt;a href=&#34;http://www.w3.org/TR/REC-xml/#sec-comments&#34;&gt;Section 2.5: Comments&lt;/a&gt; of the &lt;a href=&#34;http://www.w3.org/TR/REC-xml/&#34;&gt;XML 1.0 spec&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Comments MAY appear anywhere in a document outside other markup; in addition, they MAY appear within the document type declaration at places allowed by the grammar.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Considering this, we should allow writing comments in virtually every &lt;code&gt;WriteState&lt;/code&gt; that the &lt;code&gt;IXmlWriter&lt;/code&gt; can be in. In fact, some quick thought confirms that we should allow it for every &lt;code&gt;WriteState&lt;/code&gt; but &lt;code&gt;WriteState_Attribute&lt;/code&gt;, as a comment cannot be legally represented between the quotation marks which delimit an attribute value. With this in mind, here&amp;rsquo;s the test case I wrote:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 9: Supporting WriteStartDocument() and WriteEndDocument()</title>
      <link>https://www.stevenengelhardt.com/2005/11/22/implementing-ixmlwriter-part-9-supporting-writestartdocument-and-writeenddocument/</link>
      <pubDate>Tue, 22 Nov 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/11/22/implementing-ixmlwriter-part-9-supporting-writestartdocument-and-writeenddocument/</guid>
      <description>&lt;p&gt;This is part 9/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Today I will add support for the functions &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfSystemXmlXmlTextWriterClassWriteStartDocumentTopic.asp&#34;&gt;&lt;code&gt;WriteStartDocument()&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfsystemxmlxmltextwriterclasswriteenddocumenttopic.asp&#34;&gt;&lt;code&gt;WriteEndDocument()&lt;/code&gt;&lt;/a&gt; to &lt;a href=&#34;https://www.stevenengelhardt.com/2005/11/18/implementing-ixmlwriter-part-8-supporting-writestartattribute-and-writeendattribute/&#34;&gt;last time&amp;rsquo;s &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;WriteStartDocument()&lt;/code&gt; writes the XML declaration (i.e. &lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;/code&gt;) and &lt;code&gt;WriteEndDocument()&lt;/code&gt; closes all open attributes and elements and sets the &lt;code&gt;IXmlWriter&lt;/code&gt; back in the initial state. Adding support for these functions is straightforward. Note that I have introduced a new &lt;code&gt;IXmlWriter&lt;/code&gt; state called &lt;code&gt;WriteState_Prolog&lt;/code&gt;; this will be important later.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 8: Supporting WriteStartAttribute() and WriteEndAttribute()</title>
      <link>https://www.stevenengelhardt.com/2005/11/18/implementing-ixmlwriter-part-8-supporting-writestartattribute-and-writeendattribute/</link>
      <pubDate>Fri, 18 Nov 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/11/18/implementing-ixmlwriter-part-8-supporting-writestartattribute-and-writeendattribute/</guid>
      <description>&lt;p&gt;This is part 8/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Today I will add support for the functions &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfSystemXmlXmlTextWriterClassWriteStartAttributeTopic.asp&#34;&gt;&lt;code&gt;WriteStartAttribute()&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfSystemXmlXmlTextWriterClassWriteEndAttributeTopic.asp&#34;&gt;&lt;code&gt;WriteEndAttribute()&lt;/code&gt;&lt;/a&gt; to last time&amp;rsquo;s &lt;a href=&#34;https://www.stevenengelhardt.com/2005/11/17/implementing-ixmlwriter-part-7-cleaning-up/&#34;&gt;&lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;These functions are (obviously) used to denote the start and end of an attribute; the attribute value is written using &lt;code&gt;WriteString()&lt;/code&gt; (this usage is analogous to &lt;code&gt;WriteStartElement()&lt;/code&gt; and &lt;code&gt;WriteEndElement()&lt;/code&gt;). Because &lt;code&gt;WriteString()&lt;/code&gt; must now be aware of whether it is writing an attribute value or element content, I must keep track of the state the &lt;code&gt;IXmlWriter&lt;/code&gt; is in — a change that affects nearly every function.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 7: Cleaning Up</title>
      <link>https://www.stevenengelhardt.com/2005/11/17/implementing-ixmlwriter-part-7-cleaning-up/</link>
      <pubDate>Thu, 17 Nov 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/11/17/implementing-ixmlwriter-part-7-cleaning-up/</guid>
      <description>&lt;p&gt;This is part 7/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Wow, I can&amp;rsquo;t believe that it&amp;rsquo;s been over a month already since my &lt;a href=&#34;https://www.stevenengelhardt.com/2005/10/12/implementing-ixmlwriter-part-6-escaping-attribute-content/&#34;&gt;last &lt;code&gt;IXmlWriter&lt;/code&gt; post&lt;/a&gt;. I guess my vacation ruined my exercise plan and my blogging habits. It&amp;rsquo;s well past time to get back into both.&lt;/p&gt;&#xA;&lt;p&gt;Rather than introduce a new test case, I&amp;rsquo;m going to spend today &amp;ldquo;cleaning up&amp;rdquo; the previous version of &lt;code&gt;IXmlWriter&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The first cleanup method is trivial but overdue — I will separate the implementation of &lt;code&gt;IXmlWriter&lt;/code&gt; from its interface, as a user of &lt;code&gt;IXmlWriter&lt;/code&gt; shouldn&amp;rsquo;t be particularly concerned about its implementation. In other words, I will separate it into a .h and a .cpp file. For now, &lt;code&gt;IXmlWriter&lt;/code&gt; will continue to expose some implementation details (e.g. its private members), but these details should change relatively infrequently. If I ever need to completely separate its implementation from its interface, I will consider making it into a COM-like object or using the &lt;a href=&#34;http://www.gotw.ca/gotw/028.htm&#34;&gt;Pimpl idiom&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 6: Escaping Attribute Content</title>
      <link>https://www.stevenengelhardt.com/2005/10/12/implementing-ixmlwriter-part-6-escaping-attribute-content/</link>
      <pubDate>Wed, 12 Oct 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/10/12/implementing-ixmlwriter-part-6-escaping-attribute-content/</guid>
      <description>&lt;p&gt;This is part 6/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.stevenengelhardt.com/2005/10/11/implementing-ixmlwriter-part-5-supporting-writeattributestring/&#34;&gt;Last time&amp;rsquo;s &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt; has a serious bug: it doesn&amp;rsquo;t properly handle attribute value escaping and can lead to malformed XML.&lt;/p&gt;&#xA;&lt;p&gt;Consider the following test case:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;StringXmlWriter&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;element&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteAttributeString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;att&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strXML&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetXmlString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The previous version of &lt;code&gt;IXmlWriter&lt;/code&gt; will generate the XML string &lt;code&gt;&amp;lt;root&amp;gt;&amp;lt;element att=&amp;quot;&amp;quot;&amp;quot;/&amp;gt;&amp;lt;/root&amp;gt;&lt;/code&gt;, which is invalid and will be rejected by a XML parser. The rules for XML attribute escaping are given by &lt;a href=&#34;http://www.w3.org/TR/REC-xml/#sec-common-syn&#34;&gt;Section 2.3&lt;/a&gt; of the &lt;a href=&#34;http://www.w3.org/TR/REC-xml/&#34;&gt;XML 1.0 spec&lt;/a&gt;—specifically, the &lt;code&gt;AttValue&lt;/code&gt; literal:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 5: Supporting WriteAttributeString()</title>
      <link>https://www.stevenengelhardt.com/2005/10/11/implementing-ixmlwriter-part-5-supporting-writeattributestring/</link>
      <pubDate>Tue, 11 Oct 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/10/11/implementing-ixmlwriter-part-5-supporting-writeattributestring/</guid>
      <description>&lt;p&gt;This is part 5/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Today I will add support for writing attributes to &lt;a href=&#34;https://www.stevenengelhardt.com/2005/10/10/implementing-ixmlwriter-part-4-collapsing-empty-elements/&#34;&gt;yesterday&amp;rsquo;s version of &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;To learn more about attributes, see the &lt;a href=&#34;http://www.w3.org/TR/REC-xml/&#34;&gt;W3C XML 1.0 Recommendation&lt;/a&gt;. Writing attributes will be supported with the function &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfSystemXmlXmlWriterClassWriteAttributeStringTopic.asp&#34;&gt;&lt;code&gt;WriteAttributeString()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s today&amp;rsquo;s test case:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;StringXmlWriter&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;element&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteAttributeString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;att&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strXML&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetXmlString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// strXML should be &amp;lt;root&amp;gt;&amp;lt;element att=&amp;#34;value&amp;#34;/&amp;gt;&amp;lt;/root&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because the changes in &lt;a href=&#34;https://www.stevenengelhardt.com/2005/10/10/implementing-ixmlwriter-part-4-collapsing-empty-elements/&#34;&gt;Implementing IXmlWriter Part 4&lt;/a&gt; keep start elements unclosed until another function is called which requires them to be closed (e.g. &lt;code&gt;WriteString()&lt;/code&gt; and &lt;code&gt;WriteEndElement()&lt;/code&gt;), adding support for writing attributes is very simple. Here&amp;rsquo;s the version I came up with to pass all test cases:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 4: Collapsing Empty Elements</title>
      <link>https://www.stevenengelhardt.com/2005/10/10/implementing-ixmlwriter-part-4-collapsing-empty-elements/</link>
      <pubDate>Mon, 10 Oct 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/10/10/implementing-ixmlwriter-part-4-collapsing-empty-elements/</guid>
      <description>&lt;p&gt;This is part 4/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;One of the enhancements that XML introduced over SGML was a shorthand for specifying an element with no content by adding a trailing slash at the end of an open element. For example, &lt;code&gt;&amp;lt;br/&amp;gt;&lt;/code&gt; is equivalent to &lt;code&gt;&amp;lt;br&amp;gt;&amp;lt;/br&amp;gt;&lt;/code&gt;. Let&amp;rsquo;s add this functionality to &lt;a href=&#34;https://www.stevenengelhardt.com/2005/10/07/implementing-ixmlwriter-part-3-supporting-writeelementstring/&#34;&gt;the previous version of &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the test case:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;StringXmlWriter&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;emptyElement&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strXML&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetXmlString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// strXML should be &amp;lt;root&amp;gt;&amp;lt;emptyElement/&amp;gt;&amp;lt;/root&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;How does this affect our previous implementation?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 3: Supporting WriteElementString()</title>
      <link>https://www.stevenengelhardt.com/2005/10/07/implementing-ixmlwriter-part-3-supporting-writeelementstring/</link>
      <pubDate>Fri, 07 Oct 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/10/07/implementing-ixmlwriter-part-3-supporting-writeelementstring/</guid>
      <description>&lt;p&gt;This is part 3/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;Today&amp;rsquo;s addition to the &lt;a href=&#34;https://www.stevenengelhardt.com/2005/10/06/implementing-ixmlwriter-part-2-escaping-element-content/&#34;&gt;previous iteration of &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/a&gt; is quite trivial: supporting the &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfsystemxmlxmlwriterclasswriteelementstringtopic.asp&#34;&gt;&lt;code&gt;WriteElementString()&lt;/code&gt;&lt;/a&gt; method.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the test case:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;StringXmlWriter&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;root&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteElementString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;element&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strXML&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;xmlWriter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetXmlString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// strXML should be &amp;lt;root&amp;gt;&amp;lt;element&amp;gt;value&amp;lt;/element&amp;gt;&amp;lt;/root&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Implementation is extremely simple because &lt;code&gt;WriteElementString()&lt;/code&gt; is nothing but a convenience method which calls &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfsystemxmlxmlwriterclasswritestartelementtopic.asp&#34;&gt;&lt;code&gt;WriteStartElement()&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfsystemxmlxmlwriterclasswritestringtopic.asp&#34;&gt;&lt;code&gt;WriteString()&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfsystemxmlxmlwriterclasswriteendelementtopic.asp&#34;&gt;&lt;code&gt;WriteEndElement()&lt;/code&gt;&lt;/a&gt;. Therefore, here&amp;rsquo;s the new &lt;code&gt;StringXmlWriter&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;StringXmlWriter&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;stack&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_openedElements&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;localName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_openedElements&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;push&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;localName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;localName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lastOpenedElement&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_openedElements&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;top&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;lt;/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;lastOpenedElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_openedElements&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;pop&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WriteString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;const_iterator&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;iter_t&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iter_t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;begin&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;amp;amp;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;amp;gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;WriteElementString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;localName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;WriteStartElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;localName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;WriteString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;value&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;WriteEndElement&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;GetXmlString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_xmlStr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;};&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 2: Escaping Element Content</title>
      <link>https://www.stevenengelhardt.com/2005/10/06/implementing-ixmlwriter-part-2-escaping-element-content/</link>
      <pubDate>Thu, 06 Oct 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/10/06/implementing-ixmlwriter-part-2-escaping-element-content/</guid>
      <description>&lt;p&gt;This is part 2/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://www.stevenengelhardt.com/2005/09/30/implementing-ixmlwriter-part-1-the-basics/&#34;&gt;previous post of this series&lt;/a&gt;, we ended up with a simple class which could write XML elements and element content to a &lt;code&gt;std::string&lt;/code&gt;. However, this code has a common, serious problem that was mentioned in my post &lt;a href=&#34;https://www.stevenengelhardt.com/2005/09/16/dont-form-xml-using-string-concatenation/&#34;&gt;Don&amp;rsquo;t Form XML Using String Concatenation&lt;/a&gt;: it doesn&amp;rsquo;t properly escape XML special characters such as &amp;amp; and &amp;lt;. This means that if you call &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfsystemxmlxmlwriterclasswritestringtopic.asp&#34;&gt;&lt;code&gt;WriteString()&lt;/code&gt;&lt;/a&gt; with one of these characters, your generated XML will be invalid and will not be able to be parsed by an XML parser.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implementing IXmlWriter Part 1: The Basics</title>
      <link>https://www.stevenengelhardt.com/2005/09/30/implementing-ixmlwriter-part-1-the-basics/</link>
      <pubDate>Fri, 30 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/30/implementing-ixmlwriter-part-1-the-basics/</guid>
      <description>&lt;p&gt;This is part 1/14 of my &lt;em&gt;Implementing &lt;code&gt;IXmlWriter&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;After writing my blog post &lt;a href=&#34;https://www.stevenengelhardt.com/2005/09/16/dont-form-xml-using-string-concatenation/&#34;&gt;Don&amp;rsquo;t Form XML Using String Concatenation&lt;/a&gt;, I realized that writing a C++ &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfSystemXmlXmlWriterClassTopic.asp&#34;&gt;&lt;code&gt;System.Xml.XmlWriter&lt;/code&gt;&lt;/a&gt; workalike involves some interesting challenges. Therefore, I&amp;rsquo;ve decided to write a series of blog posts about building a streaming C++ XML generator, a.k.a. &lt;code&gt;IXmlWriter&lt;/code&gt;, step-by-step. For this series, I will follow the practice of &lt;a href=&#34;http://www.testdriven.com/&#34;&gt;test-driven development&lt;/a&gt; and write a test case followed by an implementation which passes the test case. Future posts&amp;rsquo; test cases will be constructed to illustrate bugs in or new features desired from the previous post&amp;rsquo;s implementation. The test cases will be constructed with the goal of having &lt;code&gt;IXmlWriter&lt;/code&gt; be as similar to &lt;code&gt;System.Xml.XmlWriter&lt;/code&gt; as possible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Don&#39;t Form XML Using String Concatenation</title>
      <link>https://www.stevenengelhardt.com/2005/09/16/dont-form-xml-using-string-concatenation/</link>
      <pubDate>Fri, 16 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/16/dont-form-xml-using-string-concatenation/</guid>
      <description>&lt;p&gt;It seems very common for developers to create XML using string concatenation, as in:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;CreateXML&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strValue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strXML&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;lt;tag&amp;gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;strXML&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strValue&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;strXML&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;&amp;lt;/tag&amp;gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strXML&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As any experienced XML developer knows, this code has a bug: &lt;code&gt;strValue&lt;/code&gt; must be escaped (&lt;code&gt;&amp;amp;&lt;/code&gt; must be converted to &lt;code&gt;&amp;amp;amp;&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt; must be converted to &lt;code&gt;&amp;amp;lt;&lt;/code&gt;, etc.) or the XML that is generated will not be well-formed and will not be able to be parsed by an XML parser. One could write a simple function to handle this escaping, but there are so many other issues that can potentially creep up with XML generation—string encoding, illegal element and attribute names, collapsing empty elements, making sure all opened elements are closed, the performance of string concatenation, etc.—that I recommend putting all this logic into a single class. In fact, I suggest modelling the class after .NET&amp;rsquo;s streaming XML generator, &lt;code&gt;System.Xml.XmlWriter&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Avoid Atoi() And Similar Functions</title>
      <link>https://www.stevenengelhardt.com/2005/09/13/avoid-atoi-and-similar-functions/</link>
      <pubDate>Tue, 13 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/13/avoid-atoi-and-similar-functions/</guid>
      <description>&lt;p&gt;Avoid &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/vclib/html/_crt_atof.2c_.atoi.2c_._atoi64.2c_.atol.asp&#34;&gt;&lt;code&gt;atoi()&lt;/code&gt;&lt;/a&gt; and related functions: they do not distinguish between invalid input and a valid &amp;ldquo;0″ string. Use functions which properly report errors, such as &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/vclib/html/_crt_strtod.2c_.wcstod.asp&#34;&gt;&lt;code&gt;strtod()&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Be Careful With Doubles And C&#43;&#43; Streams</title>
      <link>https://www.stevenengelhardt.com/2005/09/12/be-careful-with-doubles-and-c-streams/</link>
      <pubDate>Mon, 12 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/12/be-careful-with-doubles-and-c-streams/</guid>
      <description>&lt;p&gt;I ran across a piece of code recently that was using &lt;code&gt;ostrstream&lt;/code&gt; to convert a double to a string. The code looked something like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;DoubleToString&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;d&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ostrstream&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ostr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ostr&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;d&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ends&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ostr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;());&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ostr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;freeze&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function was used to convert doubles to strings for insertion into an XML document, which were eventually parsed in an XSLT by the XPath &lt;code&gt;number()&lt;/code&gt; function. Most of the time it worked fine, but for really large numbers the &lt;code&gt;number()&lt;/code&gt; function failed and return &lt;code&gt;NaN&lt;/code&gt;. Why?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use RAII</title>
      <link>https://www.stevenengelhardt.com/2005/09/09/use-raii/</link>
      <pubDate>Fri, 09 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/09/use-raii/</guid>
      <description>&lt;p&gt;This is covered by any halfway-decent C++ book, but I believe it deserves reiteration: Use the RAII idiom. I don&amp;rsquo;t think I could explain RAII any better than &lt;a href=&#34;http://www.hackcraft.net/&#34;&gt;HackCraft&lt;/a&gt; does in &lt;a href=&#34;http://www.hackcraft.net/raii/&#34;&gt;The RAII Programming Idiom&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Let me demonstrate how to use RAII with a semi-contrived example. Here&amp;rsquo;s the pre-RAII code:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;HMODULE&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;hm&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LoadLibrary&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;_T&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;user32.dll&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hm&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;FARPROC&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;proc&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;GetProcAddress&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hm&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;MessageBoxW&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;proc&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;WINAPI&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FnMessageBoxW&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;HWND&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LPCWSTR&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LPCWSTR&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;UINT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FnMessageBoxW&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;fnMessageBoxW&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FnMessageBoxW&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;proc&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;fnMessageBoxW&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;NULL&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;L&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;L&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;MB_OK&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;FreeLibrary&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;hm&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this case, the resource wrapped is &lt;code&gt;HMODULE&lt;/code&gt;, the resource acquisition function is &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/dllproc/base/loadlibrary.asp&#34;&gt;&lt;code&gt;LoadLibrary()&lt;/code&gt;&lt;/a&gt;, and the resource release function is &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/dllproc/base/freelibrary.asp&#34;&gt;&lt;code&gt;FreeLibrary()&lt;/code&gt;&lt;/a&gt;. Beware of resources which have multiple resource release functions, such as Win32&amp;rsquo;s &lt;code&gt;HANDLE&lt;/code&gt; with &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/fileio/fs/findclose.asp&#34;&gt;&lt;code&gt;FindClose()&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/sysinfo/base/closehandle.asp&#34;&gt;&lt;code&gt;CloseHandle()&lt;/code&gt;&lt;/a&gt;; for these cases you will typically have to write multiple RAII classes. I will call the wrapper class &lt;code&gt;HModule&lt;/code&gt;. Here&amp;rsquo;s how its use will look:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Beware File Open/Save Dialogs: They May Change The Current Directory</title>
      <link>https://www.stevenengelhardt.com/2005/09/08/beware-file-opensave-dialogs-they-may-change-the-current-directory/</link>
      <pubDate>Thu, 08 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/08/beware-file-opensave-dialogs-they-may-change-the-current-directory/</guid>
      <description>&lt;p&gt;On some Windows operating systems (primarily Windows 95, 98, and ME), &lt;a href=&#34;http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxfunctions/getopenfilename.asp&#34;&gt;&lt;code&gt;GetOpenFileName()&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxfunctions/getsavefilename.asp&#34;&gt;&lt;code&gt;GetSaveFileName()&lt;/code&gt;&lt;/a&gt; (and wrappers of these functions such as &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/vclib/html/_MFC_CFileDialog.asp&#34;&gt;MFC&amp;rsquo;s &lt;code&gt;CFileDialog&lt;/code&gt;&lt;/a&gt;) will permanently change the process&amp;rsquo;s current working directory unless the &lt;code&gt;OFN_NOCHANGEDIR&lt;/code&gt; option is specified. As you can imagine, this can easily break your application if you ever rely on the current working directory being set to a particular value (such as if you open files using relative paths).&lt;/p&gt;&#xA;&lt;p&gt;Of course, it is best to eliminate any such current working directory assumptions from your application completely.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Be Careful With Bitfields</title>
      <link>https://www.stevenengelhardt.com/2005/09/07/be-careful-with-bitfields/</link>
      <pubDate>Wed, 07 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/07/be-careful-with-bitfields/</guid>
      <description>&lt;p&gt;Consider the following piece of code (adapted from a real-world bug):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;BOOL&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;IsDirectory&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;LPCTSTR&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;strPathName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;DWORD&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;dwAtts&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;GetFileAttributes&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;strPathName&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;dwAtts&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;INVALID_FILE_ATTRIBUTES&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FALSE&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;dwAtts&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FILE_ATTRIBUTE_DIRECTORY&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This function will work most of the time, but every now and again it will run across a directory which it will claim isn&amp;rsquo;t one. Why?&lt;/p&gt;&#xA;&lt;p&gt;The problem is caused because &lt;code&gt;dwAtts&lt;/code&gt; is a bitfield (see the &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/fileio/fs/getfileattributes.asp&#34;&gt;&lt;code&gt;GetFileAttributes()&lt;/code&gt; documentation&lt;/a&gt;). Simple equality comparison isn&amp;rsquo;t appropriate, as if the directory has any other attributes (such as compressed, hidden, offline, etc.) the comparison will fail.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Use Constant References For Input-Only Parameters, Pointers Otherwise</title>
      <link>https://www.stevenengelhardt.com/2005/09/06/use-constant-references-for-input-only-parameters-pointers-otherwise/</link>
      <pubDate>Tue, 06 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/06/use-constant-references-for-input-only-parameters-pointers-otherwise/</guid>
      <description>&lt;p&gt;This is a style issue, so there is no right or wrong, but I suggest using a const reference for an input-only paramater to a C++ function and a pointer for an input/output or output-only parameter. This makes it slightly more obvious that the parameter might be modified by the function.&lt;/p&gt;&#xA;&lt;p&gt;Example:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;ReturnType&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Function&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ParamType&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;inputParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ParamType&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;inputOutputParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ParamType&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;outputParam&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;User&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ParamType&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;inputParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ParamType&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;inputOutputParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ParamType&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;outputParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Note the &amp;amp;s -- this is a bit of a warning something&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// might happen to inputOutputParam or outputParam...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;ReturnType&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ret&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Function&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;inputParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;inputOutputParam&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;outputParam&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Write Functions Which Take Iterators, Not Collections</title>
      <link>https://www.stevenengelhardt.com/2005/09/05/write-functions-which-take-iterators-not-collections/</link>
      <pubDate>Mon, 05 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/05/write-functions-which-take-iterators-not-collections/</guid>
      <description>&lt;p&gt;If my experience is typical, this is a very common construct:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;ReturnType&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Function&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;vector&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;vector&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;const_iterator&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;iterator_t&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iterator_t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;begin&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Work with *iter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The problem with this construct is that you have forced a container choice upon the user of your function. Slightly better, and basically your only choice when interoping with C, is this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;ReturnType&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Function&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;array&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;numItems&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;numItems&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Work with array[numItems]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Or perhaps:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// for (T* pT = array; pT != array + numItems; ++pT) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;//     Work with *pT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the above construct you can pass in any container which uses contiguous storage, such as an array or a &lt;code&gt;std::vector&lt;/code&gt; (yes, &lt;a href=&#34;http://www.parashift.com/c++-faq-lite/containers.html#faq-34.3&#34;&gt;&lt;code&gt;std::vectors&lt;/code&gt; &lt;em&gt;are&lt;/em&gt; guaranteed to store the data contiguously&lt;/a&gt;). Passing a &lt;code&gt;std::vector&lt;/code&gt; to the above function looks like:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Prefer Iteration To Indexing</title>
      <link>https://www.stevenengelhardt.com/2005/09/02/prefer-iteration-to-indexing/</link>
      <pubDate>Fri, 02 Sep 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/09/02/prefer-iteration-to-indexing/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve seen the following STL construct countless times:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;vector&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;size&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;i&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Work with container[i]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unless otherwise necessary, it is better to use an STL iterator because it enables you to more easily change the underlying container. You can isolate the code changes required to one line by using &lt;code&gt;typedef&lt;/code&gt;, as in:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;typedef&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;std&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;vector&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;T&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container_t&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;container_t&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Or ::const_iterator as necessary&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;container_t&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iterator&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;begin&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;container&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;end&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;++&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;iter&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Work with *iter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that I wrote &lt;code&gt;iter != container.end()&lt;/code&gt; as opposed to &lt;code&gt;iter &amp;lt; container.end()&lt;/code&gt;. The former only requires an &lt;a href=&#34;http://www.sgi.com/tech/stl/InputIterator.html&#34;&gt;input iterator&lt;/a&gt;, while the latter requires a &lt;a href=&#34;http://www.sgi.com/tech/stl/RandomAccessIterator.html&#34;&gt;random access iterator&lt;/a&gt;—a more complicated iterator type supported by fewer STL containers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Revisiting Excel Interop</title>
      <link>https://www.stevenengelhardt.com/2005/08/24/revisiting-excel-interop/</link>
      <pubDate>Wed, 24 Aug 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/08/24/revisiting-excel-interop/</guid>
      <description>&lt;p&gt;I ran into problem today relating to Excel interop. A coworker made a change to a C# application I wrote and was trying to build it. The program relied on a project which had a reference to the Microsoft Excel 9.0 Object Library which ships with Office 2000. However, the coworker had Office 2003 installed which includes the Excel 11.0 Object Library and not the Excel 9.0 Object Library. Because of this, he could not build the application.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deterministic Finalization and IDisposable Part 5: Useful IDisposable Class 3: AutoReleaseComObject</title>
      <link>https://www.stevenengelhardt.com/2005/02/15/deterministic-finalization-and-idisposable-part-5-useful-idisposable-class-3-autoreleasecomobject/</link>
      <pubDate>Tue, 15 Feb 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/02/15/deterministic-finalization-and-idisposable-part-5-useful-idisposable-class-3-autoreleasecomobject/</guid>
      <description>&lt;p&gt;This is part 5/5 of my &lt;em&gt;Deterministic Finalization and &lt;code&gt;IDisposable&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;This is the final example in my series on deterministic finalization in garbage-collected languages and the true motive behind the series: &lt;code&gt;AutoReleaseComObject&lt;/code&gt;. The idea behind &lt;code&gt;AutoReleaseComObject&lt;/code&gt; is simple: it is nothing but a wrapper around a COM object which calls &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/cpref/html/frlrfsystemruntimeinteropservicesmarshalclassreleasecomobjecttopic.asp&#34;&gt;&lt;code&gt;Marshal.ReleaseComObject()&lt;/code&gt;&lt;/a&gt; upon &lt;code&gt;Dispose()&lt;/code&gt; until the COM object&amp;rsquo;s reference count is 0 and the object is freed. Here&amp;rsquo;s the implementation:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deterministic Finalization and IDisposable Part 4: Useful IDisposable Class 2: AutoDeleteFile</title>
      <link>https://www.stevenengelhardt.com/2005/02/14/deterministic-finalization-and-idisposable-part-4-useful-idisposable-class-2-autodeletefile/</link>
      <pubDate>Mon, 14 Feb 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/02/14/deterministic-finalization-and-idisposable-part-4-useful-idisposable-class-2-autodeletefile/</guid>
      <description>&lt;p&gt;This is part 4/5 of my &lt;em&gt;Deterministic Finalization and &lt;code&gt;IDisposable&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;I guess my definition of tomorrow is much longer than I thought, but here&amp;rsquo;s another useful &lt;code&gt;IDisposable&lt;/code&gt; class which I shall present without comment: &lt;code&gt;AutoDeleteFile&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;System&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;System.Diagnostics&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;System.IO&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/// A file wrapper which automatically deletes the file unless Disarm()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/// is called.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;sealed&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;AutoDeleteFile&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;IDisposable&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FileInfo&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_underlyingFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_armed&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_disposed&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;AutoDeleteFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FileInfo&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;underlyingFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;Debug&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Assert&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;underlyingFile&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;null&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_underlyingFile&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;underlyingFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;AutoDeleteFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;Dispose&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;FileInfo&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;File&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;get&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;m_underlyingFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Disarm&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;m_armed&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#region&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;IDisposable&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Members&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Dispose&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;Dispose&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;GC&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SuppressFinalize&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#endregion&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Dispose&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;bool&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;disposing&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;m_disposed&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;m_armed&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;try&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000&#34;&gt;m_underlyingFile&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Delete&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;catch&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Exception&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// If we can&amp;#39;t delete, oh well!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;m_disposed&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Deterministic Finalization and IDisposable Part 3: Useful IDisposable Class 1: TimedLock</title>
      <link>https://www.stevenengelhardt.com/2005/02/13/deterministic-finalization-and-idisposable-part-3-useful-idisposable-class-1-timedlock/</link>
      <pubDate>Sun, 13 Feb 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/02/13/deterministic-finalization-and-idisposable-part-3-useful-idisposable-class-1-timedlock/</guid>
      <description>&lt;p&gt;This is part 3/5 of my &lt;em&gt;Deterministic Finalization and &lt;code&gt;IDisposable&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;For the first example of a useful custom class which implements &lt;a href=&#34;http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemIDisposableClassTopic.asp&#34;&gt;&lt;code&gt;IDisposable&lt;/code&gt;&lt;/a&gt;, I will simply link to and reproduce &lt;a href=&#34;http://www.interact-sw.co.uk/iangblog/&#34;&gt;Ian Griffith&lt;/a&gt;&amp;rsquo;s &lt;a href=&#34;http://www.interact-sw.co.uk/iangblog/2004/04/26/yetmoretimedlocking&#34;&gt;&lt;code&gt;TimedLock&lt;/code&gt;&lt;/a&gt; — an enhancement of the &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/csref/html/vclrflockstatement.asp&#34;&gt;C# &lt;code&gt;lock&lt;/code&gt; statement&lt;/a&gt; which allows the specification of a timeout period instead of blocking forever while trying to obtain the lock.&lt;/p&gt;&#xA;&lt;p&gt;The code for &lt;code&gt;TimedLock&lt;/code&gt; is reproduced below:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;System&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;using&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;System.Threading&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Thanks to Eric Gunnerson for recommending this be a struct rather&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// than a class -- avoids a heap allocation.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Thanks to Change Gillespie and Jocelyn Coulmance for pointing out&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// the bugs that then crept in when I changed it to use struct...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Thanks to John Sands for providing the necessary incentive to make&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// me invent a way of using a struct in both release and debug builds&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// without losing the debug leak tracking.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;struct&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TimedLock&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;IDisposable&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TimedLock&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Lock&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;object&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Lock&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TimeSpan&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;FromSeconds&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;));&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TimedLock&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Lock&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;object&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TimeSpan&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;TimedLock&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;tl&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TimedLock&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Monitor&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;TryEnter&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;timeout&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;DEBUG&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;System&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GC&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SuppressFinalize&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;tl&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;leakDetector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#endif&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LockTimeoutException&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;tl&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TimedLock&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;object&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;target&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;o&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;DEBUG&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;leakDetector&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Sentinel&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#endif&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;object&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Dispose&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;Monitor&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Exit&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;target&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// It&amp;#39;s a bad error if someone forgets to call Dispose,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// so in Debug builds, we put a finalizer in to detect&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// the error. If Dispose is called, we suppress the&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// finalizer.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;DEBUG&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;GC&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SuppressFinalize&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;leakDetector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#endif&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#if&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;DEBUG&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// (In Debug mode, we make it a class so that we can add a finalizer&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// in order to detect when the object is not freed.)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Sentinel&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;~&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Sentinel&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// If this finalizer runs, someone somewhere failed to&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// call Dispose, which means we&amp;#39;ve failed to leave&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// a monitor!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;System&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Diagnostics&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Debug&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Fail&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Undisposed lock&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Sentinel&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;leakDetector&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;#endif&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LockTimeoutException&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ApplicationException&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LockTimeoutException&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;base&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Timeout waiting for lock&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It is trivial to use &lt;code&gt;TimedLock&lt;/code&gt; instead of lock in your applications. Simply change statements from:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deterministic Finalization and IDisposable Part 2: Rules For Implementing IDisposable</title>
      <link>https://www.stevenengelhardt.com/2005/02/12/deterministic-finalization-and-idisposable-part-2-rules-for-implementing-idisposable/</link>
      <pubDate>Sat, 12 Feb 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/02/12/deterministic-finalization-and-idisposable-part-2-rules-for-implementing-idisposable/</guid>
      <description>&lt;p&gt;This is part 2/5 of my &lt;em&gt;Deterministic Finalization and &lt;code&gt;IDisposable&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Unfortunately the content of this blog post has been lost.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deterministic Finalization and IDisposable Part 1: The Basics</title>
      <link>https://www.stevenengelhardt.com/2005/02/11/deterministic-finalization-and-idisposable-part-1-the-basics/</link>
      <pubDate>Fri, 11 Feb 2005 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2005/02/11/deterministic-finalization-and-idisposable-part-1-the-basics/</guid>
      <description>&lt;p&gt;This is part 1/5 of my &lt;em&gt;Deterministic Finalization and &lt;code&gt;IDisposable&lt;/code&gt;&lt;/em&gt; post series.&lt;/p&gt;&#xA;&lt;p&gt;This topic has been covered many times by many others (such as &lt;a href=&#34;http://msdn.microsoft.com/library/en-us/csspec/html/vclrfcsharpspec_8_13.asp&#34;&gt;here&lt;/a&gt; and &lt;a href=&#34;http://www.codeguru.com/Csharp/Csharp/cs_syntax/interfaces/article.php/c8679/&#34;&gt;here&lt;/a&gt;), so if you are familiar with C#&amp;rsquo;s using statement and &lt;code&gt;IDisposable&lt;/code&gt; interface, feel free to skip this post. I&amp;rsquo;m writing this introduction to provide the necessary background information to set up a series of subsequent posts.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)&#34;&gt;Garbage collection&lt;/a&gt;, found in languages such as C# and Java (among many others), is a very useful feature: it largely alleviates the need for a programmer to manually handle resource management. The most commonly cited benefit is that garbage collection eliminates the need for the programmer to explicitly call heap memory management functions such as &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/vccore98/HTML/_crt_malloc.asp&#34;&gt;&lt;code&gt;malloc&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/vccore98/HTML/_crt_free.asp&#34;&gt;&lt;code&gt;free&lt;/code&gt;&lt;/a&gt;; instead, the garbage collector automatically keeps track of whether objects are still in use and frees them when they are no longer needed.&lt;sup&gt;1&lt;/sup&gt; However, in addition to handling memory management, garbage collection may also release other scarce resources upon cleanup, such as file locks or network connections.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In-Memory Decompression of gzip using Zlib</title>
      <link>https://www.stevenengelhardt.com/2004/09/01/in-memory-decompression-of-gzip-using-zlib/</link>
      <pubDate>Wed, 01 Sep 2004 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2004/09/01/in-memory-decompression-of-gzip-using-zlib/</guid>
      <description>&lt;p&gt;At work I recently was given the task to support gzip-based HTTP response compression in a C++ MFC application. For a while I was convinced that there was no way to support in-memory decompression of gzip-compressed data using &lt;a href=&#34;http://www.zlib.org/&#34;&gt;zlib&lt;/a&gt;, and so I wrote the gzipped data to a temporary file and then used the &lt;code&gt;gzopen()&lt;/code&gt;/&lt;code&gt;gzread()&lt;/code&gt;-family of functions in zlib to read it back (as described in &lt;a href=&#34;http://www.gzip.org/zlib/manual.html&#34;&gt;the zlib manual&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;I spent a lot of time looking at the zlib code to try to see why the in-memory streaming decompression function &lt;code&gt;inflate()&lt;/code&gt; wasn&amp;rsquo;t working for gzip-compressed data and determined that zlib wasn&amp;rsquo;t recognizing the gzip headers. The &lt;code&gt;inflate()&lt;/code&gt; function had code which purported to understand the headers, but it wasn&amp;rsquo;t being enabled due to reasons unknown. After some more sleuthing, I noticed the &lt;code&gt;gzopen()&lt;/code&gt;/&lt;code&gt;gzread()&lt;/code&gt; functions implemented their own gzip header detection and passed only the raw data to &lt;code&gt;inflate()&lt;/code&gt;. Once I noticed this, I threw my hands up in disgust and said it couldn&amp;rsquo;t be done.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using the Excel Object Model and Performance</title>
      <link>https://www.stevenengelhardt.com/2004/07/20/using-the-excel-object-model-and-performance/</link>
      <pubDate>Tue, 20 Jul 2004 00:00:00 +0000</pubDate>
      <guid>https://www.stevenengelhardt.com/2004/07/20/using-the-excel-object-model-and-performance/</guid>
      <description>&lt;p&gt;Recently I&amp;rsquo;ve had to write a bit of code which communicates with Microsoft Excel using its &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/dv_wrcore/html/wroriAutomatingExcelUsingExcelObjectModel.asp&#34;&gt;object model&lt;/a&gt;. Here are a few things I have learned from this experience.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Interaction with the Excel object model seems to use some kind of inter-process communication with an Excel process that is started behind the scenes. If things are not shut down properly, this Excel process will continue to run indefinitely in the background. Be sure to periodically check the Task Manager for any runaway Excel processes — these typically indicate a bug in your code or incomplete shutdown (perhaps because you chose &amp;ldquo;Stop Debugging&amp;rdquo; from the debugger).&lt;/li&gt;&#xA;&lt;li&gt;If you are using the Excel object model using MFC, follow the example in &lt;a href=&#34;http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q178/7/81.asp&amp;amp;NoWebContent=1&#34;&gt;Microsoft KB Article 178781: HOWTO: Automate Excel Using MFC and Worksheet Functions&lt;/a&gt;. Be sure to call &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/vclib/html/_mfc_coledispatchdriver.3a3a.releasedispatch.asp&#34;&gt;&lt;code&gt;COleDispatchDriver::ReleaseDispatch()&lt;/code&gt;&lt;/a&gt; or use the &lt;a href=&#34;http://msdn.microsoft.com/library/default.asp?url=https://www.stevenengelhardt.com/library/en-us/vclib/html/_mfc_coledispatchdriver.3a3a.m_bautorelease.asp&#34;&gt;&lt;code&gt;COleDispatchDriver::m_bAutoRelease&lt;/code&gt;&lt;/a&gt; member on all relevant objects or the Excel process may never stop.&lt;/li&gt;&#xA;&lt;li&gt;The Excel object model documentation (which &lt;a href=&#34;http://support.microsoft.com/default.aspx?scid=kb;EN-US;222101&#34;&gt;Microsoft KB Article 222101: How To Find and Use Office Object Model Documentation&lt;/a&gt; helps you find) is quite horrible, at least as of Office 2000. It is also written exclusively with the VB developer in mind.&lt;/li&gt;&#xA;&lt;li&gt;To give control of the running, hidden Excel process with which you are interacting to the user, use the following code:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;Excel&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;_Application&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Create and work with app...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SetVisible&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SetUserControl&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;Even if Excel is not visible to the user, &lt;code&gt;Application::Quit()&lt;/code&gt; may pop up a hidden dialog asking if the user wants to save the changes that were made through the dialog box. Since the dialog is not visible, Excel will never shut down. To prevent this dialog, either set &lt;code&gt;Application.DisplayAlerts&lt;/code&gt; to false or set &lt;code&gt;Workbook.Saved&lt;/code&gt; to true for all modified workbooks. The former is preferred.&lt;/li&gt;&#xA;&lt;li&gt;Each call using the Excel object model is very, very slow, probably as a result of the use of IPC. This means that the typical way one would think of interacting with cell values in Excel — iterating cell-by-cell within a set of nested for loops — is often too slow to be practical. Instead, I work in selections of nRows rows by nCols columns and use a two-dimensional &lt;code&gt;SAFEARRAY&lt;/code&gt;. For example:&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;COleSafeArray&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rawData&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;DWORD&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rawDataDimensions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;];&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;rawDataDimensions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nRows&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;rawDataDimensions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;nCols&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;rawData&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Create&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;VT_VARIANT&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;rawDataDimensions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Populate the values of rawData...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Select a range of size nRows x nCols&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;Excel&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;::&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Range&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;wksheet&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;GetRange&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;varUpperLeftCell&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;varLowerRightCell&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Set the cells&amp;#39; values in one call to .SetValue()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// instead of setting individual cell values&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;range&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;SetValue&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;rawData&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
