tag:blogger.com,1999:blog-53361079390739730342024-03-16T03:45:45.302-04:00Dale SwansonThis blog exists purely as a place for me to dump random links and thoughts I have rather than emailing them to my friends. It'll have large amounts of inside jokes. Also there will probably be times when I write "you" or refer to an email. Just pretend that you are reading an email to you. If you don't know me you likely won't find anything here interesting. If you do know me you also will not find anything here interesting.Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.comBlogger1229125tag:blogger.com,1999:blog-5336107939073973034.post-48315474511988512072024-03-12T01:04:00.001-04:002024-03-12T01:04:00.135-04:00Inside North Korea's Forced-Labor Program<p></p><p><a href="https://www.newyorker.com/magazine/2024/03/04/inside-north-koreas-forced-labor-program-in-china">https://www.newyorker.com/magazine/2024/03/04/inside-north-koreas-forced-labor-program-in-china </a><br /></p><blockquote>In late 2023, an investigator hired by my team visited a Chinese plant
called Donggang Xinxin Foodstuff. He found hundreds of North Korean
women working under a red banner that read, in Korean, “Let’s carry out
the resolution of the 8th Congress of the Workers’ Party.” Soon afterward, the
investigator visited a nearby plant called Donggang Haimeng Foodstuff,
and found a North Korean manager sitting at a wooden desk with two
miniature flags, one Chinese and one North Korean. The walls around the
desk were mostly bare except for two portraits of the past North Korean
leaders Kim Il Sung and Kim Jong Il. The manager took our investigator
to the workers’ cafeteria to eat a North Korean cold-noodle dish called <em class="">naengmyeon</em>,
and then gave him a tour of the processing floor. Several hundred North
Korean women dressed in red uniforms, plastic aprons, and white rubber
boots stood shoulder to shoulder at long metal tables under harsh
lights, hunched over plastic baskets of seafood, slicing and sorting
products by hand. “They work hard,” the manager said. The factory has
exported thousands of tons of fish to companies that supply major U.S.
retailers, including Walmart and ShopRite.</blockquote><p></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-35484893866509497172024-02-24T22:00:00.001-05:002024-02-24T22:00:22.289-05:00Power Metal: is it really about dragons?<p><a href="https://notes.atomutek.org/power-metal-and-dragons.html"> https://notes.atomutek.org/power-metal-and-dragons.html</a></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-87085695501050672042024-01-18T00:38:00.000-05:002024-01-18T00:38:20.444-05:00Let´s play money making game.<p>I've recently been playing through the NES Legend of Zelda; a game I played <i>a lot</i> as a kid. In the preinternet era I somehow spent enough time in this game to know every secret, every hidden door, and could beat the game in a single play through.</p><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieN3SpAyKXJsKdsNd1BgFwT_yxoh-eiZskgS9ZJli8fi5eOXY1sp2OtGeX3BO9cv8ePBONhN9P6FS41zzxIGexkCDJdMWmhZylOjKzkyCmpdaOcOKEDxsRpGy8QAqXqk9Wh8moXNkL56B5zv10R7fyfXi_tXvlvkYHI_1i2aWYTvXJZM0sXLdmegwTADI/s512/moneymake-yellow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="448" data-original-width="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieN3SpAyKXJsKdsNd1BgFwT_yxoh-eiZskgS9ZJli8fi5eOXY1sp2OtGeX3BO9cv8ePBONhN9P6FS41zzxIGexkCDJdMWmhZylOjKzkyCmpdaOcOKEDxsRpGy8QAqXqk9Wh8moXNkL56B5zv10R7fyfXi_tXvlvkYHI_1i2aWYTvXJZM0sXLdmegwTADI/s16000/moneymake-yellow.png" /></a></div><br /> <br /><p></p><p>However, one aspect never really spent much time on was the "money making game" aka, the basic gambling game where you choose one of three options and randomly either won or lost rupees. I didn't spend much time playing it as a kid, because I had the distinct memory that it wasn't a good choice, ie, it had a negative expected value (I'm not sure I would have phrased it quite like that as an 8 year old, but I digress). Another side note, while I didn't play it much, the idea of a random gambling minigame inside an unrelated game always stuck with me, and directly sparked the inclusion of a similar concept in the game pirate2, which you're undoubtedly familiar with.</p><p>Anyway, this is turning into a long post which is just a couple links, but I was wondering if the MMG was in fact a bad value or if there was any secrets there I didn't know about. So, I started search for the answer, and came across these two very labor intensive analyses of the game, which come from totally different angles.</p><p>The <a href="http://priesthood.yohan.se/?p=212">first is a look at the assembly code of the game itself</a> to see how the RNG worked, and what exactly the distribution of negative and positive payoffs was.</p><p>The <a href="https://gamefaqs.gamespot.com/boards/563433-the-legend-of-zelda/64051872">second was just a guy who played the game 500 times</a> and kept track of the outcomes.</p><p>They both reached the same conclusion: The right rupee is the worst choice and the middle rupee is the best choice. In fact, the middle rupee does have a positive expected value, and so you can expect to make money playing it, in the long run.<br /></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-82175699399530210112023-12-22T15:18:00.001-05:002023-12-22T15:18:00.145-05:00Credit card debt collection<p><a href="https://www.bitsaboutmoney.com/archive/the-waste-stream-of-consumer-finance/">https://www.bitsaboutmoney.com/archive/the-waste-stream-of-consumer-finance/</a></p><p></p><p>This was one of those articles I had bookmarked for months, and when I finally started reading it seemed like a lot of stuff I already knew. But, it got pretty interesting towards the end. I'd recommend reading the whole thing, but I'll quote some longer parts I found interesting here. <br /></p><blockquote><p>The rights of debtors are observed by both primary lenders and
eventual debt buyers mostly in the breach. One of those rights is to a
written “debt verification”, with specified information in it, and
(surprisingly, if you haven’t worked in this field) despite that being
the law many debts are sold in such a fashion that the buyer couldn’t
produce a responsive verification even if they wanted to. That isn’t
even a political claim; it’s just the engineering reality of which
columns are in their CSV file.</p><p>The former advocate in me will
observe that the single most effective method for resolving debts is
carefully sending a series of letters invoking one’s rights under the
FDCPA (and other legislation) to a debt collector who is <em>operationally incapable</em>
of respecting those rights, then threatening them with legal or
regulatory action when they inevitably infringe upon them in writing,
leading to them abandoning further attempts at collection.</p><p>This
effectively makes paying consumer debts basically optional in the United
States, contingent on one being sufficiently organized and informed.
That is likely a surprising result to many people. Is the financial
industry unaware of this? Oh no. Issuing consumer debt is an enormously
profitable business. The vast majority of consumers, including those
with the socioeconomic wherewithal to walk away from their debts, feel
themselves morally bound and pay as agreed.</p><p>Why are debt collectors <em>so bad at debt collection</em>?
Partially it is because credit card issuers are large national
institutions with large, automated processes sitting atop a legacy of
corporate acquisitions, IT migrations, and similar that makes
availability of non-critical information extremely fragmentary. They
then want to dump that complexity through a very small pipe (CSV files)
onto the debt collection industry.</p></blockquote><p>And this<br /></p><p></p><blockquote><p>The FDCPA and state legislation provides for automatic damages for
illegal behavior from collectors, the incidence of illegal behavior is
extremely high, and a debt collector with a high school education and
three months of experience will frequently commit three federal torts in
a few minutes of talking to a debtor then follow up with a confirmation
of the same in writing. (You think I am exaggerating. Reader, I am not.
“If you don’t pay me I will sue you and then Immigration will take
notice of that and yank your green card” contains three separate causes
of action: (frequently) a false threat to file a suit where that is not
actually a business practice of the firm, a false alleged affiliation
with a government agency, and a false alleged consequence for debt
nonpayment not provided for in law.)</p><p>As a result, private
companies compiled databases of (public in the U.S.) court filings and
organized them by Social Security number, address, and similar to allow
debt collectors to identify which debtors are aware of their legal
rights. In principle, a debt collector could do anything they wanted
with that fact, like being extra careful to follow the law in contacting
them. But the economics of debt collection do not counsel careful,
individualized consideration of credit card debt.</p><p>I will bet you
that, in practice, they simply avoid collecting against anyone who
demonstrates ability and financial resources to enforce their rights.
This is one for the history books of borked equilibriums. We devoted
substantial efforts to pro-consumer legislation to address abuse of
(mostly) poor people. We gated redress behind labor that is abundantly
available in the professional managerial class and scarce outside of it,
like writing letters and counting to 30 days. (People telling me they
were incapable of doing these two things is why I started ghostwriting
letters for debtors.) We now have literal computer programs exempting
heuristically identified professional managerial class members from debt
collection,<em> inclusive of their legitimate debts</em>, so that debt
collectors can more profitably conserve their time to do abusive and
frequently illegal shakedowns of the people the legislation was meant to
benefit.</p></blockquote><p></p><p> </p><p> </p><p></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-21041108408237309642023-12-15T13:21:00.003-05:002023-12-15T13:21:45.235-05:00The Business of Theme Parks, How Much Money Do They Make?<p></p><blockquote><p>Despite our extended rambling, we’d like to think that you can leave
with some concrete implications. In summary, here are some of the major
ones.</p>
<ul><li>Mega theme parks such as Disney and Universal find it difficult to
be profitable in the first few years after opening, and have a very low
project ROI. But it doesn’t matter.</li><li>Don’t seek to compete with Disney or Universal, unless you are them,
or you can line up tremendous sources of financing. Look for creative
sources of financing.</li><li>For investors, indoor parks are promising because they generate
enough in sales productivity to be appropriate for urban retail
environments.</li><li>Regional and superregional parks are appropriate when land prices
are extremely low, and the market does not have similar types of
developments. They can be built relatively cheaply. And once built,
these parks can become the landmark attraction of a market for decades.</li><li>Waterparks are often a more efficient alternative to regional parks,
in that they occupy less space but have a similar return profile.</li><li>It’s important to define the return <em>measure </em>for
attractions. Very often, the partner/developer/government cares less
about financial returns and more about employment, tourism, and GDP
impacts. Governments can be a good partner. On the other hand, don’t
benchmark these kinds of developments if you’re a purely private
operation.</li></ul></blockquote><p><br /></p><p><a href="https://www.theparkdb.com/blog/the-business-of-theme-parks-part-i-how-much-money-do-they-make/">https://www.theparkdb.com/blog/the-business-of-theme-parks-part-i-how-much-money-do-they-make/</a></p><p><br /></p><p><a href="https://www.theparkdb.com/blog/the-business-of-theme-parks-part-ii-how-much-do-they-cost-and-earn/">https://www.theparkdb.com/blog/the-business-of-theme-parks-part-ii-how-much-do-they-cost-and-earn/</a></p><p> </p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-83729252915092977352023-11-28T00:04:00.003-05:002023-11-28T00:04:56.837-05:00The McDonald's theory of why everyone thinks the economy sucks<p><a href="https://www.natesilver.net/p/the-mcdonalds-theory-of-why-everyone">https://www.natesilver.net/p/the-mcdonalds-theory-of-why-everyone</a><br /></p><p><span></span></p><blockquote><p><span>The point is simply this: it’s very easy to spend a </span><em>lot</em><span>
more these days on fast food in ways that don’t necessarily show up in
inflation data. Three years ago, I might have walked down the block and
ordered a Super Duper Double Cheeseburger, fries and a Diet Coke for
$9.67 before tax. Now, because Uber Eats and the restaurant have
correctly determined that I’m lazy and they can price-discriminate
against me and I fell for their viral marketing campaign, I’ll have them
deliver me a Triple Super Duper Cheeseburger Deluxe with grilled
onions, plus fries and a Diet Coke — at a price of $24.25 before tax. </span></p><p><span>And don’t think this experience — or the Idaho man’s experience — is atypical. Getting fast food delivered is </span><em>pretty damned expensive</em><span>.
In-store, fast food can be expensive too if you start messing with
upgrades, add-ons and specialty items. This is why McDonald’s revenues
are still rocketing up even as inflation has slowed down.</span></p></blockquote><p><span></span></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-7285009785154565412023-10-31T00:08:00.005-04:002023-10-31T00:08:36.794-04:001500 Archers on a 28.8: Network Programming in Age of Empires and Beyond<p><a href="https://www.gamedeveloper.com/programming/1500-archers-on-a-28-8-network-programming-in-age-of-empires-and-beyond">https://www.gamedeveloper.com/programming/1500-archers-on-a-28-8-network-programming-in-age-of-empires-and-beyond</a></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-40088562637401689152023-09-28T03:15:00.001-04:002023-09-28T03:15:00.165-04:00An analysis of radio song play frequency for 102.9 WMGK, in 2023<h3 style="text-align: left;">Background <br /></h3><p>The other day I happened to be reading through <a href="https://daleswanson.blogspot.com/2013/08/an-analysis-of-radio-song-play.html">my post about how often the classic rock station in Philly, WMGK, plays different songs</a>. I noticed that that post was made 10 years ago, on August 26, 2013. That made me wonder how things may have changed since then and how much work it would be to scrape their <a href="https://wmgk.com/stream/WMGKFM/">recently played page</a> again to collect the data. I was sure my old code wouldn't work, but figured I'd take a look at the page and see how hard it'd be to write something new.</p><p>It didn't take long to realize this was the one gift every scraper lives in hope of: Their front end was just hitting an open API to get the data. The network tools showed the request:<br /><a href="https://nowplaying.bbgi.com/WMGKFM/list?limit=200&offset=0">https://nowplaying.bbgi.com/WMGKFM/list?limit=200&offset=0</a></p><p>Which returns a nicely formatted JSON list of the 200 most recently played songs. That would make it trivial to collect this data, but it got even better. If you noticed the offset parameter there, this was pretty much just letting me get data directly out of their database. I tested it, and sure enough, I could just page through the data to go back as far as I tested (a few months). This meant I could get the full 60 days worth of data, for the exact same time period as I used in 2013, instantly.</p><p>I whipped up <a href="https://github.com/StephenWetzel/wmgk-scraper-2023">some code real quick to do the scraping, and store the data in a basic SQLite database</a>. I want to mention here that I'm increasingly a fan of using SQLite for storing data for these types of quick projects. Don't get me wrong, I still wished I had a real database a dozen times when writing queries in this project, and wouldn't use SQLite for an actual application, but the alternative here is CSV files, not a full Postgres database. And when compared to CSV files, there's no contest. Being able to write SQL, and being able to decide to expand the scope and add a few more tables later on, while still having those relations represented is very nice. And from the other side, using SQLite means you still have a file you can easily share like a CSV file. With the expected audience of this post, I probably don't have to spend any more time arguing that databases are good, so I'll stop here.</p><p>I also want to say that while I was doing the scraping, I was very paranoid they would realize what I was doing and cut me off at any moment. That is, until I realized there was no way anyone in the world cared about this data besides me, and there was no one watching a dashboard live seeing the spike in queries and immediately launching into action to prevent the scraping of their priceless WMGK recently played data.</p><p><br /></p><h3 style="text-align: left;">So what does WMGK play?<br /></h3><p>With that all out of the way, how does WMGK in 2023 compare with WMGK in 2013? I was able to look at the exact same date range as in 2013, June 26th to August 24th, or 60 days.</p><p>In my previous post I compared what WMGK played with what the most popular songs by those bands were on Last.fm a lot. I'm not doing any of that here. You can refer to the graphs from that post if you want to see what the most popular songs by bands are, but here I'm focused on how WMGK has changed in 10 years.</p><p>I would assume that they are playing more recent bands, and perhaps have retired some of the older bands they used to play. Philly still has a Rock station in WMMR though, so I would think their might be a more older bias still on the Classic Rock station. Also WMGK (and WMMR) were bought in 2016 by the Beasley Media Group, which I assume is ran by Pam from The Office. Might the new owners prefer more variety? Conglomerates buying and consolidating industries usually results in a better product, right?</p><h4 style="text-align: left;">Coverage<br /></h4><p>To review, in 2013 WMGK played 14,286 songs during the 60 day period, of which 924 were unique. But of those unique songs, there was a clear trend where a few dozen got played daily or every other day, and then they occasionally threw in a "deep" cut (which likely wasn't that deep). The best summary of that fact, was that just 172 songs represented half of those 14,286 plays over 60 days.<br /></p><p>In 2023 WMGK played 15,190 songs during the same 60 day period (6/26/2023 to 8/24/2023), of which 1060 were unique. So far so good, that is better than last time, albeit not much. Really the question is how distributed are those songs. Is it the same as last time, where the same handful of songs get played constantly? In a word, yes.<br /></p><p>Here's the coverage breakdown.<br /></p><p>
</p><table border="0" cellspacing="0">
<colgroup span="5" width="85"></colgroup>
<tbody><tr>
<td align="center" colspan="2" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;" valign="middle">2013</td>
<td align="left"><br /></td>
<td align="center" colspan="2" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;" valign="middle">2023</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Coverage</b></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Songs</b></td>
<td align="left"><br /></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Coverage</b></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Songs</b></td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">10.04%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">28</td>
<td align="left"><br /></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">10.30%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">31</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">25.27%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">77</td>
<td align="left"><br /></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">25.02%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">79</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">50.23%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">172</td>
<td align="left"><br /></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">50.03%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">168</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">75.13%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">279</td>
<td align="left"><br /></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">75.10%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">275</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">90.03%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">373</td>
<td align="left"><br /></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">90.01%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">381</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">100.00%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">924</td>
<td align="left"><br /></td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">100.00%</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">1060</td>
</tr>
</tbody></table>
<p>To review what I mean by "coverage" this is the number of songs you'd need to represent x% of plays. In other words, there's a 25% chance that any random song you heard on WMGK was one of the top 79 songs they play. If anything, it's striking how similar those numbers are. The only noticeable difference is a slightly longer tail of songs they played once.</p><h4 style="text-align: left;">Top Songs<br /></h4><p>So, things aren't looking good for 2023 WMGK, but let's look closer. What were the top songs played in 2023 vs 2013? The first table is sorted by top songs in 2013, and the second is top songs in 2023.<br /></p><p>
</p><table border="0" cellspacing="0">
<colgroup width="140"></colgroup>
<colgroup width="153"></colgroup>
<colgroup width="235"></colgroup>
<colgroup width="140"></colgroup>
<tbody><tr>
<td align="center" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;"><b>Plays/30 days (2013)</b></td>
<td align="center" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;"><b>Band</b></td>
<td align="center" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;"><b>Song</b></td>
<td align="center" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;"><b>Plays/30 days (2023)</b></td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">27.5</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Warren Zevon</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Werewolves Of London</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">0</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">27</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Cars</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Just What I Needed</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">27</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Blue Oyster Cult</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Burnin' For You</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">22</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">27</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Steve Miller Band</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Rock 'n Me</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26.5</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Supertramp</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">The Logical Song</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">23.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26.5</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">David Bowie</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Changes</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">18</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26.5</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Pink Floyd</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Another Brick In The Wall</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">21.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26.5</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Electric Light Orchestra</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Do Ya</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">0</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">J. Geils Band</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Centerfold</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">25.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">War</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Low Rider</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">25.5</td>
</tr>
<tr>
<td align="left" height="17"><br /></td>
<td align="left"><br /></td>
<td align="left"><br /></td>
<td align="left"><br /></td>
</tr>
<tr>
<td align="center" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;"><b>Plays/30 days (2013)</b></td>
<td align="center" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;"><b>Band</b></td>
<td align="center" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;"><b>Song</b></td>
<td align="center" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;"><b>Plays/30 days (2023)</b></td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">0</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Survivor</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Eye Of The Tiger</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">27.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">0</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Outfield</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Your Love</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">27.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">4.5</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Allman Brothers Band</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Ramblin' Man</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">27</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Cars</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Just What I Needed</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">1</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Eddie Money</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Take Me Home Tonight (Be My Baby)</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">14</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Pete Townshend</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Let My Love Open The Door</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">27</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Steve Miller Band</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Rock 'n Me</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">16.5</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Fleetwood Mac</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Go Your Own Way</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">25.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">22</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Guess Who</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">American Woman</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">25.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">26</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">J. Geils Band</td>
<td align="left" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">Centerfold</td>
<td align="right" style="border-bottom: 1px solid #aaaaaa; border-color: rgb(170, 170, 170) rgb(170, 170, 170) rgb(100, 100, 100); border-left: 1px solid #aaaaaa; border-right: 1px solid #aaaaaa; border-style: solid; border-top: 1px solid #aaaaaa; border-width: 1px;">25.5</td>
</tr>
</tbody></table>
<p>Obviously, I expected changes, but it is surprising how many songs went from 0 plays in 2013 to top 10 song in 2023 or vice versa. While I don't have anything against Eye of the Tiger, it doesn't strike me as a particularly "Classic Rock" song. Admittedly, there's some association with Philly due to Rocky, but still, it's an odd top song.<br /></p><p>However, it's time to discuss the biggest travesty I discovered while looking through the 2023 data. You may have noticed that Warren Zevon's Werewolves of London went from the #1 song, with 27.5 average plays in 30 days, down to 0 plays across 60 days. That is bad enough, however, one of the new bands to be played in 2023 was Kid Rock. He had a single play for a song called "All Summer Long", which I decided to listen to to see if it qualified as Classic Rock. Well I'm guessing most people reading this are ahead of me on the punchline, but that song is the one were he "samples" the Werewolves of London intro.</p><p>So, to review: If you were listening to 102.9 WMGK, the Classic Rock station from June 26th 2023 to August 24th 2023, and you heard the Werewolves of London intro, we can say with absolute certainty that what you were actually hearing was Kid Rock. Our ancestors weep.<br /></p><p>I'm hesitant to even link to the Kid Rock song, but if you aren't familiar with it, <a href="https://www.youtube.com/watch?v=aSkFygPCTwE">here it is</a>. After you watch 5 seconds of that, please switch to <a href="https://www.youtube.com/watch?v=qae25976UgA">the Werewolves of London video</a>, and tell me that isn't an objectively better video.</p><h4 style="text-align: left;">Top Bands<br /></h4><p>Well, I don't even know if there's any point in going on, but for what it's worth, here's the top bands.</p><p>
</p><table border="0" cellspacing="0">
<colgroup width="87"></colgroup>
<colgroup width="206"></colgroup>
<colgroup width="87"></colgroup>
<colgroup width="85"></colgroup>
<tbody><tr>
<td align="center" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Plays (2013)</b></td>
<td align="center" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Band</b></td>
<td align="center" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Plays (2023)</b></td>
<td align="center" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Change</b></td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">356.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Rolling Stones</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">251.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-105</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">334.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Led Zeppelin</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">252</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-82.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">283</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Beatles</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">69.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-213.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">183</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Pink Floyd</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">147.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-35.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">177.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Who</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">82</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-95.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">169.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Van Halen</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">130</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-39.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">164</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Queen</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">135.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-28.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">154.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Journey</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">161.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">7</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">143</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Cars</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">71.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-71.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">138.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Billy Joel</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">178</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">39.5</td>
</tr>
<tr>
<td align="left" height="17"><br /></td>
<td align="left"><br /></td>
<td align="left"><br /></td>
<td align="left"><br /></td>
</tr>
<tr>
<td align="left" height="17"><br /></td>
<td align="left"><br /></td>
<td align="left"><br /></td>
<td align="left"><br /></td>
</tr>
<tr>
<td align="center" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Plays (2013)</b></td>
<td align="center" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Band</b></td>
<td align="center" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Plays (2023)</b></td>
<td align="center" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;"><b>Change</b></td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">334.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Led Zeppelin</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">252</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-82.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">356.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Rolling Stones</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">251.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-105</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">138.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Billy Joel</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">178</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">39.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">105</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Elton John</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">168.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">63.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">105.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Aerosmith</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">167</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">61.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">154.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Journey</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">161.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">7</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">135.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Tom Petty & The Heartbreakers</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">160</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">24.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">25.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">U2</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">148</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">122.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">183</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Pink Floyd</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">147.5</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">-35.5</td>
</tr>
<tr>
<td align="right" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">77.5</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Fleetwood Mac</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">147</td>
<td align="right" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">69.5</td>
</tr>
</tbody></table>
<p>More similar than the top songs. Biggest changes are the dropping of Beatles and the rise of U2. Sorry, I can't think straight after that Kid Rock/Werewolves of London debacle. But let's perservere</p><p>Here's a graph of the top 50 bands.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcluEFwbZ6iqSjDZCJSbcZmOAKjx1llUTtrH1PsbZ8m5TAHRDZmb8UCKQzTG6Ty_IqOpsA4Lo8WTzPUNPHZyV4BW1f_DA4OLUkAeuUx-j0k8GsJspauDj93ivchrFo2R3Z7PpG5qIz1Y-BUnssk7cagJaYuKb-sxnW79-HG1bs0hpDpqn5xdNjS71ODBE/s985/wmgk_top_50_bands_2023.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="508" data-original-width="985" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcluEFwbZ6iqSjDZCJSbcZmOAKjx1llUTtrH1PsbZ8m5TAHRDZmb8UCKQzTG6Ty_IqOpsA4Lo8WTzPUNPHZyV4BW1f_DA4OLUkAeuUx-j0k8GsJspauDj93ivchrFo2R3Z7PpG5qIz1Y-BUnssk7cagJaYuKb-sxnW79-HG1bs0hpDpqn5xdNjS71ODBE/w640-h330/wmgk_top_50_bands_2023.png" width="640" /></a></div>And here's the 2013 version, for comparison.<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJjYqlxwbFA7V8PtlySSTTcHTBuLCnPYO6yUHefdzCNzyIpuHfH6aXmG2mrlRjpIBwv4hrFoW4-IIPvnBEcYbp08lTLRIiANw48gyd9TE8_Gcn-s6mYyhM6A2-uN8ck_g0c1SlN8Xz0gM/s1200/WMGK.topbands.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="1200" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJjYqlxwbFA7V8PtlySSTTcHTBuLCnPYO6yUHefdzCNzyIpuHfH6aXmG2mrlRjpIBwv4hrFoW4-IIPvnBEcYbp08lTLRIiANw48gyd9TE8_Gcn-s6mYyhM6A2-uN8ck_g0c1SlN8Xz0gM/w640-h426/WMGK.topbands.png" width="640" /></a></div><p></p><p>Chart is pretty similar, although the top bands in 2023 are only getting 250 plays/month vs 350 for in 2013. The rest of the top tier bands got 150 plays/month in both 2013 and 2023.</p><h4 style="text-align: left;">Plays per hour of day<br /></h4><p>Here's a quick plays per hour chart.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV2oroqyb6aEhTnRA2SrihvAtTjDy6SnLGIWpwBKKHtHBPUrenUxaXJG9bw-DRZSSQ5FKKLOdz2DrZp3PGdxibT1srPbGt6Flh3QLSCWOO2DGPrZQ1S40IGr-tzwEnRl7p4996LMzVtB_Qa6v5Mk8Y4zHJCevH-m3hNEBwrwWeBjA27QHoSnd2FMWV128/s1029/wmgk_plays_per_hour_2023.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="486" data-original-width="1029" height="302" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV2oroqyb6aEhTnRA2SrihvAtTjDy6SnLGIWpwBKKHtHBPUrenUxaXJG9bw-DRZSSQ5FKKLOdz2DrZp3PGdxibT1srPbGt6Flh3QLSCWOO2DGPrZQ1S40IGr-tzwEnRl7p4996LMzVtB_Qa6v5Mk8Y4zHJCevH-m3hNEBwrwWeBjA27QHoSnd2FMWV128/w640-h302/wmgk_plays_per_hour_2023.png" width="640" /></a></div><p>And then the 2023 version.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPD5HH7-g1Ir8aPS0zFvphYlKEIBgfnL5vH3RUSzUOADtGuyaFTzOMxgN1HhO7UaKdzUXe3ehb3TCCOxcP2C8FYAH6EhofLsGMnWKhuvh4eMD0fzG86dDIVWs8vO1aiKhKjJmqD16iGt4ZNbixnTalSrxx-9vlpm4n9gVteYDdmeLiithUK_DeYRPu1ss/s1200/WMGK.hours.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="1200" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPD5HH7-g1Ir8aPS0zFvphYlKEIBgfnL5vH3RUSzUOADtGuyaFTzOMxgN1HhO7UaKdzUXe3ehb3TCCOxcP2C8FYAH6EhofLsGMnWKhuvh4eMD0fzG86dDIVWs8vO1aiKhKjJmqD16iGt4ZNbixnTalSrxx-9vlpm4n9gVteYDdmeLiithUK_DeYRPu1ss/w640-h426/WMGK.hours.png" width="640" /></a></div><p>Similar, but less of a clear pattern.</p><h4 style="text-align: left;">Top songs by band<br /></h4><p>This is the part of the post where I looked at a bunch of individual bands last time. I'm not really going to do that here, we already know MGK doesn't play a variety from any band, they just pick 2 or 3 hits and only play those. But I will post one comparison for one band.</p><p>That band is Yes, who admittedly are maybe not the best radio band, but they absolutely have plenty of Classic Rock hits. In 2013 MGK played I've Seen All Good People 22 times/month, and then occasional plays from "deep cuts" like Roundabout and a few others.</p><p>In 2023 MGK played only 2 Yes songs, one was Roundabout with 1.5 plays per month (down from 3.5 in 2013). The other got 25.5 average plays in 30 days, and that song was Owner of a Lonely Heart.</p><p>Now I like Owner of a Lonely Heart, just like I like every Yes song, but it is not the first song that comes to mind when I think of Classic Rock. At this point, I just want to say that I did go to <a href="https://wmgk.com/">WMGK's site</a> and confirm that they still refer to themselves as a "Classic Rock" station, which they do. I just can't fathom the decision making here. I'd like to present this dramatization of how that decision may have been made.<br /></p><p>"Ok, we need our single song for our Yes allotment for our Classic Rock station that we can play every single day"</p><p>"What if instead of playing the same Yes song every day we just choose from a handful of the best Yes songs?"</p><p>"You're fired, who's got my pick?"</p><p>"What era do people most associate with both 'classic rock' and the band Yes? The 80s right? So let's play the most 80s Yes song, Owner of a Lonely Heart"</p><p>"Perfect, let's go to lunch" </p><h4 style="text-align: left;">Changes in band makeup<br /></h4><p></p><p></p><p></p><p></p><p></p><p>Another thing I wanted to look at was what bands from 2013 were no longer played in 2023, and what bands were new in 2023. I don't think I ever gave this stat in my prior post, but in 2013 there were 172 distinct bands played. In 2023 that number has gone up to 293. Looking at a diff of the two, there aren't many that disappeared; a few that look like they did are just due to formatting changes, like replacing & with and, which I could clean up, but I'm not.</p><p>Skimming through the diff, the only bands I notice going away in 2023 are: Jefferson Airplane, The Animals, Yardbirds, and Zombies. Which are are all very 60s era bands, so I guess that makes sense. There's a ton of new 90s bands, which I can't say I agree with for a Classic Rock station, but that is far from the top problem.</p><h4 style="text-align: left;">"One hit" wonders<br /></h4><p>Finally, I attempted to answer the question, how many bands do they just play one song (or nearly one song) from? So to start with some high level stats. There were 293 distinct bands, and of those 78 were only played 1 time, leaving 215 bands that were played multiple times. Of those, there were 45 bands with at least 3 plays, yet only 1 song ever played. In addition to those 45 bands with only 1 song played multiple times, there were 33 more bands with multiple songs played, but where the top song was at least 80% of those plays. Finally, there are only 68 bands with at least 3 plays where the top song wasn't most (> 50%) of those plays.</p><p>I eyeballed the list of some of these groups, and two stood out to me from the list of bands where MGK played just 1 song by a band: Alice Cooper (School's Out), and Thin Lizzy (The Boys Are Back In Town). If we expand that list out to include bands with multiple songs, but where the top song was at least 80% of the plays then we get a lot more, including: </p><p>
</p><table border="0" cellspacing="0">
<colgroup width="163"></colgroup>
<colgroup width="211"></colgroup>
<tbody><tr>
<td align="left" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Alice In Chains</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Man In The Box</td>
</tr>
<tr>
<td align="left" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Neil Young</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Rockin' In The Free World</td>
</tr>
<tr>
<td align="left" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Yes</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Owner Of A Lonely Heart</td>
</tr>
<tr>
<td align="left" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Allman Brothers Band</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Ramblin' Man</td>
</tr>
<tr>
<td align="left" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Electric Light Orchestra</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Evil Woman</td>
</tr>
<tr>
<td align="left" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Van Morrison</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Moondance</td>
</tr>
<tr>
<td align="left" height="17" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Rush</td>
<td align="left" style="border-bottom: 1px solid #cccccc; border-color: rgb(204, 204, 204); border-left: 1px solid #cccccc; border-right: 1px solid #cccccc; border-style: solid; border-top: 1px solid #cccccc; border-width: 1px;">Tom Sawyer</td>
</tr>
</tbody></table>
<p>Keep in mind these were just the bands that stood out to me as bands where I know they have a bunch of hits that could be played besides just one song.</p><p><br /></p><h3 style="text-align: left;">Closing<br /></h3><p>I think the data speaks for itself (with the help of my multiple page essay you just read through): WMGK has not gotten better from 2013 to 2023, and in fact, has gotten much worse in some key areas. I'm curious what 2033 holds.</p><p>Also, for the record, I don't think I've listened to WMGK, or any radio station since my 2013 post. So maybe I have no room to talk, maybe the people listening to the radio in 2023 want to hear the same 80 songs on repeat every day forever.</p><p> </p><h3 style="text-align: left;">Further Reading</h3><p>As I mentioned above, I did <a href="https://daleswanson.blogspot.com/2013/08/an-analysis-of-radio-song-play.html">a similar analysis in 2013</a>, which you probably should have read before this post.</p><p>In the extraordinarily unlikely scenario that you want to scrape some WGMK recently played songs for yourself, <a href="https://github.com/StephenWetzel/wmgk-scraper-2023">the code is up on Github</a>.</p><p>In the slightly less unlikely scenario you just want to play around with the data <a href="http://daleswanson.org/blog/wmgk_2023/wmgk_plays_2013_vs_2023.ods">here is an unorganized spreadsheet with 10 tabs worth of data</a> I used for this post. And <a href="http://daleswanson.org/blog/wmgk_2023/wmgk.db">here is the full SQLite database</a> which includes some additional time than just the 60 days I focused on in this post.<br /></p><p></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-50568846761695320952023-08-30T23:38:00.001-04:002023-08-30T23:38:00.139-04:00See Random Wikipedia Articles<p><a href="https://wetzel.dev/tools/wikipedia.html">https://wetzel.dev/tools/wikipedia.html</a></p><p>I made this page that shows random pages from Wikipedia. You may know Wikipedia has a <a href="https://en.wikipedia.org/wiki/Special:Random">random article link</a> already, which I've always liked. But my version has two advantages:<br /></p><ol style="text-align: left;"><li>It shows quick summaries of articles and an image for each article so you can quickly skim through them.</li><li>It allows you to set a popularity filter. This uses the number of inbound links to that page as a proxy for how popular it is, so you can filter out huge pool of random-town-in-Wales articles.</li></ol><p>The second point is the real reason I made it. The actual random article link just gives so much uninteresting stubs. I feel like using number of inbound links works well for only seeing somewhat meaningful articles.<br /></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-76117549671230191932023-07-31T16:24:00.000-04:002023-07-31T16:24:30.247-04:00Enshittification<p><a href="https://pluralistic.net/2023/01/21/potemkin-ai/">https://pluralistic.net/2023/01/21/potemkin-ai/</a></p><p></p><blockquote><p>When a platform starts, it needs users, so it makes itself valuable
to users. Think of Amazon: for many years, it operated at a loss, using
its access to the capital markets to subsidize everything you bought. It
sold goods below cost <em>and</em> shipped them below cost. It operated
a clean and useful search. If you searched for a product, Amazon tried
its damndest to put it at the top of the search results.</p>
<p>This was a hell of a good deal for Amazon's customers. Lots of us
piled in, and lots of brick-and-mortar retailers withered and died,
making it hard to go elsewhere. Amazon sold us ebooks and audiobooks
that were permanently locked to its platform with DRM, so that every
dollar we spent on media was a dollar we'd have to give up if we deleted
Amazon and its apps. And Amazon sold us Prime, getting us to pre-pay
for a year's worth of shipping. Prime customers start their shopping on
Amazon, and 90% of the time, they don't search anywhere else.</p>
<p>That tempted in lots of business customers – Marketplace sellers who
turned Amazon into the "everything store" it had promised from the
beginning. As these sellers piled in, Amazon shifted to subsidizing
suppliers. Kindle and Audible creators got generous packages.
Marketplace sellers reached huge audiences and Amazon took low
commissions from them.</p>
<p>This strategy meant that it became progressively harder for shoppers
to find things anywhere except Amazon, which meant that they only
searched on Amazon, which meant that sellers <em>had</em> to sell on Amazon.</p>
<p>That's when Amazon started to harvest the surplus from its business
customers and send it to Amazon's shareholders. Today, Marketplace
sellers are handing 45%+ of the sale price to Amazon in junk fees. The
company's $31b "advertising" program is really a payola scheme that pits
sellers against each other, forcing them to bid on the chance to be at
the top of your search.</p>
<p>Searching Amazon doesn't produce a list of the products that most
closely match your search, it brings up a list of products whose sellers
have paid the most to be at the top of that search. Those fees are
built into the cost you pay for the product, and Amazon's "Most Favored
Nation" requirement sellers means that they can't sell more cheaply
elsewhere, so Amazon has driven prices at <em>every</em> retailer.</p></blockquote><p></p><p> </p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-87571395994968362622023-06-14T18:47:00.002-04:002023-06-16T19:54:25.088-04:00The time adding a limit to a Postgres query made it slower<p>This is something I ran into at work. I wouldn't usually post stuff like this here, but I thought it was pretty interesting. It involves optimizations to SQL queries, so best to stop reading here if that's not something you're interested in. I've cleaned up the example below and made it generic. <br />
</p><p><br />
Out database is Postgres 13 and we have two tables. One is named <code>offers</code> which has a primary key of <code>offer_id</code> and a foreign key column named <code>plan_id</code>. The other table is named <code>plans</code> and has a <code>plan_id</code> primary key and then a column named <code>plan_name</code>. Many offers can have the same one <code>plan_id</code>. There are indexes on the primary and foreign key columns. We want to find all the offers that have a particular <code>plan_name</code>.<br />
<br />
<br />
This was the starting query:<br />
<code>
select * from offers where plan_id in (<br />
select plan_id from plans where plan_name = 'Example Plan'<br />
)<br />
order by offer_id desc<br />
limit 5</code><br />
<br />
It took about 200 seconds to run.<br />
<br />
If I removed the <code>order by</code> and ran it again, it only took 14 ms for me. So far so good, sorting can be slow, although <code>offer_id</code> is the primary key, and has an index, so sorting by it shouldn't be that slow.<br />
<br />
Here's where things get interesting though. If I removed the limit, and keep the order by:<br />
<code>
select * from offers where plan_id in (<br />
select plan_id from plans where plan_name = 'Example Plan'<br />
)<br />
order by offer_id desc<br />
</code>
<br />
That only takes 323 ms.<br />
<br />
To be clear: <b>Adding a limit to this query causes it to go from less than a second to 3 minutes!</b><br />
<br />
It turns out this is a thing. If you google "Postgres query slower with limit" you'll find lots of <a href="https://dba.stackexchange.com/questions/213262/why-is-this-query-with-where-order-by-and-limit-so-slow">confused</a> <a href="https://stackoverflow.com/questions/21385555/postgresql-query-very-slow-with-limit-1">Stack Overflow</a> posts. The problem is when Postgres's statistics are wrong and the query planner assumes the limit will make one approach faster, but actually there are far less rows meeting your criteria than it thought, and it takes much longer.<br />
<br />
In this case, Postgres thinks "oh I have an index on <code>offer_id</code>, let me just sort by that column and scan through all those rows until I find 5 rows that match that <code>plan_id</code> filter, that'll be fast cause there's plenty of rows that match that filter and I need to sort them anyway, so I'm accomplishing 2 things with one sort" (Postgres has a problem with run on sentences). However, Postgres only thinks that's a good plan because it misestimated how many rows match the filter, thinking there are thousands when there are only a dozen or so. So it wastes a lot of time scanning through rows in reverse chronological order until it finds 5. A better plan is to use the index on the <code>plan_id</code> to find all the rows that match that, and then sort those and take the newest 5. But that is only a better plan because we know how few rows actually match the filter, and Postgres has a bad estimate for that.<br />
<br />
The "solution" is to force Postgres to not use that plan. Postgres does not have query plan hints, so we have to use hacks to force Postgres to not take the slow approach. There are various suggestions to use subqueries or CTEs and put the order by in the subquery, and the limit on the outer query. So something like this<br />
<code>
with all_results as (<br />
select * from offers<br />
join plans using (plan_id)<br />
where plan_name = 'Example Plan'<br />
order by offer_id desc<br />
)<br />
select * from all_results<br />
limit 5<br />
</code>
<br />
But it seems Postgres 13 is smarter than that, and still optimizes the combined query. It does seem a bit faster than the first query, but still took 2 minutes to run.<br />
<br />
However, a much hackier solution, which also seems to be fastest and simplest to understand is to "modify" the column you are ordering on so that it can't use the index. So bizarrely, this query<br />
<code>
select * from offers where plan_id in (<br />
select plan_id from plans where plan_name = 'Example Plan'<br />
)<br />
order by offer_id + 0 desc<br />
limit 5<br />
</code>
<br />
Ran in 272 ms. Removing the <code>+ 0</code> causes it to go back to 3+ minutes.<br />
<br />
<a href="https://ottertune.com/blog/how-to-fix-slow-postgresql-queries/">This article</a> goes into more detail, and is where I got the + 0 idea came from.<br />
<br />
I should also mention that the "real" solution to this is to <a href="https://stackoverflow.com/questions/27422268/limit-slows-down-my-postgres-query">increase the amount of statistics on the columns Postgres is having a hard time estimating</a>, but I tested this and it didn't seem to fix this case. Removing the index on offer_id would also work, although that's not an option here with it being the primary key, it also feels like a bad idea to remove the index entirely rather than just forcing Postgres not to use it on a particular query where we know it's a bad idea.</p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-8161903952378039422023-05-23T20:05:00.003-04:002023-05-23T20:07:57.438-04:00Whole home energy monitoring with IoTaWatt<p>I recently installed an <a href="https://iotawatt.com/">IoTaWatt</a> open source whole home energy monitor, and wanted to summarize my experience and what I learned about the install.</p><p>Full disclosure, after I had written this post, but hadn't posted it yet the created of IoTaWatt announced he was stopping production, but continuing to support existing hardware, and working on a new ESP32 based version that he plans to make available as a DIY project.<br /></p><h4 style="text-align: left;">What is a whole home energy monitor?</h4><p>A whole home energy monitor is a device that measures all the electrical energy your house uses, both total usage and then usage on individual circuits. You may have heard of Sense, which is the most well know of these. Unfortunately, Sense fails my most fundamental rule of smart home tech: it's cloud based. Which means both that your data will eventually be sold off or leak, and that the device will eventually stop working when the company shuts down the servers. That's why I insist upon fully local smart home devices.</p><h4 style="text-align: left;">Why would I want one?</h4><p>Like most things I do, the answer is data. Knowing how much energy your house is using can help identify trends and highlight when new devices use a lot of power at idle. That can help you save money, but realistically you're not going to save enough money to offset the few hundred you spend on the device. Instead, knowing when circuits are drawing power and how much can help drive automations.</p><p>Here are some examples of things I'm detecting or have plans to set up:<br /></p><ul style="text-align: left;"><li>Know when the hardwired dishwasher is running/done</li><li>Know when bathroom circuits have a large draw on them (straightener left on)</li><li>Detect when fridge usage is high for a long time (either door left open, or fridge failing)</li></ul><p>There are more examples where I'm instead using a Zigbee smart outlet with energy monitoring to measure just that device (washer, dryer, sump pump). The IoTaWatt can't replace those smart plugs entirely, as they allow me to measure just one device on a circuit that can have multiple devices on it. But it is great for measuring the energy usage for either hardwired devices or when you do want an entire circuit at once and can't rely on a smart plug always being used (like the bathrooms example).</p><p><img alt="A line graph of several circuits being monitored over a day" height="150" src="data:image/png;base64,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" width="640" /> <br /></p><h4 style="text-align: left;">How does the IoTaWatt work?</h4><p>All these devices work the same way. They use Current Transformers (CT) which clip around one of the two wires in a circuit (so either hot or neutral, but not both), and measure the strength of the magnetic field, which increases as the current increases. There is a base device which you plug in these CTs to, and you tell it what circuit each CT is monitoring and then that reports that usage back to you.</p><h4 style="text-align: left;">IoTaWatt pros and cons</h4><p>If you google "best whole home energy monitor" and click on a bunch of lists, you won't even find any the mention IoTaWatt. I'm sure it comes as no surprise to anyone reading this that I'm using the hipster whole home energy monitor. I think the main reasons IoTaWatt isn't more popular is that it's more of a DIY solution, as well as the fact that it's a one man operation with 0 SEO or marketing. That being said, I consider both of those pros. Here are the pros and cons as I see them, starting with the cons<br /><b>Cons</b><br /></p><ul style="text-align: left;"><li>Less user friendly to set up.</li><li>Less polished interface.</li><li>Limited to monitoring 14 circuits, of which 2 are typically your mains, so you really have 12 circuits you can monitor.</li><li>Must be connected to via WiFi and the antenna is quite weak, will likely require a closer AP/repeater.</li><li>Not the cheapest option. <br /></li></ul><p><b>Pros</b></p><ul style="text-align: left;"><li>Fully local means it will work unless there is a hardware failure.</li><li>No cloud server to be shut down, and no company to decide they want to start charging a subscription.</li><li>Made by a guy in New Hampshire, who basically lives on the <a href="https://community.iotawatt.com/">forums</a> (the fried egg profile) and will provide unlimited, detailed, support. Often pays for shipping units back to him if he can't figure out what is wrong with it remotely.</li><li>Very flexible in install and configuration. </li></ul><p>Of the cons, the only big one to me is the 14 (or really 12) circuit limit. That being said, the bulk of the rest of this post will go into detail on how to mitigate that limit.</p><h4 style="text-align: left;">Combining circuits</h4><p>The TL;DR of this is that there are several ways you can combine multiple circuits on one input. The downside is that you lose the ability to differentiate the circuits you combine, but you often don't really care if you combine them in logical ways. For example, if you have several bathrooms each with a dedicated circuit, you can combine all of those into one common bathroom input. You'll lose the ability to know which bathroom the power is being used in, but for most purposes just knowing "all the bathrooms combined are using x watts" is good enough.</p><h4 style="text-align: left;">How to combine circuits</h4><p>There are 3 main ways to combine circuits:<br /></p><ol style="text-align: left;"><li>Combine them in software</li><li>Combine them using a splitter</li><li>Put multiple wires in one CT</li></ol><p>#1 is the easiest by far, but it doesn't actually save you an input. You just tell the IoTaWatt to combine inputs 1 and 2 (or whatever). Not terribly useful, but can be nice to test combining circuits before you try the other two methods out.</p><p>#2 is interesting. It turns out that the CTs just have standard 1/8" stereo headphones plugs on the end of them. That means you can combine multiple CTs into one input by just using regular, cheap, headphone splitters. There are a few caveats there, like you need to use identical CTs (size and brand), and each of your CTs need to be sized to handle the combined input of all circuits you are combining. So, if you are combining two 20 amp circuits, you can't use two 20 amp CTs, you'd have to use two 50 amp CTs since the total power could be 40 amps. The nice thing about this method is you can combine circuits without opening your service panel again. You just unplug the CTs from the main IoTaWatt body, plug them both into a splitter, and then plug that splitter into one of the inputs on the IoTaWatt (and tell the software about the new configuration). You will have to open the service panel to add a new CT if you want to actually use your newly freed up input, but you can combine several and test how they work together over weeks.</p><p>#3 has the advantage of being free, but requires the most planning. You can simply pass multiple wires through the same CT and their current will be summed. However, they must either be the same phase, or they must be passed through in opposite directions. Another practical constraint is that the wires need to be physically near each other in the panel. If you have a panel laid out in an organized way, without much slack, what this means in practice, is that you can only combine circuits in this way if they are on the same side of your panel (left vs right) and the same phase (alternating rows).</p><p>This picture from the <a href="https://docs.iotawatt.com/en/master/CTbasics.html">IoTaWatt docs</a> demonstrates how you can measure two circuits with different phases, by passing one through in the opposite direction. I don't have slack on any of my circuits to do this kind of thing, but perhaps you do. Extending circuits inside your panel is a good use for the new <a href="https://www.amazon.com/221-2401-WAGO-Lever-Nuts%C2%AE-2-Conductor-Transparent/dp/B0BKR2SR7H">Wago inline connectors</a>.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRq_0fMDiVXmnZqbj821vUbzNAeRCawdgxsFjVD_KHY8VOX8GoyyWeHg16emUD4Ly8KhBA6wsYk_BUpY9QWln8ALTTPcWFjyvuB-26lgcAVIMDN3CXoDPhwIT_F4-cvyPOAe2fpzFmEMGnMRMBwEGXvsC_UwVdM1c4UoXBG08KoWGmy7sAEXCTzepn/s2154/reverse240V.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="A circuit breaks with 2 wires leaving it looping through a CT in opposite directions" border="0" data-original-height="2154" data-original-width="1786" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRq_0fMDiVXmnZqbj821vUbzNAeRCawdgxsFjVD_KHY8VOX8GoyyWeHg16emUD4Ly8KhBA6wsYk_BUpY9QWln8ALTTPcWFjyvuB-26lgcAVIMDN3CXoDPhwIT_F4-cvyPOAe2fpzFmEMGnMRMBwEGXvsC_UwVdM1c4UoXBG08KoWGmy7sAEXCTzepn/w530-h640/reverse240V.jpg" width="530" /></a></div><p>One more note about this picture, is that it's showing a 240V circuit,
which uses both phases and so will always have two out of phase circuits
that you likely want to combine. If it is a "pure 240V" circuit then
you can just measure one of them and double it in software (which I do
for my AC compressor). However, some 240V circuits also have 120V
available, which means there will be one phase with more current than
the other, and just doubling will not be accurate, although may be good
enough still since the 120V current draw is likely to be quite small. You can tell if a circuit is pure 240V or 240V plus 120V based on if it has a neutral running to it, or just two hots. So, 2 wire (plus ground) = pure 240V, but 3 wire (plus ground) = 240V and 120V.</p><h4 style="text-align: left;">Other thoughts on making 12 inputs work</h4><p>By combining inputs with either headphone splitters or multiple wires inside one CT you can monitor any number of circuits, at the cost of a loss insight into the individual circuits. Some other options you have are to combine your two mains, using either of the options just discussed, or to not monitor the mains at all. There is no reason the IoTaWatt needs to monitor the mains, so if those inputs would be more valuable to you monitoring branch circuits that is an option. Measuring the mains though allows you to produce an "other" output though. You can add your two mains together and then subtract each branch circuit input from it. What is left is all the power your house is using that isn't monitoring by any of your inputs. That's what I did and my "other" output is quite boring (which is the goal). I have a roughly constant 14 watt draw on other, and then it spikes when the basement lights go on (which I can monitor being on via a lux meter in the basement).<br /></p><h4 style="text-align: left;">My install<br /></h4><p>This is a bit out of order now, but I can't be bothered to copy and paste this section before the previous stuff.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6JG37gS95EoiwrL4eHV0jct9CLctIPnGU6-7KbBNlYAfOLNSxTS0Elhyr7cnFgpir07BFSYaI_6m0Jcdf51-hzErtDAU_6pskfSDalORoNfjnqtaLP5bZxYNsbHHuEFkBy7WyY-ab0OXcIb6bdfpsqjinqMLg0vh4LOzC4VPTiMTbZXvFSYggLtYW/s4608/IMG_20220911_145232.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="The before state of my service panel" border="0" data-original-height="4608" data-original-width="3456" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6JG37gS95EoiwrL4eHV0jct9CLctIPnGU6-7KbBNlYAfOLNSxTS0Elhyr7cnFgpir07BFSYaI_6m0Jcdf51-hzErtDAU_6pskfSDalORoNfjnqtaLP5bZxYNsbHHuEFkBy7WyY-ab0OXcIb6bdfpsqjinqMLg0vh4LOzC4VPTiMTbZXvFSYggLtYW/w480-h640/IMG_20220911_145232.jpg" width="480" /></a></div><br /><p>I started with a clean panel which I had rewired when I moved in. I made a spread sheet of all the breakers, what they had on them, and which physical location and phase they were on, so I could plan which might be combined in one CT. The IoTaWatt requires two plugs, one for power, and one to use as a reference voltage. Ideally this is a dedicated circuit so there is less voltage fluctuation as things turn on and off. I added a dedicated 20 amp outlet right next to my service panel for the IoTaWatt.</p><p>I then opened my panel, and began attaching the CTs to the circuits I wanted to measure. Combining the ones that made sense. I haven't mentioned this yet, but even for just single wires in a CT the direction of the wire needs to match the phase, or else it will be negative. Luckily if you mess this up you can just tell the IoTaWatt to flip the value in software. Still, I put some thought into this at attempted to correctly attach all the CTs in the right orientation from the start. </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI9A2rDhVAfzggqYyR_u8MLBgW5aBJrKoXzOopzhI1RX8bZWZCzEXVXyD9o_Uf45qOMv-J69ewsYduGU2PYEDj2aWEgoF0OPslpxdEXfi2XzthIaQDO0ugrT3ZXf2DOzgebzLxPdXhYxJ0BkAX7atknN0hDYNUMkHZsAmqgpixU5PQ5KmGP6xlcgtg/s4624/IMG20230304155534.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="Several CTs attached to the hot wires inside my service panel" border="0" data-original-height="4624" data-original-width="3468" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI9A2rDhVAfzggqYyR_u8MLBgW5aBJrKoXzOopzhI1RX8bZWZCzEXVXyD9o_Uf45qOMv-J69ewsYduGU2PYEDj2aWEgoF0OPslpxdEXfi2XzthIaQDO0ugrT3ZXf2DOzgebzLxPdXhYxJ0BkAX7atknN0hDYNUMkHZsAmqgpixU5PQ5KmGP6xlcgtg/w480-h640/IMG20230304155534.jpg" width="480" /></a></div><br /><p>I knocked out a 1 and 1/4" knockout on the bottom left of the service panel, and put a threaded conduit terminal adapter there to protect the CT wires. I still don't have the wires in conduit, but when I do that I won't have to open the panel again because I can just unplug the CTs from the IoTaWatt and run them through the conduit and then replug them in. The important thing is having the terminal piece there. The 1 and 1/4" conduit is more than enough for the 15 CT wires I have now, 1" may have worked too, but there didn't seem to be much downside to going up to 1 and 1/4" since the knockout I was using went up to that anyway.</p><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdacsE8NU4rVC5soEGHus4X43ykm4S-1FThc8kCAlgn2WehMF4cq4q65qXeDD_KQytqioRBYJ1dzwEphMYgSaDM-Cj2imS4J8nGQgTsrJvMAukLfWkJ-Z-cFbO2WMEOhSqmtCotc2WszmmDG_5_n5IzoHY5sjxVDTbNGzaJpW62NYYFWhcydbS3M_I/s4624/IMG20230304132829.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="My CT wires entering the service panel through a conduit terminal" border="0" data-original-height="3468" data-original-width="4624" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdacsE8NU4rVC5soEGHus4X43ykm4S-1FThc8kCAlgn2WehMF4cq4q65qXeDD_KQytqioRBYJ1dzwEphMYgSaDM-Cj2imS4J8nGQgTsrJvMAukLfWkJ-Z-cFbO2WMEOhSqmtCotc2WszmmDG_5_n5IzoHY5sjxVDTbNGzaJpW62NYYFWhcydbS3M_I/w640-h480/IMG20230304132829.jpg" width="640" /></a></div><p></p><p>I should mention that I'm lucky to have a disconnect outside my house by the meter. When I disconnect that there is no power inside my house, including the service panel. Normally even with your main break off you still have power where your mains come in. You can decide if you're comfortable with that, but if not an electrician should be able to install this pretty easily.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH8ICXrjhZqtgYsLUr66lmvntxZEujjViGGRSuHgV64YKXbO9k1kjsbgnOS88cZDdKHDPC9eRP6fSyCjfhYDyLHh7kIdqyIhN1x_n1gNKq3-351Q8OWrwKWj217x_U7Ojr7KNyBxvfC6vVGylSkYaG2zKXaXA2u8XV-PJPXkVfMiLNxyrDJMuL5pUq/s4624/IMG20230304155514.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="My opened service panel with all the CTs added" border="0" data-original-height="4624" data-original-width="3468" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH8ICXrjhZqtgYsLUr66lmvntxZEujjViGGRSuHgV64YKXbO9k1kjsbgnOS88cZDdKHDPC9eRP6fSyCjfhYDyLHh7kIdqyIhN1x_n1gNKq3-351Q8OWrwKWj217x_U7Ojr7KNyBxvfC6vVGylSkYaG2zKXaXA2u8XV-PJPXkVfMiLNxyrDJMuL5pUq/w480-h640/IMG20230304155514.jpg" width="480" /></a></div><p></p><p>Another tip, which you can see in the below pic is to label all the CT wires, ideally while you still have the panel opened and as you run each one. Personally, I just used the notion of which number breaker each was on, using + or , when there were multiple ones.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCUknH5JMcd7Er8dFSgH2TYYZutLdAJ9o7onsa7z1l7DIVd5ZB1MGozuEASINcMOUEhZB-836PX7XxcRw_EN26wOfdSsX_LEsVZf5ac1oHsfnW4ZeaM7povgBQnrROTE5UBJMvbnOM8p0eD4EUfBLsrVaUreLIKfzbzPpvUUgkZZCbKNXj4bBdGwOW/s4624/IMG20230304132816.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="My closed service pane with the IoTaWatt installed" border="0" data-original-height="4624" data-original-width="3468" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCUknH5JMcd7Er8dFSgH2TYYZutLdAJ9o7onsa7z1l7DIVd5ZB1MGozuEASINcMOUEhZB-836PX7XxcRw_EN26wOfdSsX_LEsVZf5ac1oHsfnW4ZeaM7povgBQnrROTE5UBJMvbnOM8p0eD4EUfBLsrVaUreLIKfzbzPpvUUgkZZCbKNXj4bBdGwOW/w480-h640/IMG20230304132816.jpg" width="480" /></a></div><p> </p><p>The finished product is bit messy, but A. it's a basement, and B. I can easily run conduit to a box and install everything in there without opening the panel again.<br /></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-24440708013608125042023-05-19T19:05:00.002-04:002023-05-19T19:05:22.106-04:00How I Fixed a Parasitic Drain on my Car in 408 Days<p><a href="https://davidmuller.github.io/posts/2023/04/10/how-i-fixed-a-parasitic-drain-in-408-days.html"> https://davidmuller.github.io/posts/2023/04/10/how-i-fixed-a-parasitic-drain-in-408-days.html</a></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-32160192894190145042023-04-12T15:27:00.009-04:002023-04-12T15:27:57.786-04:00Paperclip Game<p>A browser based text only game where you make as many paperclips as possible.<br /><br /><a href="https://www.decisionproblem.com/paperclips/index2.html">https://www.decisionproblem.com/paperclips/index2.html</a></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-79780685427959829172023-03-30T02:03:00.000-04:002023-03-30T02:03:49.636-04:00Turning on my office lights when I plug in my webcam<p>Another post in my series of "absurdly specific things no other human will ever find useful, but I'm still writing a blog post about". I have a USB webcam in my home office on my PC which I use for work meetings. I only plug that webcam in while I'm working, because I don't trust it otherwise. Also, I have some lights above my desk that I like to turn on during meetings for better lighting. The switch for those lights is in the corner behind my desk, and annoying to reach. I installed a smart switch for them so I could turn them on via Home Assistant, but never got around to creating an easier way to turn them on other than the switch, or doing it via the HA UI. Most mornings I plug in the webcam and then reach awkwardly over my monitors to hit the light switch.</p><p>I decided to automate this. Now while I've recently acquired a glut of motion sensors, I find they have far too many false positives and false negatives to actually drive most automations with. Instead I figured I could just detect if my webcam was plugged in and if so, send some signal to HA to turn on the light. My first instinct was a cron job that checked the output of lsusb, which would have worked, but would have been pretty inefficient running every minute, and would have had a lag. Instead, I began googling how to trigger an action when plugging in a USB device and discovered udev rules.</p><h4 style="text-align: left;">udev rules</h4><p><a href="https://wiki.archlinux.org/title/udev">udev rules</a> are a way to trigger commands when various hardware events happen. They're commonly used for doing certain things when a USB thumb drive is plugged in. Anyway, I'm going to skip over a lot of saga here, but if you want to read more about udev rules and how to set them up, you can find a lot of info on Google. Here is <a href="https://opensource.com/article/22/1/cameras-usb-ports-obs">one page that describes some of the details a bit</a>.</p><p>With that in mind, what I ended up with was a file named /etc/udev/rules.d/80-logitech-webcam-connect.rules with the following contents:<br />
<span style="font-family: monospace;"><span style="background-color: white; color: black;">
ACTION=="add" KERNEL=="video0" SUBSYSTEM=="video4linux" SUBSYSTEMS=="usb" ATTRS{idVendor}=="046d", ATTRS{idProduct}=="082c", RUN+="/home/me/bin/webcam_alert/webcam_alert.sh connect"
<br />
ACTION=="remove" KERNEL=="video0" SUBSYSTEM=="video4linux" SUBSYSTEMS=="usb" ATTRS{idVendor}=="046d", ATTRS{idProduct}=="082c", RUN+="/home/me/bin/webcam_alert/webcam_alert.sh disconnect"
</span>
<br />
<br /></span>A couple udev protips I figured out. I know I didn't explain what any of these lines do, but each all caps word (besides RUN) is a filter, which you'll be looking for and then running the command when they all match. Note the KERNEL=="video0" portion. The script works without that, but I was getting duplicate executions, which didn't cause any issues but bothered me.</p><p>Another thing is that the longest part, by far, of all this was the point where I had all this working, except my shell script was seemingly just silently failing. It would log to a file fine, but I slowly realized anything that require network access was just timing out. Turns out this is due to firewall rules that prevent udev rules from connecting to remote machines. The command <span style="font-family: monospace;"><span style="background-color: white; color: black;">sudo systemctl status systemd-udevd.service</span></span> helped in debugging this, and then the command <span style="font-family: monospace;"><span style="background-color: white; color: black;">sudo systemctl edit systemd-udevd.service</span></span> allowed me to <a href="https://www.ctrl.blog/entry/systemd-application-firewall.html">add an exception</a> for the machine that I have running MQTT.<br /></p><h4 style="text-align: left;">Shell Script</h4><p> That command will <a href="https://github.com/StephenWetzel/webcam-alert/blob/main/webcam_alert.sh">call this shell script</a>. You can see there is a connect or disconnect argument that is passed to the script. The script also logs which argument was passed to it, which helps with debugging a lot. That script is just taking that connect or disconnect argument and turning it into an ON or OFF payload to send to an MQTT sensor in Home Assistant.</p><h4 style="text-align: left;">MQTT Auto Discovery Sensors</h4><p>I am a big fan of MQTT auto discovery sensors in Home Assistant. If you don't know, MQTT is just a protocol for sending messages around your network, which is used heavily by smart home senors, particularly once you get into more DIY stuff. You set up a "broker" and then devices can publish JSON messages to "topics", which are just file paths. Then other devices can subscribe to those topics and receive anything published to them. If you set up MQTT and want to play around with messages or just see what messages are being sent, I recommend <a href="http://mqtt-explorer.com/">MQTT Explorer</a> as a really good GUI tool.<br /></p><p></p><p>You can get away without any MQTT for a while, but a lot of the more DIY sensors use it, and once you have it set up it unlocks a lot of capabilities. For example, I'm using it for both <a href="https://daleswanson.blogspot.com/2021/09/how-i-diy-smart-home-sensors.html">ESPHome</a> and <a href="https://www.zigbee2mqtt.io/">Zigbee2MQTT</a>, where I use it to send all data from my zigbee sensors back to HA. I was hesitant to do that for a while because I assumed it would introduce lag, but I can't detect any delay in something like a door sensor opening and triggering a light to turn on.</p><p>Anyway, once you have MQTT set up, you can use a feature of it in <a href="https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery">Home Assistant called Auto Discovery</a>. This has to be enabled, but once you do HA will look for topics matching a certain pattern and when it finds them it'll automatically create a new sensor. Like I said, I'm a big fan of this, and I've made <a href="https://github.com/StephenWetzel/home-assistant-weather-mqtt">a project that uses it to grab local weather data and send it to Home Assistant</a>.</p><p>You can check out the <a href="https://github.com/StephenWetzel/webcam-alert/blob/main/webcam_alert.sh">above shell script</a> if you're interesting in making your own custom MQTT auto discovery sensors, it's the simplest I could set it up. You need to send two different topics, one to configure the sensor and then another for the data. The script is a bit inefficient in that it sends both the configuration and data every time it runs, but I can live with that considering it only runs a couple times a day. The weather data project I linked to is a much better done example of MQTT auto discovery sensors.<br /></p><h4 style="text-align: left;">Home Assistant</h4><p>At this point it's simple. The webcam state gets picked up by HA as a binary sensor with an On and Off state. I just set up an automation to turn on the light via the Lutron integration whenever it transitions from off to on, and vice versa.</p><p>For some reason it detects unplugging faster than plugging in, but it's about a second from plugging in to light being on, and just about instant for unplugging. The timing is a bit of a moot point as it takes a few seconds for Hangouts to detect the camera before I can join a meeting anyway.<br /></p><h4 style="text-align: left;">Summary</h4><p>And there you go. When I plug in my webcam, a custom udev rule triggers, which runs a custom shell script that publishes a MQTT message to a topic which Home Assistant has been configured to automatically detect and treat as a native sensor, and that sensor then triggers an automation which tells the Lutron integration to turn on the lights, simple. I've been using this for a week now, and it's performed flawlessly, despite the fact that I'm still shocked anytime anything I make works even once.<br /></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-56139559250099968652023-02-28T18:18:00.001-05:002023-02-28T18:18:27.141-05:00DIY emulation in 2023<h4 style="text-align: left;">Intro <br /></h4><p>I've been told this is currently the 2020s, and so it's time for my decennial post on how to emulate classic games. I've been chasing the <a href="http://daleswanson.org/stuff/xbox.htm">high of modded original Xboxes</a> running XBMC and a collection of emulators since 2006. The main selling point of that setup was how slick the interface was. Just turn it on and do everything with the controller on a UI that was clearly designed for a TV. The main downside was having a huge Xbox in your living room, and having to use wired controllers.</p><p>Last decade's solution was a <a href="https://daleswanson.blogspot.com/2016/09/replacing-modded-xbox-with-raspberry-pi.html">Raspberry Pi running RetroPie</a>, which worked ok, but the interface was never that great and it struggled with N64.</p><p>Separately, the Roku I use to watch Plex, Netflix, and other media is starting to show its age, and I wouldn't mind something more open source.</p><p>My plan was to buy a mini PC, put linux on it, maybe some HTPC distro, and use that for both media and emulation.</p><p>I'll skip over the saga and say that the media playback didn't work out. I had assumed there would just be native clients for Netflix and others available, but there isn't. There are the web versions, and maybe something could be done with launching the web versions seemlessly, but it just didn't feel like it'd ever have the slick UI I wanted.</p><p>Incidentally, around this time I got an Nvidia Shield donated to me and discovered <a href="https://github.com/yuliskov/SmartTubeNext">SmartTubeNext</a>, which is a Youtube player which skips ads, including portions of the videos about sponsors themselves. That greatly reduced my desire for media playback on the mini PC. I've also been very happy with pairing the Shield with an Xbox controller to play game via Steam Link on my Desktop PC.<br /></p><h4 style="text-align: left;">So what did I end up with?</h4><p>The focus then was just emulation, from N64 and older. First, I bought <a href="https://smile.amazon.com/gp/product/B082VZP76P?psc=1">this Mini PC</a> for $200. Note there are a ton of these around this price point, and they all have similar specs. I sort of regret buying this one because it has a very loud fan, despite the fact that the listing claimed it was silent when I bought it (and later removed that claim), and because this one doesn't support any sort of Wake On LAN or boot on power restore, so there is no way to for me to turn it on remotely, and I can't leave it on 24/7 because of how absurd the fan is.<br /></p><p>I also bought <a href="https://smile.amazon.com/gp/product/B01NBRBWS6?psc=1">this IR USB</a> dongle for $20. I intended on setting it all up manually, but ended up just installing the FLIRC program from the repos and liking it a lot. I set up buttons on my remote to map to Alt+F4 (close program), ESC, and a custom shortcut I set up to show the desktop. Between those and the obvious stuff like arrow keys and enter, I found it pretty easy to use with a remote. The only things I have on the desktop are Steam and RetroArch, as well as a few useful tools, including a shortcut to power off.</p><p>I was using my Logitech Harmony 300 remote until some of the button finally started to give out. I replaced that with <a href="https://smile.amazon.com/gp/product/B07XG1HT7G?psc=1">this remote</a> I got for $40, which I like quite a bit.</p><p>I also have <a href="https://smile.amazon.com/gp/product/B091QVBN73?psc=1">this wireless N64 controller</a> that I got for $40, and which you can use with actual N64s or via a USB dongle on a PC.<br /></p><p>And I found this amazing <a href="https://archive.org/details/no-intro_romsets">archive of every ROM ever</a> on Internet Archive. I got all the N64 and older ROMs from the systems I wanted, and filtered the sets down to the games I had heard of.<br /></p><p>I installed Xubuntu on there, although I'm keeping my eye on KDE's Plasma Bigscreen, which looks very promising for what I want to do, but right now is only available on ARM hardware.</p><p>So overall I'm happy with this set up. I have to get up to turn it on, but after that I can control everything with the remote and controller. I've been playing a lot of N64 games on it, and they generally work well. Goldeneye's sound stutters, but I googled what to tweak in the setting to get the best performance out of it, and that was enough to play through the campaign. Mario 64 I'm about halfway through and it's been flawless.<br /></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-8932333149275157172023-01-02T21:57:00.000-05:002023-01-02T21:57:00.958-05:00My Youtube earnings - Brick Experiment Channel<p><a href="https://brickexperimentchannel.wordpress.com/2022/11/19/my-youtube-earnings/">https://brickexperimentchannel.wordpress.com/2022/11/19/my-youtube-earnings/</a> </p>
<p></p><blockquote>My viewership consists of mostly middle-aged males.</blockquote><p></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-21554416140990041722022-12-09T22:34:00.000-05:002022-12-09T22:34:17.355-05:00Finding the B-21's hangar location from the stars in its press image<p><a href="https://twitter.com/johnmcelhone8/status/1600683623250030593"> https://twitter.com/johnmcelhone8/status/1600683623250030593</a></p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">The photo of the U.S. Air Force's new stealth aircraft is on the left, taken at night, with stars in the background.<br>We can use them to find the exact location of the jet<br><br>(thread) <a href="https://t.co/aJo9kIPv2l">https://t.co/aJo9kIPv2l</a></p>— John McElhone (@johnmcelhone8) <a href="https://twitter.com/johnmcelhone8/status/1600683623250030593?ref_src=twsrc%5Etfw">December 8, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-88872077668902491962022-11-27T02:02:00.000-05:002022-11-27T02:02:32.131-05:00From Oscilloscope to Wireshark: A UDP Story<a href="https://www.mattkeeter.com/blog/2022-08-11-udp/">https://www.mattkeeter.com/blog/2022-08-11-udp/</a>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-868026697098358862022-10-08T19:21:00.004-04:002023-04-23T23:25:18.880-04:00QR codes Share<p><a href="https://typefully.com/DanHollick/qr-codes-T7tLlNi">https://typefully.com/DanHollick/qr-codes-T7tLlNi</a></p><blockquote><div style="margin-bottom: 22px; width: 100%;"><p><span>Second, the mask - what's that?
Well, QR readers work best when there are the same amount of white and black areas.
But the data might not play ball so a mask is used to even things out. When a mask is applied to the code anything that falls under the dark part of the mask is inverted.
A white area becomes black and black area becomes white.</span></p></div><p><span>There are 8 standard patterns which are applied one by one. The pattern that achieves the best result is used and that info is stored so the reader can unapply the mask.</span></p><p><span></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihYYWGZhMPGl3JNM0UGYRpdpP94Z7IPoseVJaFeFzvWg6SwjbehQ8cOj3O1xn4cXoyhFgHWkVSQd-awlEeH-xjFo4mjKIqyTHfUnj0o60z5v1xA9lEvdHIv1ZFWLxFS-thbdfJ7HLm8xPpssMVFL7FFcExR7azckt-IHNWiNCCx83aSwTUpuej30E9/s2024/qr_masks.png" style="margin-left: 1em; margin-right: 1em;"><img alt="the 8 possible QR code masks" border="0" data-original-height="1012" data-original-width="2024" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihYYWGZhMPGl3JNM0UGYRpdpP94Z7IPoseVJaFeFzvWg6SwjbehQ8cOj3O1xn4cXoyhFgHWkVSQd-awlEeH-xjFo4mjKIqyTHfUnj0o60z5v1xA9lEvdHIv1ZFWLxFS-thbdfJ7HLm8xPpssMVFL7FFcExR7azckt-IHNWiNCCx83aSwTUpuej30E9/w640-h320/qr_masks.png" width="640" /></a></div><br /> <p></p></blockquote><p class="css-1u4fp9e" style="box-sizing: border-box; color: var(--c1); font-size: 16px; line-height: 1.5; white-space: pre-wrap; word-break: break-word;"><span></span></p><p> </p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-52950357548829780432022-09-15T19:01:00.001-04:002022-09-15T19:01:18.939-04:00Here’s Why Car Wheels Are So Flat These Days<p><a href="https://www.theautopian.com/heres-why-car-wheels-are-so-flat-these-days-and-no-its-not-just-aerodynamics-and-styling/"> https://www.theautopian.com/heres-why-car-wheels-are-so-flat-these-days-and-no-its-not-just-aerodynamics-and-styling/</a></p><p></p><blockquote><span style="font-weight: 400;">At first, rack and pinion gears were
being applied to existing suspension designs but since the tire forces
were being “amplified” by the large kingpin offset and scrub radius in
those old designs, they were too much for the driver to take and were
ripping the steering wheel out of their hands. Something had to be done
and since there will always be potholes and braking forces, the only
thing that the engineers could do to reduce the forces coming back
through the steering system was to reduce the size of the kingpin offset
and scrub radius. This meant the lower ball joints had to move
outboard, the brakes had to move outboard and all the dominoes started
to fall which spelled the end of deep dish wheels.</span></blockquote><span style="font-weight: 400;"></span> <p></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com1tag:blogger.com,1999:blog-5336107939073973034.post-44757331429106956262022-08-27T00:55:00.000-04:002022-08-27T00:55:57.425-04:00Why No Roman Industrial Revolution?<p><a href="https://acoup.blog/2022/08/26/collections-why-no-roman-industrial-revolution/">https://acoup.blog/2022/08/26/collections-why-no-roman-industrial-revolution/</a></p><p></p><blockquote><p>Eventually in the 1800s, these engines get small enough and fuel
efficient enough to be able to move their own fuel over water or rails,
collapsing the prohibitive transportation costs that defined
pre-industrial economies and in the process breaking <a data-id="13968" data-type="post" href="https://acoup.blog/2022/07/15/collections-logistics-how-did-they-do-it-part-i-the-problem/">the tyranny of the wagon equation</a>, decisively transforming warfare in ways that would <a data-id="8552" data-type="post" href="https://acoup.blog/2021/09/17/collections-no-mans-land-part-i-the-trench-stalemate/">not be fully appreciated until 1914</a>.
</p><p>But the technology could not jump straight to railroads and steam
ships because the first steam engines were nowhere near that powerful or
efficient: creating steam engines that could drive trains and ships
(and thus could move themselves) requires decades of development where
existing technology and economic needs created very valuable niches for
the technology at each stage. It is particularly remarkable here how
much of these conditions are <em>unique to Britain</em>: it has to be
coal, coal has to have massive economic demand (to create the demand for
pumping water out of coal mines) and then there needs to be massive
demand for spinning (so you need a huge textile export industry fueled
both by domestic wool production and the cotton spoils of empire) <em>and</em> a device to manage the conversion of rotational energy into spun thread. I’ve left this bit out for space, but you <em>also</em>
need a major incentive for the design of pressure-cylinders (which, in
the event, was the demand for better siege cannon) because of how that
dovetails with developing better cylinders for steam engines.</p></blockquote>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-63993159038219450112022-07-18T01:38:00.001-04:002022-07-18T01:38:36.473-04:00Is it getting hotter?<p>I wanted to see what actual data said about how much hotter it has gotten in my area during my lifetime. I know climate change is going on at a global level, but I just cared about my area, is it actually getting noticeably warmer, or is it just my imagination?</p><p>Before we go any further I should stress I'm not trying to prove or disprove climate change, or do any sort of serious climate science here. I'm just trying to answer the question: Is it actually noticeably hotter here in the Philly area now than it was when I was a kid?</p><p>I've seen graphs of average temperature over time for cities before, but I feel like they tend to use average temperature over the year. Which, I'm sure is a more important data point for climate science, but again, I only care about if I feel hotter here. I don't really care about days that would have been 50F and now are 60F. I decided the right metric to use for me is how many days over 90F per year do we see? Is that number going up?</p><p>I won't turn this into a huge post. I grabbed <a href="https://www.ncei.noaa.gov/cdo-web/datasets">data from the NOAA here</a>, in a CSV for the Philly airport from 1980 to 2021, which roughly matches the time I've been alive. I threw that into a database and queried the count of days per year over 80F and over 90F, and graphed both, with trend lines.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiduqKvT6QeSt3EF7PHWtk6XUCjqO7qjpqol1wMYuBkIKwukbcWK3fYW0Ufda7rjS6IPf7SXDUbabW3squ6T1Rx5Aa5_A8yFzlQE4S5zF0qG2GrH1r4mR2lGG4vgyJqqSDKrckBBawgwatvkV7V8C3086E9u0Hlt0kkxsa3KQdCK-NMGhynOR65Mkac/s960/philly_over80_trend.png" style="margin-left: 1em; margin-right: 1em;"><img alt="graph of days over 80F in Philadelphia" border="0" data-original-height="521" data-original-width="960" height="348" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiduqKvT6QeSt3EF7PHWtk6XUCjqO7qjpqol1wMYuBkIKwukbcWK3fYW0Ufda7rjS6IPf7SXDUbabW3squ6T1Rx5Aa5_A8yFzlQE4S5zF0qG2GrH1r4mR2lGG4vgyJqqSDKrckBBawgwatvkV7V8C3086E9u0Hlt0kkxsa3KQdCK-NMGhynOR65Mkac/w640-h348/philly_over80_trend.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7F4F3mDqwYIXCCNsDKOHoN2JkBrCowjbFQVVBf9RSh0xYfkMdXlN0IJN22WP77SCw-lTXK5LxeYIE8_RcLGXiF-GdlFBXG-rpdEE7upCUp-KH42GHlQMv8_eFre_Rr6Gur0PjXUfnUprgYBL9NkhUQQ7BBI9ylfscKVUenGnq5f3iHi5MUIZ0-6vG/s943/philly_over90_trend.png" style="margin-left: 1em; margin-right: 1em;"><img alt="graph of days over 90F in Philadelphia" border="0" data-original-height="530" data-original-width="943" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7F4F3mDqwYIXCCNsDKOHoN2JkBrCowjbFQVVBf9RSh0xYfkMdXlN0IJN22WP77SCw-lTXK5LxeYIE8_RcLGXiF-GdlFBXG-rpdEE7upCUp-KH42GHlQMv8_eFre_Rr6Gur0PjXUfnUprgYBL9NkhUQQ7BBI9ylfscKVUenGnq5f3iHi5MUIZ0-6vG/w640-h360/philly_over90_trend.png" width="640" /></a></div><br /><p>Before I put the trendline on there, I have to admit I thought the 90F version didn't show any increase. But then I noticed how few years had less than 20 days over 90F recently vs the 80s. We haven't had a year with less than 10 days over 90F since 2014.</p><p>The over 80F version is a bit harder to read, but I feel like it shows the upward trend better, particularly if you focus on the 100 days line. In the 80s there were a few years with more than 100 days over 80F. In the 90s it was about half the years. In the 2000s it was most, and then in the 2010s it was all but 2, which barely snuck in under the line.</p><p>For fun I also looked for number of days where it never went above 30F. Note this isn't just the daily low, this is the warmest it got on any given day, or in other words, days where it never got above freezing. Spoiler alert, it's also getting less cold.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoLZmnkkhauaB5z03xESPP1Uo36Xjh6SnP6iGtQHuKQferLqMRqPc8ivoR5Q4Ck3oDSh0o2K7Q0ADUARoWFmQkd7a9vGQ3VjP1ab1L4-vvDVzvKjbxhCgZqx_zDy7x70itESemnukX6v_MZViSHN-P66X9L9zWTzfXiAPbUqYXVmWjRVdwiKNAdscI/s943/philly_under30_trend.png" style="margin-left: 1em; margin-right: 1em;"><img alt="graph of days under 30F in Philadelphia" border="0" data-original-height="530" data-original-width="943" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoLZmnkkhauaB5z03xESPP1Uo36Xjh6SnP6iGtQHuKQferLqMRqPc8ivoR5Q4Ck3oDSh0o2K7Q0ADUARoWFmQkd7a9vGQ3VjP1ab1L4-vvDVzvKjbxhCgZqx_zDy7x70itESemnukX6v_MZViSHN-P66X9L9zWTzfXiAPbUqYXVmWjRVdwiKNAdscI/w640-h360/philly_under30_trend.png" width="640" /></a></div><p>I did also pull the lows and looked at those, they showed similar trends. The 1980s had an average of 25 days below 20F, the 2010s had an average of 13 days, and 2021 had exactly 1. The one graph I will post from the lows is this one of the number of days where the low is over 70F. In other words, days where it never goes below 70F, even over night. If you're looking to cool your house by opening the windows over night and closing them during the day when it heats up, it's going to be pretty tough to do if it's not going below 70F at all (which probably means it's still over 80F when you're going to bed).<br /></p><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzHEhnfGJjmRfkMAiAj19MBbMaE8nZW3xMQ1TX0zaTWp1lOcf1bAutntGYytymdWGl1DWucJf2Edat5klJyhPebCxpdI9FCvAZAla_DObO9tAOs3WQ3i0wvu-yqnCc7Nekj4GmyG7D536j17h1_lMALDS0ADGjw5W1DcHEllu3crYHyZJAnmnAovoX/s943/philly_low_over70_trend.png" style="margin-left: 1em; margin-right: 1em;"><img alt="graph of days with a low over 70F in Philadelphia" border="0" data-original-height="530" data-original-width="943" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzHEhnfGJjmRfkMAiAj19MBbMaE8nZW3xMQ1TX0zaTWp1lOcf1bAutntGYytymdWGl1DWucJf2Edat5klJyhPebCxpdI9FCvAZAla_DObO9tAOs3WQ3i0wvu-yqnCc7Nekj4GmyG7D536j17h1_lMALDS0ADGjw5W1DcHEllu3crYHyZJAnmnAovoX/w640-h360/philly_low_over70_trend.png" width="640" /></a></div><br /><p></p><p>I was actually surprised at how clear the trend was in the data, and in every single version of the data I could think of to look at. There wasn't a single dimension I looked at that didn't show this trend. Turns out it is hotter now than when I was a kid. Not a fan.<br /></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-56731456954233381472022-07-12T23:04:00.001-04:002022-07-12T23:04:00.190-04:00 Mouse Heaven or Mouse Hell?<p><a href="https://www.sciencehistory.org/distillations/mouse-heaven-or-mouse-hell"> https://www.sciencehistory.org/distillations/mouse-heaven-or-mouse-hell</a></p><p></p><blockquote><p>Officially, the colony was called the Mortality-Inhibiting Environment for Mice. Unofficially, it was called mouse heaven.</p>
<p>Biologist John Calhoun built the colony at the National Institute of
Mental Health in Maryland in 1968. It was a large pen—a 4½-foot
cube—with everything a mouse could ever desire: plenty of food and
water; a perfect climate; reams of paper to make cozy nests; and 256
separate apartments, accessible via mesh tubes bolted to the walls.
Calhoun also screened the mice to eliminate disease. Free from predators
and other worries, a mouse could theoretically live to an
extraordinarily old age there, without a single worry.</p>
<p>But the thing is, this wasn’t Calhoun’s first rodent utopia. This was
the 25th iteration. And by this point he knew how quickly mouse heaven
could deteriorate into mouse hell.</p></blockquote><p></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0tag:blogger.com,1999:blog-5336107939073973034.post-52787346101919551152022-06-25T01:06:00.002-04:002023-06-17T00:36:44.888-04:00Converting numbers stored as decimal to binary encoded decimal values in PostgreSQL, or how I fixed my smart water meter reader<h1 style="text-align: left;">Intro <br /></h1><p>In my <a href="https://daleswanson.blogspot.com/2022/06/reading-my-water-meter-from-home.html">previous post about reading my smart water meter in Home Assistant</a>, I left you on a cliff hanger. You don't really need to go back and read that post if you haven't already. Just know that I'm reading my smart water meter using a <a href="https://www.rtl-sdr.com/about-rtl-sdr/">USB </a><a href="https://www.rtl-sdr.com/about-rtl-sdr/">SDR</a> dongle and a tool called <a href="https://github.com/bemasher/rtlamr">rtlamr</a>, (and a wrapper for that tool called <a href="https://github.com/allangood/rtlamr2mqtt">rtlamr2mqtt</a>). While I seemed to be able to read the meter, and the ID matched the one printed on the label, there was a drift between the two readings.</p><p>Also know that you really don't need to read this post. Of everything I've written for this blog, this may be the most absurd self indulgent post yet. I can guarantee you, that no one will find the contents of this post useful.</p><p><br /></p><h1 style="text-align: left;">Figuring out the offset</h1><p>My initial readings from the SDR were 157815, while the physical meter read 268770. I had a suspicion that the SDR would have to be multiplied by 10, because the physical meter had an odometer style dial for all the digits down to the 10s digit. The 1s digit was a permanent 0, and then there was a clock style dial, which I assumed was the 1s digit.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1Dthn-ODNnx1Hbc1UbHpxMz0Zcfi_uVn_gI7UH2SjUwEKl-q7iE5pxSL7A6xYmQ5_msED-X3OK-dJEwdgLzQhnyGvtbEWKNyqGWKS8LT-wMf7BZYqnZO7a-j2CcC-ZSFDS08LbDHa2yewhNtuVM6EAjsvuYb7Vf7pDpXksq70bJZCcJe7mABQJFd/s698/Screenshot_20220608_004758.png" style="margin-left: 1em; margin-right: 1em;"><img alt="water meter, showing the dials" border="0" data-original-height="698" data-original-width="694" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1Dthn-ODNnx1Hbc1UbHpxMz0Zcfi_uVn_gI7UH2SjUwEKl-q7iE5pxSL7A6xYmQ5_msED-X3OK-dJEwdgLzQhnyGvtbEWKNyqGWKS8LT-wMf7BZYqnZO7a-j2CcC-ZSFDS08LbDHa2yewhNtuVM6EAjsvuYb7Vf7pDpXksq70bJZCcJe7mABQJFd/w636-h640/Screenshot_20220608_004758.png" width="636" /></a></div><p>I just sort of assumed that the SDR version of this number would also have a resolution of the 10s digit, but I hoped it was better. It was also possible it was much worse. The water company bills me by the 1000s of gallon. If I understood the meter, that would be the white dials. It was entirely possible the SDR was only broadcasting that number. I also wasn't sure what kind of time lag there would be between usage and the SDR reading changing. I was getting readings pretty constantly, about once a minute, maybe more, but those readings didn't seem to change when I was actually using water.<br /></p><p>After the first night I could see the SDR meter updating about once an hour. Not ideal, if I was going to use this to help detect leaks, but still better than nothing.</p><p>I would wait until a time when we hadn't used much water, and then record the physical meter. If the SDR didn't update for at least an hour before and after the time I read the physical meter, then I assumed that SDR reading corresponded to the physical reading I had. My plan was to do that about once a day for a while and then try to find the offset. I figured with just two pairs, I should be able to find the equation of the line through those points and that ought to be enough to convert between the two. That is, as long as the SDR was increasing in a linear way.<br /></p><p>After a day I had these two readings. With both I verified that the SDR reading hadn't changed for a while around the time they were taken, both around 3pm.</p><p>6/2: 268815.4 157825<br />6/3: 268864.5 157830</p><p>Solving that line gave me this formula to convert the SDR reading to the physical reading: physical = 9.82 * SDR - 1281026.1. Looking at the multiplier of 9.82 I realized that confirmed my suspicion that the SDR reading was for 10 gallons, and that the factor should just be 10, the only reason it wasn't was the error in the SDR value, since that was only accurate to 10 gallons. I simply used 10x and found the offset and that gave me the slightly updated formula of: physical = 10 * SDR - 1309434.</p><p>And with that, I was pretty much done...</p><p><br /></p><h1 style="text-align: left;">Discrepancies</h1><p>6/3 was a Friday, so I didn't get a chance to get a good reading over the weekend, but come Monday I took another reading to confirm my formula worked. On the afternoon of 6/6 I read the physical meter at 269214.8, and the SDR reading was 157985. Plugging the SDR value into my formula gave: 10 * 157985 - 1309434 = 270416. Which is 1201.2 gallons too high.</p><p>Now this was <a href="https://getyarn.io/yarn-clip/bba54aae-f455-427c-956d-99afce1840d4">damn peculiar</a>. I wouldn't have been surprised to see some error, but 1200 gallons was way too much. The fact that it was close to 1000 made me suspicious that perhaps I had read something wrong. Luckily I had taken pictures of each physical meter reading. I double and triple checked everything, but got the same results.<br /></p><p>I went back and looked at the graph of SDR readings. There was a clear jump at about 11:30am that day. The previous change was at 3am and the SDR value at that time was 157849, then at 11:30 that changed to 157952. Note that just looking at the last two digits the value went from 49 to 52. Those are 10s of gallons so 30 gallons used. That seemed plausible, albeit still a bit high. I began to wonder if the first 4 digits of the SDR number were actually something else, basically two independent numbers just concatenated together. I tried subtracting 1000 from the readings after the jump, and that helped, but they were still off by a lot.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNrywKfdjo_aooD3rMvcJPiBx0bodjwwfs2lM5ETOxMWM08Hwjk3oRhK9t-reAzYpv8rPrKoPk_uAWgRFvnvjWdM5yiE_MaMtFzE-x6AbdOxaNyLV7Ws_pHJZCjcF-2PCGTy_9KmFZZKCx5ixnVmyepEEwGggqcqe8IkAHTWNfg0Nfo0kDwz3X0jt/s1226/Screenshot_20220610_020325.png" style="margin-left: 1em; margin-right: 1em;"><img alt="spreadsheet of SDR and actual meter readings" border="0" data-original-height="211" data-original-width="1226" height="110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNrywKfdjo_aooD3rMvcJPiBx0bodjwwfs2lM5ETOxMWM08Hwjk3oRhK9t-reAzYpv8rPrKoPk_uAWgRFvnvjWdM5yiE_MaMtFzE-x6AbdOxaNyLV7Ws_pHJZCjcF-2PCGTy_9KmFZZKCx5ixnVmyepEEwGggqcqe8IkAHTWNfg0Nfo0kDwz3X0jt/w640-h110/Screenshot_20220610_020325.png" width="640" /></a></div><p></p><p>After a week of this I began to lose hope that I'd be able to correct this issue. I tried fitting any curve to these numbers, even though it really didn't make any sense why the meter would go up in a non-linear fashion. I started to rationalize that at least the SDR did seem to increase when we used water, and stay the same when we didn't. At the very least, I could do something with that.<br /></p><p><br /></p><h1 style="text-align: left;">Stumbling Block</h1><p>You may remember from <a href="https://daleswanson.blogspot.com/2022/06/reading-my-water-meter-from-home.html">my first post</a>, that my first stumbling block was reading the default scm meter type, instead of the r900 type I actually had. It turns out this was also my second stumbling block.</p><p>I began to be more sure that A. I was not making any mistakes with these readings, and B. this was a common enough water meter that someone else must have also had this issue. After a lot of searching, and just reading through every issue on the github project that mentioned the R900 meter, I finally found <a href="https://github.com/bemasher/rtlamr/issues/94">this issue</a>.<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8wxwrRE1Iey8XCR20iIGS_aXmo0ZeVatufDTo_HQYbGdSxQnhkP8mkk_QFKezRW-P01z-0G7w0CM7sr3hAWe_fkEJJF0CG8NGct9Thp3_J2_ZXza5PlN4OeEZwHLyAvw5ns2wQ7DDlbXdSaelPHHr6xBTEistyonzrzCXc4N7-BdqFBIIhEwQixyp/s859/Screenshot_20220610_021009.png" style="margin-left: 1em; margin-right: 1em;"><img alt="github issue suggesting to use r900bcd if r900 produces odd results" border="0" data-original-height="450" data-original-width="859" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8wxwrRE1Iey8XCR20iIGS_aXmo0ZeVatufDTo_HQYbGdSxQnhkP8mkk_QFKezRW-P01z-0G7w0CM7sr3hAWe_fkEJJF0CG8NGct9Thp3_J2_ZXza5PlN4OeEZwHLyAvw5ns2wQ7DDlbXdSaelPHHr6xBTEistyonzrzCXc4N7-BdqFBIIhEwQixyp/w640-h336/Screenshot_20220610_021009.png" width="640" /></a></div><p>That was it. Turns out there was another r900 type, called r900bcd (binary coded decimal). I had seen this type, but figured if I was able to read my meter using the r900 type that meant that was what I had. I never thought that the r900bcd type would also be able to read my meter, but produce different outputs.</p><p>Sure enough I changed the type to r900bcd, relaunched the program, and the readings matched the physical meter exactly (up to the 10s digit). This was both a huge relief and super annoying that I wasted so much time on what was essentially the same problem I already had.</p><p>Either way, I was happy to have accurate water usage data, to within 10 gallons and approximately an hour. I could definitely use that to detect leaks while we were away or asleep. But now I had a new problem. I had already collected a week's worth of priceless data. What was I to do with these data points, which through no fault of their own, had been encoded incorrectly?</p><p>Well, if you'd like a snack now is the time to get one, because this is the part where the blog post gets good. If you're somewhat annoyed at having read a 1000 word essay, which was essentially a preamble to the actual purpose of this post, please remember that you were warned earlier.<br /></p><p><br /></p><h1 style="text-align: left;">Binary Coded Decimal</h1><p>"What is Binary Coded Decimal (BCD)" you almost certainly do not ask yourself? Well it's a system where instead of just converting a full number into binary, you instead take each individual decimal digit and convert it into binary. 4 binary digits let you express all the numbers from 0 to 9, so you can represent each decimal digit with 4 binary digits. Why would we do that? It does have some advantages when expressing numbers which could grow quite large, and we don't want to lose any precision. Dates and times are a good example. We could (and often do) convert a time into just the number of seconds since X, and then store that as a big binary number, but using <a href="https://www.digital-detective.net/binary-coded-decimal-timestamps/">BCD</a> lets us encode each digit in a date exactly.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqIifKyhjeNflWbSaK7awxgffTx9oKCNH3O7tXiA034AG8ByZIclx2VLM1TtJgptjb2LhOz6BLxIh9IzeeA4ILRTFt7ZDPhrj7l4SAesEgZMQwl-cbAJQx-FmWzxVt2B8fcA_7Xw99MdvX6rsq2rQIAEi_tHgszkmLP-Ytfu_hfY0MD0BE7rmEJxSH/s523/Binary-Coded-Decimal-Comparison-to-Binary.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="graphic explaing BCD vs binary" border="0" data-original-height="523" data-original-width="496" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqIifKyhjeNflWbSaK7awxgffTx9oKCNH3O7tXiA034AG8ByZIclx2VLM1TtJgptjb2LhOz6BLxIh9IzeeA4ILRTFt7ZDPhrj7l4SAesEgZMQwl-cbAJQx-FmWzxVt2B8fcA_7Xw99MdvX6rsq2rQIAEi_tHgszkmLP-Ytfu_hfY0MD0BE7rmEJxSH/s16000/Binary-Coded-Decimal-Comparison-to-Binary.jpg" /></a></div><br /><p><br /></p><h1 style="text-align: left;">Converting decimal numbers into BCD</h1><p>Now I have these values which seem all over the place, but are actually just numbers which were converted from binary to decimal, when they should have been converted from BCD into decimal. No information has been lost, I simply need to figure out how to correct the encodings of these numbers. Though, it took me a while to even wrap my head around what set of operations I wanted to perform.</p><p>After thinking it through for a while, and doing some trial and error with online calculators, I figured it out. I had to convert my decimal values back into (normal) binary. I had to then break that binary number up into groups of 4 digits each. And then, convert each of those groups of 4 binary digits back into a decimal number. Finally, I could just concat those decimal digits into my correct value.</p><p>From about a week I didn't have that much data to correct. I could have very easily written a little script to iterate over each value and convert it for me. I didn't <i>need</i> to do this in SQL, and in fact I wasn't even sure I <i>could</i> do this in SQL. But I was pretty sure SQL could convert decimal to binary and back again, and that (plus a bunch of string manipulation) was really all I needed.</p><p> </p><h1 style="text-align: left;">The Query <br /></h1><p>So without further ado, here is the monstrosity of a SQL query I wrote to convert values which had been incorrectly converted from BCD to decimal as if they were simple binary numbers.<br />
<script src="https://gist.github.com/StephenWetzel/b999a7c2d1ad95dde73696d345091359.js"></script>
</p><p></p><p><br />I'll attempt to walk you through it, but if you don't know SQL you might as well just skip ahead. I start with a subquery, as I like to do. This subquery is just trying to convert the numbers from decimal back to binary. This is the part doing work:</p><p><code>select right((state::int / 10)::bit(32)::varchar, 20) as binary_num</code></p><p>First it has to divide by 10, then convert to binary, then cast as a string and just take the last 20 digits (4 bits * 5 decimal digits = 20 bits in BCD). Now that I have that BCD string, all I have to do is split it up into groups of 4 bits. Each<br /><code>SUBSTRING(binary_num, 1, 4)::bit(4)::int::varchar</code><br /></p><p>Is grabbing one group of 4 bits, converting it from a string to a binary number, then to a decimal digit, and then back to a string. And then I just concat those together, convert that back to an int so that I can multiply that by 10, and that is my corrected value.</p><p>With that I had a bunch of lines of the ids that had to change and the values they had to change to. Now, despite having written that query, I can never remember how to write an insert or update that uses a subquery off the top of my head. Instead I just copied the results of the select into Sublime, and used my favorite text editor feature of all time, multi-line cursor. I just wrote an update statement for each line all at once and ran those few hundred statements together in a transaction.</p><p> </p><h1 style="text-align: left;">Result</h1><p>And with that, all was right. I had my priceless data, and could admire my graphs to my heart's content. I'll leave you with this graph of the original vs the corrected data for your viewing pleasure.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxW7fxx8VV-hdaMZQpLr4cJ0Qgk_rbtJchOkegZuWz4SGU_KICAocEm4C4oUpEMLI0mxijEO5lQMz9FkgbSqkqSf_zMf9CmydI7NsZabbVLLbhhVMqjaFuEvPnptb_aQf22SsOUZvN_jQhnrLH-sWbtwZKE2qR1MzwKt2hP0PeDnaUPCqe2aChrngd/s1789/water_meter_vs_sdr_large_2.png" style="margin-left: 1em; margin-right: 1em;"><img alt="a graph of actual water meter readings vs sdr readings" border="0" data-original-height="1007" data-original-width="1789" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxW7fxx8VV-hdaMZQpLr4cJ0Qgk_rbtJchOkegZuWz4SGU_KICAocEm4C4oUpEMLI0mxijEO5lQMz9FkgbSqkqSf_zMf9CmydI7NsZabbVLLbhhVMqjaFuEvPnptb_aQf22SsOUZvN_jQhnrLH-sWbtwZKE2qR1MzwKt2hP0PeDnaUPCqe2aChrngd/w640-h360/water_meter_vs_sdr_large_2.png" width="640" /></a></div><p><br /></p>Dalehttp://www.blogger.com/profile/16971331812573996589noreply@blogger.com0