<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: I Want To Learn Programming</title>
    <description>The latest articles on DEV Community by I Want To Learn Programming (@iwtlp).</description>
    <link>https://dev.to/iwtlp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3972025%2Fe29e6194-b687-42ba-947e-36f7f02185ad.png</url>
      <title>DEV Community: I Want To Learn Programming</title>
      <link>https://dev.to/iwtlp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iwtlp"/>
    <language>en</language>
    <item>
      <title>Code Challenge of the Day: Number appearing once (others thrice) (hard)</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Wed, 15 Jul 2026 14:00:05 +0000</pubDate>
      <link>https://dev.to/iwtlp/code-challenge-of-the-day-number-appearing-once-others-thrice-hard-44g8</link>
      <guid>https://dev.to/iwtlp/code-challenge-of-the-day-number-appearing-once-others-thrice-hard-44g8</guid>
      <description>&lt;p&gt;Every value appears three times except one, which appears once. Return that value.&lt;br&gt;
Write single_three(nums).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;single_three&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Solve it interactively in your browser (no setup), check your answer instantly, and keep your daily streak going on IWTLP: &lt;a href="https://iwtlp.com/challenge" rel="noopener noreferrer"&gt;https://iwtlp.com/challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>challenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What WebAssembly actually is, and why it escaped the browser</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Wed, 15 Jul 2026 14:00:03 +0000</pubDate>
      <link>https://dev.to/iwtlp/what-webassembly-actually-is-and-why-it-escaped-the-browser-142a</link>
      <guid>https://dev.to/iwtlp/what-webassembly-actually-is-and-why-it-escaped-the-browser-142a</guid>
      <description>&lt;p&gt;WebAssembly (Wasm) was pitched as "fast code in the browser," a way to run C or Rust on a web page at near-native speed. In 2026 it has escaped that origin: Wasm now runs on servers, at the edge, and as workloads orchestrated by Kubernetes. To understand why it spread, you have to understand what Wasm actually &lt;em&gt;is&lt;/em&gt;, and it's simpler and more familiar than it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one idea: a tiny, safe, portable instruction set
&lt;/h2&gt;

&lt;p&gt;Wasm is a &lt;strong&gt;bytecode for a stack machine&lt;/strong&gt;, the same shape as the &lt;a href="https://iwtlp.com/blog/build-your-own-bytecode-vm" rel="noopener noreferrer"&gt;bytecode VM&lt;/a&gt; you can build in 30 lines. It defines a small set of low-level instructions (push a number, add, call a function, load from memory) that aren't tied to any real CPU. You compile a high-level language &lt;em&gt;down&lt;/em&gt; to these instructions, and any Wasm runtime can execute them.&lt;/p&gt;

&lt;p&gt;That's the whole concept. The interesting part is three properties that fall out of it, and together explain the takeover.&lt;/p&gt;

&lt;h2&gt;
  
  
  Property 1: it's portable
&lt;/h2&gt;

&lt;p&gt;Because Wasm instructions are CPU-independent, the &lt;em&gt;same&lt;/em&gt; compiled &lt;code&gt;.wasm&lt;/code&gt; file runs on x86, ARM, in a browser, on a server, anywhere there's a runtime. It's "compile once, run anywhere", Java's old promise, delivered as a compact, language-neutral target. Here's a Wasm function in text form (WAT), adding two integers on the stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(module
  (func (export "add") (param i32 i32) (result i32)
    local.get 0      ;; push first argument
    local.get 1      ;; push second argument
    i32.add))        ;; pop two, push their sum
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that looks like the PUSH/ADD bytecode from a toy VM, that's because it &lt;em&gt;is&lt;/em&gt; one, standardized and shipped at industrial scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Property 2: it's fast
&lt;/h2&gt;

&lt;p&gt;Wasm is low-level and statically typed, so a runtime can compile it to real machine code quickly (ahead-of-time or just-in-time) and run it at near-native speed. There's no parsing of source, no dynamic-type guessing. This is why it could do the original job, running a video editor or a game in a browser tab without the JavaScript penalty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Property 3: it's sandboxed by default (the big one)
&lt;/h2&gt;

&lt;p&gt;This is the property that took Wasm out of the browser. A Wasm module runs in a &lt;strong&gt;sandbox&lt;/strong&gt;: it has its own linear block of memory and &lt;em&gt;cannot&lt;/em&gt; touch anything outside it, no files, no network, no system calls, unless the host explicitly hands it a capability. By default it can do nothing but compute.&lt;/p&gt;

&lt;p&gt;In a browser that's a security necessity. On a server it turns out to be a superpower: you can run &lt;em&gt;untrusted&lt;/em&gt; code safely, with near-native speed and millisecond startup. That combination, fast, portable, and safe to run code you don't trust, is exactly what serverless and edge platforms need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's suddenly everywhere
&lt;/h2&gt;

&lt;p&gt;Put the three together and the 2026 spread makes sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serverless / edge functions.&lt;/strong&gt; A Wasm module starts in milliseconds (no container or VM to boot) and is safe to run on shared infrastructure. Edge platforms run your code as Wasm close to users, with cold starts a containerized function can't match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes workloads.&lt;/strong&gt; Running Wasm modules under Kubernetes gives a lighter, faster-starting, more strongly isolated unit than a container for many jobs, the "ultra-performant" pattern showing up across 2026's infra writeups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin systems.&lt;/strong&gt; Apps embed a Wasm runtime to run third-party plugins safely, the plugin literally cannot escape its sandbox to read your data. (This is also why it pairs naturally with the capability model behind tool-using AI agents.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polyglot.&lt;/strong&gt; Rust, C, Go, and more all compile to Wasm, so teams aren't locked to one language.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest limits
&lt;/h2&gt;

&lt;p&gt;Wasm isn't magic. The sandbox that makes it safe also means it can't do anything useful without the host granting capabilities, so there's a standard (WASI) defining how a module gets controlled access to files, clocks, and networking, and it's still maturing. And Wasm shines for compute-bound, self-contained work; it's not a drop-in replacement for every container or every workload. It's a new unit of deployment, not the end of the old ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is worth understanding
&lt;/h2&gt;

&lt;p&gt;WebAssembly is one of those technologies that sounds like a niche browser feature and turns out to be a quietly foundational idea: a small, safe, portable instruction set is a great way to ship and run code &lt;em&gt;anywhere&lt;/em&gt;, including code you don't trust. Once you see it's a sandboxed stack machine, the browser demos, the edge functions, the Kubernetes modules, and the plugin systems all become the same thing pointed at different problems.&lt;/p&gt;

&lt;p&gt;And the core of it is a stack machine, which you can build yourself, that's the bridge from "what is bytecode" to "why is half of cloud infrastructure adopting Wasm." Building runtimes and the languages that target them is the heart of the &lt;a href="https://iwtlp.com/track/compilers-python" rel="noopener noreferrer"&gt;compilers&lt;/a&gt; track, and the general systems thinking is all over the &lt;a href="https://iwtlp.com/track/general-coding-python" rel="noopener noreferrer"&gt;general coding&lt;/a&gt; track.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.loginline.com/en/blog/2026-kubernetes-trends" rel="noopener noreferrer"&gt;10 Kubernetes trends that will redefine cloud computing in 2026 — LoginLine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webassembly.org/" rel="noopener noreferrer"&gt;WebAssembly — official site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wasi.dev/" rel="noopener noreferrer"&gt;WASI: the WebAssembly System Interface&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webassembly</category>
      <category>compilers</category>
      <category>runtime</category>
    </item>
    <item>
      <title>Code Challenge of the Day: Number of islands (hard)</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Tue, 14 Jul 2026 14:00:05 +0000</pubDate>
      <link>https://dev.to/iwtlp/code-challenge-of-the-day-number-of-islands-hard-39hn</link>
      <guid>https://dev.to/iwtlp/code-challenge-of-the-day-number-of-islands-hard-39hn</guid>
      <description>&lt;p&gt;Count groups of connected 1s (4-directionally) in a 2D grid of 0/1.&lt;br&gt;
Write num_islands(grid).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;num_islands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Solve it interactively in your browser (no setup), check your answer instantly, and keep your daily streak going on IWTLP: &lt;a href="https://iwtlp.com/challenge" rel="noopener noreferrer"&gt;https://iwtlp.com/challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>challenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Code Challenge of the Day: Baseball game score (medium)</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Mon, 13 Jul 2026 14:00:05 +0000</pubDate>
      <link>https://dev.to/iwtlp/code-challenge-of-the-day-baseball-game-score-medium-3b5m</link>
      <guid>https://dev.to/iwtlp/code-challenge-of-the-day-baseball-game-score-medium-3b5m</guid>
      <description>&lt;p&gt;Process ops: an integer is a score; 'C' cancels the last, 'D' doubles the last, '+' sums the last two. Return the total.&lt;br&gt;
Write cal_points(ops).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cal_points&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ops&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Solve it interactively in your browser (no setup), check your answer instantly, and keep your daily streak going on IWTLP: &lt;a href="https://iwtlp.com/challenge" rel="noopener noreferrer"&gt;https://iwtlp.com/challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>challenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Code Challenge of the Day: Remove adjacent duplicates (medium)</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Sun, 12 Jul 2026 14:00:11 +0000</pubDate>
      <link>https://dev.to/iwtlp/code-challenge-of-the-day-remove-adjacent-duplicates-medium-37bo</link>
      <guid>https://dev.to/iwtlp/code-challenge-of-the-day-remove-adjacent-duplicates-medium-37bo</guid>
      <description>&lt;p&gt;Repeatedly remove adjacent equal characters until none remain; return the result.&lt;br&gt;
Write remove_adjacent(s).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remove_adjacent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Solve it interactively in your browser (no setup), check your answer instantly, and keep your daily streak going on IWTLP: &lt;a href="https://iwtlp.com/challenge" rel="noopener noreferrer"&gt;https://iwtlp.com/challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>challenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A web server from raw bytes, and the framing bugs nobody warns you about</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Sun, 12 Jul 2026 14:00:08 +0000</pubDate>
      <link>https://dev.to/iwtlp/a-web-server-from-raw-bytes-and-the-framing-bugs-nobody-warns-you-about-g3a</link>
      <guid>https://dev.to/iwtlp/a-web-server-from-raw-bytes-and-the-framing-bugs-nobody-warns-you-about-g3a</guid>
      <description>&lt;p&gt;Every backend developer leans on a framework, Spring or Express or whatever, and almost none of them have seen what it actually does. It is not much. Underneath, a web server is a function from bytes to a request, and from a response to bytes. Building that function by hand takes an afternoon, and it teaches you the handful of things that go wrong in production precisely because the framework normally hides them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole protocol is text (in HTTP/1.1)
&lt;/h2&gt;

&lt;p&gt;When a browser hits your server, it opens a socket and writes this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/42?fields=name HTTP/1.1\r\n
Host: example.com\r\n
Accept: application/json\r\n
\r\n
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the entire request. A request line, some headers, a blank line, and an optional body. The socket hands you bytes; the protocol is the agreement about how to give those bytes shape. Parsing is mostly splitting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\r\n"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// method, path, version&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;               &lt;span class="c1"&gt;// "GET" is the whole intent&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three details bite here, and each is a real bug I have watched people ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers are case-insensitive.&lt;/strong&gt; &lt;code&gt;Host&lt;/code&gt; and &lt;code&gt;host&lt;/code&gt; and &lt;code&gt;HOST&lt;/code&gt; must mean the same key. The spec says so, and clients rely on it. If you store headers in a plain map keyed by the literal string, you will one day fail to find &lt;code&gt;Content-Type&lt;/code&gt; because someone sent &lt;code&gt;content-type&lt;/code&gt;. Lowercase every key on the way in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The blank line is the frame.&lt;/strong&gt; &lt;code&gt;\r\n\r\n&lt;/code&gt; is the only thing separating the headers from the body. It is not decoration; it is how the receiver knows the headers ended and the body began. Forget it in a response and the browser keeps reading your body as headers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Percent-encoding is not optional.&lt;/strong&gt; A space in a URL arrives as &lt;code&gt;%20&lt;/code&gt;, an ampersand as &lt;code&gt;%26&lt;/code&gt;. The query string &lt;code&gt;?q=a%20b&lt;/code&gt; is &lt;code&gt;a b&lt;/code&gt;. You have to decode the escapes back into real characters, or every search with a space breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Content-Length bug
&lt;/h2&gt;

&lt;p&gt;When you respond, you tell the browser exactly how many bytes the body is, so it knows when to stop reading:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"{\"name\":\"José\"}"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// WRONG, on a string with non-ASCII:&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;                       &lt;span class="c1"&gt;// counts characters&lt;/span&gt;
&lt;span class="c1"&gt;// RIGHT:&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StandardCharsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// counts bytes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;String.length()&lt;/code&gt; counts characters, but &lt;code&gt;Content-Length&lt;/code&gt; is a byte count, and in UTF-8 a character like &lt;code&gt;é&lt;/code&gt; is two bytes. Get this wrong and the browser either hangs waiting for bytes that never come, or truncates the body mid-character. It works perfectly on your ASCII test data and breaks the first time a user named José shows up. This is the single most common hand-rolled-HTTP bug, and the framework was quietly calling &lt;code&gt;getBytes&lt;/code&gt; for you the whole time.&lt;/p&gt;

&lt;h2&gt;
  
  
  404 is not 405
&lt;/h2&gt;

&lt;p&gt;Routing is matching the method and path to a handler. The interesting part is the failure codes, because there are three and people conflate the first two constantly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /users/42&lt;/code&gt; matches a route: &lt;strong&gt;200&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /nope&lt;/code&gt; matches nothing: &lt;strong&gt;404 Not Found&lt;/strong&gt;. There is no such resource.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /users&lt;/code&gt; when only &lt;code&gt;POST /users&lt;/code&gt; exists: &lt;strong&gt;405 Method Not Allowed&lt;/strong&gt;. The resource exists; the verb is wrong.&lt;/li&gt;
&lt;li&gt;The handler throws: &lt;strong&gt;500&lt;/strong&gt;. Your bug, not the client's.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 404-versus-405 distinction matters because it is the difference between "this address does not exist" and "this address exists but you cannot do that to it." Returning 404 for a wrong method hides a real route from clients and tools that probe with &lt;code&gt;OPTIONS&lt;/code&gt;. The way to get it right is to check path-match and method-match separately: if no path matches at all, 404; if a path matches but no method does, 405.&lt;/p&gt;

&lt;p&gt;Path parameters are the one genuinely clever bit. A route pattern &lt;code&gt;/users/:id&lt;/code&gt; matches &lt;code&gt;/users/42&lt;/code&gt; and captures &lt;code&gt;42&lt;/code&gt; as &lt;code&gt;id&lt;/code&gt;. Match segment by segment, treat a &lt;code&gt;:name&lt;/code&gt; segment as a wildcard that captures, and let the most specific route win so &lt;code&gt;/users/new&lt;/code&gt; beats &lt;code&gt;/users/:id&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the toy ends
&lt;/h2&gt;

&lt;p&gt;Be honest about what this is not. A real server has to handle things this version ignores: chunked transfer encoding when the body length is not known up front, keep-alive and pipelining so one socket serves many requests, TLS, and timeouts and backpressure so a slow client cannot tie up a thread forever. And the "it is all text" framing is specifically HTTP/1.1; HTTP/2 and HTTP/3 are &lt;em&gt;binary&lt;/em&gt; framed protocols with multiplexed streams, where this mental model stops being literally true.&lt;/p&gt;

&lt;p&gt;But the core never changes: bytes become a request, a handler produces a response, the response becomes bytes. Once you have written that loop yourself, the framework stops being magic and becomes a set of defaults you now understand well enough to override. That is the entire point of building it once.&lt;/p&gt;

</description>
      <category>http</category>
      <category>networking</category>
      <category>webserver</category>
      <category>backend</category>
    </item>
    <item>
      <title>Code Challenge of the Day: Evaluate reverse Polish (medium)</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Sat, 11 Jul 2026 14:00:07 +0000</pubDate>
      <link>https://dev.to/iwtlp/code-challenge-of-the-day-evaluate-reverse-polish-medium-22p4</link>
      <guid>https://dev.to/iwtlp/code-challenge-of-the-day-evaluate-reverse-polish-medium-22p4</guid>
      <description>&lt;p&gt;Evaluate a list of reverse-Polish-notation tokens (ints and + - * /, integer division truncating toward zero).&lt;br&gt;
Write eval_rpn(tokens).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;eval_rpn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Solve it interactively in your browser (no setup), check your answer instantly, and keep your daily streak going on IWTLP: &lt;a href="https://iwtlp.com/challenge" rel="noopener noreferrer"&gt;https://iwtlp.com/challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>challenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The bootstrap, confidence intervals without the formula</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Sat, 11 Jul 2026 14:00:05 +0000</pubDate>
      <link>https://dev.to/iwtlp/the-bootstrap-confidence-intervals-without-the-formula-hok</link>
      <guid>https://dev.to/iwtlp/the-bootstrap-confidence-intervals-without-the-formula-hok</guid>
      <description>&lt;p&gt;Open a statistics textbook and you'll find a different confidence-interval formula for every situation: one for a mean, another for a median, another for a correlation, each carrying assumptions (normality, large samples) you may quietly be violating. The &lt;strong&gt;bootstrap&lt;/strong&gt; replaces that whole drawer of formulas with a single, almost suspiciously simple idea, and it works for statistics that have no clean formula at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one idea: your sample is your best guess at the population
&lt;/h2&gt;

&lt;p&gt;You have one sample of data and you want to know how much a statistic (say, the mean) would &lt;em&gt;wobble&lt;/em&gt; if you could collect new samples. But you can't collect new samples, you have the one.&lt;/p&gt;

&lt;p&gt;The bootstrap's move: treat your sample &lt;em&gt;as if it were the population&lt;/em&gt;, and draw new samples &lt;em&gt;from it&lt;/em&gt;, with replacement. Each "resample" is the same size as your data, but some original points appear twice or thrice and others not at all. Compute your statistic on each resample, do it thousands of times, and the spread of those values estimates how much the statistic would vary in reality. You simulate "collecting new data" by reusing the data you have.&lt;/p&gt;

&lt;h2&gt;
  
  
  In a few lines of R
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight r"&gt;&lt;code&gt;&lt;span class="n"&gt;bootstrap_ci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="c1"&gt;# B resamples, each the same size as x, drawn WITH replacement&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;boots&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;replicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;quantile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;boots&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# the middle 95% of the resample stats&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;set.seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;4.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6.4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;bootstrap_ci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;# a 95% CI for the mean, no t-distribution in sight&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire method. &lt;code&gt;sample(x, n, replace = TRUE)&lt;/code&gt; is the resample; &lt;code&gt;replicate(B, ...)&lt;/code&gt; does it ten thousand times; &lt;code&gt;quantile(..., c(0.025, 0.975))&lt;/code&gt; takes the middle 95% of the resulting statistics as the interval. The "percentile bootstrap" confidence interval is literally: &lt;em&gt;the range that holds the central 95% of your resampled statistics.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Three details that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;replace = TRUE&lt;/code&gt; is the whole trick.&lt;/strong&gt; Sampling &lt;em&gt;without&lt;/em&gt; replacement would just return your original data every time. Sampling &lt;em&gt;with&lt;/em&gt; replacement creates the variation that mimics drawing fresh samples.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each resample is the same size &lt;code&gt;n&lt;/code&gt;.&lt;/strong&gt; The amount of data you have determines how much a statistic wobbles, so the resamples must match it. A bigger original sample gives a tighter interval, exactly as it should.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No distributional assumption.&lt;/strong&gt; We never assumed the data was normal. The interval comes from the data's own shape, which is why the bootstrap shines on skewed data and small (but not tiny) samples where formula-based intervals quietly fail.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The magic: it works for &lt;em&gt;any&lt;/em&gt; statistic
&lt;/h2&gt;

&lt;p&gt;Here's the real payoff. Want a confidence interval for the &lt;strong&gt;median&lt;/strong&gt;? There's no nice textbook formula. With the bootstrap, change one argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight r"&gt;&lt;code&gt;&lt;span class="n"&gt;bootstrap_ci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;median&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same for a trimmed mean, a correlation, a ratio, the 90th percentile, anything you can compute. If you can write a function that returns the statistic, the bootstrap gives you its confidence interval. One method, unlimited statistics. That generality is why it became a workhorse of modern applied statistics: you stop hunting for the right formula and just &lt;em&gt;resample and look&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it doesn't work
&lt;/h2&gt;

&lt;p&gt;Honesty matters. The bootstrap isn't universal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Very small samples.&lt;/strong&gt; If you have 5 data points, resampling 5 points can't conjure information that isn't there; the interval will be unreliable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extremes.&lt;/strong&gt; It struggles with statistics that depend on the rarest values, like the maximum, because a resample can't produce values larger than your observed max.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It needs compute.&lt;/strong&gt; It trades a formula for thousands of recomputations, trivial today, which is exactly why the method became practical only once computers were cheap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this is worth knowing
&lt;/h2&gt;

&lt;p&gt;The bootstrap is a beautiful example of computation replacing cleverness. Instead of deriving a formula with restrictive assumptions, you let the computer &lt;em&gt;simulate&lt;/em&gt; the sampling variation directly from your data. Once the idea clicks, resample with replacement, recompute, look at the spread, a huge swath of "which test do I use?" anxiety dissolves: for many questions, you can just bootstrap it.&lt;/p&gt;

&lt;p&gt;Building these resampling and simulation methods yourself, rather than calling a black-box &lt;code&gt;t.test&lt;/code&gt;, is exactly the spirit of the &lt;a href="https://iwtlp.com/track/statistics-r" rel="noopener noreferrer"&gt;statistics in R&lt;/a&gt; track, where Monte Carlo and the bootstrap show up as tools you construct, not incantations you trust.&lt;/p&gt;

</description>
      <category>statistics</category>
      <category>r</category>
      <category>bootstrap</category>
      <category>resampling</category>
    </item>
    <item>
      <title>Code Challenge of the Day: Make an acronym (easy)</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Fri, 10 Jul 2026 14:00:05 +0000</pubDate>
      <link>https://dev.to/iwtlp/code-challenge-of-the-day-make-an-acronym-easy-12hl</link>
      <guid>https://dev.to/iwtlp/code-challenge-of-the-day-make-an-acronym-easy-12hl</guid>
      <description>&lt;p&gt;Return the uppercase first letter of each space-separated word.&lt;br&gt;
Write acronym(s).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;acronym&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Solve it interactively in your browser (no setup), check your answer instantly, and keep your daily streak going on IWTLP: &lt;a href="https://iwtlp.com/challenge" rel="noopener noreferrer"&gt;https://iwtlp.com/challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>challenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Code Challenge of the Day: Capitalize first letter (easy)</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Thu, 09 Jul 2026 14:00:07 +0000</pubDate>
      <link>https://dev.to/iwtlp/code-challenge-of-the-day-capitalize-first-letter-easy-1bi1</link>
      <guid>https://dev.to/iwtlp/code-challenge-of-the-day-capitalize-first-letter-easy-1bi1</guid>
      <description>&lt;p&gt;Return the string with only its first character uppercased.&lt;br&gt;
Write cap_first(s).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cap_first&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Solve it interactively in your browser (no setup), check your answer instantly, and keep your daily streak going on IWTLP: &lt;a href="https://iwtlp.com/challenge" rel="noopener noreferrer"&gt;https://iwtlp.com/challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>challenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How SaaS data exfiltration works, the quiet breaches of 2026</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Thu, 09 Jul 2026 14:00:04 +0000</pubDate>
      <link>https://dev.to/iwtlp/how-saas-data-exfiltration-works-the-quiet-breaches-of-2026-1kkg</link>
      <guid>https://dev.to/iwtlp/how-saas-data-exfiltration-works-the-quiet-breaches-of-2026-1kkg</guid>
      <description>&lt;p&gt;The headline breaches of 2026 had a new shape. Instead of hacking a company's own servers, attackers drained the &lt;strong&gt;SaaS platforms&lt;/strong&gt; those companies live in: Salesforce, Microsoft 365, CRMs, support desks. The ShinyHunters extortion campaign exfiltrated customer data at scale this way; one telecom reportedly lost hundreds of terabytes. And almost none of it involved breaking software. It involved &lt;em&gt;using&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;This is the modern data-theft model, and understanding it changes what "securing your data" even means when your data lives in someone else's app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one idea: your data lives in apps you don't control
&lt;/h2&gt;

&lt;p&gt;A decade ago your customer data sat in a database on a server you ran. Today it sits in SaaS platforms, and those platforms are designed to make data easy to access and export. That's a feature for you and a target for attackers. The attack surface moved from "your server's vulnerabilities" to "who and what can log into your SaaS tenant, and what they're allowed to take."&lt;/p&gt;

&lt;p&gt;Once an attacker has &lt;em&gt;legitimate&lt;/em&gt; access, the platform's own export features do the rest. There's no malware to detect; it looks like normal use.&lt;/p&gt;

&lt;h2&gt;
  
  
  How they get in: tokens, not exploits
&lt;/h2&gt;

&lt;p&gt;The way into a SaaS tenant is almost always a credential or a token, building on &lt;a href="https://iwtlp.com/blog/they-logged-in-not-broke-in-credential-attacks" rel="noopener noreferrer"&gt;why credentials are the #1 way in&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phished employee logins&lt;/strong&gt;, sometimes with the MFA code captured in real time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth app consent.&lt;/strong&gt; This is the SaaS-specific one. A user is tricked into clicking "Allow" on a malicious third-party app requesting broad permissions ("read all your files and email"). No password is stolen, the user &lt;em&gt;granted&lt;/em&gt; access. The app now holds a token that reads their data directly, and it survives password changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over-permissioned integrations and vendors.&lt;/strong&gt; A connected tool or contractor with more access than it needs becomes the way in when &lt;em&gt;it&lt;/em&gt; is compromised.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The theme: the attacker ends up holding a valid token with broad read scope. From the platform's view, every request that follows is authorized.&lt;/p&gt;

&lt;h2&gt;
  
  
  How they drain it: the platform's own APIs
&lt;/h2&gt;

&lt;p&gt;With a valid token, exfiltration is just &lt;em&gt;using the API as designed&lt;/em&gt;. SaaS platforms expose rich query and bulk-export endpoints so you can integrate and back up your data, exactly what an attacker wants. The pattern, conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Authenticate with the stolen token.
2. List the objects available (accounts, contacts, files, messages).
3. Page through them in bulk and download.
4. Repeat slowly enough to blend into normal traffic.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We won't write a working exfiltrator, but note how &lt;em&gt;boring&lt;/em&gt; it is: authenticate, list, page, download. It's the same code a legitimate backup integration runs. That's the whole problem, the malicious export and the legitimate one are indistinguishable at the request level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's so hard to spot
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's authenticated traffic.&lt;/strong&gt; No failed logins, no exploit signatures. Every request is "valid."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It mimics normal integration behavior.&lt;/strong&gt; SaaS tenants have dozens of apps pulling data all day. One more reader hides in the noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The data is centralized.&lt;/strong&gt; One compromised token can reach an entire org's records, because that's how the platform is meant to work for admins and integrations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Canvas/Instructure incident (275 million students' data, including private messages) and the SaaS extortion wave all share this: the value was concentrated in a platform, and access to the platform was the whole game.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually defends against it
&lt;/h2&gt;

&lt;p&gt;Since you can't patch "the platform works as designed," defense is about &lt;em&gt;governing access&lt;/em&gt; to your SaaS data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audit OAuth app grants.&lt;/strong&gt; Review which third-party apps have access to your tenant and what scopes they hold. Revoke the broad, unused, and unknown ones, this directly kills the malicious-consent path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Least privilege, everywhere.&lt;/strong&gt; Most users and integrations don't need org-wide read or bulk-export rights. Scope them down so one stolen token reaches little.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phishing-resistant MFA&lt;/strong&gt; on the SaaS logins themselves, to make the tokens harder to steal in the first place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch for bulk-export behavior.&lt;/strong&gt; The one real signal is &lt;em&gt;volume and pattern&lt;/em&gt;: a token suddenly paging through every record, an unusual mass download. SaaS platforms increasingly expose these logs, use them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypt and minimize.&lt;/strong&gt; Don't put more sensitive data into a SaaS platform than you must, and use field-level encryption for the crown jewels so an export yields less.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this is the lesson that matters
&lt;/h2&gt;

&lt;p&gt;"Securing your data" used to mean hardening your servers. When your data lives in SaaS, it means governing &lt;em&gt;access and permissions&lt;/em&gt; in platforms you don't control, because the breach won't be an exploit, it'll be a granted permission used at scale. The shift from "break in" to "log in and export" is the defining data-security story of the year.&lt;/p&gt;

&lt;p&gt;Understanding the mechanism, valid token plus the platform's own bulk APIs, makes the defenses obvious: shrink who can read, shrink what they can take, and watch for the one thing that looks different, mass export. Reasoning from the attack to the defense like this is the whole approach of the &lt;a href="https://iwtlp.com/track/cybersecurity-python" rel="noopener noreferrer"&gt;cybersecurity&lt;/a&gt; track.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.acilearning.com/blog/the-biggest-cybersecurity-breaches-of-2026-so-far-and-the-training-that-could-have-prevented-them/" rel="noopener noreferrer"&gt;The biggest cyber breaches of 2026 so far — ACI Learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cm-alliance.com/cybersecurity-blog/biggest-cyber-attacks-data-breaches-ransomware-attacks-of-may-2026" rel="noopener noreferrer"&gt;Biggest cyber attacks &amp;amp; breaches of May 2026 — CM-Alliance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pkware.com/blog/2026-data-breaches" rel="noopener noreferrer"&gt;2026 data breaches — PKWARE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>saas</category>
      <category>oauth</category>
      <category>dataprotection</category>
    </item>
    <item>
      <title>Code Challenge of the Day: Target sum ways (hard)</title>
      <dc:creator>I Want To Learn Programming</dc:creator>
      <pubDate>Wed, 08 Jul 2026 14:00:05 +0000</pubDate>
      <link>https://dev.to/iwtlp/code-challenge-of-the-day-target-sum-ways-hard-lhf</link>
      <guid>https://dev.to/iwtlp/code-challenge-of-the-day-target-sum-ways-hard-lhf</guid>
      <description>&lt;p&gt;Count the ways to assign + or - to each number so the expression equals target.&lt;br&gt;
Write count_target(nums, target).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;count_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# TODO
&lt;/span&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Solve it interactively in your browser (no setup), check your answer instantly, and keep your daily streak going on IWTLP: &lt;a href="https://iwtlp.com/challenge" rel="noopener noreferrer"&gt;https://iwtlp.com/challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>challenge</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
