Seth Larson https://sethmlarson.dev/feed 2026-06-18T00:00:00Z Seth Larson https://sethmlarson.dev [email protected] https://github.com/sethmlarson.png https://github.com/sethmlarson.png Werkzeug TIL “@here” only notifies online users on Discord and Slack https://sethmlarson.dev/til-at-here-only-notifies-online-users-on-discord-and-slack?utm_campaign=rss 2026-06-18T00:00:00Z 2026-06-18T00:00:00Z Seth Larson <p>I'm in a few Discord servers of friends and we get together in-person regularly. Whenever I was the one organizing an event I would attempt to ping everyone details in the Discord using <code>@here</code>.</p> <p>After the initial ping I would usually follow-up with folks over text, which is fine and expected part of organizing. More often than not, invitees would be <em>way more responsive</em> over text than over Discord. I created an <a href="https://sethmlarson.dev/sms-bcc">SMS BCC tool</a> because of how effective texting is for organizing events.</p> <p>Turns out that <code>@here</code> is <a href="https://superuser.com/questions/1212953/how-do-everyone-and-here-work-whats-the-difference-between-them"><em>functionally different</em></a> from <code>@everyone</code> or <code>@channel</code> on Slack and Discord. <!-- more --> <code>@here</code> only sends notifications to users that are <em>currently online</em> 🟢, not offline ⚫ or “away” 🟡. This makes <code>@here</code> useful for when you’re trying to play an online multiplayer game or chat synchronously... but not for planning a hang-out in advance. So none of my usually-offline friends on Discord would get my initial notification, only the follow-ups. I’ll be using <code>@channel</code> for this purpose from now on.</p> <p>I learned this from a friend and <em>three people</em> including me were not aware of this distinction, so I figure I have to share this on the blog. Maybe this will help you increase the turn-out for the next event you host for Discord friends. What other Discord or Slack hacks am I probably unaware of? Send them to me via email or on social media.</p> <p><em>Happy organizing!</em> </p> <br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br> Linting is important for code review: screen included https://sethmlarson.dev/linting-screen-during-code-review?utm_campaign=rss 2026-06-11T00:00:00Z 2026-06-11T00:00:00Z Seth Larson <p>Today I was reviewing a pull request for some Python code when I saw a semicolon in the diff. <!-- more --> Screenshot provided below, which as we all know is the best way to share text on the internet:</p> <p> <center> <img alt="Picture of code with a semicolon (;)" style="border: 2px black solid; max-width: 100%;" src="https://storage.googleapis.com/sethmlarson-dev-static-assets/IMG_5329_small.jpeg"/> <br><small><em></em></small> </center> </p> <p>I was just about to leave a comment, but then I scrolled the page a bit and... </p> <p> <center> <img alt="Same picture of code, but the dot on top of the semicolon has shifted away revealing it is only a piece of dirt on the screen above a comma (,)" style="border: 2px black solid; max-width: 100%;" src="https://storage.googleapis.com/sethmlarson-dev-static-assets/IMG_5332_small.jpeg"/> <br><small><em></em></small> </center> </p> <p>Ah. Time to clean my laptop screen then... 🧼🫧</p> <br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br> Are insecure code completions a vulnerability? https://sethmlarson.dev/are-insecure-code-completions-a-vulnerability?utm_campaign=rss 2026-06-10T00:00:00Z 2026-06-10T00:00:00Z Seth Larson <p>Three months ago I saw that PyCharm shipped with a “<a href="https://www.jetbrains.com/help/pycharm/full-line-code-completion.html">Full Line Completion</a>” plugin that “uses a local deep learning model to suggest entire lines of code”. These suggestions manifest as whole-line suggestions after you start typing and can be accepted with <code>Tab</code>. Essentially auto-complete for entire lines.</p> <p>I decide to test this functionality. I started by writing <code>import urllib3</code>, created a new line, and then typed <code>u</code> and received a suggested completion for the line marked below with a <span style="border: 2px black dashed; padding-left: 2px; padding-right: 2px;">dashed border</span>. I was not impressed by the result:</p> <!-- more --> <div class="codehilite"> <pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">urllib3</span> <span class="n">u</span><span style="border: 2px black dashed"><span class="n">rllib3</span><span class="o">.</span><span class="n">disable_warnings</span><span class="p">(</span><span class="n">urllib3</span><span class="o">.</span><span class="n">exceptions</span><span class="o">.</span><span class="n">InsecureRequestWarning</span><span class="p">)</span></span> </code></pre> </div> <p>Accepting this line would mean that any insecure requests made with <code>urllib3</code> would not result in a user-visible warning. I didn't accept this suggestion and then began to instantiate a <code>urllib3.PoolManager</code> and what I feared would come next was confirmed:</p> <div class="codehilite"> <pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">urllib3</span> <span class="n">urllib3</span><span class="o">.</span><span class="n">PoolManager</span><span class="p">(</span> <span style="border: 2px black dashed"> <span class="n">cert_reqs</span><span class="o">=</span><span class="s1">'CERT_NONE'</span><span class="p">,</span></span> </code></pre> </div> <p>The suggestion offered to disable certificate verification (<a href="https://docs.python.org/3/library/ssl.html#ssl.CERT_NONE"><code>CERT_NONE</code></a>) which would make every request made by the <code>PoolManager</code> susceptible to monster-in-the-middle (MITM) attacks. Accepting this code as-is would mean the program I am writing has a severe vulnerability. If I had accepted the prior suggestion too, then <code>urllib3</code> would have no chance to warn the user about this mistake prior to productionizing this code.</p> <p>Clearly <em>something</em> insecure is going on here, but for a CVE to be assigned we have to decide which software component is vulnerable. Does this behavior warrant a CVE at all? I am not sure which is unfortunate, without a security-angle to a bug report companies are less likely to prioritize reports.</p> <p>I reported this behavior to JetBrains for “Full Line Code Completion” v253.29346.142 and clearly their support staff weren't certain whether this defect was a security vulnerability or not either. When I asked to publish a blog post about this behavior after they confirmed this report wasn’t a “direct security vulnerability” (which I agree with) but then was asked not to publicize my report and referred to PyCharm’s <a href="https://www.jetbrains.com/legal/docs/terms/coordinated-disclosure/">Coordinated Disclosure Policy</a> so... which is it? Security vulnerability or not?</p> <p>I ended up waiting the 90 days anyway and I didn't hear back with any substantive update from the development team. I double-checked again today using “Full Line Code Completion” v261.24374.152 and the behavior is identical, suggesting the same insecure code for both contexts. </p> <p>This isn’t meant to be a specific dig at PyCharm or JetBrains, I have no-doubt that examples like this exist in every code generation model available. I don’t think using CVEs for this purpose is appropriate or helpful for users, either. But not prioritizing and addressing this behavior at the source means more work to mitigate the potential for insecure code to be accepted by users who are trusting what is offered to them by their IDE.</p> <p>What do you think? I am interested in knowing your thoughts about this specific class of issue with code generation models.</p> <br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br> Is the Super Smash Bros. Brawl donut from Mister Donut? https://sethmlarson.dev/is-the-donut-from-super-smash-bros-brawl-a-mister-donut?utm_campaign=rss 2026-06-05T00:00:00Z 2026-06-05T00:00:00Z Seth Larson <p>Happy <a href="https://en.wikipedia.org/wiki/National_Donut_Day">Donut Day</a> (and <a href="https://sethmlarson.dev/fedi-donut-friday">#FediDonutFriday</a>) to those who celebrate! 🍩 <a href="https://www.presentandcorrect.com/">Present and Correct</a> shared a link to the <a href="https://www.misterdonut.jp/enjoy/zukan/donut/y1971.html">Mister Donut museum on Bluesky</a> and upon clicking through I was greeted with a familiar face: a chocolate ring donut.</p> <p>Strangely, I've seen this chocolate ring donut before: from the <a href="https://sethmlarson.dev/food-jpegs-in-super-smash-bros-and-kirby-air-riders">hours staring at sprite-sheets</a> from the Super Smash Bros. and Kirby Air Riders franchises. That donut looked just like the one from Super Smash Bros. Brawl.</p> <!-- more --> <p>“But Seth”, I hear you say, “chocolate ring donuts all look the same anyway!” Maybe... <em>and yet...</em></p> <p><center> <img width="140px" style="" src="https://storage.googleapis.com/sethmlarson-dev-static-assets/food-jpegs/ssbb-donut.png"> <img width="128px" src="https://www.misterdonut.jp/enjoy/zukan/donut/img/00053.jpg"/> </center></p> <p>Funnily enough, the <a href="https://github.com/Render96/Render96Wiki">Render96 wiki</a>, which collects origins for artwork for many games like Super Smash Bros., lists <a href="https://github.com/Render96/Render96Wiki/wiki/Super-Smash-Bros.-Melee#currently-missing">the donut from Super Smash Bros. Melee</a> as one of the few foods where the origin is not known. Could this donut <em>also</em> be a Mister Donut? We'll probably never know!</p> <br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br> How much “Super Mario” per year? https://sethmlarson.dev/super-mario-per-year?utm_campaign=rss 2026-05-29T00:00:00Z 2026-05-29T00:00:00Z Seth Larson <p>It's impossible to objectively quantify art, but we try anyway. For example: Is “<a href="https://en.wikipedia.org/wiki/Super_Mario">Super Mario</a>” a good video-game franchise?</p> <p>Looking at review scores, Super Mario includes some of the most universally-acclaimed games ever published: Galaxy, Galaxy 2, and Odyssey are respectively the #4, #5, and #13 highest ranking video-games of all time on Metacritic, all with 97 overall. <em>Chances seem good?</em></p> <!-- more --> <p>What if we tried quantifying art in a different and slightly more reductive way? This blog post introduces and calculates a new unit: <strong>“Super Mario per year”</strong>. If you enjoy this franchise like I do then this unit is of particular importance to you.</p> <!-- more --> <h2>Calculating “Super Mario per year”</h2> <p>There have been ~19 titles (and two add-ons) published to what I consider the "main-line" Super Mario games, both 2D and 3D. Below is a table with every title, the year it was published, and the approximate duration to play. This last column is the most subjective, because there’s speed-runners, casual players, completionists. If you think any value is way off, <a href="mailto:[email protected]">send me an email</a>.</p> <table> <thead> <tr> <th>Game</th> <th>2D/3D</th> <th>Platform</th> <th>Year</th> <th>Time to Beat</th> </tr> </thead> <tbody> <tr> <td>Super Mario Bros.</td> <td>2D</td> <td>NES</td> <td>1985</td> <td><a href="https://retroachievements.org/game/1446">5 hours</a></td> </tr> <tr> <td>Super Mario Bros. Lost Levels</td> <td>2D</td> <td>NES</td> <td>1986</td> <td><a href="https://retroachievements.org/game/5183">10 hours</a></td> </tr> <tr> <td>Super Mario Bros. 2</td> <td>2D</td> <td>NES</td> <td>1988</td> <td><a href="https://retroachievements.org/game/1994">5 hours</a></td> </tr> <tr> <td>Super Mario Bros. 3</td> <td>2D</td> <td>NES</td> <td>1988</td> <td><a href="https://retroachievements.org/game/1995">5 hours</a></td> </tr> <tr> <td>Super Mario Land</td> <td>2D</td> <td>GB</td> <td>1989</td> <td><a href="https://retroachievements.org/game/504">5 hours</a></td> </tr> <tr> <td>Super Mario World</td> <td>2D</td> <td>SNES</td> <td>1990</td> <td><a href="https://retroachievements.org/game/228">10 hours</a></td> </tr> <tr> <td>Super Mario Land 2</td> <td>2D</td> <td>GB</td> <td>1992</td> <td><a href="https://retroachievements.org/game/540">10 hours</a></td> </tr> <tr> <td>Super Mario 64</td> <td>3D</td> <td>N64</td> <td>1996</td> <td><a href="https://retroachievements.org/game/10003">15 hours</a></td> </tr> <tr> <td>Super Mario Sunshine</td> <td>3D</td> <td>GC</td> <td>2002</td> <td><a href="https://retroachievements.org/game/6049">20 hours</a></td> </tr> <tr> <td>New Super Mario Bros.</td> <td>2D</td> <td>DS</td> <td>2006</td> <td><a href="https://retroachievements.org/game/11729">10 hours</a></td> </tr> <tr> <td>Super Mario Galaxy</td> <td>3D</td> <td>Wii</td> <td>2007</td> <td><a href="https://retroachievements.org/game/189">15 hours</a></td> </tr> <tr> <td>New Super Mario Bros. Wii</td> <td>2D</td> <td>Wii</td> <td>2009</td> <td><a href="https://retroachievements.org/game/95">5 hours</a></td> </tr> <tr> <td>Super Mario Galaxy 2</td> <td>3D</td> <td>Wii</td> <td>2010</td> <td><a href="https://retroachievements.org/game/190">15 hours</a></td> </tr> <tr> <td>Super Mario 3D Land</td> <td>3D</td> <td>3DS</td> <td>2011</td> <td><a href="https://howlongtobeat.com/game/9361">15 hours</a></td> </tr> <tr> <td>New Super Mario Bros. 2</td> <td>2D</td> <td>3DS</td> <td>2012</td> <td><a href="https://howlongtobeat.com/game/6535">10 hours</a></td> </tr> <tr> <td>New Super Mario Bros. U</td> <td>2D</td> <td>Wii U</td> <td>2012</td> <td><a href="https://howlongtobeat.com/game/63660">15 hours</a></td> </tr> <tr> <td>Super Mario 3D World</td> <td>3D</td> <td>Wii U</td> <td>2013</td> <td><a href="https://howlongtobeat.com/game/9362">20 hours</a></td> </tr> <tr> <td>Super Mario Odyssey</td> <td>3D</td> <td>Switch</td> <td>2017</td> <td><a href="https://howlongtobeat.com/game/42833">25 hours</a></td> </tr> <tr> <td>Bowser's Fury (Super Mario 3D World)</td> <td>3D</td> <td>Switch</td> <td>2021</td> <td>5 hours</td> </tr> <tr> <td>Super Mario Bros. Wonder</td> <td>2D</td> <td>Switch</td> <td>2023</td> <td><a href="https://howlongtobeat.com/game/130444">15 hours</a></td> </tr> <tr> <td>Meetup at Bellabel Park (Super Mario Bros. Wonder)</td> <td>2D</td> <td>Switch</td> <td>2026</td> <td>5 hours</td> </tr> </tbody> </table> <p>Using the table above we can calculate approximately how much new Super Mario gameplay is published on average per year.</p> <table> <thead> <tr> <th>Year</th> <th>All-Time Avg</th> <th>10-Year Avg (10YA)</th> <th>2D (10YA)</th> <th>3D (10YA)</th> </tr> </thead> <tbody> <tr> <td>1985</td> <td>5.0</td> <td>5.0</td> <td>5.0</td> <td>0.0</td> </tr> <tr> <td>1986</td> <td>7.5</td> <td>7.5</td> <td>7.5</td> <td>0.0</td> </tr> <tr> <td>1987</td> <td>5.0</td> <td>5.0</td> <td>5.0</td> <td>0.0</td> </tr> <tr> <td>1988</td> <td>6.2</td> <td>6.2</td> <td>6.2</td> <td>0.0</td> </tr> <tr> <td>1989</td> <td>6.0</td> <td>6.0</td> <td>6.0</td> <td>0.0</td> </tr> <tr> <td>1990</td> <td>6.7</td> <td>6.7</td> <td>6.7</td> <td>0.0</td> </tr> <tr> <td>1991</td> <td>5.7</td> <td>5.7</td> <td>5.7</td> <td>0.0</td> </tr> <tr> <td>1992</td> <td>6.2</td> <td>6.2</td> <td>6.2</td> <td>0.0</td> </tr> <tr> <td>1993</td> <td>5.6</td> <td>5.6</td> <td>5.6</td> <td>0.0</td> </tr> <tr> <td>1994</td> <td>5.0</td> <td>5.0</td> <td>5.0</td> <td>0.0</td> </tr> <tr> <td>1995</td> <td>4.5</td> <td>5.0</td> <td>5.0</td> <td>0.0</td> </tr> <tr> <td>1996</td> <td>5.4</td> <td>6.0</td> <td>4.5</td> <td>1.5</td> </tr> <tr> <td>1997</td> <td>5.0</td> <td>5.0</td> <td>3.5</td> <td>1.5</td> </tr> <tr> <td>1998</td> <td>4.6</td> <td>5.0</td> <td>3.5</td> <td>1.5</td> </tr> <tr> <td>1999</td> <td>4.3</td> <td>4.0</td> <td>2.5</td> <td>1.5</td> </tr> <tr> <td>2000</td> <td>4.1</td> <td>3.5</td> <td>2.0</td> <td>1.5</td> </tr> <tr> <td>2001</td> <td>3.8</td> <td>2.5</td> <td>1.0</td> <td>1.5</td> </tr> <tr> <td>2002</td> <td>4.7</td> <td>4.5</td> <td>1.0</td> <td>3.5</td> </tr> <tr> <td>2003</td> <td>4.5</td> <td>3.5</td> <td>0.0</td> <td>3.5</td> </tr> <tr> <td>2004</td> <td>4.2</td> <td>3.5</td> <td>0.0</td> <td>3.5</td> </tr> <tr> <td>2005</td> <td>4.0</td> <td>3.5</td> <td>0.0</td> <td>3.5</td> </tr> <tr> <td>2006</td> <td>4.3</td> <td>4.5</td> <td>1.0</td> <td>3.5</td> </tr> <tr> <td>2007</td> <td>4.8</td> <td>4.5</td> <td>1.0</td> <td>3.5</td> </tr> <tr> <td>2008</td> <td>4.6</td> <td>4.5</td> <td>1.0</td> <td>3.5</td> </tr> <tr> <td>2009</td> <td>4.6</td> <td>5.0</td> <td>1.5</td> <td>3.5</td> </tr> <tr> <td>2010</td> <td>5.0</td> <td>6.5</td> <td>1.5</td> <td>5.0</td> </tr> <tr> <td>2011</td> <td>5.4</td> <td>8.0</td> <td>1.5</td> <td>6.5</td> </tr> <tr> <td>2012</td> <td>6.1</td> <td>10.5</td> <td>4.0</td> <td>6.5</td> </tr> <tr> <td>2013</td> <td>6.6</td> <td>10.5</td> <td>4.0</td> <td>6.5</td> </tr> <tr> <td>2014</td> <td>6.3</td> <td>10.5</td> <td>4.0</td> <td>6.5</td> </tr> <tr> <td>2015</td> <td>6.1</td> <td>10.5</td> <td>4.0</td> <td>6.5</td> </tr> <tr> <td>2016</td> <td>5.9</td> <td>10.5</td> <td>4.0</td> <td>6.5</td> </tr> <tr> <td>2017</td> <td>6.5</td> <td>12.0</td> <td>3.0</td> <td>9.0</td> </tr> <tr> <td>2018</td> <td>6.3</td> <td>10.5</td> <td>3.0</td> <td>7.5</td> </tr> <tr> <td>2019</td> <td>6.1</td> <td>10.5</td> <td>3.0</td> <td>7.5</td> </tr> <tr> <td>2020</td> <td>6.0</td> <td>10.0</td> <td>2.5</td> <td>7.5</td> </tr> <tr> <td>2021</td> <td>5.9</td> <td>9.0</td> <td>2.5</td> <td>6.5</td> </tr> <tr> <td>2022</td> <td>5.8</td> <td>7.5</td> <td>2.5</td> <td>5.0</td> </tr> <tr> <td>2023</td> <td>6.0</td> <td>6.5</td> <td>1.5</td> <td>5.0</td> </tr> <tr> <td>2024</td> <td>5.9</td> <td>4.5</td> <td>1.5</td> <td>3.0</td> </tr> <tr> <td>2025</td> <td>5.7</td> <td>4.5</td> <td>1.5</td> <td>3.0</td> </tr> <tr> <td>2026</td> <td>5.7</td> <td>5.0</td> <td>2.0</td> <td>3.0</td> </tr> </tbody> </table> <p>This table will help you calculate approximately how much Super Mario is coming in the next decade. The current 10-year window pace shows <strong>5 hours of Super Mario per year</strong>.</p> <p>Looking at the trends, it looks like we may have already passed peak 2D and 3D Mario individually. This table also shows how overdue we are for a new <em>big</em> 3D Super Mario title, the last entry being Super Mario Odyssey almost a decade ago in 2017.</p> <p>If I were to somewhat morbidly apply these numbers I can estimate how much more new “Super Mario” gameplay I’m likely to experience. Let’s be optimistic and apply the “All-Time Average” instead of the “10-Year Average”: the resulting number is 256 hours. Around 10 games of similar size to “Super Mario Odyssey”... <em>seems good to me!</em></p> <h2>Super Mario Blogroll</h2> <p>If you want to read more Super Mario writing here are a few personal selections from <a href="/blogroll">my blogroll</a>:</p> <ul> <li>“<a href="https://www.thrillingtalesofoldvideogames.com/blog/mario-101-history">Mario 101: For Super Players</a>” by Drew Mackie</li> <li>“<a href="https://www.archdaily.com/783657/the-sheets-of-graph-paper-they-used-to-design-super-mario-bros">Super Mario Bros was designed on graph paper</a>” by Nicolás Valencia</li> <li>“<a href="https://lmnt.me/blog/the-most-mario-colors.html">The most Mario colors</a>” by Louie Mantia</li> </ul> <p>Happy gaming!</p> <br><hr><p>Thanks for reading ♥ I would love to hear your thoughts! Contact me via <a href='https://mastodon.social/@sethmlarson'>Mastodon</a>, <a href='https://bsky.app/profile/sethmlarson.dev'>Bluesky</a>, or <a href='mailto:[email protected]'>email</a>. Browse the <a href='https://sethmlarson.dev/'>blog archive</a>. Check out my <a href='https://sethmlarson.dev/blogroll'>blogroll</a>.</p><hr><br>