Coding with o1-preview

o1-preview is the most recent model released by OpenAI as of this writing. Less a model than a GPT wrapped in the API that runs your query through multiple steps on OpenAI’s end instead of you doing it yourself.

I think they may have made adjustments, because it has been getting better for me.

I’ve used o1-preview extensively for a Python script to search a disk for duplicate files. It is 443 lines of actual code at this point. The script is moderately complex, allowing users to choose originals based on path, a preferred list of directories, or within a specific directory, delete duplicates, have a dry run, and more. These features require tracking a small set of variables from start through finish to insure proper processing.

Not a big deal for most humans, but something I’ve found LLMs to struggle with in the past. It’s been like they can only keep track of the changes in one or two of the most recent functions they’ve seen. o1 doesn’t seem to have this problem.

My conversation is over 8,000 lines long, and with every change it has properly tracked the context of the entire script at once. Any changes I’ve asked it to make that require updating multiple functions its handled perfectly. It’s accuracy has been very high, with only a single mistake made that I’ve spotted.

This isn’t revolutionary, but it is a major step forward, and I believe will allow much faster development of simple to moderate-complexity scripting, even for non-devs.

Not the Way to M&A

As a small business, we work with a lot of other local small businesses. For many owners, exiting (selling) is essentially their retirement plan. I fully believe owners should be able to exit their business at a healthy price.

But how they exit matters.

Last week I recieved an email from a business we’ve partnered with for well over a decade. TThey handle both my personal and business accounts. I noticed that the email said, “A [national brand] company.”

Huh?

Well, this business had sold to a national company without notifying anyone.1 Nothing on their blog, nothing on their social. media, no email announcements. Just that small change in their email signature and attachments. I suspect this was required because the industry is regulated, and they need to disclose who ultimately provides the product.

The new owners had a small press release where they quote the original owner/founder:

“Our clients were at the forefront of our decision to join [national brand] due to today’s ever changing insurance environment,” says [former owner] Principal and Founder of [local small business]. “… and we are excited to bring world-class resources and expertise with our same local support to the business-owners, non-profits and individuals we serve.”

If clients like me were truly at the forefront, we would have been informed about the acquisition. It wouldn’t have been hidden.

M&A deals are complicated, I get that. It’s important for owners to receive fair value for what they’ve built and the risks they’ve taken. But these “thief-in-the-night” acquisitions leave a bad taste in my mouth.

I have no timeline for exiting my own firms, but when that day comes, I hope I am proud enough of the transition to celebrate it with my clients and employees, rather than hide it

  1. As far as I can tell. ↩︎

ConnectWise Purchases Axcient

On September 10th, 2024 ConnectWise announced they purchased Axcient. I’m neutral on this having very limited experience with ConnectWise. Their announcement email is here.

I suspect Axcient was in need of capital. Over the last couple of years many MSPs moved from Datto BCDR and SaaS backups to Axcient which offers essentially the same thing. While Axcient’s GUI is nowhere near as streamlined. as Datto’s, they offer lower pricing, better terms and better support. Before the acquisition by Kaseya, Datto would have won in those areas, except pricing, where they always demanded a premium.

I’m entirely OK with another conglomerate arising in the channel to challenge Kaseya. I’m not reflexively anti-Kaseya. We use many of their products and we have a good relationship with their director-level management. However, it isn’t healthy for the ecosystem to lack competition, not just in terms of products, but in terms of vertical integration and deep-pocketed investors.

Misleading Facebook Post: US Poverty is Driven y Politics

There is a Facebook post going around that deceptively shows US states by poverty to imply that Republican politics introduce poverty. Here is the post/list:

A screenshot displaying a list titled "List Of the US States With the Highest Poverty Rates." It enumerates twelve states with their respective poverty rates in descending order: Mississippi at 19.58%, West Virginia at 17.10%, Arkansas at 16.08%, New Mexico at 18.55%, Louisiana at 18.65%, Kentucky at 16.61%, Alabama at 15.98%, Oklahoma at 15.27%, South Carolina at 14.68%, Tennessee at 14.62%, North Carolina at 13.98%, and Georgia at 14.28%. The list is followed by a comment from "The Other 98%" with a timestamp indicating "12 August at 10:13" and a pondering emoji, stating "wonder what they all have in common 🤔".

This list cuts off arbitrarily to make a point. While there may be truth in the larger picture, selectively using data to make your point isn’t cool.

First, let’s expand the list1:

State or territoryPopulationPopulation under
poverty line
Poverty rate
 Puerto Rico3,227,4571,400,95843.41%
 Mississippi2,883,074564,43919.58%
 Louisiana4,532,187845,23018.65%
 New Mexico2,053,909381,02618.55%
 West Virginia1,755,591300,15217.10%
 Kentucky4,322,881717,89516.61%
 Arkansas2,923,585470,19016.08%
 Alabama4,771,614762,64215.98%
 District of Columbia669,089103,39115.45%
 Oklahoma3,833,712585,52015.27%
 South Carolina4,950,181726,47014.68%
 Tennessee6,603,468965,21314.62%
 Georgia10,238,3691,461,57214.28%
 Texas28,013,4463,984,26014.22%
 Arizona7,012,999990,52814.12%
 North Carolina10,098,3301,411,93913.98%
 Michigan9,753,5411,337,25613.71%
 Ohio11,350,3781,546,01113.62%
 New York19,009,0982,581,04813.58%
 Florida20,793,6282,772,93913.34%
 Missouri5,942,813772,99213.01%
 Indiana6,491,632838,14912.91%
 South Dakota849,910108,86312.81%
 Montana1,036,490132,47612.78%
 Nevada2,987,817381,69512.78%
 California38,589,8824,853,43412.58%
 Oregon4,096,744506,55812.36%

There is no shortage of blue states in that list.

The overall US poverty rate is 13.15%, and guess what? There are plenty of red states below that. Here is the visualization:

United States map showing the percentage of population below the poverty line by state, based on the American Community Survey from 2016 to 2020. States are color-coded to indicate poverty levels: dark red for 18% or more, red for 16% to 18%, orange for 14% to 16%, light orange for 12% to 14%, and pale orange for less than 12%. The overall percentage of Americans living below the poverty line is 13.1%. The top five states with the highest poverty rates are Mississippi at 19.6%, Louisiana at 19.0%, New Mexico at 18.4%, West Virginia at 17.1%, and Kentucky at 16.3%. The bottom five states with the lowest poverty rates are New Hampshire at 7.2%, Utah at 8.9%, Maryland at 9.0%, Minnesota at 9.3%, and New Jersey at 9.5%.

But that still doesn’t tell a good story, here is povery by county:

Heat map of the United States showing the percentage of the population living below the poverty line by county, based on data from the American Community Survey 2016-2020. Darker shades of red indicate higher percentages of poverty. The map legend indicates that red tones range from light (less than 5% poverty) to dark (30% or more poverty). The overall percentage of Americans living below the poverty line during this period is noted as 13.1%. The image also includes a reference to New York City for geographical context.

With the data provided you could conclude that poverty is driven by politics.

Atlanta has a poverty rate of 17% compared to 12.3% for GA overall even though Atlanta is blue.

Or you could conclude that it’s due to race.

Or you could conclude that it’s due to geography.

This isn’t even adjusted for the cost of living!

This article from Time shows CA, FL, MI and NY as the states with the four highest poverty rates after such adjustments.

Like nearly every political issue in the news today the data is nuanced and the causes are nuanced.

P.S. You can find fuller data on the adjusted measure (SPM) at the US Census Bureau – https://www.census.gov/topics/income-poverty/supplemental-poverty-measure.html

  1. Via Wikipedia which takes it from the US Census Burea ↩︎

Guess What? EVs Are Useful

Illustration of an electric car charging at a home charging station with a family in the background. A man is reading a newspaper in the foreground, and two people are seated on the porch using a laptop and a tablet. The setting is a residential area during the evening.

WSJ out with an article where the author finds that — surprise! — EVs are useful today even without as many charging stations as there are gas stations:

The surprise was that—for seven days of errands, pickups, and even a lengthy road trip—being limited to charging at the slowest possible rate was just fine, and my inability to fast charge away from home was a nonissue.

First — yes, the average American driving range is so low, 30-40 miles a day, that a gas car with a 3-gallon tank would be sufficient for most daily needs, much less an EV with a 200-300 mile range.

Second, it’s nice to see the Journal have at least one reporter understand that EVs aren’t just to fight climate change, although that matters, they are actually nice cars in their own right.

Don’t Kill All Your Zombies

Image from Negative Space at Pexels.

The WSJ ran a story about the risks associated with old online accounts, often referred to as “zombie” accounts. They recommend deleting these old accounts.

We may forget about them, but these accounts pose a risk. They make us more vulnerable to criminals who want to steal the personal data stored there, from our passwords to our contact information to even our credit-card numbers.

This statement isn’t wrong but it is incomplete.

I do not recommend that people delete their old social media accounts. You want to control your online presence, when you delete an old account you make it possible for someone else to pick up the same username at that sight and pretend to be you. Worse, anyone that knew you at that username would not easily know it wasn’t you.

I once had someone signup for an Instagram account with an old email address of mine, which I still controlled. It was faster for me to take over their account through a password reset than to get it shut down. To this day, I have control of the account.

So what do you do instead?

The Journal also fails to note that people at the highest risk of—those that reuse passwords—probably have their passwords on the dark web already. Deleting that MySpace account from 20 years ago was already exposed in 2016.

  • Remove saved credit cards from your old sites.
  • Change the password to something long and random.
  • Make sure 2FA is on.
  • Make sure your contact information is up to date, especially your email and cell phone number.

There may be other reasons to delete those accounts. If you have messages, search history or purchased products you don’t want to see public ditching those accounts make may sense. But remember, the other person on that message still had their copy which also means that the site keeps a copy. Deleting the account may or may not delete your data.

Note: my advice doesn’t apply to all sites. Deleting your accounts at old shopping sites or places where you signed up for a 30-day trial and no more makes plenty of sense.

At the end of the day you will need to use your own common sense. Don’t take the advice of the Journal—or mine—blindly.

Coding with Copilot and ChatGPT

I love coding with AI.

There, I said it. “You’re not a real developer,” I can hear you saying. And no, my profession is not primarily development1, but development definitely makes my job in IT easier.

Here are some tips that will make Copilot and ChatGPT code faster, better and more accurately for you.

Start with a Readme

When you can, start with a readme that explains what your project or script will do, before you write a single line of code. In this project, the readme was the very first file I made. I then pasted it into ChatGPT and asked that ChatGPT write a script to match.

Use examples in the readme: what do you want the syntax to be? Are there code examples of JSON or expected output you want to see? Start with the end in mine, and describe it as much detail as matters to you for the output.

Examples, Specifically

Both Copilot and ChatGPT work very well with examples. If you want to see a specific output, show it an example of what you want. If you were writing an API that exposes an endpoint with user data you might tell ChatGPT something along the lines of:

This is an unfinished endpoint to return user data from this project through a restful API. Clients expect to see JSON responses such as:
{
   "user": "[email protected]",
   "id": "some-guid",
   "phone": "555-123-1234",
   "nickname": "JD",
   "favorite color": "blue"
}

Some attributes are optional, so responses like this are also valid:
{
   "user": "[email protected]",
   "id": "another-guid"
}

Comments Galore

Comments seem to make both Copilot and ChatGPT better so I use them liberally. When ChatGPT gives me output I ask it to comment the code for a “junior developer.” In Python I have it generate docstrings for each function (documentation that describes what the function does).

With Copilot, comments can write your code for you. Write a comment like:

# Regex to separate split emails from domains, then put the domains into a sorted list

and then just wait for the autocomplete to give you the correct code, such as:

pattern = r'@([a-zA-Z0-9.-]+)'
domains = re.findall(pattern, emails)
sorted_domains = sorted(domains)

I also add examples and documentation in comments when I think the reference will help. If I am consuming a JSON API I may write:

def SaveAPIResponse(*args):
"""Takes the json response from Acme API and saves to the database.
A sample response would be:
{
   "user": {
      id": 12345,
      "username": "johndoe",
      "email": "[email protected]",
      "firstName": "John",
      "lastName": "Doe",
      "createdAt": "2024-08-05T22:04:55Z",
      "github": "johndoe"
     }
}
"""

You’ll see the accuracy explode.

One Thing at a Time

For the first couple of responses you can ask ChatGPT to output a lot, a 100+ lines of code isn’t crazy. When you get to troubleshooting, feed it one section at a time.

For instance, in my most recent project I decided to have ChatGPT write unit tests for me — because who likes writing those? They didn’t all work correctly, so I gave it one failing test at a time, correct either the test or the original code, and then went on to the next test.

Even when there is a similar root issue, one at a time is usually better.

Know When to Restart

For a certain amount of time ChatGPT seems to be more accurate with the more information you give it. But at some point in the conversation it seems to suffer from brain fog and stops any critical thinking and gives recycled output2. At this point, start a new chat.

Don’t just pick it up again, start fresh.

Your new chat might start like, “I’m picking up this project from another developer. She was working on adding feature XYZ to the script below. Will you check for errors and then finish the function? <paste the script>”

If relevant, include the readme or other documentation (again). “She left me these notes…” (This is also where it can be helpful to have documentation in comments, such as those above)

Prep Materials with AI

Sometimes you may have a lot of material or code to go through and you don’t want to muddy up the conversation. Just use a separate chat. For example, I may take a large snippet of JSON and ask ChatGPT to write documentation on the structure of it, and then use that documentation in my readme.

I might take a 100+ lines of JSON from something like this, and then ask ChatGPT to “write documentation for this JSON from the provider’s perspective, as through a restful API.” Then I’ll take that output and put it in the readme or the comments.

It keeps the main conversation from getting brain fogged, and should give you some clear output about expectations as well.

  1. If you look at my Github you will see projects such as this WordPress plugin that uses ChatGPT to add alt text to images, a docker/syslog project, a Dehashed command line API client, and more. I’m not alien to programming either. ↩︎
  2. Yes I know ChatGPT doesn’t “think” but I don’t know what to call an. AI that is essentially emulating brain fog… ↩︎

Roaring Kitty, Stock Manipulator?

The WSJ reports (gift link for paywall) that E*Trade is thinking about kicking Keith Gill — better known as Roaring Kitty or DeepFuckingValue — off of its platform. Gill is largely credited with driving the GameStop stock price to unrealistic levels, as evidenced by a PE ratio of 1,320 on June 4, 2024.

E*Trade is asking whether or not Gill manipulated the stock price, presumably via his Reddit and Twitter posts, especially after he resurfaced after silence for three years.

It is possible that Gill will find himself under an SEC investigation for this very question, especially now that he has 120,000 GameStop options worth $289 million. Gill will probably respond along the lines of, (1) he can’t be held responsible for what hundreds or thousands of amateur investors do, and (2) out of 306 million shares outstanding his portion is tiny and unable to influence the market.

But at this point his following is loyal and many will follow his lead, which will affect the stock price, where volume now exceeds 25 million. For comparison, Apple has 15 billion shares outstanding, approximately 50 times more than GameStop, with a trading volume of 62.5 million, which is less than three times that of GameStop.’s. Or more simply, Gill tweets and GameStop trading volumes goes through the roof.

It’s clear that Gill can significantly influence GameStop trading.

I don’t know if Gill is acting in good faith or not, I do know that he is in a position where he can influence this stock, and probably dozens of others that have prices low enough and some other measure of volatility that can be exploited by amateur traders. He may not have always had the influence, but he now does whether he realizes it or not.

In other words, he has a responsibility to be prudent in communications that will impact the stock price.

It made me think of Elon Musk, another figure who is able to significantly influence stock prices with a tweet. He often seems clueless that his has such power. Again, I don’t know if this is in good fatih. Like Gill he didn’t always have that kind of power. In many of his actions, he seems unaware that the repercussions of his behavior, as the world’s richest man, are orders of magnitude greater than anyone else’s.

In other words, he has a responsibility to be prudent in communications that will impact the stock price.

Neither man seems to understand what their influence is, or if they do, understand the idea of prudence. (Or perhaps don’t care, I don’t know.)

Short Takes

Like Twitter, but only here.

🔓 Unlocked: Gambling!

The idea that Uber eats somehow gamiified and allowed me to unlock the ability to gamble always amuses me.

Screen displaying a status update for an order with an estimated arrival time of 7:50 PM and the latest arrival by 8:05 PM. Below the status, there is a promotional offer congratulating the user, Jonathan, on unlocking a Bet $5 Get $150 bonus offer with BetMGM. A 'Register Now' button is provided to take advantage of the offer. A disclaimer at the bottom indicates the promotion is for those 21 and older and provides a gambling problem helpline number.

Do We Want An Armed Europe?

Aaron MacLean in the WSJ with an op-ed reminding us what an armed Europe looked like in the 20th century. (And while he focuses on the 20th century the arguments would hole true for most of the previous 20 centuries)

He asks:

Do we want European states to rearm, to achieve something closer to strategic self-sufficiency, perhaps including nuclear proliferation to the east?

And reminds us:

Perhaps we forget the vast slaughterhouse into which the Continent transformed on two occasions in the first half of the last century

He concludes:

In the short run, the main risk is still that European nations will overfund their social priorities, underfund their security, and fail to deter further westward Russian expansion…

There is… a risk for a disengaged America even if Europe does rearm. Putting these countries on their own feet may merely be the prelude to their hands reaching for one another’s throats. The two possibilities aren’t mutually exclusive…

Report: no reason to fire Sam Altman

Ars Technica

After reportedly interviewing dozens of people and reviewing over 30,000 documents, [the legal firm hired to investigate Altman’s firing] found that while the prior board acted within its purview, Altman’s termination was unwarranted. “WilmerHale found that the prior Board acted within its broad discretion to terminate Mr. Altman,” OpenAI wrote, “but also found that his conduct did not mandate removal.”

I am neutral on Sam Altman as a whole. I think that this episode is a net—negative for keeping AI development in check — especially at Open AI, as Sam Altman now essentially seems invincible.

Slackb0t

Tom McKay successfully masqueraded as a “Slackbot” on Slack after leaving Gizmodo in 2022, going unnoticed by the site’s management for several months. The Verge reports: If you’re not glued to Slack for most of the day like I am, then you might not know that Slackbot is the friendly robot that lives in the messaging service. It helps you do things like set reminders, find out your office’s Wi-Fi password, or let you know when you’ve been mentioned in a channel that you’re not a part of. When it was his time to leave, McKay swapped out his existing profile picture for one that resembled an angrier version of Slackbot’s actual icon. He also changed his name to “Slackbot.” You can’t just change your name on Slack to “Slackbot,” by the way, as the service will tell you that name’s already been taken. It does work if you use a special character that resembles one of the letters inside Slackbot, though, such as replacing “o” with the Unicode character “o.”

🏈 2024 Super Bowl or The Moon 🌖

One small step for man, one giant touchdown for the Chiefs. (Also: That was the most relevant blocked extra point in the history of football) BBC:

Screenshot of a BBC news article with the headline "Super Bowl 2024 was most watched US TV broadcast since 1969 Moon landing," published 17 hours ago by Emma Saunders, Entertainment reporter. The accompanying image shows a group of excited fans, with one person in a red Kansas City Chiefs jersey with "CHAMPS" and the Super Bowl LIV logo on the hat, celebrating among the crowd.

Preliminary US TV ratings put Sunday’s game just behind Apollo 11’s historic landing, which was seen by an estimated 125 to 150 million people.

Athletic Brewing Companys Gets Its 15 Minutes

WSJ has an interesting article on Athletic Brewing Company, one of the premier non-alcoholic beer brewers in the US.

I won’t summarize the article, but I will say I’ve enjoyed Athletic’s beers since my cousin Drew introduced me to them a couple of years ago. They are easily better than O’Douls, which is Anheuser-Busch. They are easily better than anything Bud — or most mainstream brewers — make.

I’m not here to evangalize you on NA beers, but if you like beer and you want want to try something new, Athletic stands on its own. Find it at Target, Kroger, Total Wine.