<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: GSGBen</title><link>https://news.ycombinator.com/user?id=GSGBen</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 23 Apr 2026 08:54:58 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=GSGBen" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by GSGBen in "Show HN: unsafehttp – tiny web server from scratch in C, running on an orange pi"]]></title><description><![CDATA[
<p>Ah yep, I read about the TCP RST problem in one of the RFC docs, then promptly forgot about it and never implemented anything to avoid it. Thankyou for the detailed notes.</p>
]]></description><pubDate>Sun, 17 Aug 2025 10:30:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=44930515</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=44930515</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44930515</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: unsafehttp – tiny web server from scratch in C, running on an orange pi"]]></title><description><![CDATA[
<p>Noice!</p>
]]></description><pubDate>Sun, 17 Aug 2025 02:05:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=44928335</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=44928335</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44928335</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: unsafehttp – tiny web server from scratch in C, running on an orange pi"]]></title><description><![CDATA[
<p>Oof, thanks.</p>
]]></description><pubDate>Sun, 17 Aug 2025 01:40:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=44928250</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=44928250</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44928250</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: unsafehttp – tiny web server from scratch in C, running on an orange pi"]]></title><description><![CDATA[
<p>Should be back up now with a very temporary workaround in place.</p>
]]></description><pubDate>Sun, 17 Aug 2025 00:15:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=44927903</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=44927903</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44927903</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: unsafehttp – tiny web server from scratch in C, running on an orange pi"]]></title><description><![CDATA[
<p>Still seems to have an issue, but no output before the crash. Will have to do some more debugging. Thanks for the test HN!<p>Source is here btw: <a href="https://github.com/GSGBen/unsafehttp/blob/main/src/main.c" rel="nofollow">https://github.com/GSGBen/unsafehttp/blob/main/src/main.c</a></p>
]]></description><pubDate>Sat, 16 Aug 2025 23:48:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=44927779</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=44927779</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44927779</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: unsafehttp – tiny web server from scratch in C, running on an orange pi"]]></title><description><![CDATA[
<p>Found the issue - a use after free in send_response() if I close the session early due to an error. Was continuing to the next bit. Put a temp fix in place, will push a proper one later.</p>
]]></description><pubDate>Sat, 16 Aug 2025 23:41:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=44927743</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=44927743</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44927743</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: unsafehttp – tiny web server from scratch in C, running on an orange pi"]]></title><description><![CDATA[
<p>Whoops, should be back up now. I'll have to check logs later to see why it went down.</p>
]]></description><pubDate>Sat, 16 Aug 2025 23:25:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=44927672</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=44927672</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44927672</guid></item><item><title><![CDATA[Show HN: unsafehttp – tiny web server from scratch in C, running on an orange pi]]></title><description><![CDATA[
<p>Hey HN, I wanted to get more familiar with C programming, *nix socket programming and C compilation, so I wrote this "web" ""server"". It's running on a tiny SBC in my office, and there's as little as possible between you and it.<p>Happy for you to try and break it, hopefully with something more interesting than a DoS though :) Please let me know if you find any issues.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=44926785">https://news.ycombinator.com/item?id=44926785</a></p>
<p>Points: 87</p>
<p># Comments: 52</p>
]]></description><pubDate>Sat, 16 Aug 2025 20:46:15 +0000</pubDate><link>http://unsafehttp.benren.au</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=44926785</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44926785</guid></item><item><title><![CDATA[Unreal Engine 5 Angelscript Integration]]></title><description><![CDATA[
<p>Article URL: <a href="https://angelscript.hazelight.se/">https://angelscript.hazelight.se/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=41023850">https://news.ycombinator.com/item?id=41023850</a></p>
<p>Points: 1</p>
<p># Comments: 1</p>
]]></description><pubDate>Sun, 21 Jul 2024 09:57:37 +0000</pubDate><link>https://angelscript.hazelight.se/</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=41023850</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41023850</guid></item><item><title><![CDATA[Grafterm: Grafana-Like TUI]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/slok/grafterm">https://github.com/slok/grafterm</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=40194154">https://news.ycombinator.com/item?id=40194154</a></p>
<p>Points: 3</p>
<p># Comments: 0</p>
]]></description><pubDate>Mon, 29 Apr 2024 03:35:05 +0000</pubDate><link>https://github.com/slok/grafterm</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=40194154</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40194154</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: The demo of my game that uses GOAP and Utility AI is out"]]></title><description><![CDATA[
<p>(continued)<p>Other tips: I still had issues going too granular with GOAP actions at the start, so I recommend keeping your actions as coarse as possible. It's still a tool that you use with your AI designer hat on, it doesn't do everything on its own. But the power of being able to throw in a new goal, maybe one new action, and have the existing actions solve all the other prerequisites, is amazing. Defining world properties and states is a muuuuuuch lower mental load than using utilities for actions.<p>I wrote it all with performance in mind, and it seems to run fine. Basically lots of caching (each world property is only evaluated once per AI per tick then re-used, shared values are cached for all then re-used, etc); eliminating invalid paths early; and searching backwards from the goal instead of forwards from the current world state. I test with 4 AI players on an old i3 laptop processor from ~2016 without issue.</p>
]]></description><pubDate>Fri, 26 Apr 2024 20:01:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=40173546</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=40173546</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40173546</guid></item><item><title><![CDATA[Show HN: The demo of my game that uses GOAP and Utility AI is out]]></title><description><![CDATA[
<p>Hey HN, I'm working on a game where you throw stacks of your own team-mates in first-person, in various gamemodes. I tried a few different approaches for player AI, but ended up settling on Utility for "what to do" and GOAP (Goal Oriented Action Programming) for "how to do it". Each of these (Utility AI and GOAP AI) are worth watching videos on, they're very cool.<p>Utility AI was popularised by Dave Mark, and was used in Guild Wars 2 (or an expansion). For each AI, each of it's actions is scored on how useful it would be to perform at this moment, based on the world state, and custom multipliers/curves. The highest-scoring action is then performed. This is a beautiful system. You can cache the world-state values for multiple actions and AI, and the scoring is just * and +, so it's very cheap. You can switch out multiplying against fixed weights for multiplying against a curve, which gives your AI designers much more elegant control. I found this works well for goals, or for non-complex AI, but falls down when trying to use it for each granular action a player-AI might use. Keeping all the different values (or strata of values) in your head to roughly control what happens, becomes difficult.<p>Enter GOAP AI. GOAP was popularised by Jeff Orkin in the 2005 videogame F.E.A.R. Simply: It's A* pathfinding, except the destination is your desired world state, other nodes are intermediate world-states, and the edges are actions. This is the AI system that feels most right. When you use it, it feels like what you imagine AI design should feel like. Each world state is defined by a bunch of world properties and their state (bools are simplest but I'd like to see more complex systems like ints with comparisons). E.g. WS.HoldingAtLeast3 = False,  WS.OverlappingGoal = False, and WS.Offside = False. Then you define your desired world state (e.g. WS.OverlappingGoal = True), your possible action (e.g. ThrowAtLeast3TowardsGoal), what each action requires (e.g. WS.HoldingAtLeast3 = True) and what it results in (e.g. WS.OverlappingGoal = True). On top of that you give each action a cost (e.g. default to 1, but e.g. PickUpAtLeast3 might have a cost of 3). You don't need to manually chain these together - the GOAP planner will use the actions to find a path from the current world state to the target world state if it can, and use the length of the action chain and the costs to minimise the total cost (e.g. PickUpAtLeast3 => ThrowAtLeast3TowardsGoal).<p>I implemented the GOAP planner from scratch, based on all the readings and public reference implementations I could find, which greatly helped my understanding of it. I initially tried using other people's implementations but none of them fit exactly. Writing it myself, and just what I needed, made debugging a million times easier and let it fit the requirements better. I implemented A* in the process, but it's not generic. It was easier for me to dedicate it fully to GOAP, instead of implementing an abstract A* machine with A* variable names then overriding for GOAP.<p>Debug output is the most critical thing to implement when creating game AI systems, and UE4 works well here: it has Visual Logger, which is a time-based log that you can scrub back-and-forth through, only seeing the logs from the tick you have selected. It also differentiates logs per actor, and supports verbosity levels. It's compiled out of shipping games so it has no final performance impact either. This is where I solve all my "why can't the planner find a path here" and "why is the planner picking that action" issues.<p>(continued in comment)</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=40173540">https://news.ycombinator.com/item?id=40173540</a></p>
<p>Points: 3</p>
<p># Comments: 1</p>
]]></description><pubDate>Fri, 26 Apr 2024 20:00:40 +0000</pubDate><link>https://store.steampowered.com/app/1813590/Grab_n_Throw/</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=40173540</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40173540</guid></item><item><title><![CDATA[Show HN: Wt is a small terminal workout timer]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/GSGBen/wt">https://github.com/GSGBen/wt</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=38936293">https://news.ycombinator.com/item?id=38936293</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 10 Jan 2024 04:46:13 +0000</pubDate><link>https://github.com/GSGBen/wt</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=38936293</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38936293</guid></item><item><title><![CDATA[New comment by GSGBen in "Windows XP 2024 Edition is everything I want from a new OS"]]></title><description><![CDATA[
<p>hmailserver is the replacement you want for this.</p>
]]></description><pubDate>Sun, 07 Jan 2024 19:47:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=38904492</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=38904492</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38904492</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: Send me an IRL message and watch it arrive"]]></title><description><![CDATA[
<p>Hey thanks, this was a good catch. `--shutter 12000` fixes the screen, and is bright but not too bright.</p>
]]></description><pubDate>Sun, 12 Nov 2023 05:58:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=38237718</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=38237718</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38237718</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: Send me an IRL message and watch it arrive"]]></title><description><![CDATA[
<p>Update 2: The servo's gears are absolutely grinding at the moment</p>
]]></description><pubDate>Sun, 12 Nov 2023 01:16:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=38236307</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=38236307</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38236307</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: Send me an IRL message and watch it arrive"]]></title><description><![CDATA[
<p>Haha nope!</p>
]]></description><pubDate>Sun, 12 Nov 2023 01:14:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=38236297</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=38236297</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38236297</guid></item><item><title><![CDATA[New comment by GSGBen in "Show HN: Send me an IRL message and watch it arrive"]]></title><description><![CDATA[
<p>Hey, thanks! I was thinking about game ideas while stepping into the shower one day (where all great ideas are born), and "throwing people in a first-person view might be fun?" came across my mind. I mentally fleshed it out a bit, and wrote it down. When the idea I was already working on turned out to not be fun, I shelved that and started working on this instead. When I prototyped the basic throw feel and it already felt fun, I decided to run with it.</p>
]]></description><pubDate>Sun, 12 Nov 2023 01:08:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=38236257</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=38236257</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38236257</guid></item><item><title><![CDATA[Show HN: Send me an IRL message and watch it arrive]]></title><description><![CDATA[
<p>- This page is running directly on the Pico W in the stream, using microdot (but proxied out via cloudflare tunnel).<p>- There's a buzzer that plays a sound as well but the stream has no audio.<p>- There's a Pi Zero 2 W with a Camera Module 3 streaming the video. Streaming low latency video is painful. I tried mjpeg, Nginx+HLS/DASH, YouTube and Twitch. Twitch is definitely the easiest and best-performing.<p>- There's still a few seconds delay between sending your message and the video updating.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=38234746">https://news.ycombinator.com/item?id=38234746</a></p>
<p>Points: 41</p>
<p># Comments: 20</p>
]]></description><pubDate>Sat, 11 Nov 2023 21:30:48 +0000</pubDate><link>https://hi.benren.au/</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=38234746</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38234746</guid></item><item><title><![CDATA[New comment by GSGBen in "Royal Mail to Issue “Terry Pratchett’s Discworld” Stamps"]]></title><description><![CDATA[
<p>I started with The City Watch series, and it felt like a great introduction.</p>
]]></description><pubDate>Fri, 04 Aug 2023 00:11:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=36993812</link><dc:creator>GSGBen</dc:creator><comments>https://news.ycombinator.com/item?id=36993812</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36993812</guid></item></channel></rss>