<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>MPL</title>
    <description>CTO at ChangEd</description>
    <link>http://mikepland.com/</link>
    <atom:link href="http://mikepland.com/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>Craps AI – Specialized LLM with OpenAI Functions &amp; Vector Store</title>
        <description>&lt;blockquote&gt;
  &lt;p&gt;The AIs were just too smart for Craps…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which is more, ‘15 to 1’ or ‘16 for 1’? Well the AIs know they are they’re the same thing; and when it came to Craps they would constantly provide payouts as ‘to 1’. Presumably this was just a natural tendency to reduce. But with Craps, it actually is, ‘for 1’, it’s written on the table that way. It’s not just convention, this would throw off people’s understanding when bets would have more than one unit.&lt;/p&gt;

&lt;p&gt;This began my pursuit of a Craps AI what would give responses like me (I was a Craps dealer in the Vegas area in my early days).&lt;/p&gt;

&lt;p&gt;So the problem I was looking to solve was the AIs forcing, ‘to 1’ payouts for Craps payouts that are, ‘for 1’, and to get the AI to embody my own Craps knowledge instead of it’s own. And also to reduce hallucinations when calculating bets.&lt;/p&gt;

&lt;p&gt;There are two main components I’m using on Craps AI’s for my openAI solution: Function calling and Vector Store. The function calling is calculating bets, LLMs are notorious for hallucinating (you don’t call it, ‘lying’ because that means intent and machines don’t do that). So now instead of the LLM calculating the payout of a horn bet, it understands when it’s being asked to calculate a bet, it extracts bet name from the question (and knows bets that don’t exist), and extracts what the roll is. The Vector store is data that I produce about Craps which it will then prioritize over what it already knows.&lt;/p&gt;

&lt;h3 id=&quot;openai-functions&quot;&gt;OpenAI Functions&lt;/h3&gt;

&lt;p&gt;So a question might be, “How much does a five dollar horn high 12 pay if aces hits?”, the AI will return something like this&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;calculate_horn_highs_payout({
  &quot;bet_amount&quot;: 5,
  &quot;roll&quot;: 2,
  &quot;target&quot;: &quot;twelve&quot;
})
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Requesting the calculation, then regular determinative JavaScript code would return this&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;{&quot;totalPayout&quot;:31,&quot;stillUpToWin&quot;:26}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This response is then feed into another API call to openAI where it will use this info to craft a nice response. So the cost was an additional API call and the reward was reducing the chance of a hallucination on calculations. Now it just needs to know the elements for the calculation. Regular JavaScript is good at calculating a Horn bet if you provide the elements, it works the same way every time.&lt;/p&gt;

&lt;p&gt;Even with this setup at first the AI was not using my nice function until I added this to the system instructions&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;DO NOT CALCULATE PAYOUTS ON YOUR OWN, USE THE CALCULATION FUNCTIONS  “type”: “function”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;openai-vector-store&quot;&gt;OpenAI Vector Store&lt;/h3&gt;

&lt;p&gt;This is where your message can shine through. Similar to telling the AI to use my functions, my system instructions included, “Priortize my Vector Store Data”. One way this showed up for Craps is calculating the max bet on a Don’t Pass Bet. Some things vary by casino and other things are universal, calculating the max bet on the don’ts is universal. After noticing the AI using the word typically I updated my vector store for Don’t Pass and Don’t Come to make sure the AI knew, this was how it’s calculated, so it shouldn’t use the work, ‘typically’ or ‘usually’. You see the AIs, they’re not like us humans, they haven’t been on those tables, they’ve never had green felt under their fingernails.&lt;/p&gt;

&lt;p&gt;The vector store for Craps AI is a directory of markdown files explaining each bet. This is where I can influence the AI’s responses. For instance a question came in about taking down a Don’t Come Bet, since the AI didn’t mention, ‘no action’, I added this to it’s vector store doc&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;A player can take down their Don’t Come bet at any time. In addition while in the Don’t Come area, before traveling to behind a number, a player can say, ‘no action’, and the dealer will leave the bet in the DC and not move it to behind the number rolled. If a question is about taking down the Don’t Come Bet, mention the ability to call, ‘no action’.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most times after adding this, it would mention, ‘no action’ but sometimes it would not mention it and you have to decide how much you want to press it knowing that pressing might cause it to focus too much there and loss integrity elsewhere.&lt;/p&gt;

&lt;h3 id=&quot;evaluation-test-cycle&quot;&gt;Evaluation Test Cycle&lt;/h3&gt;

&lt;p&gt;Finally here is my work flow for improving the responses.&lt;/p&gt;

&lt;p&gt;First I’m checking the logs, reading the questions and responses. Once I find a response with room for improvement, I add it to a file for evaluation testing. I create an obj with the question, an example answer, and the evaluation criteria.&lt;/p&gt;

&lt;p&gt;So I copy over the question, copy over the response, edit the response to be optimal, then add what I am looking for, what makes a good response.&lt;/p&gt;

&lt;p&gt;In order to evaluate and score the response, I’m using another AI model the high reasoning model, which is also supplyed with the same vector store data.&lt;/p&gt;

&lt;p&gt;In this case a question came in about takind down a Don’t Come Bet, the answer was good. Except in craps you can say, ‘no action’, and elect to not travel your DC bet, this definitely should have been included.&lt;/p&gt;

&lt;p&gt;So I just added on to the original answer.&lt;/p&gt;

&lt;p&gt;Then instructed the evaluating AI to look for the following&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Say YES (player can take down their Don’t Come Bet)&lt;/li&gt;
  &lt;li&gt;Say player has the advantage&lt;/li&gt;
  &lt;li&gt;Say player can do, ‘no action’&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Very important, I ran this test with no updates so I could replicate the error. Naturally it didn’t mention, ‘no action’ since I had not added that to the vector store yet, thus my evaluation model scored it low.&lt;/p&gt;

&lt;p&gt;So then I added the lines about, ‘no action’, to my vector store file. This caused the AI’s response to include, ‘no action’ most of the times.&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;tight-evaluatepatch-loop&quot;&gt;🔄 Tight evaluate–patch loop&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Read production logs.&lt;/strong&gt; Spot answers with room for improvement.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Turn the Q&amp;amp;A into a test case.&lt;/strong&gt; Save the question, an &lt;em&gt;ideal&lt;/em&gt; answer, and criteria.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Run an eval model&lt;/strong&gt;—also armed with the vector store.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Patch&lt;/strong&gt; either the vector docs or the function set, then rerun the test.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That cycle catches regressions early and keeps the knowledge base improving&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Thinking about a specialized LLM?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/us/app/craps-ai/id6743343228&quot;&gt;&lt;img src=&quot;/crapsAIIconDownload.png&quot; alt=&quot;Craps AI&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 12 Jul 2025 08:11:23 +0000</pubDate>
        <link>http://mikepland.com/ai/2025/07/12/Craps-AI-Specialized-LLM-With-OpenAIs-Functions-And-Vector-Store/</link>
        <guid isPermaLink="true">http://mikepland.com/ai/2025/07/12/Craps-AI-Specialized-LLM-With-OpenAIs-Functions-And-Vector-Store/</guid>
      </item>
    
      <item>
        <title>Infinity Levels On Infinity Racer Using AI/Machine Learning With Tensorflow</title>
        <description>&lt;p&gt;Infinity Levels has arrived. Using Tensorflow, an open source Machine Leanring platform, I have setup a level generator which creates levels ondemand. Here is how I did it.&lt;/p&gt;

&lt;p&gt;Looking at a screenshot here of the app, you can see a clear grid pattern. There is a 20X30 grid. Each cell is either a space, rock, or exit. The user draws lines with their finger to get the car to the exit.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/20240204/gridExample.png&quot; alt=&quot;gridExample&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For this task I used a GAN or Generative Adversarial Network (GAN), which has two neural networks, a generator and a discriminator. These are trained simulaneously, through competition the Generator and Discriminator go back and forth. The Generator tries to make levels indistinguishable from the real thing. While the Discriminator tries to guess if a level is generated or fake. For 30,000 rounds the battle rages. Back and forth these two go at it.&lt;/p&gt;

&lt;p&gt;This all happens locally on my computer, other than pulling existing levels from the database, the training process does not require the internet.&lt;/p&gt;

&lt;p&gt;By the end both elements should be trained to do their job, both becoming better and better until the end when the model is saved.&lt;/p&gt;

&lt;p&gt;Once the training process is complete the discriminator is not used in the level generator. It just sits dormant in the model.&lt;/p&gt;

&lt;p&gt;Unlike ChatGPT where it gives a response based on a prompt, this level generator produces raw output, “noise vector” as it’s called, it just imagines it, and tada, a level is born.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;My initial sprint was just to get the level generator to produce BAD levels. I was sure if I could get bad levels, I could keep iterating and eventually produce good levels.&lt;/p&gt;

&lt;p&gt;My earliest attempt I mapped the grid down to the pixel. On my development phone a cell is 18.75 pixels. It seems obvious in retrospect, but when I produced my first level, it wasn’t produced with a grid in mind. It was just a smattering of decimal numbers between 0 and 1. It seemed to give little consideration to the fact that these numbers were going to be groups with it’s neighbors to become a cell in a grid.&lt;/p&gt;

&lt;p&gt;It became clear that it would be better to simplify to a grid approach rather than mapping each pixel.&lt;/p&gt;

&lt;p&gt;My next approach was to use 600 values to represent the 20X30 grid. I used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; for space, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; for rock, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2&lt;/code&gt; for exits. After recoding for this new approach the level started producing level with exits in the middle, on the top, all sort of places.&lt;/p&gt;

&lt;p&gt;So I decided to just place the exits after the level was generated, now I was down to just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt;s and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;s. Deciding where to place an exit has rules like, must be in the lower half of the screen, must be 2-3 cells all next to one another. I decided to use a pathfinding software and some regular software development to place an exit location after the level was generated.&lt;/p&gt;

&lt;p&gt;Using a pathfinding module for npm, I started validating levels based on if there was a clear path to the bottom row.&lt;/p&gt;

&lt;p&gt;Here would be an invalid level&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0     
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This shows a row of rock making the pathway to the exit impossible.&lt;/p&gt;

&lt;p&gt;Since the car is slighly taller than the width of one cell, a level also needs to have a path of 2 cells or more, making this invalid as well.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0     
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The pathway software still counted this as valid, so came up with the concept of, ‘solidifing’ a level, if there was a cell with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; on each side, just change the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt; to a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; since the pathway is invalid based on the size of the car. This allowed me to solidify a level and then run the pathway software to see if there was an exit.&lt;/p&gt;

&lt;p&gt;Next came the concept of velocity, in plain language this means, the car cannot go far enough, it runs out of speed and stops. This example below shows an invalid level based on the car not having enough velocity.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once a level is determined valid, I select a placement of the exit cell based on:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;velocity, making sure the user has enough speed to get to that cell&lt;/li&gt;
  &lt;li&gt;pathway validation, making sure there is a valid path to the exit cell, for instance, it’s not blocked by a rock&lt;/li&gt;
  &lt;li&gt;too direct, making sure a user cannot just draw a simple diagonal line and beat the level&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As it stand now, I have the level generator running daily, I’m doing slight edits and approving each level. Once approved, the brand new level is available to the those with Infinity Level on the Infinity Racer App.&lt;/p&gt;

&lt;p&gt;In the last 15 levels created 9 were invalid, meaning there was no way to place an exit based on my level validation. Invalid levels get saved into the database too, I’m using them to further train the discriminator. These levels required some manual adjustments, in order to be valid and then released to the app.&lt;/p&gt;

&lt;p&gt;Going forward I’ll be looking to train a new model regularly, adjusting configurations and input parameters in order to get the model to produce the highest quality levels possible.&lt;/p&gt;

&lt;p&gt;Infinity Racer now with Infinity Levels is available &lt;a href=&quot;https://apps.apple.com/us/app/infinity-racer/id6464310248?uo=4&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 03 Feb 2024 13:24:03 +0000</pubDate>
        <link>http://mikepland.com/portfolio/2024/02/03/Infinity-Levels-on-Infinity-Racer-With-AI-Machine-Learning/</link>
        <guid isPermaLink="true">http://mikepland.com/portfolio/2024/02/03/Infinity-Levels-on-Infinity-Racer-With-AI-Machine-Learning/</guid>
      </item>
    
      <item>
        <title>Weather Window AI</title>
        <description>&lt;script async=&quot;&quot; defer=&quot;&quot; src=&quot;https://buttons.github.io/buttons.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;A.I. Generated Photo Of Current Weather In A Random City&lt;/p&gt;

&lt;p&gt;Now LIVE on twitter.&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;twitter-timeline&quot; href=&quot;https://twitter.com/WeatherWindowAI&quot; data-widget-id=&quot;627367580370604033&quot;&gt;Tweets by @WeatherWindowAI&lt;/a&gt;
&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?&apos;http&apos;:&apos;https&apos;;if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+&quot;://platform.twitter.com/widgets.js&quot;;fjs.parentNode.insertBefore(js,fjs);}}(document,&quot;script&quot;,&quot;twitter-wjs&quot;);&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Regular readers might remember my earlier post, &lt;a href=&quot;https://mikepland.com/dall-e/short-story/hacker-news/2023/03/04/Using-Dall-E2-For-AI-Image-Generation/&quot;&gt;Why I Quit Being So Accommodating (With Dall-e Illustrations)&lt;/a&gt; where I generated Dall-e Illustrations to accompany the classic 1922 story.&lt;/p&gt;

&lt;p&gt;I enjoyed generating those images so much I wanted to find a way to regularly generate Dall-E images and cast them to an E Paper device.&lt;/p&gt;

&lt;p&gt;Below is my own Weather Window running on &lt;a href=&quot;https://www.waveshare.com/eink-disp.htm&quot;&gt;Waveshare E-Paper Monitor&lt;/a&gt; powered by a Raspberry Pi 400.&lt;/p&gt;

&lt;h1 id=&quot;e-paper-photos&quot;&gt;E Paper Photos&lt;/h1&gt;

&lt;p&gt;&lt;img src=&quot;/assets/WeatherWindow/cloudy-dingzhou-china.jpg&quot; alt=&quot;cloudy-dingzhou-china&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/WeatherWindow/rain-quanzhou-china.jpg&quot; alt=&quot;rain-quanzhou-china&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Weather Window code &lt;a href=&quot;https://github.com/lando2319/WeatherWindow&quot;&gt;on github&lt;/a&gt; will randomly select a city&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dingzhou China&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then query for the current weather in that city&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Rain Weather&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then generate an OpenAI Image based on the current weather of the city&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Rain Weather in Changzhou China”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From there the image is put into an html page for showing on my E-Paper Device&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/WeatherWindow/rain-changzhou-china.jpg&quot; alt=&quot;rain-changzhou-china&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The Image is then saved and tweeted out to all the fans&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/WeatherWindowAI&quot; data-size=&quot;large&quot; class=&quot;twitter-follow-button&quot; data-show-count=&quot;false&quot;&gt;Follow @WeatherWindowAI&lt;/a&gt;&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;github-button&quot; href=&quot;https://github.com/buttons/github-buttons&quot; data-icon=&quot;octicon-star&quot; data-size=&quot;large&quot; aria-label=&quot;Star buttons/github-buttons on GitHub&quot;&gt;Star&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a class=&quot;github-button&quot; href=&quot;https://github.com/lando2319&quot; data-size=&quot;large&quot; aria-label=&quot;Follow @lando2319 on GitHub&quot;&gt;Follow @lando2319&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Sat, 13 May 2023 04:24:03 +0000</pubDate>
        <link>http://mikepland.com/portfolio/dall-e/2023/05/13/Weather-Window-AI/</link>
        <guid isPermaLink="true">http://mikepland.com/portfolio/dall-e/2023/05/13/Weather-Window-AI/</guid>
      </item>
    
      <item>
        <title>Great Portfolio Examples</title>
        <description>&lt;h2 id=&quot;clientsemployers-need-things-to-click-on&quot;&gt;Clients/Employers Need Things To Click On&lt;/h2&gt;

&lt;p&gt;I tell the Devs, Build Your Brand, that’s what it’s about.&lt;/p&gt;

&lt;p&gt;Here is a list of Portfolio pieces. Every one of these software projects could be done by a brand new dev. No Experience Necessary, in fact this is where the experience comes from.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://chronologyclock.com/&quot;&gt;https://chronologyclock.com/&lt;/a&gt; - by &lt;a href=&quot;https://twitter.com/PDF_Origami&quot;&gt;PDF Origami&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arrive at the site, it translates the current time into a date and tells you a historical fact that happened on that date.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://somethingorotherwhatever.com/wobble-clock/&quot;&gt;https://billywojcicki.github.io/vexillologist/&lt;/a&gt; - by &lt;a href=&quot;https://somethingorotherwhatever.com/&quot;&gt;Christian Lawson-Perfect&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s a Clock and it’s Wobbly, don’t over think it.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://billywojcicki.github.io/vexillologist/&quot;&gt;https://billywojcicki.github.io/vexillologist/&lt;/a&gt; - by &lt;a href=&quot;https://billywojcicki.github.io/&quot;&gt;Billy Wojcicki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pick the right flag for the country&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://kuboble.com/&quot;&gt;https://kuboble.com/&lt;/a&gt; - by Kuboble&lt;/p&gt;

&lt;p&gt;Kuboble Try to find a way home for all the balls!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://www.drawaurora.com/&quot;&gt;https://www.drawaurora.com/&lt;/a&gt; - by Draw Aurora&lt;/p&gt;

&lt;p&gt;Draw Aurora Borealis&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Build something like this and talk gushingly about it to potential Clients and Employers. This is the way.&lt;/p&gt;

&lt;p&gt;All of these were found on &lt;a href=&quot;https://news.ycombinator.com/news&quot;&gt;Hacker News&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://mikepland.com/apps/&quot;&gt;Here Are My Portfolio Pieces&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 27 Mar 2023 02:19:54 +0000</pubDate>
        <link>http://mikepland.com/portfolio/web-dev/2023/03/27/Great-Portfolio-Examples/</link>
        <guid isPermaLink="true">http://mikepland.com/portfolio/web-dev/2023/03/27/Great-Portfolio-Examples/</guid>
      </item>
    
      <item>
        <title>Building A Craps AI Using ChatGPT</title>
        <description>&lt;h2 id=&quot;development-log&quot;&gt;Development Log&lt;/h2&gt;

&lt;p&gt;As a weekend project, for the last 6 weeks I’ve been pursuing a Craps AI using ChatGPT via OpenAI. The end product would be an interactive bot that knows about Craps.&lt;/p&gt;

&lt;p&gt;I wanted to start documenting this process.&lt;/p&gt;

&lt;p&gt;This is with OpenAI’s API, ChatGPT, using the Divinci Model&lt;/p&gt;

&lt;h2 id=&quot;heres-the-latest&quot;&gt;Here’s The Latest&lt;/h2&gt;

&lt;p&gt;I’ve been targeting a Horn Bet. My query has been, “What does a $4 Horn Bet pay?”. For you Humans, it’s simple, A Horn Bet is spit evenly between four bets, the Aces, Ace Deuce, Twelve, and Eleven. The Aces and Twelve pay 31 for 1, the Ace Deuce and Eleven pay 16 for 1. So if Ace Deuce or Eleven roll it’s 16 and down, if Aces or Twelve rolls it’s 31 and down.&lt;/p&gt;

&lt;p&gt;Getting an AI to spit back a version of that has proved to be challenging. My lastest attempt has been the most successful, here’s the latest.&lt;/p&gt;

&lt;p&gt;Query: “what does a $4 Horn Bet Pay”&lt;/p&gt;

&lt;p&gt;This is with the tempature set at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.2&lt;/code&gt;&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-linenos&quot; data-lang=&quot;linenos&quot;&gt;{
    id: &apos;cmpl-6yKPTRNU6YGpKP1FJ1tJqDxEzWFVc&apos;,
    object: &apos;text_completion&apos;,
    created: 1679836155,
    model: &apos;davinci:ft-personal-2023-03-26-13-07-18&apos;,
    choices: [
        {
            text: &apos;A $4 Horn Bet would have $1 on the Aces, with a payout of 31 for 1 on the Aces, a $4 Horn Bet would pay $31 and down, with $3 on the Eleven, with a payout of 16 for 1 on the Eleven, a $4 Horn Bet would pay $16 and down, with $1 on the Twelve, with a payout of 8&apos;,
            index: 0,
            logprobs: null,
            finish_reason: &apos;length&apos;
        }
    ],
    usage: { prompt_tokens: 9, completion_tokens: 80, total_tokens: 89 }
}&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;It starts out perfect with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;A $4 Horn Bet would have $1 on the Aces, with a payout of 31 for 1 on the Aces, &lt;/code&gt;, but then for some reason it throws in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;, with $3 on the Eleven&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This response is from a Divici model trained on the following 42 lines of training data. The informal benchmark for length seems to be a couple hundred lines as a minimum. This of course varies greatly based on the type of training data.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-linenos&quot; data-lang=&quot;linenos&quot;&gt;{&quot;prompt&quot;: &quot;What is a Horn Bet?&quot;, &quot;completion&quot;: &quot;Horn is a one roll bet on the Aces, Ace Deuce, Eleven, and Twelve&quot;}
{&quot;prompt&quot;: &quot;How many numbers does a Horn Bet Cover?&quot;, &quot;completion&quot;: &quot;The Horn Bet covers 4 numbers: Aces, Eleven, Ace Deuce, and Twelve&quot;}
{&quot;prompt&quot;: &quot;How many numbers can win on the Horn Bet?&quot;, &quot;completion&quot;: &quot;Well the Dice can only roll on one number, so just one&quot;}
{&quot;prompt&quot;: &quot;What does the Horn Bet Pay if Aces rolls?&quot;, &quot;completion&quot;: &quot;The Horn Bet is equally split over the four numbers (Aces, Ace Deuce, Eleven, and Twelve), if Aces rolls it pays 31 for 1 for the Aces portion of the Bet.&quot;}
{&quot;prompt&quot;: &quot;So if I have a Horn Bet for $4, what would an Aces roll pay?&quot;, &quot;completion&quot;: &quot;With a $4 Horn bet you would have $1 on the Aces, so you would get 31 for 1, total payout everything down would be $31&quot;}
{&quot;prompt&quot;: &quot;What are the payouts for the Horn Bet?&quot;, &quot;completion&quot;: &quot;Aces and Twelve pay 31 for 1 while Ace Deuce and Eleven pay 16 for 1&quot;}
{&quot;prompt&quot;: &quot;So a $4 Horn Bet pays $48 if Eleven rolls?&quot;, &quot;completion&quot;: &quot;No, you would only have $1 on the Eleven, so that&apos;s $16 and down&quot;}
{&quot;prompt&quot;: &quot;a $4 Horn Bet pays $124 if Aces rolls?&quot;, &quot;completion&quot;: &quot;No, you would only have $1 on the Aces, so that&apos;s $31 and down&quot;}
{&quot;prompt&quot;: &quot;Which numbers pay the highest on a Horn Bet&quot;, &quot;completion&quot;: &quot;The Horn Bet is split equally 4 ways, the portion of the bet on Aces and Twelve pays 31 for 1&quot;}
{&quot;prompt&quot;: &quot;Which numbers pay the lowest on a Horn Bet&quot;, &quot;completion&quot;: &quot;The Horn Bet can be split equally into 4 separate bets, the portion on Ace Deuce and Eleven pays 16 for 1&quot;}
{&quot;prompt&quot;: &quot;What is the payout on a Horn Bet if five rolls&quot;, &quot;completion&quot;: &quot;zero, the Horn Bet only pays out on Aces, Twelve, Ace Deuce, and Eleven&quot;}
{&quot;prompt&quot;: &quot;What is the Aces Bet&quot;, &quot;completion&quot;: &quot;Aces is a one roll bet on the dice total of two, each die showing a 1&quot;}
{&quot;prompt&quot;: &quot;What is the Ace Deuce Bet&quot;, &quot;completion&quot;: &quot;Ace Deuce is a one roll bet on the dice total of three, one die showing a 1 and the other showing a 2&quot;}
{&quot;prompt&quot;: &quot;What is the Eleven Bet&quot;, &quot;completion&quot;: &quot;Eleven, or Yo, is a one roll bet on the dice total of Eleven, one die showing a 5 and the other showing a 6&quot;}
{&quot;prompt&quot;: &quot;What is the Twelve Bet&quot;, &quot;completion&quot;: &quot;Twelve, is a one roll bet on the dice total of Twelve, each dice showing a 6&quot;}
{&quot;prompt&quot;: &quot;What is the payout on a $4 Horn Bet if Eleven rolls&quot;, &quot;completion&quot;: &quot;A $4 Horn Bet would be $1 on each of the four Horn Bet numbers, so the Eleven would pay 16 for 1, so that $16 and down for your Horn Bet&quot;}
{&quot;prompt&quot;: &quot;So if I have an $8 Horn Bet, how much would that be on each number&quot;, &quot;completion&quot;: &quot;A Horn Bet is always split evenly amoungst the four Horn Bet numbers, so with $8 it would be $2 on each number&quot;}
{&quot;prompt&quot;: &quot;On a Horn Bet which pays more if it rolls, Aces or Twelve&quot;, &quot;completion&quot;: &quot;A Horn Bet would have the same amount on each number, so it would pay equal amounts&quot;}
{&quot;prompt&quot;: &quot;Is the Aces covered in a Horn Bet?&quot;, &quot;completion&quot;: &quot;Yes, the Aces is one of the four Horn Numbers, the others would be Twelve, Ace Deuce, and Eleven&quot;}
{&quot;prompt&quot;: &quot;Is the Eleven covered in a Horn Bet?&quot;, &quot;completion&quot;: &quot;Yes, the Eleven is one of the four Horn Numbers, the others would be Aces, Ace Deuce, and Twelve&quot;}
{&quot;prompt&quot;: &quot;Is the Twelve covered in a Horn Bet?&quot;, &quot;completion&quot;: &quot;Yes, the Twelve is one of the four Horn Numbers, the others would be Aces, Ace Deuce, and Eleven&quot;}
{&quot;prompt&quot;: &quot;Is the Ace Deuce covered in a Horn Bet?&quot;, &quot;completion&quot;: &quot;Yes, the Ace Deuce is one of the four Horn Numbers, the others would be Aces, Twelve, and Eleven&quot;}
{&quot;prompt&quot;: &quot;Is the payout on a Horn Bet 16 for 1&quot;, &quot;completion&quot;: &quot;No, a Horn Bet is split between 4 individual bets, the Ace Deuce and the Eleven pay 16 for 1 for their individual bets.&quot;}
{&quot;prompt&quot;: &quot;Is the payout on a Horn Bet 31 for 1&quot;, &quot;completion&quot;: &quot;No, a Horn Bet is split between 4 individual bets, the Aces and Twelve pay 31 for 1 for their individual bets.&quot;}
{&quot;prompt&quot;: &quot;With a $12 Horn Bet how much is on each number?&quot;, &quot;completion&quot;: &quot;A Horn Bet is divided four ways, so a $12 Horn would have $3 on the each number&quot;}
{&quot;prompt&quot;: &quot;So a $12 Horn Bet pays how much if Aces rolls&quot;, &quot;completion&quot;: &quot;Well a $12 Horn Bet would have $3 on the Aces, with a payout of 31 for 1 on the Aces, A $12 Horn Bet would pay $93 and down&quot;}
{&quot;prompt&quot;: &quot;So a $12 Horn Bet pays how much if Twelve rolls&quot;, &quot;completion&quot;: &quot;$12 Horn Bet would have $3 on the Twelve, with a payout of 31 for 1 on the Twelve, A $12 Horn Bet would pay $93 and down&quot;}
{&quot;prompt&quot;: &quot;So a $12 Horn Bet pays how much if Ace Decue rolls&quot;, &quot;completion&quot;: &quot;$12 Horn Bet would have $3 on the Ace Deuce, with a payout of 16 for 1 on the Ace Deuce, A $12 Horn Bet would pay $48 and down&quot;}
{&quot;prompt&quot;: &quot;So a $12 Horn Bet pays how much if Eleven rolls&quot;, &quot;completion&quot;: &quot;$12 Horn Bet would have $3 on the Eleven, with a payout of 16 for 1 on the Eleven, A $12 Horn Bet would pay $48 and down&quot;}
{&quot;prompt&quot;: &quot;$4 Horn Bet pays how much if Aces rolls&quot;, &quot;completion&quot;: &quot;Well a $4 Horn Bet would have $1 on the Aces, with a payout of 31 for 1 on the Aces, A $4 Horn Bet would pay $31 and down&quot;}
{&quot;prompt&quot;: &quot;$4 Horn Bet pays how much if Twelve rolls&quot;, &quot;completion&quot;: &quot;$4 Horn Bet would have $1 on the Twelve, with a payout of 31 for 1 on the Twelve, A $4 Horn Bet would pay $31 and down&quot;}
{&quot;prompt&quot;: &quot;$4 Horn Bet pays how much if Ace Decue rolls&quot;, &quot;completion&quot;: &quot;$4 Horn Bet would have $1 on the Ace Deuce, with a payout of 16 for 1 on the Ace Deuce, A $4 Horn Bet would pay $16 and down&quot;}
{&quot;prompt&quot;: &quot;$4 Horn Bet pays how much if Eleven rolls&quot;, &quot;completion&quot;: &quot;$4 Horn Bet would have $1 on the Eleven, with a payout of 16 for 1 on the Eleven, A $4 Horn Bet would pay $16 and down&quot;}
{&quot;prompt&quot;: &quot;What are the Odds on a Horn Bet?&quot;, &quot;completion&quot;: &quot;The Aces and Twelve pay 31 for 1, the Ace Deuce and Eleven pay 16 for 1, for each individual bet&quot;}
{&quot;prompt&quot;: &quot;So a Horn Bet pays 31 for 1&quot;, &quot;completion&quot;: &quot;Not as a whole, the Horn Bet is split into 4 individual bets, two of those bets, the Aces and Twelve, pay 31 for 1&quot;}
{&quot;prompt&quot;: &quot;So a Horn Bet pays 16 for 1&quot;, &quot;completion&quot;: &quot;Not as a whole, the Horn Bet is split into 4 individual bets, two of those bets, the Ace Deuce and Eleven, pay 16 for 1&quot;}
{&quot;prompt&quot;: &quot;So a Horn Bet pays what exactly?&quot;, &quot;completion&quot;: &quot;Depending on what rolls, it&apos;s split 4 ways, Aces and Twelve pays 31 for 1, Ace Deuce and Eleven pay 16 for 1&quot;}
{&quot;prompt&quot;: &quot;What numbers are covered with the Horn Bet?&quot;, &quot;completion&quot;: &quot;Aces, Ace Deuce, Twelve, and Eleven are coverd with the Horn Bet&quot;}
{&quot;prompt&quot;: &quot;So the Horn Bet is one bet or four?&quot;, &quot;completion&quot;: &quot;Well it&apos;s one bet, but that one bet is made up of four individual bets (Aces, Ace Deuce, Twelve, Eleven)&quot;}
{&quot;prompt&quot;: &quot;Is a five covered by the Horn Bet?&quot;, &quot;completion&quot;: &quot;No, the Horn Bet covers the Aces, Ace Deuce, Twelve, and Eleven, not the Five&quot;}
{&quot;prompt&quot;: &quot;The Horn Bet is covering the Aces, Ace Deuce, and Twelve?&quot;, &quot;completion&quot;: &quot;Also the Eleven. So it&apos;s Aces, Ace Deuce, Tweleve, and Eleven&quot;}
{&quot;prompt&quot;: &quot;What is the payout for a Horn Bet&quot;, &quot;completion&quot;: &quot;Depends on what rolls. Aces and Twelve pay 31 for 1 for thier portion of a Horn Bet, the Ace Deuce and Eleven pay 16 for 1&quot;}&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Even the chat on openai.com, which I consider to be the gold standard, if you ask, “What does a $4 Horn Bet pay in Craps”, the answers are inaccurate. It seems to do ok with the general pass line, establish a point, etc, but beyond that the accuracy starts to fall.&lt;/p&gt;

&lt;p&gt;As of this writing, here is the chat.openai.com’s response to, “What does a $4 Horn Bet pay?”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/20230326/chatgpt-craps-query.png&quot; alt=&quot;chatgpt craps query&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This start out well, it mentions that the bet is divided into equal parts, then it gets the payout, although 31 FOR 1 is preferrable over 31 TO 1 since that’s how it’s written on the actual craps table, but they’re the same. But then at the end it botches the payouts. Highside, Aces and Twelve, pay $31 and down, the Lowside Ace Deuce and Eleven pay $16 and down.&lt;/p&gt;

&lt;p&gt;This is close.&lt;/p&gt;

&lt;p&gt;I recently recieved access to Bard, Google’s version of ChatGPT, here’s what it has to say&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/20230326/bard-craps-query.png&quot; alt=&quot;bard craps query&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here it doesn’t adaquately talk about how the bet is split 4 ways, but it does get the payout correct, except it’s 16 and down, or still up for $12. But $15 means it’s keeping up only the winning portion of the Horn Bet.&lt;/p&gt;

&lt;p&gt;So where do I go from here?&lt;/p&gt;

&lt;p&gt;Well, it seems like more data is the path forward.&lt;/p&gt;

&lt;p&gt;Perhaps I’ll keep building that list to 200+ lines.&lt;/p&gt;

&lt;p&gt;Stay Tuned&lt;/p&gt;
</description>
        <pubDate>Sun, 26 Mar 2023 04:19:54 +0000</pubDate>
        <link>http://mikepland.com/chatgpt/2023/03/26/Building-A-Craps-AI/</link>
        <guid isPermaLink="true">http://mikepland.com/chatgpt/2023/03/26/Building-A-Craps-AI/</guid>
      </item>
    
      <item>
        <title>Why I Quit Being So Accommodating (With Dall-e Illustrations)</title>
        <description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;“Why I Quit Being So Accommodating” is a Short Story I found on &lt;a href=&quot;https://news.ycombinator.com&quot;&gt;Hacker News&lt;/a&gt;. The story is excellent, and with linkrot being what it is, I wanted to print it out to make sure I had it forever. So I printed it out, then as I sat in my chair and looked up at the end of my bookshelf, seeing a handful of printed sheets of computer paper, I thought to myself, “I can do better”.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/bookshelf-paper.jpg&quot; alt=&quot;bookshelf-paper&quot; style=&quot;max-width: 250px;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;printed out story on my bookshelf&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then I got the idea to print it out into a nice custom printed book. Something that would fit along side other books on a shelf.&lt;/p&gt;

&lt;p&gt;After recently building a Craps AI using ChatGPT, I thought to myself, “well maybe I should generate some illustration with DALL-E2”, this would go great with the story.&lt;/p&gt;

&lt;p&gt;The main tool I used was the labs &lt;a href=&quot;https://labs.openai.com&quot;&gt;DALL-E editor&lt;/a&gt; by openAI.&lt;/p&gt;

&lt;p&gt;The Story first appeared in &lt;a href=&quot;https://www.google.com/books/edition/_/kstZAAAAYAAJ?hl=en&amp;amp;gbpv=0&quot;&gt;The American Magazine April 1922&lt;/a&gt; no author is listed. The blog post where I saw the story is &lt;a href=&quot;https://mikecanex.wordpress.com/2012/12/26/1922-why-i-quit-being-so-accommodating/&quot;&gt;Here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My approach was to break up the story into 2-3 paragraph chunks and create an illustration. Since the story is over a hundred years old, I wanted to have a hand drawn style for my illustrations.&lt;/p&gt;

&lt;p&gt;I searched line art and one of the related articles on wikipedia was, ‘hatching’. This seemed appropriate.&lt;/p&gt;

&lt;p&gt;One thing I learned is to prepend with a style, it became clear that since I wanted to have a consistent style, I should be including that in my search, and since the system seems to prioritize the beginning of the query, I should put, “hatching style,” at the front.&lt;/p&gt;

&lt;p&gt;Each image took 2-5 queries, adjusting slightly each time. Each query contains 4 images to choose from. So it still took a human having an idea of what type of images to look for, and knowing when to tweak the query.&lt;/p&gt;

&lt;p&gt;Below is the story along with the AI Generated Images&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;why-i-quit-being-so-accommodating&quot;&gt;Why I Quit Being So Accommodating&lt;/h1&gt;

&lt;p&gt;&lt;img src=&quot;/assets/salesman.png&quot; alt=&quot;Dall-e2 Query: hatching style, traveling saleman, tired&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, traveling saleman, tired]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yesterday was the fifth anniversary of my retirement from the business of being a Good Fellow. I use the word “business” advisedly. Until five years ago, if the city directory had told the truth, it would have listed after my name, as my real occupation, something like, “General Attender to Things,” or “Pinch Hitter,” or “Fine Old Scout.” I hope I am entitled in some measure to these designations even to-day. But I have quit being an accommodator and nothing else.&lt;/p&gt;

&lt;p&gt;Five years ago yesterday it was, at two o’clock in the morning; I am not likely to forget the place or the hour. From four-thirty, when the president of our company and I faced each other across his desk, until eleven-thirty, when I left him at his door, we fought the thing back and forth. From eleven-thirty until two o’clock I spent in a bitter ordeal of self-examination.&lt;/p&gt;

&lt;p&gt;“You are thirty-five years old,” I said to myself. “More than half of your life has already been spent. Who is living your life, anyway? Is it actually yours? Or is it a kind of public storehouse of odd jobs? A pile of days and hours put on the counter of the world with a sign inviting every Tom, Dick, and Harry to take one?”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/person-mid-life.png&quot; alt=&quot;Dall-e2 Query: hatching style, person thinking, mid-life crisis&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, person thinking, mid-life crisis]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It was in that solemn morning hour, as I have said, that I formally retired from the business of being Everybody’s Friend. For weeks I had to school myself in the hard business of saying “No.” But five years have made the cure almost complete.&lt;/p&gt;

&lt;p&gt;Surely, if life means anything at all, it means that each of us is entrusted with a certain irreplaceable fund of hours and weeks and years. To let anybody and everybody fritter that fund away is as if the trustee of an estate were to deposit the estate’s funds in a bank and issue check books to whoever applied.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/content-guy-with-clock.png&quot; alt=&quot;Dall-e2 Query: hatching style, person content, with clock, black and white&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, person content, with clock, black and white]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Some of us are born good-natured, some acquire good-nature, and some have good-nature thrust upon us. I belong to the third class. My father ran a small-town drug store. A bald, worried little man, perpetually tired but perpetually smiling — nodding his head and murmuring, “Right away, Mrs. Jones; we’ll have it up right away!’ And, “No trouble! not the slightest trouble in the world!”&lt;/p&gt;

&lt;p&gt;Why is it that everybody imposes upon the hapless proprietor of a drug store? No one ever runs into a butcher shop, and asks, “Would you mind watching Willie until I come back?” No one, expects a hardware merchant to carry two-cent stamps, or grumbles at him, because he happens to be out of postal cards on Sunday afternoons. No one rings excitedly at the front door of the feed merchant and pulls him out of bed at two o’clock for some trivial purchase that might just as easily have been made before the store closed in the evening.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/drugstoreOwner.png&quot; alt=&quot;Dall-e2 Query: hatching style, hapless drug store proprietor&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, hapless drug store proprietor]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But there is absolutely nothing that people will not ask and expect a druggist to do. My father had a competitor across the street and one block down. Our whole lives were passed in fear of what that competitor was doing or might do. Lest he should gain some advantage, it was impressed upon us that we must go the limit in being accommodating.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/guy-looking-at-store-up-the-road.png&quot; alt=&quot;Dall-e2 Query: hatching style, street view, person looking at store up the road&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, street view, person looking at store up the road]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It goes without saying that Father belonged to every lodge and society in town. His name was on every subscription list. With all his twelve or fifteen hours of work a day, our family finances were never a nickel ahead. And yet, in all the years, I can remember my mother protesting only once.&lt;/p&gt;

&lt;p&gt;It was a warm June evening when I was about nine years old. We were waiting for Father to come home from the store, and Mother had been thrilling us with plans for the journey we were going to take to my grandmother’s farm in Iowa — the only vacation trip we had ever dared to plan. For months she had been saving up for it, slipping an odd bit of change into the little bank in her bureau drawer. We were to start the following Monday — and it was Thursday night that Father came home, a little more nervous and apologetic than usual.&lt;/p&gt;

&lt;p&gt;I was too young to understand the conversation, which had to do with a note he had endorsed for some “friend.” In jerky, disconnected sentences he poured out his confession, while my mother listened in silence. When he finished she rose, and walking into her room lifted the little bank, carried it out, and fairly flung it into Father’s lap. Then, turning swiftly, she locked herself in her room and we heard her sobbing as if her heart would break.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/other-sad-family.png&quot; alt=&quot;Dall-e2 Query: hatching style, sad family, nervous old dad with pocket book&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, sad family, nervous old dad with pocket book]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It was, as I have said, her only protest. Generally speaking, we were a contented family. But always there hung over us the heavy hand of the community’s unreasonable demands; and the fear of the advantage that might accrue to the rival drug store down the street if we failed, in any way, to meet the requests that came to us. We did everything for everybody, and were always in debt. Our rival, gruff old “Doc” Meadows, did nothing except to keep a clean store, fill prescriptions accurately, and charge fair prices and insist on prompt payments. Yet he managed to own a house and have all the other comforts that we yearned for but never enjoyed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/docMeadows.png&quot; alt=&quot;Dall-e2 Query: hatching style, gruff drug store proprietor&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, gruff drug store proprietor]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It was not until long afterward that I understood the whole truth of the matter. People never trust an accommodating man with important things. That may sound harsh and cynical, but check it up in your own experience. If you have a severe illness, for example, you turn to the busiest, most exacting doctor in town. The fact that he is busy and can’t be bothered by little things gives you confidence in his ability and judgment.&lt;/p&gt;

&lt;p&gt;But this big truth I did not learn until many years afterward. Meanwhile, growing up in such a household, it was inevitable that the habit of being accommodating should have become almost a religion with me. I was the boy who carried the heavy bag of bats home after the ball game. I was the official chaser of foul balls. I brought water from the spring in the meadow, down below the ball field, carrying it up the hill under the burning sun. When any one of the five churches was to have a special celebration, I was invariably one of the boys who stayed up most of Saturday night getting the decorations in place. I think I must have sold a hundred thousand tickets to everything — from an oyster supper at the First Methodist Church to an Elks Carnival at the picnic grounds.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/boy-helping.png&quot; alt=&quot;Dall-e2 Query: hatching style, boy putting up party decorations, black and white&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, boy putting up party decorations, black and white]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At eighteen I went away to college. Father could contribute nothing to the enterprise, but I had saved enough from a summer’s work to pay the fees of the first term, and I expected somehow to find work by which to pull myself through. I might claim to have been fairly popular in my class. At least, my classmates seemed to like to have me around, and I was especially in demand at dances. Not because I was a perfect dancer — I never had the chance to dance at all — but because I played the piano while the other fellows danced!&lt;/p&gt;

&lt;p&gt;Except for one or two good friendships and a little social polish, which I needed badly, I doubt whether my college experience added much to my equipment for success. There was not time to do any real college work, when I had finished making a living and tending to everybody’s odd jobs. The truth is, while they liked me, neither my professors nor my fellow students took me seriously. I was just “Good old Bert.”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/piano-dancing.png&quot; alt=&quot;Dall-e2 Query: hatching style, people dancing around piano&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, people dancing around piano]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Joe, my roommate, was a happy-go-lucky sort of youngster who had an idea that he might become a great artist if only his father would let him spend two or three years in Paris. But his father insisted that the place for him to spend the next two or three years was in the family hardware business. After two years in college, the old man sent for him to come home, and I was taken along in the hope that the parental wrath might be averted by the presence of a third party.&lt;/p&gt;

&lt;p&gt;What went on between father and son that evening in the old man’s study I never knew in detail. But Joe came out at the end of an hour and announced:&lt;/p&gt;

&lt;p&gt;“I start to work Monday in the darned old store, .Bert. And you’re going to start with me.”&lt;/p&gt;

&lt;p&gt;“I start with you?” I protested.&lt;/p&gt;

&lt;p&gt;“Now, don’t argue!” he exclaimed. “You don’t suppose I could stand it to be in that dirty old warehouse all alone, do you? There’s no use in your going back to college, anyway; and you’ve got to start in business somewhere. Be a good fellow; come on!”&lt;/p&gt;

&lt;p&gt;Whatever vague plans I had for my life had centered around the bank in a Middle-Western city of which my mother’s brother was president. It had been generally understood that as soon as I was through college Uncle Frank would have a job for me. However, my roommate was insistent. And so, to be a good fellow, I drifted into a business to which twenty-four hours before I had never given a thought.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/two-people-surprised.png&quot; alt=&quot;Dall-e2 Query: hatching style, two men standing, one surprised&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, two men standing, one surprised]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It was a wholesale hardware business. Joe and I began together in the shipping room and were promoted step by step until, within a few months of each other, we were sent out on the road. Both of us were well liked by the merchants with whom we dealt, were reasonably satisfactory from the standpoint of the house, and my six years on the road were on the whole the happiest I had known up to that time. I visited my customers in their homes, played with their youngsters, and I don’t know how their wives had managed to keep house at all before I began my visits.&lt;/p&gt;

&lt;p&gt;“When you’re in New York, would you mind matching this piece of goods for me?” one of them would say.&lt;/p&gt;

&lt;p&gt;Of course I wouldn’t mind! Anything to oblige the wife of a customer.&lt;/p&gt;

&lt;p&gt;Such shopping commissions represented only a small part of the troubles my good nature brought onto my shoulders, however. I arranged reservations on ocean liners; I purchased new books for customers who read; and secured front-row theatre tickets for those who were going to be in New York. I attempted to collect — for friends — bad debts in towns on my route. I trimmed show windows at night for merchants who were up at the club playing poker when they ought to have been down at the store trimming their own show windows.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/guy-on-phone-stressed.png&quot; alt=&quot;Dall-e2 Query: hatching style, man on the old style phone stressed&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, man on the old style phone stressed]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In short, I was to the people who did business with me what my father had been to the people who traded with him — a good-natured drudge who might be imposed upon without limit.&lt;/p&gt;

&lt;p&gt;With it all I seemed to be making progress, for when Joe was appointed general manager, I was brought into the home office as assistant general manager of sales. The promotion was a surprise to me; and with the other good things that followed in the next eighteen months my life seemed to lack for no blessing. I met the loveliest girl in the world; we were engaged, and married, and began the happy process of paying for our own home.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/couple-in-front-of-home.png&quot; alt=&quot;Dall-e2 Query: hatching style, newly wed couple in front of home, black and white&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, newly wed couple in front of home, black and white]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I have heard that tramps have a private code by which they designate the character of households with chalk marks on the front gate posts. One symbol means, “Bad dog here.” Another means the house is inhabited by an old maid from whom no kindness may be expected. Then there is a shining mark of some sort which indicates that the home owner is just that — a shining mark.&lt;/p&gt;

&lt;p&gt;Some such code, written or understood, must prevail among folks who want to unload their petty difficulties onto someone else. I have had men, whose names I never had heard, call me up and say: “I am a cousin of John Mifflin. John told me how you fixed him up with a couple of theatre tickets when he was in town last summer. He said he knew you would be glad to take care of me if I would give you a ring. John certainly thinks a lot of you; says you’re the most accommodating fellow in the world.” I have had women, whose husbands were merely casual acquaintances telephone my home at midnight to say that these same husbands had been arrested for speeding, and wouldn’t I please get hold of my friend, Judge Ingersoll, and see what I could do. I have had men who were distant relatives of men whom I had met only once or twice in my life ask me for letters of introduction to business executives whom I hardly knew at all.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/family-guy-on-phone-stressed.png&quot; alt=&quot;Dall-e2 Query: hatching style, man on phone stressed, family in background&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, man on phone stressed, family in background]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Little by little, my office became a kind of rendezvous for people of all sorts who had odd jobs to be attended to or favors to be secured. I never realized to what extent the demands were increasing; it never occurred to me that, in being over-kind to every Tom, Dick, and Harry who applied to me, I was being unkind to the boss who paid my salary and to the wife who waited dinner until the dinner was spoiled.&lt;/p&gt;

&lt;p&gt;Such a situation could have but one outcome. Sooner or later there was bound to be a decided crash. It came suddenly, and in a way which I could not possibly have anticipated. Joe’s father, the president, and chief stockholder in the business, died, and Joe became president in his place. That I would succeed him as vice president and general manager seemed a natural expectation. We had been room mates at college. Entering the business together we had come up through the different departments side by side. There was a general assumption that Joe would want me at his right hand.&lt;/p&gt;

&lt;p&gt;Just after the funeral, while Joe was still away from the office, I was called West on a trip that was partly business and partly a personal favor to one of my friends. I was delayed for more than two weeks, and when I returned to the office it was evident at once that something had happened. The greeting of the girls at the reception desk, the quizzical glances of one or two men whom I passed in the hall — all these were straws indicating that things were not right. As soon as I reached my own office my secretary told me. The Western manager had been called into headquarters and made vice president and general manager. Joe, my own college mate and friend, had betrayed me while I was away!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/woman-telling-man.png&quot; alt=&quot;Dall-e2 Query: hatching style, woman standing over man at desk, bad news&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, woman standing over man at desk, bad news]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;She had hardly finished speaking when my telephone rang and Joe’s voice asked if I would see him in his own office. I went down the corridor hurt, angry, and reproachful. As I opened the door Joe stepped forward and took me by the hand, calling me by the old college nickname. I recoiled; the show of affection seemed merely an added blow. Yet his obvious sincerity softened my mood in spite of myself.:. A moment later we sat facing each other across the desk that had been his father’s and now was his.&lt;/p&gt;

&lt;p&gt;For the first time in my life, I realized how much he resembled his father — in build, in the lines of his face, and in the swift, sure action of his mind. The discovery startled me. Joe had grown up! He had become a business executive, facing things in a mature business way. While I, carried along on the easy tide of routine and pleasantries, had remained, in a sense, a boy.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/two-men-sitting-at-desk.png&quot; alt=&quot;Dall-e2 Query: hatching style, two men sitting at desk, compassion&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, two men sitting at desk, compassion]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;He drove straight at the heart of the matter in a way that reminded me of his father even more.&lt;/p&gt;

&lt;p&gt;“I have made Daugherty general manager, Bert,” he began. “I wanted to tell you about it before it happened, but you were away and I couldn’t wait. I know you had many reasons to suppose that you would have the place. Until a few weeks ago I never had thought of anyone else for it. But my father thought otherwise. I appointed Daugherty in deference to his wish.”&lt;/p&gt;

&lt;p&gt;I straightened up in amazement. His father had been almost like a father to me as well. I had done a thousand personal kindnesses for him. . . .&lt;/p&gt;

&lt;p&gt;“Six weeks ago, Father knew from his physicians that there was no hope,” Joe continued quietly. “He sent for me, and we had a frank talk about the business. If I live to be a hundred I shall never forget the calm courage with which he faced the thing. We talked about you, Bert, and I told Father that I had always hoped you could come up to the top of the business with me. When I said that, the old man shook his head.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/two-men-heartfelt-convo.png&quot; alt=&quot;Dall-e2 Query: hatching style, two men at desk, heartfelt conversation&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, two men at desk, heartfelt conversation]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;“‘I love him, Joe,’ he said to me. ‘I love him almost as if he were my own boy. But he’s got something to learn before he is fit for a responsibility such as that. He’s the nicest fellow in the world, and when you have said that you have praised him and condemned him in the same breath. He is everybody’s friend to such an extent that he is a very poor friend to himself. It was written a long time ago that no man can serve two masters. Bert, in his good-natured way, is trying to serve a thousand.’”&lt;/p&gt;

&lt;p&gt;I need not report the conversation in detail. It began in Joe’s office, continued over the dinner table at the club, and ended at his front door, after we had walked together for hours up one street and down another, talking with a frankness such as few men ever achieve in their lives. And when at last he gripped my hand and left me, I continued the walk alone until in the cold gray morning I reached my decision to retire from the business of being a Good Fellow. That, as I said at the beginning, was five years ago.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/walking-man.png&quot; alt=&quot;Dall-e2 Query: hatching style, man walking in city, looking down street, contemplation&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, man walking in city, looking down street, contemplation]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I am afraid some reader may imagine that from being a good-natured friend of humanity I became all at once an unobliging and purely self-centered individual. That, I am sure, is not the case. I am giving away more money to-day in various sorts of charities than at any previous period of my life. I have helped more young men to find positions in the past year than in any previous year. I have added two invalids to my permanent roll of pensioners, and taken on a nephew whose college expenses I am helping to defray. I am not a dried-up, inhuman wretch. But I have made the big important shift in my life, just the same. I control my charities now; they do not control me. I am master of my time; it is not wasted wantonly among a thousand thoughtless folks. And while I find ways to do more than ever for those who really deserve help — the young, the sick, and the bereaved — I no longer allow myself to be sacrificed by the selfish demands of those who are perfectly able to take care of themselves.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/confident-man.png&quot; alt=&quot;Dall-e2 Query: hatching style, happy man, confident, boss&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, happy man, confident, boss]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Three things were very clear to me in that night of self-examination five years ago. First: A man’s chief loyalty must be to the woman who has joined her life to his; to the children who call him father; and to the business which feeds and clothes and houses them all. In my easy-going willingness to befriend the world at large, I was sacrificing my wife, my children, and my employer far more than I was sacrificing myself. As I look back, I marvel that my wife and the children should have borne with me as uncomplainingly as they did.&lt;/p&gt;

&lt;p&gt;What was true of my family was true of the business as well. I thought I was being friendly to the customers of the house. As a matter of fact, I was too often being friendly to the customers at the expense of the house. It is a common fault in salesmen. They let a thousand trivial demands on the part of the men to whom they sell take their time and energy from the business of the men for whom they sell.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/heart-to-heart-talk.png&quot; alt=&quot;Dall-e2 Query: hatching style, confident man walking, waving&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, confident man walking, waving]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Second: I am convinced that indiscriminate charity, whether one gives money or time — which is life itself — merely pauperizes the recipients. The business and social world are full of respectable panhandlers, who will take and take and take, just as long as they can find anyone to give. I gave to them for years, at the expense of those who had a far better claim upon my generosity. I am still willing to help any man who honestly needs help. But as for the strong, perfectly well, and perfectly capable human beings who have chosen to ride through the world on someone else’s back, they will have to look for another beast of burden. They can buy their own theatre tickets, write their own letters of introduction, make their own hotel reservations, use somebody else’s office instead of mine for their engagements, and borrow money from the banks which are in business to lend.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/no-thank-you.png&quot; alt=&quot;Dall-e2 Query: hatching style, confident man saying no thank you&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, confident man saying no thank you]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And, finally, I am persuaded that no one ever achieves anything worth-while in this world unless he has so great a respect for his work that he compels all other men to respect it. Unless, in a word, he commands his time. Read the life of a great scientist like Agassiz. Was he forever at the world’s beck and call? Not for a single day. To letters inviting him to write, or to lecture for money, he replied that he had no time for those things. He was the custodian of a certain number of days — a number far too small for the great task he had laid out for himself — and he would not be diverted even for an instant.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/man-with-clock.png&quot; alt=&quot;Dall-e2 Query: hatching style, man smiling next to clock&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, man smiling next to clock]&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was explaining this point of view to a good old aunt of mine one afternoon and she exclaimed: “But, Joe, it is so selfish for a man to put his work ahead of everything! It’s unchristian.”&lt;/p&gt;

&lt;p&gt;“On the contrary, it is Christian in the very finest sense,” I replied. “What was it that Jesus said when his parents rebuked him for his failure to keep his engagement with them on that first journey down from Jerusalem? ‘Wist ye not that I must be about my Father’s business?’ He demanded. He had work to do — great work and little time in which to do it. Even He was no exception to the eternal rule that achievement comes only through the subordination of every power to a great ideal; and that no man is really obliging who does not first discharge in full his obligations to his work.”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/divine-man.png&quot; alt=&quot;Dall-e2 Query: hatching style, man divine feeling, ascending&quot; /&gt;
&lt;em&gt;[Dall-e2 Query: hatching style, man divine feeling, ascending]&lt;/em&gt;&lt;/p&gt;

</description>
        <pubDate>Sat, 04 Mar 2023 08:19:54 +0000</pubDate>
        <link>http://mikepland.com/dall-e/short-story/hacker-news/2023/03/04/Using-Dall-E2-For-AI-Image-Generation/</link>
        <guid isPermaLink="true">http://mikepland.com/dall-e/short-story/hacker-news/2023/03/04/Using-Dall-E2-For-AI-Image-Generation/</guid>
      </item>
    
      <item>
        <title>PRESS RELEASE - Introducing HN Kotlin Bot</title>
        <description>&lt;p&gt;Today we are pleased to announce that due to significant demand we are adding a &lt;strong&gt;NEW BOT&lt;/strong&gt; to the HN Bot family. This is our second Bot here at HN Bot Industries, our original bot, &lt;a href=&quot;https://www.twitter.com/hn_vimmy_bot&quot;&gt;HN Vimmy Bot&lt;/a&gt;, in just one year, has grown to become a beloved addition to twitter feeds all over the world. We are looking to bring that same magic with our new bot.&lt;/p&gt;

&lt;p&gt;Many of you are familiar with Kotlin, while others may be hearing about it for the first time. We at HN Bot Industries have seen increased buzz around Kotlin. Over the past 6 months Hacker News has been filled with active discussion threads around the &lt;a href=&quot;https://kotlinlang.org/&quot;&gt;Kotlin Programming Language&lt;/a&gt;. Thanks to the hard work of our technical and design crew, we are rolling out our newest bot ahead of schedule.&lt;/p&gt;

&lt;p&gt;We give you…&lt;/p&gt;

&lt;h1 id=&quot;hn-kotlin-bot&quot;&gt;HN Kotlin Bot&lt;/h1&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;et&quot; dir=&quot;ltr&quot;&gt;Kotlin Programming Language&lt;br /&gt;💬 &lt;a href=&quot;https://t.co/MPUye3OKID&quot;&gt;https://t.co/MPUye3OKID&lt;/a&gt;&lt;br /&gt;🔗 &lt;a href=&quot;https://t.co/th0Ymwomri&quot;&gt;https://t.co/th0Ymwomri&lt;/a&gt;&lt;a href=&quot;https://twitter.com/hashtag/HackerNews?src=hash&quot;&gt;#HackerNews&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/Kotlin?src=hash&quot;&gt;#Kotlin&lt;/a&gt;&lt;/p&gt;&amp;mdash; HN Kotlin Bot (@HN_Kotlin_Bot) &lt;a href=&quot;https://twitter.com/HN_Kotlin_Bot/status/866491686561751040&quot;&gt;May 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;As you can see, our design crew kept the wildly popular format of the story and discussion link together in the same tweet. While seen as controversial by some, we have adopted this format as a means to bring you the &lt;strong&gt;hardest hitting&lt;/strong&gt; Tweets available. Many say it’s thanks to our efforts that this format has become so powerful. After all this format has shown to increase a tweet’s potency ten fold… and we’ve been using it for a year, let that sink in.&lt;/p&gt;

&lt;p&gt;Since 2016 HN Bot Industries had been bringing you the latest in HN Bot Technology.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Innovative Story AND Discussion Link Hybrid Format&lt;/li&gt;
  &lt;li&gt;New Enhancements mean you’ll always see fresh content&lt;/li&gt;
  &lt;li&gt;99.99% Uptime Reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Follow HN Kotlin Bot Here&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/HN_Kotlin_Bot&quot; class=&quot;twitter-follow-button&quot; data-show-count=&quot;false&quot;&gt;Follow @HN_Kotlin_Bot&lt;/a&gt;&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;We at HN Bot Industries look forward to contributing to the active Kotlin Community.&lt;/p&gt;
</description>
        <pubDate>Sun, 21 May 2017 12:07:54 +0000</pubDate>
        <link>http://mikepland.com/kotlin/bots/hn-bots/hacker-news/2017/05/21/PRESS-RELEASE-Introducing-HN-Kotlin-Bot/</link>
        <guid isPermaLink="true">http://mikepland.com/kotlin/bots/hn-bots/hacker-news/2017/05/21/PRESS-RELEASE-Introducing-HN-Kotlin-Bot/</guid>
      </item>
    
      <item>
        <title>Learn Craps Yo - Patient Dealers Teaching Craps On A Mobile App</title>
        <description>&lt;p&gt;Craps is a fun game, I should know, once upon a time I was a Craps Dealer before getting into iOS development. I wanted to create a Craps game that could FULLY teach Craps. Game integrity is very important, some of the other Craps games on the app store have glaring errors which allow for moves which would never be allowed on a real Craps table, not to mention there is little, if any, actual guidance.&lt;/p&gt;

&lt;p&gt;This is why I created &lt;a href=&quot;http://craps.education&quot;&gt;Learn Craps Yo&lt;/a&gt;, to fully teach Craps in a risk-free environment, with 100% game integrity, all under the helpful guidance of friendly dealers.&lt;/p&gt;

&lt;p&gt;In my experience the tough thing about teaching someone Craps is the fact that when teaching &lt;a href=&quot;http://craps.education/how-do-i-play-craps/passline-bet&quot;&gt;the Pass Line&lt;/a&gt; (the most fundamental bet), the winning number changes, that is to say there are two different states to the game, the Come Out Roll (the first part), and once a Point has been established (the second part). This created a situation where it is very helpful to teach, while actually playing Craps.&lt;/p&gt;

&lt;p&gt;Now with Learn Craps Yo there are dozens of friendly dealers available ready to walk you through each and every bet, all in a convienent iPhone/iPad app.&lt;/p&gt;

&lt;p&gt;Interested in Craps? Download Learn Craps Yo Today!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://geo.itunes.apple.com/us/app/learn-craps-yo/id943996740?mt=8&quot; style=&quot;display:inline-block;overflow:hidden;background:url(http://linkmaker.itunes.apple.com/images/badges/en-us/badge_appstore-lrg.svg) no-repeat;width:165px;height:40px;&quot;&gt;&lt;/a&gt;&lt;/p&gt;

</description>
        <pubDate>Tue, 24 May 2016 12:07:54 +0000</pubDate>
        <link>http://mikepland.com/learn-craps-yo/product/2016/05/24/learn-craps-yo-patient-dealers-teaching-craps-on-a-mobile-app/</link>
        <guid isPermaLink="true">http://mikepland.com/learn-craps-yo/product/2016/05/24/learn-craps-yo-patient-dealers-teaching-craps-on-a-mobile-app/</guid>
      </item>
    
      <item>
        <title>HN Vimmy Bot Now Tweets Hacker New Discussion Link Along With Story Link</title>
        <description>&lt;p&gt;By popular demand, HN Vimmy Bot will now Tweet the Hacker News discussion link along with the link to the story. This means you will get all the great Vim tweets you got before, only from now on it will be accommodated with a link to the associated Hacker News discussion thread. No more searching for that discussion link, now it’s right in the tweet.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;YOU ASKED FOR IT, NOW IT’S HERE&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Monday afternoon a short 20 minute Twitter poll was conducted to gauge the interest of including a discussion link. The results were unanimous, the message was clear, followers of HN Vimmy Bot overwhelmingly supported the purposed measures.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Should HN Vimmy Bot serve HN discussion link with story link? Downside is there is no preview on story link&lt;/p&gt;&amp;mdash; HN Vimmy Bot (@HN_Vimmy_Bot) &lt;a href=&quot;https://twitter.com/HN_Vimmy_Bot/status/732245668245426177&quot;&gt;May 16, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;This is wonderful news for all of HN Vimmy Bots followers, their voices were heard and now HN Vimmy Bot will better suit the needs of his followers.&lt;/p&gt;

&lt;p&gt;Are you interested in Vim Stories on Hacker News? Be sure to follow HN Vimmy Bot on Twitter.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/hn_vimmy_bot&quot; class=&quot;twitter-follow-button&quot; data-show-count=&quot;false&quot; data-size=&quot;large&quot;&gt;Follow @hn_vimmy_bot&lt;/a&gt;
&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?&apos;http&apos;:&apos;https&apos;;if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+&apos;://platform.twitter.com/widgets.js&apos;;fjs.parentNode.insertBefore(js,fjs);}}(document, &apos;script&apos;, &apos;twitter-wjs&apos;);&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Read more about HN Vimmy Bot &lt;a href=&quot;/hn-vimmy-bot&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Mon, 16 May 2016 08:04:54 +0000</pubDate>
        <link>http://mikepland.com/hn-vimmy-bot/product/2016/05/16/HN-Vimmy-Bot-Now-Tweets-Hacker-News-Discussion-Link-Along-With-Story-Link/</link>
        <guid isPermaLink="true">http://mikepland.com/hn-vimmy-bot/product/2016/05/16/HN-Vimmy-Bot-Now-Tweets-Hacker-News-Discussion-Link-Along-With-Story-Link/</guid>
      </item>
    
      <item>
        <title>Just people saying your idea is good, doesn&apos;t make it good</title>
        <description>&lt;p&gt;People telling you, “good idea”, is NOT a reliable metric for the market viability of your idea. Another approach is to generate a hypothesis of the problem, what exactly is the problem you are trying to solve? Ask yourself, what group of people would really benefit from this proposed solution? THEN you go and find those people and interview them.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;People telling you, “good idea”, is NOT a reliable metric for the market viability of your idea.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So you interview these people about problem X, which is so horrible they are taking time out of their day to talk to you about it. Once they have explained what they are dealing with, getting as much info you can on the problem, what solutions have they tried in the past, why had they not worked? Then once that is complete, you could show them some mockups of your proposed solution, ideally they would be really thrilled and want to get their hands on it right away.&lt;/p&gt;

&lt;p&gt;After some interviews, you put all the valuable data into action with an MVP or Minimum Viable Product. Your MVP is an illusion of your full offering. It’s a test app, just a simple, slimmed down app, with only one function, and one purpose, to solve problem X.&lt;/p&gt;

&lt;p&gt;Likely in the beginning you won’t have fancy algorithms running the backend of your app, it will be you, think of it as a Human Driven Backend. You essentially want people to PROVE how seriously they want YOUR solution. Sure they say they like it, they say it’s good. But are they willing to actually pull out their phone, open your app, make a few taps, in order to solve that problem. How bad do they want it?&lt;/p&gt;

&lt;p&gt;An MVP is a great way to test the market viability of your product, it’s far more reliable than people telling you your idea is good.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I make MVPs, Independent iOS developer, influenced by &lt;a href=&quot;https://en.wikipedia.org/wiki/Lean_startup&quot;&gt;The Lean Startup&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://mikepland.com/contact/&quot;&gt;Contact me&lt;/a&gt; for free consultations&lt;/em&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 17 Mar 2016 13:24:29 +0000</pubDate>
        <link>http://mikepland.com/mvp/product/2016/03/17/People-saying-your-idea-is-good-doesnt-make-it-good/</link>
        <guid isPermaLink="true">http://mikepland.com/mvp/product/2016/03/17/People-saying-your-idea-is-good-doesnt-make-it-good/</guid>
      </item>
    
  </channel>
</rss>
