<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://blog.ironboundsoftware.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://blog.ironboundsoftware.com/" rel="alternate" type="text/html" /><updated>2026-01-01T15:33:30+00:00</updated><id>http://blog.ironboundsoftware.com/feed.xml</id><title type="html">Possibility and Probability</title><subtitle>A Python programmer with a personality thinking about space exploration</subtitle><entry><title type="html">Vibe Coding Review</title><link href="http://blog.ironboundsoftware.com/2025/03/vibe-coding" rel="alternate" type="text/html" title="Vibe Coding Review" /><published>2025-03-12T00:00:00+00:00</published><updated>2025-03-12T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2025/03/vibe-coding</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2025/03/vibe-coding"><![CDATA[<p>Vibe Coding is a new fad that is sweeping the programming world. Basically it is letting an LLM AI (like ChatGPT or Claude) write an entire program via prompts. You as a developer never really look at the code it produces or try to understand it, instead you guide it via “vibes”. But can this really work? Is this the future of software development?</p>

<p>As I write this the most visible example of this is <a href="https://fly.pieter.com">Pieter Levels’ flight simulator</a>. Pieter simply asked ChatGPT to write a fight simulator that would run in the browser. He did this as a reaction to the bloat that is in a lot of games these days: Large downloads that are needed to “patch” the game on an almost daily basis, long load times, etc.</p>

<p>The game that was written will never be mistaken for a “professional” game. Blocky graphics, clunky physics, and a multiplayer experience that is… well it reminded me a lot of the early internet (e.g. security holes, but a lot of fun). But at the end of the day the game was shipped incredibly fast (less than a week), it is making money via ads (over $80k per month!), and Pieter didn’t have to become an expert on the code but was still able to iterate and add new features.</p>

<p>And this is where Vibe Coding shines, the ability to just do things. A lot of programmers are opposed to this style, they claim that one must understand what is going on under the hood in order to make sure the right choices are being made. They point to the XSS and multiplayer bugs in Pieter’s game as the prime example of not understanding. They are not wrong, but they are missing an important point.</p>

<p>Quick iteration is something that separates so called 10x programmers from mere mortals. Those that can try out an idea quickly are the ones who seem to be able to win the day. If they hit on a bad idea, they find out sooner and change course. Regular programmers tens to get bogged down either trying to make it work, or trying to figure out the optimum solution.</p>

<p>Being a regular programmer who wants to improve, I decided this was something I should try to get better at iterating quickly.</p>

<p>This past weekend I decided to vibe code up a game to exercise this muscle. One of my favorite games is an RPG from the late 80’s called <a href="https://www.gog.com/en/game/wasteland_the_classic_original">Wasteland</a>. It is a low-resource game for modern machines so it would be perfect to implement it in Javascript (a language I am not nearly comfortable enough with). The <a href="https://github.com/nloadholtes/valley-escape-rpg">code</a> and the <a href="https://valley.ironboundsoftware.com">game</a> if you are interested</p>

<p>The experience was interesting: I got up and running very quickly. Going back and forth with Claude we quickly a v1 up and running of the basic UI. I tried not to look at the code beyond a few broad strokes, and instead relied on Claude to fix the issues as I found them via playing the games.</p>

<p>At this point things got interesting… My initial prompts where ok, but they missed a lot of nuances that quickly came up as I tried to do things in the game. Thankfully I quickly asked Claude to split the game into 2 files because it was clear that I could cut down on the amount of code back-and-forth by isolating the trouble spots. Especially when I found it was breaking the working code while trying to fix the bugs.</p>

<p>And in real life this is what I would have done if I was writing this. And this is also what I’ve been telling people about using LLMs. If you do a good job of decomposing the problem and breaking it down into small chunks, your LLM is going to have an easier time.</p>

<p>For me this is where one has to be smart when it comes to vibe coding. Doing the ideation and getting up and running is a great thing to do with an LLM. But at some point things will get too complicated for the LLM to sanely handle. Before you get to that point you need to step in and start applying some software engineering best practices.</p>

<p>For me this would look like:</p>

<ul>
  <li>Breaking the codebase into files/modules based around functionality</li>
  <li>Identify which functions are starting to have problems</li>
  <li>Concentrate on learning what the code is doing in those areas</li>
  <li>Ignore parts of the codebase that are “working normally”</li>
</ul>

<p>Learning what is happening in the trouble spots is important. Just like with a human programmer, this is where the definitions or specifications are weakest. By understanding what is trying to be accomplished here, you can help guide the LLM to a more correct solution, either by editing the code or by prompting.</p>

<p>This is a good thing! We are still iterating quickly, finding a dead end in our knowledge, exploring an isolated area, and then moving forward to repeat the cycle.</p>

<p>I know many programmers who love to complain that other programmers “don’t understand the code they are using”, but I also know the dirt secret… Most programmers don’t know/care to look at the libraries they are using because they trust it to work. Which to be fair it usually does.</p>

<p>Do programmers run into trouble because they don’t fully understand 100% of the code they are using? Absolutely. All day, every day. Does that mean they should not be coding? Absolutely not. No software is perfect, bugs are always present.</p>

<p>So the secret to success with vibe coding is to only let it take you so far, and then you need to take the wheel. Treat the process just like you would working with a junior programmer: Let them get going, but do frequent check ins to make sure the train is still on the tracks.</p>

<p>Back to my game… I was not planning to do a whole re-creation of the original game, so after an hour of struggle to get the basic combat working I decided to call it done. I had positive vibes from the experience and most importantly, I had fun coding. And it had been a little while since I’d experienced that.</p>

<p>And isn’t a positive vibe all that we really want?</p>]]></content><author><name>Nick</name></author><category term="programming,ai" /><category term="building" /><category term="programming" /><category term="ai" /><summary type="html"><![CDATA[Vibe Coding is a new fad that is sweeping the programming world. Basically it is letting an LLM AI (like ChatGPT or Claude) write an entire program via prompts. You as a developer never really look at the code it produces or try to understand it, instead you guide it via “vibes”. But can this really work? Is this the future of software development?]]></summary></entry><entry><title type="html">Leetcode and interviews</title><link href="http://blog.ironboundsoftware.com/2025/01/Leetcode" rel="alternate" type="text/html" title="Leetcode and interviews" /><published>2025-01-30T00:00:00+00:00</published><updated>2025-01-30T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2025/01/Leetcode</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2025/01/Leetcode"><![CDATA[<p><em>Originally published on <a href="https://www.linkedin.com/posts/nickloadholtes_explore-leetcode-activity-7288587382017163264-ah6e?utm_source=share&amp;utm_medium=member_desktop">LinkedIn</a></em></p>

<p>Stagefright. In an interview situation it is the worst. I have the greatest conversations and then as soon as I get asked to do the simplest coding puzzle my mind goes blank.</p>

<p>To fight this, I’ve been doing a daily <a href="https://en.wikipedia.org/wiki/Kata">kata</a> practice of working on a LeetCode puzzle. Not only do these serve as a “mental warm up”, but a few times they helped me uncover things I’ve forgotten (from lack of use), or things I never really understood deeply.</p>

<p>I’ve also started livestreaming/recording my practice sessions to help amp up the “intentionality” of my efforts. In doing this I am:</p>

<ol>
  <li>
    <p>Working in public, which is basically what we all fear in the interview. It’s a livestream so anyone could drop in!</p>
  </li>
  <li>
    <p>Thinking out loud: Companies give out the challenges to see how you think. Talking while I code is kind of unnatural, so this is an opportunity to do this. (Watching yourself on a recording is a great way to realize which words you overuse. I say “like” waaaaay too much. 😬)</p>
  </li>
  <li>
    <p>Showing that I can do it! By recording these, even the bad ones where I struggle, I can now go back and quiet my doubts. Also, if it ever comes to it, I can share the playlist out and show a potential employer that yes, I can actually solve a puzzle.</p>
  </li>
  <li>
    <p>I am documenting things I don’t know. This might not sound like a positive, but hear me out: knowing where the boundary of your knowledge is essential. Being in unfamiliar territory is scary, especially in the pressure cooker of an interview. Nobody is perfect or all knowing and having it recorded keeps me from dismissing a challenging problems as “Oh, you’d never do that in the real world”.</p>
  </li>
</ol>

<p>So to wrap this up, LeetCode style interviews are a fact of life for the working programmer. A little bit of daily practice with it can go a long way!</p>

<p>PS: did you know that LeetCode has a cheatsheet page? It is a really useful reminder of certain patterns that come up in these puzzles. Its a great reminder of things you might not do on a daily basis at work (like code up a breadth-first search for a graph). Log in to check it out in detail:  https://leetcode.com/explore/interview/card/cheatsheets</p>]]></content><author><name>Nick</name></author><category term="thinking" /><summary type="html"><![CDATA[Originally published on LinkedIn]]></summary></entry><entry><title type="html">Space Is Awesome</title><link href="http://blog.ironboundsoftware.com/2025/01/space-is-awesome" rel="alternate" type="text/html" title="Space Is Awesome" /><published>2025-01-04T00:00:00+00:00</published><updated>2025-01-04T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2025/01/space-is-awesome</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2025/01/space-is-awesome"><![CDATA[<p>I have loved all things space related for a long time. Like little kid long time. Space and the exploration of it is something I’ve always been fascinated about and is one of my favorite topics to talk about.</p>

<p>Let me share with you why space and its exploration is so important to me.</p>

<h2 id="whats-cool">What’s cool</h2>
<p>When it comes to space related topics, certain things are top of my “That’s AWESOME” list:</p>
<ul>
  <li>Autonomous Machines exploring (also known as robots)</li>
  <li>Orbits - This is basically using math to predict where things are going to be. For every time I asked “When will we ever use this” in a math class, if the teacher had replied “to calculate orbits” I probably would have studied 10x harder and become a mathematician.</li>
  <li>Remote sensing - The ability to send a robot to take pictures or radar scans of something and send it back is something that will always impress me. In the early days of exploration we relied on the eyes and art skills of an explorer to draw a picture of what they saw. Now we can capture the light and send it back so we can all see and experience what it is like in a place we will never be able to visit in person.</li>
</ul>

<p>So those are some of my “why space is cool” reasons, but the follow up question is usually some form of “Why?” or “Isn’t that really expensive just to take some pictures?”</p>

<p>Those are valid questions! Here on Earth people are hungry, there are wars and diseases with no cure. But in my mind, space exploration is the exercise we need as a species to unlock the answers to those problems.</p>

<h2 id="close-to-home">Close to home</h2>
<p>The Space Race of the 1960’s helped kickstart research into many technologies that had payoffs many years later that we are now reaping the benefits of. From talking with non-space obsessed people I have found that this isn’t widespread knowledge. Sure people know that things like Velcro and satellites came from the space program, but there were so many everyday things that can trace their lineage to the research  of the 1960’s to today:</p>
<ul>
  <li>GPS (e.g. your maps in your cars)</li>
  <li>Computers in your pockets: Cell phones are a great example of a technology that shook out from the space program. Making powerful computers that can communicate with other computers while being portable and using small amounts of energy sounds incredibly nerdy… Until you reframe it as “I shared a picture of my dinner that took while on vacation”.</li>
  <li>Communications in general: I think the work done to keep machines in touch with earth (radio transmission, data compression) helped push things like cell phones and even the idea of WiFi. Granted, WiFi came many years later, but if we didn’t need to send data between computers would this have even developed like it did?</li>
  <li>Materials: NASA did a lot of testing on more “basic” material research topics. The vast treasure trove of data on how metals and plastics work in a wide rage of environments would probably not exist in the form it does today.</li>
</ul>

<p>There’s probably more examples of this, but overall the idea is this: our focused work as a species on a specific problem of exploring a new environment unlocked a lot of new tools.</p>

<h2 id="exploring-is-what-humans-do-best">Exploring is what humans do best</h2>
<p>Personally I’m curious about what’s out there. Throughout history many humans have felt this way, and this is why we have spread out all over the globe, not just restricting ourselves to small pockets where the weather is nice all the time.</p>

<p>We go places that are not friendly to learn what is there. Sometimes we learn something we already knew (the ocean has fish here just like at home), other times we learn brand new things (there are worms that live near the boiling water in the depths of the ocean next to hydrothermal vents).</p>

<p>Space is huge. Vast. There is so much out there we could learn about. Even if we aren’t looking for the holy grail of life, there’s so much we could discover. Places out there that are like nothing on Earth could teach us so many things.</p>

<p>While we might not know the consequences of that knowledge right away, the knowledge gained from the Space Race shows us we could us the new information to create new things we can’t quite imagine today.</p>

<h2 id="the-balance-how-to-make-this-happen">The balance: how to make this happen</h2>
<p>So how do we make this happen while keeping in mind the people around us here on Earth also need resources? To me the answer is pretty straightforward:</p>
<ul>
  <li>Prioritize robotic exploration over human travel</li>
  <li>Iterate quickly</li>
  <li>Lower the cost to get off the planet</li>
</ul>

<p>Putting humans safely into the unforgiving environment of space is very expensive. Spaceships and missions have to be designed very differently to keep people alive as they explore. To put it mildly this is <em>very</em> expensive.</p>

<p>In contrast, robotic explorers can tolerate much more than humans. In a much smaller volume and weight they can travel faster, further, and longer than our squishy biological selves can. Our electronic friends basically need less resources, only a power supply and some thermal regulation vs the food/water/entertainment/exercise that a human explorer would need.</p>

<p>That alone can lower the cost of exploration by orders of magnitude while allowing it to happen quickly: The reviews needed for a human launch vs a robotic launch are vastly more involved. Human passenger? Huge check list needed. Robot? Much shorter list.</p>

<p>The result of this is we can put more robots into space quicker. This will get us more knowledge of more places faster.</p>

<p>This of course will involve more infrastructure details that I’m ignoring for the moment, but if this were a pro-human spaceflight argument that same infrastructure would be necessary (and probably more expensive as it is supporting human operations). But for the moment let’s just assume that would be needed no matter what is flying.</p>

<p>The last point is making this exploration more affordable. As discussed above it is not cheap to get human into the vacuum of space and get them home safe again.</p>

<p>Getting robots into space has traditionally been cheaper, but still expensive. In the industry the measurement used is “Cost per kg of cargo”. It is usually thousands of US dollars per kg to launch something into space. But that is changing.</p>

<p>New companies are overturning the old assumptions about spaceflight. Reuse of rockets, experiments with new fuels, and launching multiple satellites per rocket are helping to reduce to cost pretty dramatically. With it’s <a href="https://en.wikipedia.org/wiki/SpaceX_Starship">Starship launch vehicle</a> SpaceX is looking to drastically cut the cost to around $100/kg. That combined with its large launch capabilities could open new doors for the exploration I’ve outlined.</p>

<h2 id="lets-go">Let’s go!</h2>
<p>Exploration is part of the human story.</p>

<p>We are at an interesting place in time where our tools are allowing us to put our senses in place we couldn’t normally visit for a cost that is very reasonable, especially compared to our past efforts.</p>

<p>Let’s do this.</p>

<p>Make robots to explore. Make robots to visit every large body in the solar system and find the places where humans could visit some day. We can even have robots prepare for our arrival!</p>

<p>The future is now.</p>]]></content><author><name>Nick</name></author><category term="exploration,fun,space,spaceflight" /><category term="space" /><summary type="html"><![CDATA[I have loved all things space related for a long time. Like little kid long time. Space and the exploration of it is something I’ve always been fascinated about and is one of my favorite topics to talk about.]]></summary></entry><entry><title type="html">Do Things</title><link href="http://blog.ironboundsoftware.com/2024/11/do-things" rel="alternate" type="text/html" title="Do Things" /><published>2024-11-21T00:00:00+00:00</published><updated>2024-11-21T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2024/11/do-things</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2024/11/do-things"><![CDATA[<p>Lately I’ve been seeing the phrase “You can just do things” being thrown around on line. Usually this is a snarky response to someone complaining about <em>waves hands</em> whatever.</p>

<p>I am trying hard not to succumb to snark anymore, but I can’t help but really like this phrase. It is true. We live in a time where there are more opportunities available to us than our ancestors could have imagined.</p>

<p>Should we sit around bemoaning all the things because there’s someone that just doesn’t fit with our world view?</p>

<p>Or should we take action?</p>

<p>A lot of people default to the easy path. Action is hard. Requires effort. Work.</p>

<p>I think about the Dark Ages in Europe from time to time. Progress basically stopped for many years, each generation lived pretty much the same life as those that came before them.</p>

<p>But what if there was more action during that time? Where would we as a species be now?</p>

<p>Take action.</p>

<p>You can just do things.</p>]]></content><author><name>Nick</name></author><category term="thinking" /><category term="thinking" /><summary type="html"><![CDATA[Lately I’ve been seeing the phrase “You can just do things” being thrown around on line. Usually this is a snarky response to someone complaining about waves hands whatever.]]></summary></entry><entry><title type="html">When LLMs go bad</title><link href="http://blog.ironboundsoftware.com/2024/11/llm-badpath" rel="alternate" type="text/html" title="When LLMs go bad" /><published>2024-11-14T00:00:00+00:00</published><updated>2024-11-14T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2024/11/llm-badpath</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2024/11/llm-badpath"><![CDATA[<blockquote>
  <p>Note: Originally I was writing this up as a journal entry, but decided this would be something worthwhile to share.</p>
</blockquote>

<p>Large Language Models (LLMs) like ChatGPT are all the rage these days. Some people fear them, some people love them, some people don’t know what to think of them. I tend to fall more into the “Love them!” group, but I had an encounter yesterday that has me seething a little bit.</p>

<p>My preferred LLM is <a href="https://claude.ai">Claude</a>. I find it to be very good at producing code which is my main use case for it. I’ve also found it give really good conversational answers when I ask it non-programming related questions.</p>

<p>After reading a tweet were someone mentioned having an LLM map out your life, or at least the life you want to live, I started thinking about my efforts to launch a new app as a side project. It hasn’t gone the way I wanted it to, and I wondered if talking to Claude as a “coach” could help me get back on track with things.</p>

<p>First obvious question: Why not talk to a human coach? In this instance I am still trying to figure out what I want to do and paying someone to listen to me whine doesn’t seem like a good use of anyone’s time. I believe in paying for services received, and I feel stressed just thinking about what questions I would like to ask a coach, or what I would want from them.</p>

<p>So using Claude as a starting point makes a lot of sense to me: It is a computer so it won’t get mad if I ask dumb questions, and it is always there so I don’t have to wait days for an appointment. Getting some of the basic questions out of the way would be a good exercise for me, and a headache saver if I ever do talk to a human coach.</p>

<p>Additionally these LLMs have been trained on all kinds of books and blogs and newspaper articles covering a lot of humanity’s knowledge. The LLMs “know” a lot about the successful business techniques out there, so this seems like a really good way to approach this problem.</p>

<h2 id="the-wheels-start-to-come-off">The wheels start to come off</h2>

<p>Well, really good at first. My conversation got off to a great start where it gave me some great conversation starters for a networking event I was going to. After the event I told Claude what I did and it offered some really insightful feedback on what I could have said, and what I should say next time.</p>

<p>When I mentioned that there’s a 3 week break until the next meeting and that I’d like to explore validating a new idea it was more than happy to jump in and help. Our brainstorming session quickly got to the idea of a landing page. Claude whipped up a really good prototype that just needed a few tweaks to be able to collect email addresses.</p>

<p>I quickly got wrapped around the axle trying to get an email collection form in place (WOW! Mailchimp and everyone else has really raised their prices since I last used them.) Eventually I got a solution in place and deployed. I was just about to move on to buying some ads to start driving traffic…</p>

<h2 id="wait-what-is-this-offer">Wait, what is this offer?</h2>

<p>For some reason although I was moving this text all around I never actually <strong>read</strong> the offer until this point. What the Claude written copy was doing was trying to sell a specific solution.</p>

<p><em>But we had been talking about how to research the pain points of the customers so we could validate A solution.</em></p>

<p>I was furious. I had wasted a lot of time (like 2 hours) wrestling with a landing page that wasn’t going to even answer the core question we were discussing. I pointed this out to Claude and it was all “Oh yeah, that makes sense. Let’s do this instead…”</p>

<p><img src="/images/2024-11-14-the-path.jpg" alt="Skipping down the road holding hands, who knows where we will wind up" /></p>
<h2 id="so-what-is-the-lesson-here">So what is the lesson here?</h2>

<p>When using an LLM to brainstorm or get coaching you need to keep a few things in mind:</p>

<ol>
  <li>It wants to answer your questions, so you need to make sure <strong>YOU</strong> stay on topic.<br />
LLMs are just a mirror: The know what we humans have taught it, so they try to reflect that knowledge back to us. If you start to have “two conversations” at once with a human, most can handle this. LLMs don’t seem to make that distinction and instead try to meld the two topics into one giant topic.</li>
</ol>

<p>So, when having the conversation, keep it on topic. Humans will thank you, and you will thank yourself.</p>

<ol>
  <li>If you need to dig in on a specific detail, consider doing that in a new chat session.<br />
With just enough context to start with, most LLMs can give a good concise answer. In this situation I should have moved the technical discussion of the Landing page into a new chat.</li>
</ol>

<p>If nothing else this would have helped keep the history of the chat cleaner. I think it also might have lead to me discovering the issue earlier.</p>

<ol>
  <li>Brainstorming is ok, but you need to do regular sanity checks.<br />
Like mentioned in point #1, the LLM will answer your questions. If over the course of your conversation you veer off a little bit I am convinced this will affect the answers it gives in the end.</li>
</ol>

<h2 id="next-steps">Next steps</h2>
<p>For me the next move is to revisit the last bit of the conversation and determine if I should start a new more focused conversation. This is probably the best move as I can start the new one off strong with a focused topic and no baggage of the past failed attempt.</p>]]></content><author><name>Nick</name></author><category term="thinking" /><summary type="html"><![CDATA[Note: Originally I was writing this up as a journal entry, but decided this would be something worthwhile to share.]]></summary></entry><entry><title type="html">Fortnite giftcard fix with Python</title><link href="http://blog.ironboundsoftware.com/2024/11/fortnite-fix" rel="alternate" type="text/html" title="Fortnite giftcard fix with Python" /><published>2024-11-02T00:00:00+00:00</published><updated>2024-11-02T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2024/11/fortnite-fix</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2024/11/fortnite-fix"><![CDATA[<p>My son got a Fortnite gift card recently, and in his excitement to cash it in he scratched too hard and rubbed off some of the characters. Because it was a gift, we didn’t have a receipt so I was concerned that customer support might not be to help us.</p>

<p><img src="/images/2024-11-02-pin-redacted.jpg" alt="pin image" /></p>

<p><em>I’ve redacted the whole PIN to help us focus in on the first 4 digits.</em></p>

<p>My son was pretty sad when he realized he probably wasn’t going to be able to cash in this gift card. My wife tried contacting the friend who gave us the card, we weren’t sure they would have the receipt either.</p>

<p>I started thinking about it and realized if we were smart and careful, we could probably recover the missing characters and cash in the card!</p>

<h2 id="examining-the-problem">Examining the problem</h2>
<p>So a Fortnite gift card is 24 characters. The font used to print them on the card is very readable, in fact there were other “missing” characters that were were able to figure out what they were because enough of the character was there. For example one missing character was a “4” and we could tell because the cross at the bottom right was all that was left of the character.</p>

<p>So my first thought was we can just try the combinations for those two missing characters. My son had tried that though, and had no luck. I tried to explain to him that manually typing in things was a very error prone process, but he wasn’t having any of my fancy explanations.</p>

<p>So I said “Let’s write a program to help us out”.</p>

<h2 id="phone-a-friendai">Phone a friend/AI</h2>
<p>After asking <a href="https://claude.ai">Claude</a> what the characters were (it couldn’t figure it out, and actually mis-read some of the other characters!). So instead I asked it to make a Python program to generate all strings that could be in those 2 spots.</p>

<p>A split second later I had a really short nested loop that would generate all of the possible combinations, and surely our pin would be in there… right? Kinda.</p>

<p>This initial program generated all <code class="language-plaintext highlighter-rouge">36**2</code> combinations, which is almost 1,300 different pins! The good folks at Epic/Fortnite would not like me just trying all 1,296. Since you have to be logged in to redeem a card, I was sure they would probably ban our account long before we got to the right pin.</p>

<p>So, how do you reduce the problem space?</p>

<h2 id="looking-harder">Looking harder</h2>
<p>So a pin for these gift cards seems to be the (capital) letters A through Z, and the numbers 0 to 9. And there seems to be 24 characters per pin code. So that is 36 raised to the 24th power which has 38 digits. That’s a huge number!</p>

<blockquote>
  <p>Side note: There are some letters that might not be in the set of possible letters. For example, it can be hard to tell the capital letter O from the number zero (0), so it is totally possible that they aren’t using those. But for this problem even if we eliminated I and O, we would still be looking at 34 different characters per position which is a lot. Especially when we don’t know where the “you’ve tried to many” limit is.</p>
</blockquote>

<p>They use large numbers like that to help keep people from guessing the code and getting free stuff. Thankfully we only need 2 characters. Are there any hints on what these characters could be?</p>

<p>I used my phone and a bright light to zoom in and take a closer look.</p>

<p><img src="/images/2024-11-02-first-4-zoom-zoom.jpg" alt="zoom in of first 4" /></p>

<p>The font that was used on these cards is a huge help: it tries to be unambiguous about what the character is. For example, the 5 and a capital S do not look alike. So because we have some partial marks in the red and blue squares, we can made some educated guesses.</p>

<p>Let’s start with the easy one, the blue square. It looks like it could be a U, or maybe even a J. In the rest of the pin that I redacted we had some other example of characters that has a similar shape like the number 0. We felt pretty confident we could eliminate a bunch of “impossible” characters and reduce the size of our search space from <code class="language-plaintext highlighter-rouge">36*36</code> (1,296) down to <code class="language-plaintext highlighter-rouge">36*2</code> which is only 72. Progress!</p>

<p>The red box was a little more challenging. We were convinced at first that it was a “4”. But we had a 4 elsewhere in the pin and saw it had a different shape because it was angled. Also, that horizontal piece looks darker than the other lines, and is angled slightly differently. Could it just be part of the letters that were scratched off?</p>

<p>We went through the alphabet and numbers and narrowed it down to 11 that we thought it could realistically be based on the shape. This is what we wound up with:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">possible_a_chars</span> <span class="o">=</span> <span class="s">"5BDEFHKLPRU"</span>
<span class="n">possible_b_chars</span> <span class="o">=</span> <span class="s">"JU"</span> <span class="c1"># 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
</span></code></pre></div></div>

<p>Which is 11 and 2, or 22 possible combinations. Much better than trying 1,296 we could manually try this quickly. I did add a <code class="language-plaintext highlighter-rouge">random.shuffle()</code> to mix up the numbers a little bit, I was concerned if we looked like we were trying them in order that the system might ban us sooner.</p>

<p>So with my shuffled list of 22 I logged into my son’s account and tried them one by one… and on the 18th try it worked! That sounds like a big number but it only took me about 3 minutes to get to it. So pretty quick overall!</p>

<p>It turned out the missing characters were <code class="language-plaintext highlighter-rouge">KJ</code> which now seems obvious when we look at the card, but at the time we didn’t see that.</p>

<p>So, in the end my son got to see:</p>
<ul>
  <li>How to analyze a problem</li>
  <li>2 different unsuccessful approaches to solving it (manually, asking the AI to analyze the image)</li>
  <li>A simple python program to generate the combinations</li>
  <li>How to reduce the scope of the problem with a better heuristic rather than brute force guessing</li>
</ul>

<p>But all he probably cares about at the moment is that he has a bunch of V-Bucks that he can now spend in Fortnite.</p>

<hr />
<h2 id="so-wheres-the-code">So where’s the code?</h2>
<p>I’m publishing this code kinda incomplete. I don’t want to just hand everyone the complete code because if you try and run through all combinations (e.g. you are trying to get free V-Bucks) <strong>you will get banned.</strong></p>

<p>So here’s a Python function that demonstrates the ideas in this post without actually producing a full pin.</p>

<p>If you use this and get banned, that’s on you.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">generate_combinations</span><span class="p">():</span>
	<span class="c1"># 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
</span>    <span class="n">possible_a_chars</span> <span class="o">=</span> <span class="s">"5BDEFHKLPRU"</span>
    <span class="n">possible_b_chars</span> <span class="o">=</span> <span class="s">"JU"</span>
    <span class="n">combinations</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">possible_a_chars</span><span class="p">:</span>
        <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">possible_b_chars</span><span class="p">:</span>
            <span class="n">code</span> <span class="o">=</span> <span class="sa">f</span><span class="s">"7</span><span class="si">{</span><span class="n">a</span><span class="si">}{</span><span class="n">b</span><span class="si">}</span><span class="s">S"</span>
            <span class="n">combinations</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">code</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">combinations</span>

<span class="c1"># Generate and print all combinations
</span><span class="n">codes</span> <span class="o">=</span> <span class="n">generate_combinations</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">code</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">codes</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">. </span><span class="si">{</span><span class="n">code</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
</code></pre></div></div>

<p>To run this, copy and paste into a file (<code class="language-plaintext highlighter-rouge">gen.py</code> for example) and then run from your command line:</p>

<p><code class="language-plaintext highlighter-rouge">python3 gen.py</code></p>

<p>And you should see output that looks like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1. 75JS
2. 75US
3. 7BJS
4. 7BUS
5. 7DJS
</code></pre></div></div>]]></content><author><name>Nick</name></author><category term="python" /><category term="python" /><summary type="html"><![CDATA[My son got a Fortnite gift card recently, and in his excitement to cash it in he scratched too hard and rubbed off some of the characters. Because it was a gift, we didn’t have a receipt so I was concerned that customer support might not be to help us.]]></summary></entry><entry><title type="html">AdditPulse mid-moretem</title><link href="http://blog.ironboundsoftware.com/2024/10/addit-mid-mortem" rel="alternate" type="text/html" title="AdditPulse mid-moretem" /><published>2024-10-27T00:00:00+00:00</published><updated>2024-10-27T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2024/10/addit-mid-mortem</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2024/10/addit-mid-mortem"><![CDATA[<p>So I’ve got a project I’ve built and I’m in the process of trying to get people to use it. I’ve decided this is a good point to do a what I’m calling a “mid-mortem”.</p>

<p>A “post-mortem” is done after something is over (or is dead), and a “pre-mortem” is an exercise to figure out what could go wrong and kill a project.</p>

<p>Since I’ve already started the project, the former is premature, and latter is too late. So a “mid-mortem” it is.</p>

<h2 id="the-subject-addit-pulse">The subject: Addit Pulse</h2>
<p>A few months ago I saw a random tweet asking for what I thought was a great idea: a place to see who is advertising on a subreddit:</p>

<blockquote class="twitter-tweet" align="center"><p lang="en" dir="ltr">is there any tool that shows who&#39;s advertising on Reddit? like FB ads library. <br /><br />I want a list of every advertiser targeting a subreddit</p>&mdash; stetson 🤠 (@stetsblake) <a href="https://twitter.com/stetsblake/status/1779902015960678813?ref_src=twsrc%5Etfw">April 15, 2024</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>This seemed like a fun idea to build out, and something that would be really useful. In other words, a business idea I could make money with!</p>

<p>So I did some building, and launched a few <del>weeks</del> months ago. But I haven’t made any money off of it. In fact, I’m not really seeing any interest in it at the moment.</p>

<p><a href="https://additpulse.com">AdditPulse</a> might be a failed project. Or is it too soon to tell?</p>

<p>I have more marketing work I can and should do to answer that question. But in the meantime I think it would be great to look at what I’ve done so far, and write down what I think went well and what I should have done differently.</p>

<h2 id="the-good">The good</h2>
<p>Overall, there’s a lot of good stuff to report here. No real regrets.</p>
<ul>
  <li>Using <a href="https://claude.ai/">claude</a> to write a lot of the code - I decided to really lean on AI to see if it could help me get from 0 to 1 on the code: Getting bogged down in minutia has stopped me in the past. Claude blasted me through that and I was able to keep momentum.</li>
  <li>Keeping the tech stack simple - I stuck with what I knew (python, jinja) and only used new things that were small enough for me to reason about them (sqlite3, bootstrap, jquery). Claude was a huge help with this, especially on the font-end stuff where I am typically very weak.</li>
  <li>Shipping Fast* - I was able to ship small features <em>really</em> quickly compared to my past efforts. The * is because I didn’t ship the whole site as quickly as I should have (more on that below)</li>
  <li>Keeping the feature set small - I was working hard to stay focused on the “important” things first. I still have features I can add, but getting small things out first and fast feels good and feels like a win.</li>
  <li>Setting up <a href="https://coolify.io/">coolify</a> - The mantra for a while has been to not waste time on setting up infrastructure. Overall I agree with that, but coolify was a game changer for me: it is the best parts of k8s without the headaches. Using it allowed me to deploy my changes faster and manage things on my terms. And it kept my sever bill cheap: 1 hetzner ARM node has been all I’ve needed. You can run your own infra, and it doesn’t have to consume all your time and money.</li>
</ul>

<h2 id="the-badshould-have-done-differently">The bad/should-have-done-differently</h2>
<p>Looking back now, I see some things that probably should have been approached differently.</p>
<ul>
  <li>While I did get Stetson (who wrote the original tweet) to try it out, I didn’t really get anyone else looking at it early on. More “validation” or at least finding my target audience would have been a thing to do earlier in the process.</li>
  <li>Too simple? My mastermind group were concerned I was keeping the UI too simple and it should have had more style. This is one I wrestled with a little bit: They are not wrong, but there is no clear line on how much time and money is too much in the beginning. I think as I learn more I’ll develop a better sense of “taste” on these things and probably produce a nicer first draft.</li>
  <li>Related to the last point, I “launched” without a working buy button or analytics. IF someone tried to buy and couldn’t I have no idea. Both of those should have been day 1 features.</li>
  <li>I sat on the site for about a month before finally launching. No excuses here, should have just gotten it out there sooner.</li>
  <li>I have no customers. So no one is looking at the site. I’ve been tweeting about it a little bit, but finding the community where people are discussing the problems I’m solving has been a challenge. I should have found the community first, then built.</li>
</ul>

<h2 id="whats-next">What’s next?</h2>
<p>I’m going to continue trying to find my users. There’s still lots of ground I can cover on this one I think, so I shouldn’t give up… yet.</p>

<p>I do think I should set an internal deadline for myself though so I don’t squander my time chasing after something that isn’t there.</p>

<p>I believe that withing a month I should know if this is going to work or not. And by that time I can just put this on the back burner since it doesn’t cost much money to operate at this level. So it will just slowly wither on the vine.</p>

<p>Using the infrastructure and code I made for this project I am confident I’m in a strong position to start my next project: A lot of the boilerplate is there waiting to be reused, so I can pick it up and run with it and start focusing on the things I should do better the next time around:</p>

<ol>
  <li>Find customers first.</li>
  <li>Build what they need/will pay for.</li>
</ol>]]></content><author><name>Nick</name></author><category term="experiments,thinking" /><category term="building" /><summary type="html"><![CDATA[So I’ve got a project I’ve built and I’m in the process of trying to get people to use it. I’ve decided this is a good point to do a what I’m calling a “mid-mortem”.]]></summary></entry><entry><title type="html">Split and join social media sites</title><link href="http://blog.ironboundsoftware.com/2024/10/Split-and-Join-Social-Media" rel="alternate" type="text/html" title="Split and join social media sites" /><published>2024-10-16T00:00:00+00:00</published><updated>2024-10-16T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2024/10/Split-and-Join-Social-Media</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2024/10/Split-and-Join-Social-Media"><![CDATA[<h1 id="split-and-join-social-media">Split and Join Social Media</h1>

<p>For a long time I’ve followed the idea of <a href="https://indieweb.org/POSSE">POSSE</a> where you basically post your content on your own site, and then “syndicate” it out to everywhere. In practice this meant posting to my Pleroma instance and then having <a href="https://ifttt.com/">IFTTT</a> copy that post over to my twitter/X account.</p>

<p>For the most part that has worked well. But now I’ve got a new project (more on that in a later post) and it makes more sense for me to post more directly on twitter.</p>

<p>So I’ve decided to shut down the bridge between the two worlds.</p>

<p>Why? Although I aim to be “the same person everywhere”, the project is going to be more oriented towards the folks on twitter. So it doesn’t make sense to just throw it out to everyone and hope that everyone likes it (because they won’t).</p>

<p>Instead I am going to make sure to focus my efforts on twitter to ensure that I’m doing the best job I can with my messaging and replies.</p>

<p>Sometimes you just need to make sure your efforts are pulling in the right direction and this is one those times for me. A unified presence on the web is nice, but for now I’ve got to split things up a little bit and let them grow.</p>

<p>If you are interested in this new project, <a href="https://x.com/nloadholtes">follow me on twitter</a> to learn more! Or, if the fediverse is more your speed, <a href="https://social.ironboundsoftware.com/users/nloadholtes">follow me there</a>!</p>]]></content><author><name>Nick</name></author><category term="thinking" /><category term="thinking" /><summary type="html"><![CDATA[Split and Join Social Media]]></summary></entry><entry><title type="html">Fuck the algorithm, be you</title><link href="http://blog.ironboundsoftware.com/2024/07/be-you" rel="alternate" type="text/html" title="Fuck the algorithm, be you" /><published>2024-07-16T00:00:00+00:00</published><updated>2024-07-16T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2024/07/be-you</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2024/07/be-you"><![CDATA[<p>Have you ever watched a video or listened to an interview that was so mind blowing you had to keep stopping it to try and let your brain catch up? That was me today while watching this interview with Palmer Luckey:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/dBeosjr7PyY?si=5ojDTcYscDZSZb9f" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>There were so many things that Palmer covered in just the first 15 minutes that completely floored me. The hosts interviewing him were equally impressedand that when it occurred to me: Palmer seems amazing because he is just being himself, and he is just naturally curious.</p>

<p>So many people feel the need to present a certain “face” to the public. Their self stories are polished, with just the right amount of humility, and jus the right amount (but not too much!) pride in their accomplishments.</p>

<p>Palmer on the other hand just lays it out there. Crazy ideas, experiments that didn’t work out, the pride he has in what he’s created… It’s front and center. And that is shocking, yet refreshing.</p>

<p>Instead of bowing to the expected path that people follow to “get attention” he is just being himself and that alone makes him stand out. And that is a secret so many people seem to fail to get: It doesn’t matter what time of day you post, just post. It doesn’t matter what SEO magic you try to use, just present what you are doing so a human understands it.</p>

<p>Don’t try to beat the Social Media algorithms, be yourself and force the algorithm to pay attention to you.</p>

<p>Do something cool. Do something you would love to read about. Don’t worry about making computers happy, make yourself happy.</p>

<p>Your people will find you. You will be happier.</p>

<p>Just be you. Do what you do.</p>]]></content><author><name>Nick</name></author><category term="reading," /><category term="thinking" /><category term="reading," /><category term="thinking" /><summary type="html"><![CDATA[Have you ever watched a video or listened to an interview that was so mind blowing you had to keep stopping it to try and let your brain catch up? That was me today while watching this interview with Palmer Luckey:]]></summary></entry><entry><title type="html">Interesting reading</title><link href="http://blog.ironboundsoftware.com/2020/10/interesting-reading" rel="alternate" type="text/html" title="Interesting reading" /><published>2020-10-04T00:00:00+00:00</published><updated>2020-10-04T00:00:00+00:00</updated><id>http://blog.ironboundsoftware.com/2020/10/interesting-reading</id><content type="html" xml:base="http://blog.ironboundsoftware.com/2020/10/interesting-reading"><![CDATA[<p>Lately I’ve been trying to get back to my roots of exploration. Part of that is reading as much as I can on pretty much any topic I find interesting.</p>

<p>The approach really served me well many years ago, so I’m giving it another shot. Here’s some things I’ve read recently that really got my attention.</p>

<h2 id="the-meat">The meat</h2>

<ul>
  <li><a href="https://josephg.com/blog/crdts-are-the-future/">I was wrong. CRDTs are the future</a> - A really interesting high-level look at an old approach that didn’t work and how the author is now looking at a new brighter future for Conflict-free Replicated Data Types. Also, at the end the article really hits home for me with some talk about how we should own our bits instead of just letting Google (or whomever) just take over and tell us what we can or can’t write to disk.</li>
  <li><a href="https://blog.jessfraz.com/post/the-art-of-automation/">The Art of Automation</a> - Now more than ever I am seeing how critical automation is not only in work environments, but even in our day-to-day lives. Why should I be working for a computer? Shouldn’t it be the other way around? As always Jess gives a great take on this important topic.</li>
  <li><a href="https://www.nin.com/john-carmak-american-mcgee/">John Carmack and American McGee’s liner notes to the Quake Soundtrack</a> - id Software was and continues to be a huge inspiration for me. NIN released the quake soundtrack and since a certain company wouldn’t let them include these notes I think it is even more awesome to see them here.</li>
</ul>

<h2 id="the-veggies">The veggies</h2>

<p>I have been reading some some sci-fi to try and tickle some thoughts I’m having around computation and space exploration. I will write more about this in the future after I <strong>a)</strong> finish a few of the books and <strong>b)</strong> digest some of the ideas in them.</p>

<p>I’m also going to re-pick up a text book and work through another chapter or two. Its important to stay sharp, and I am fortunate that I can jump around in an algorithms book and learn what catches my eye.</p>

<h2 id="till-next-time">Till next time</h2>

<p>Keep positive, have fun, and make something awesome!</p>]]></content><author><name>Nick</name></author><category term="reading" /><category term="reading" /><summary type="html"><![CDATA[Lately I’ve been trying to get back to my roots of exploration. Part of that is reading as much as I can on pretty much any topic I find interesting.]]></summary></entry></feed>