<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2024-11-25T03:57:50+00:00</updated><id>/feed.xml</id><title type="html">Pardner’s Roundup</title><subtitle>Twice as 25 as those other dot-com founders
</subtitle><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><entry><title type="html">How Apple ‘double-dips’ their egregious upgrade prices</title><link href="/2024/11/25/how-apple-double-dips-those-egregious-upgrade-prices.html" rel="alternate" type="text/html" title="How Apple ‘double-dips’ their egregious upgrade prices" /><published>2024-11-25T03:50:00+00:00</published><updated>2024-11-25T03:50:00+00:00</updated><id>/2024/11/25/how-apple-double-dips-those-egregious-upgrade-prices</id><content type="html" xml:base="/2024/11/25/how-apple-double-dips-those-egregious-upgrade-prices.html"><![CDATA[<p>I’m not the first to comment on the ridiculous RAM/SSD upgrade prices that Apple charges. You can see lots of charts online showing how RAM and SSD prices have plummeted  over the years… <em>except</em> on Apple devices.</p>

<p>But no one seems to notice how much more egregious those prices really are after you consider Apple only lets its retailers sell the lower-end versions.</p>

<p>Want to future-proof your MBP by getting a 2TB SSD? That’s generally only available from Apple directly, so Apple keeps 100% of those ridiculous upgrade charges, making their margins even higher compared to the lower-end models that are also sold by third parties like Best Buy or Costco.</p>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[I’m not the first to comment on the ridiculous RAM/SSD upgrade prices that Apple charges. You can see lots of charts online showing how RAM and SSD prices have plummeted over the years… except on Apple devices.]]></summary></entry><entry><title type="html">Coulda Woulda Shoulda (2024 Harris Edition): Attack the Pandemic Profiteers</title><link href="/2024/11/09/coulda-woulda-shoulda-2024-harris-edition.html" rel="alternate" type="text/html" title="Coulda Woulda Shoulda (2024 Harris Edition): Attack the Pandemic Profiteers" /><published>2024-11-09T07:43:00+00:00</published><updated>2024-11-09T07:43:00+00:00</updated><id>/2024/11/09/coulda-woulda-shoulda-2024-harris-edition</id><content type="html" xml:base="/2024/11/09/coulda-woulda-shoulda-2024-harris-edition.html"><![CDATA[<p>If only she had messaged:</p>

<blockquote>
  <p>Let me take the fight to the next step: bringing the full force of the federal government down on the “pandemic profiteers”. We have ample proof of corporate and billionaire greed and exploitation. Now it’s time to send in a prosecutor to bring justice to the American people.</p>

  <p>What I want to tell the profiteers: ‘Brace yourself, we know who you are, here I come, and I aint gonna be playing defense.’</p>
</blockquote>

<p>My key premise is the <strong>Billionaire Trump</strong> did a very good job inciting anger at what is (unfortunately) the #1 concern of (short-sighted and ill-informed) voters while deflecting the blame from the actual culprits (the greedy class) and <em>therefore</em> the Dems had a chance to do the same thing with a simple posture:</p>

<blockquote>
  <p>“<strong>Billionaire Trump</strong> sold you out to mega-corporations and billionaires - that’s just what billionaires do if you elect them. Joe Biden got us half-way towards fixing it. Let’s finish the cleanup.”</p>
</blockquote>

<p>Where she really screwed up is “waffle” when asked what she would do differently compared to Biden. I get she didn’t want to throw Biden+Harris under the bus, but she did not have to…</p>

<p>She coulda/shoulda positioned the last 4 years as the “first aid” stage for a gravely wounded economy, but now it’s time to counterattack and take back the ground lost under Trump and his cronies. (Cite examples like political appointees with astonishing conflicts of interest profting as they gutted public institutions.)</p>

<h2 id="the-script">The Script</h2>

<ul>
  <li>Billionaire Trump left behind a trainwreck of an economy, gutted by cronies and other billionaires (cite stats)</li>
  <li>Even with a disfunctional Congress Biden managed to unwind the worst of it and get the economy off life support in one term (cite accomplishments)</li>
  <li>But in the process, mega-corporations and billionaires exploited the economic upheaval for their own benefit at the expense of <em>everyone</em> else. Cite:
    <ul>
      <li>Record inflation + record corporate profits means the inflations is direct result of corporate profiteering</li>
      <li>Billionaires - including Billionaire Trump - enjoyed unprecedented gains</li>
      <li>Working class Americans have a harder and harder time affording groceries or a home</li>
    </ul>
  </li>
  <li>The solution is simple, but not easy: “give me a 4 year mandate in the house, senate, and white house and let’s finish what we started and make the pandemic profiteers fully accountable to the American people” … for example:
    <ul>
      <li>repatriate unearned profiteering gains to the direct benefit of everyday Americans… send all Americans a periodic “refund” check, like they do for class-action lawsuits</li>
      <li>bust monopolies found guity of profiteering</li>
    </ul>
  </li>
</ul>

<p>There’s a lot of ways to handle the actual positioning. One being: “War” on the greedy class. A better alternative is probably:</p>

<ul>
  <li>Biden was the “emergency medic” we needed to stop the bleeding, and he did it.</li>
  <li>Now, Harris is the “surgeon to excise the cancer of unchecked greed that <strong>Billionaire Trump</strong> instigated”.</li>
</ul>

<h2 id="a-missed-opportunity">A missed opportunity</h2>

<p>I suspect the social media tycoons, being the social parasites they are, would have fallen into line behind her, faced with the alternative of being in her crosshairs. (E.g., precisely the same intimidation strategy <strong>Billionaire Trump</strong> uses.)</p>

<p>But, as Bernie has noted, the Democratic party refused to raise the banner of the exploited working class. Attacking profiteers does not make one a socialist.</p>

<p>And as we plainly saw, in 2024 identifying the real enemy - profiteering mega-corporations and billionaires with record profits at <em>your</em> expense - would have been a more effective strategy than assuming Americans to have the sense to consider character.</p>

<p>Harris’ team could have, in my opinion, handled a lot of things better, but the economy was #1 so they needed to aggressively attack the profiteers, not try to gaslight people into equating a good stock market with a good economy for non-billionaires.</p>

<h3 id="final-thought-harris-shoulda-never-mentioned-trumps-name-without-billionaire-in-front-of-it">Final thought: Harris shoulda never mentioned Trump’s name without “Billionaire” in front of it.</h3>

<p>As evidenced in 2016, rebranding the opposition via name-calling repetition works, unfortunately. When talking to people who work for a living using “billionaire” as a pejorative would be effective on many levels in the us-vs-them battle for votes. Or in this case “U.S. vs Them”?</p>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[If only she had messaged:]]></summary></entry><entry><title type="html">Rising stupidity sinks all boats.</title><link href="/2024/11/07/rising-stupidity-sinks-all-boats.html" rel="alternate" type="text/html" title="Rising stupidity sinks all boats." /><published>2024-11-07T01:45:00+00:00</published><updated>2024-11-07T01:45:00+00:00</updated><id>/2024/11/07/rising-stupidity-sinks-all-boats</id><content type="html" xml:base="/2024/11/07/rising-stupidity-sinks-all-boats.html"><![CDATA[<p>(But not super-yachts.)</p>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[(But not super-yachts.)]]></summary></entry><entry><title type="html">Love of money is the root of all evil.</title><link href="/2024/11/06/love-of-money-is-the-root-of-all-evil.html" rel="alternate" type="text/html" title="Love of money is the root of all evil." /><published>2024-11-06T21:33:00+00:00</published><updated>2024-11-06T21:33:00+00:00</updated><id>/2024/11/06/love-of-money-is-the-root-of-all-evil</id><content type="html" xml:base="/2024/11/06/love-of-money-is-the-root-of-all-evil.html"><![CDATA[<p>A majority of people seem to think they voted <em>their</em> wallet.</p>

<p>I anticipate they, and their children, and their children’s children, will discover soon enough <em>whose</em> wallets they <em>actually</em> voted for.</p>

<p>Bamboozled by Billionaires.</p>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[A majority of people seem to think they voted their wallet.]]></summary></entry><entry><title type="html">How to ‘hone in on’ a software solution using Claude.ai</title><link href="/2024/09/14/an-example-software-consultation-with-claude-ai.html" rel="alternate" type="text/html" title="How to ‘hone in on’ a software solution using Claude.ai" /><published>2024-09-14T18:58:00+00:00</published><updated>2024-09-14T18:58:00+00:00</updated><id>/2024/09/14/an-example-software-consultation-with-claude-ai</id><content type="html" xml:base="/2024/09/14/an-example-software-consultation-with-claude-ai.html"><![CDATA[<p>Allow me to join the chorus of developers who find AI to be an outstanding productivity tool.</p>

<p>One key reason AI is so helpful programming is the ablity to copy the AI’s code answer and simply “run it”. (I’ve had ChatGpt just make stuff up and tell me to use methods that do not exist)</p>

<p>But, as shown below, the programmer needs the ability to ask good questions. (Fortunately perfect typing is not needed as AI does a great job working around typos.)</p>

<p>Particularly impressive is AI’s ability to infer the <em>context</em> of a question. <strong>For example my third question below</strong>  when I asked what <em>could</em> have been interpreted as a yes/no question yet the AI properly construed that was me pointing out a possible bug, and the AI re-wrote the appropriate section of the code despite me not even naming the specific code I had doubts about. <strong>Ditto my fifth question below</strong> and the AI’s realizing the issue was to avoid introducing hard to debug errors.</p>

<p>Essentially, working with an AI assist is like working with a <em>junior</em> programmmer… who happens to have read <em>everything</em> on the internet related to programming.</p>

<p>AI’s ability to infer context is perhaps what I find most remarkable.</p>

<p>Here’s a fairly typical conversation from this morning wiht code redacted to highlight the back-and-forth discusion that narrows down to a rather elegant solution to a problem which I imagine was entirely unique.</p>

<blockquote>
  <p>ME:</p>

  <p>my rails app uses rack_attack.
I have written a method add_ip_to_suspects(ip, path)
the method quickly stores the ip address and the (invalid) path it tried to request in Rails.cache for  later processing to possibly add to a more permanent blocking scheme, those details are not important at this time.
my question is where can I place that method so that a) any of my controller routes can use it, AND b) so it gets invoked by rack_attack.rb when THIS rule (which blocks attempts to access for exmaple a .php route which is a 100% certain indication of a hacker) gets triggered</p>

  <p>MY CODE</p>
</blockquote>

<p>CLAUDE:</p>

<p>To make your add_ip_to_suspects(ip, path) method accessible from both your controllers and the Rack::Attack configuration, you can follow these steps:
Create a new concern:
First, create a new file app/controllers/concerns/suspect_ip_handler.rb:</p>

<p>CODE</p>

<p>Include the concern in your ApplicationController:
In app/controllers/application_controller.rb:</p>

<p>CODE</p>

<p>Extend the Rack::Attack class with the concern:
In your config/initializers/rack_attack.rb:</p>

<p>CODE</p>

<p>Modify your Rack::Attack rule:
Now you can use the add_ip_to_suspects method in your Rack::Attack rule:</p>

<p>CODE</p>

<p>With these changes:</p>

<p>a) Any of your controller routes can use the method by calling SuspectIpHandler.add_ip_to_suspects(ip, path) or simply add_ip_to_suspects(ip, path) within a controller action.</p>

<p>b) The method gets invoked by rack_attack.rb when the rule is triggered.</p>

<p>This approach keeps your code DRY and makes the add_ip_to_suspects method accessible from both your controllers and the Rack::Attack configuration. The method is defined in one place and can be easily maintained and updated as needed.</p>

<blockquote>
  <p>ME:</p>

  <p>is there an alternative to using a concern, if I only need it in my Home controller and in rack_attack</p>
</blockquote>

<p>CLAUDE:</p>

<p>Certainly. If you only need the method in your Home controller and Rack::Attack, you can use a simpler approach without creating a concern. Here’s an alternative solution:</p>
<ul>
  <li>Create a module in lib directory:</li>
  <li>Create a new file lib/suspect_ip_handler.rb:</li>
</ul>

<p>CODE</p>

<p>Make sure the lib directory is autoloaded:
In config/application.rb, ensure you have this line:</p>

<p>CODE</p>

<p>Use the module in your Home controller:
In app/controllers/home_controller.rb:</p>

<p>CODE</p>

<p>Use the module in Rack::Attack:
In your config/initializers/rack_attack.rb:</p>

<p>CODE</p>

<p>This approach has several benefits:</p>
<ul>
  <li>It’s simpler than using a concern, as you’re only defining the method once in a module.</li>
  <li>It’s more isolated, as you’re only including it where it’s needed (Home controller and Rack::Attack).</li>
  <li>It’s still easily maintainable, as the method is defined in one place.</li>
  <li>It doesn’t add the method to all controllers, which keeps your application cleaner if you only need it in specific places.
To use the method:</li>
  <li>In your Home controller, you can call SuspectIpHandler.add_ip_to_suspects(ip, path).</li>
  <li>In Rack::Attack, you’re already calling it as shown in the example above.
This solution provides a good balance between accessibility and isolation for your specific use case.</li>
</ul>

<blockquote>
  <p>ME:</p>

  <p>to confirm, rack_attack, whcih is middleware can access a lib module?</p>
</blockquote>

<p>CLAUDE:</p>

<p>You’re right to double-check this. I apologize for any confusion in my previous response. Let me clarify and provide a more accurate solution:</p>
<ul>
  <li>You’re correct to be cautious. Rack middleware, including Rack::Attack, runs in a different context than your Rails application. This means it doesn’t have direct access to your lib directory or Rails autoloading mechanisms by default. Here’s a more reliable approach:</li>
  <li>Create a new initializer file:</li>
  <li>Create config/initializers/suspect_ip_handler.rb:</li>
</ul>

<p>SuspectIpHandler Initializer</p>

<p>Use the method in your Rack::Attack configuration:
In config/initializers/rack_attack.rb:</p>

<p>CODE</p>

<p>Use in your Home controller:
In app/controllers/home_controller.rb:</p>

<p>CODE</p>

<p>This approach has several advantages:</p>
<ul>
  <li>It ensures the SuspectIpHandler module is loaded and available when Rack::Attack initializes.</li>
  <li>It makes the method available to both Rack::Attack and your Rails controllers.</li>
  <li>It keeps the implementation in one place, making it easy to maintain.</li>
  <li>It works reliably in the Rack middleware context.
By defining the module and extending Rack::Attack in an initializer, we ensure that the method is available to Rack::Attack when it’s set up, avoiding any issues with Rails autoloading or accessing application code from middleware.</li>
</ul>

<blockquote>
  <p>ME:</p>

  <p>how do i know it will be avialable when rack_attack is initilaized? do I need ot control the initializer order in some way with suspect_ip_handler.rb and rack_attack.rb ?</p>
</blockquote>

<p>CLAUDE:</p>

<p>You raise an excellent point about initialization order. Let’s address this concern to ensure our solution is robust:</p>
<ul>
  <li>You’re right to be cautious about the initialization order. In Rails, initializers are loaded alphabetically by default, which could potentially cause issues if rack_attack.rb loads before suspect_ip_handler.rb. To ensure the correct loading order, we can take the following steps:</li>
  <li>Rename the initializers with number prefixes:</li>
  <li>Rename suspect_ip_handler.rb to 01_suspect_ip_handler.rb</li>
  <li>Rename rack_attack.rb to 02_rack_attack.rb
This naming convention ensures that suspect_ip_handler.rb is loaded before rack_attack.rb.
Update the 01_suspect_ip_handler.rb file:</li>
</ul>

<p>CODE</p>

<p>In your 02_rack_attack.rb file, you can now use the method as before:</p>

<p>CODE</p>

<p>This approach provides several benefits:</p>
<ul>
  <li>It explicitly controls the load order of the initializers.</li>
  <li>It handles the case where Rack::Attack might not be defined yet (unlikely, but possible in some configurations).</li>
  <li>If Rack::Attack isn’t defined when the first initializer runs, it uses after_initialize to ensure the method is added once Rack::Attack is available.</li>
  <li>It keeps the implementation in one place, making it easy to maintain.
With these changes, you can be confident that SuspectIpHandler will be available when Rack::Attack is initialized, regardless of any peculiarities in your Rails environment or gem load order.</li>
</ul>

<p>Remember, you can still use SuspectIpHandler.add_ip_to_suspects(ip, path) directly in your controllers if needed.</p>

<blockquote>
  <p>ME:</p>

  <p>if it cannot extend rack_attack I do NOT want to hide that error, it is important that if rack_attack calls that method that it be there - fatal errors in rack_attack are very problematic</p>
</blockquote>

<p>CLAUDE:</p>

<p>You’re absolutely right, and I appreciate your emphasis on reliability, especially when it comes to security-related features like Rack::Attack. Let’s revise our approach to ensure we fail fast and visibly if there’s any issue with extending Rack::Attack.</p>

<p>Here’s a revised version of the initializer that addresses your concerns:</p>

<p>01_suspect_ip_handler.rb</p>

<p>CODE</p>

<p>This revised initializer does the following:</p>
<ul>
  <li>Defines the SuspectIpHandler module as before.</li>
  <li>Explicitly requires rack/attack and raises an error if it’s not available. This ensures that Rack::Attack is present before we try to extend it.</li>
  <li>Extends Rack::Attack with the add_ip_to_suspects method only if it doesn’t already have this method. This prevents potential issues if the method is somehow defined elsewhere.</li>
  <li>Verifies that the method was successfully added to Rack::Attack. If not, it raises an error.</li>
  <li>Outputs a confirmation message if everything was successful.</li>
</ul>

<p>With this approach:</p>
<ul>
  <li>If Rack::Attack is not properly installed or configured, you’ll get an immediate, clear error during application startup.</li>
  <li>If there’s any issue extending Rack::Attack with the new method, you’ll also get an immediate error.</li>
  <li>There’s no risk of silently failing or hiding errors.</li>
  <li>You can be confident that if the application starts successfully, Rack::Attack has been properly extended with the add_ip_to_suspects method.
This initializer should be named to load before your Rack::Attack configuration (e.g., 01_suspect_ip_handler.rb). Your Rack::Attack configuration file (e.g., 02_rack_attack.rb) can then use the method as before:</li>
</ul>

<p>CODE</p>

<p>This approach ensures that any issues with Rack::Attack or the extension of its functionality will be immediately apparent and treated as critical errors, aligning with your emphasis on reliability and security.</p>

<blockquote>
  <p>ME:</p>

  <p>does home controller need to include/require the SuspectIpHandler</p>
</blockquote>

<p>CLAUDE:</p>

<p>You’re right to ask about this. Let’s clarify the situation for the Home controller.</p>

<ul>
  <li>In this case, the Home controller doesn’t need to explicitly include or require the SuspectIpHandler. Here’s why:</li>
  <li>The SuspectIpHandler module is defined in an initializer, which means it’s loaded when the Rails application starts up.</li>
  <li>Modules defined in initializers become part of the global namespace and are available throughout the application.</li>
</ul>

<p>However, to make the code more explicit and to ensure there are no issues, we can add a small safeguard to the Home controller. Here’s how you can use it in your Home controller:</p>

<p>CODE</p>

<p>This approach has several benefits:</p>
<ul>
  <li>It doesn’t require an explicit include or require, keeping the controller cleaner.</li>
  <li>It checks if SuspectIpHandler is defined before using it, preventing potential NameErrors if something goes wrong with the initializer.</li>
  <li>It logs an error (or optionally raises one) if SuspectIpHandler is not available, making any issues immediately apparent.</li>
  <li>If you prefer to be absolutely certain and don’t mind an extra line in your controller, you could add this at the top of your controller file:</li>
</ul>

<p>CODE</p>

<p>This require_dependency is typically not necessary, but it can help catch any load order issues in development. In production, Rails will have already loaded all initializers before any requests are processed.</p>

<p>To summarize:</p>
<ul>
  <li>You don’t need to include or require SuspectIpHandler in your Home controller.</li>
  <li>It’s available globally because it’s defined in an initializer.</li>
  <li>You can add a simple check in your controller action to ensure it’s defined and handle any potential issues.
If you want to be extra cautious, you can add a require_dependency in development, but this is generally not necessary.</li>
</ul>

<p>Claude can make mistakes. Please double-check responses.</p>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[Allow me to join the chorus of developers who find AI to be an outstanding productivity tool.]]></summary></entry><entry><title type="html">Technical Debt and Dodgy Sushi</title><link href="/2024/07/30/technical-debt-and-dodgy-sushi.html" rel="alternate" type="text/html" title="Technical Debt and Dodgy Sushi" /><published>2024-07-30T19:52:00+00:00</published><updated>2024-07-30T19:52:00+00:00</updated><id>/2024/07/30/technical-debt-and-dodgy-sushi</id><content type="html" xml:base="/2024/07/30/technical-debt-and-dodgy-sushi.html"><![CDATA[<h2 id="what-is-this-technical-debt-of-which-you-speak">“What is this ‘Technical Debt’ of which you speak?”</h2>

<p>As we start updating a number of web apps running on some older libraries, I was asked the above by a non-programmer.</p>

<p>Best analogy I could think of:</p>

<div style="margin:0 50px 0 50px;padding:10px;color:midnightblue;">
<b>Technical Debt</b>. 
<br />
The nerd equivalent of some <i>rather</i> dodgy sushi for lunch&hellip; particularly notable for the relief when it is finally and violently purged  after a period of mounting apprehension that something very bad could happen soon.
</div>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[“What is this ‘Technical Debt’ of which you speak?”]]></summary></entry><entry><title type="html">What if Joe Took the Wheelchair for a Spin?</title><link href="/2024/07/21/the-wheelchair-gambit.html" rel="alternate" type="text/html" title="What if Joe Took the Wheelchair for a Spin?" /><published>2024-07-21T02:16:00+00:00</published><updated>2024-07-21T02:16:00+00:00</updated><id>/2024/07/21/the-wheelchair-gambit</id><content type="html" xml:base="/2024/07/21/the-wheelchair-gambit.html"><![CDATA[<p>Imagine Biden holding a televised news conference, and to the surprise of all attending, he is <em>wheeled</em> in.</p>

<p>He pauses, giving everyone ample time to gasp and think <em>oh no, he’s in even worse shape than we thought</em>.</p>

<hr />

<p>Then he stands.</p>

<p>He points to the Chair.</p>

<p><img src="/assets/images/2024/wheelchair.jpeg" alt="FDR's wheelchair" style="display:block;margin:auto;max-height: 250px;" /></p>

<figcaption><i>source: artifacts.archives.gov</i></figcaption>

<p>He says:</p>

<p>This is Franklin D. Roosevelt’s wheelchair.</p>

<p>This is the chair from which FDR ended the bank runs that plagued the Great Depression with his Emergency Banking Act of 1933.</p>

<p>This is the chair from which FDR established the FDIC.</p>

<p>This is the chair from which FDR created the New Deal and the Civilian Conservation Corp.</p>

<p>This is the chair from which FDR spearheaded the PWA and the Tennesee Valley Authority.</p>

<p>This is the chair from which FDR cut America’s crippling 25% unemployment rate to under 2%.</p>

<p>This is the chair from which FDR grew the US economy 58% in 8 years of peacetime, and then 56% again during the war.</p>

<p>This is the chair from which FDR created Social Security.</p>

<p>This is the chair from which FDR established the first federal minimum wage, and the first federal action to prohibit employment discrimination.</p>

<p>This is the chair from which FDR successfully overcame the Nazi-led propaganda efforts aided by Nazi sympathizers in the US Congress trying to convince Americans to let Hitler do whatever the hell he wanted. (Sound familiar?) Instead, FDR established the allied coalition that emerged victorious in World War 2. This great leader almost got to see the fruition of his efforts but he died 2 weeks before Germany surrendered.</p>

<p>This is the chair of a man who <em>genuinely</em> made America great.</p>

<p>You can bet the same pundits and elites who are suggesting today that I step aside would not have supported FDR… they would have said FDR was not fit to be president. Pundits and elites have no skin in the game. They have a terrible track record. They lacked vision in 2016. They lacked vision in 2022. And they lack vision today.</p>

<p>Look, I’m grateful to have reached this age without needing a wheelchair.</p>

<p>But you know what?</p>

<p>Even from a wheelchair I’d be a far better president than a convicted felon, hate-monger, insurrectionist, and self-described dictator. I know how to get things done, and I look forward to working for the American people another 4 years.</p>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[Imagine Biden holding a televised news conference, and to the surprise of all attending, he is wheeled in.]]></summary></entry><entry><title type="html">How to read Apple News+ articles without subscribing to News+ on a mac</title><link href="/2024/07/09/how-to-read-apple-news-articles-without-subscribing-to-new-on-a-mac.html" rel="alternate" type="text/html" title="How to read Apple News+ articles without subscribing to News+ on a mac" /><published>2024-07-09T19:34:00+00:00</published><updated>2024-07-09T19:34:00+00:00</updated><id>/2024/07/09/how-to-read-apple-news-articles-without-subscribing-to-new-on-a-mac</id><content type="html" xml:base="/2024/07/09/how-to-read-apple-news-articles-without-subscribing-to-new-on-a-mac.html"><![CDATA[<p>I tried Apple News+ on trial and IMO it sucked so bad I unsubscribed during the free trial.</p>

<p>Why #1? Ads. LOTS of ads. A <em>ridiculous</em> number of ads for a PAID service. Sometimes a new ad scrolls up almost immediately after the current ad scrolls off. Downright dystopian IMO. A short article can easily have 5 ads, and a longer article… well, forget about it.</p>

<p>Why #2? Copying of text snippets and zooming images are <em>disabled</em> on the Apple News App. (Possibly the <em>only</em> app on mac that doesnt support either copying text snippets nor zooming images.)</p>

<p><strong>Simply put, reading most articles in a web browser is a <em>far</em> superior experience. (Even without an ad-blocker.)</strong></p>

<h2 id="but-i-do-find-the-apple-news-app-useful-on-a-mac-to-quickly-gather-a-list-of-timely-new-articles">But I do find the Apple News app useful on a Mac to quickly gather a list of timely new articles.</h2>

<h3 id="my-solution-is-google-the-headline-to-find-and-read-the-original-article-online-and-read-it-from-the-source">My solution is google the headline to find and read the original article online and read it from the source.</h3>

<p>Of course, some articles will be paywalled. But a surprising number of the articles that <em>Apple</em> paywalls behind its lousy News+ subscription are <em>not</em> paywalled if you simply google the headline.</p>

<p>Too lazy to re-type the headline (since Apple disabled Copy)? On a Mac you can use the outstanding $29 app CleanShotX which has an excellent “grab text” feature to copy the text to your clipboard, then you can google the headline!</p>

<p><img src="/assets/images/2024/cleanshot.png" alt="CleanShot X can grab TEXT off your screen" /></p>
<figcaption>CleanShot X can grab TEXT off your screen so "snag" the headline and google it</figcaption>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[I tried Apple News+ on trial and IMO it sucked so bad I unsubscribed during the free trial.]]></summary></entry><entry><title type="html">A prospective history of the brief “TASED in 2024” Dictatorship under His Dark Excellency Biden (July-Dec 2024)</title><link href="/2024/07/04/a-brief-prospective-history-of-the-american-dictatorship-experiment-july-dec-2024.html" rel="alternate" type="text/html" title="A prospective history of the brief “TASED in 2024” Dictatorship under His Dark Excellency Biden (July-Dec 2024)" /><published>2024-07-04T19:47:00+00:00</published><updated>2024-07-04T19:47:00+00:00</updated><id>/2024/07/04/a-brief-prospective-history-of-the-american-dictatorship-experiment-july-dec-2024</id><content type="html" xml:base="/2024/07/04/a-brief-prospective-history-of-the-american-dictatorship-experiment-july-dec-2024.html"><![CDATA[<p>There’s a lot of snark this week about ways Biden could seize upon the Supreme Court’s unconstitutional grant of immunity to presidents… comments such as “Biden should send Seal Team 6 to Maralago then” (predictably, uttered on the X cesspool).</p>

<p>Biden, of course, would not do that.</p>

<p>Yet the 4th of July seems like an appropriate day to speculate: <strong><em>WHAT IF</em> Biden decided to use our current flirtation with gutting the norms of democracy as a “teachable moment”? Perhaps it might go something like this:</strong></p>

<ul>
  <li>Jul 10, 2024, noon EST - President Biden, in an official act, outlines his plan for “Temporary American Sample Experimental Dictatorship” (TASED), explaining that roughly 50% of American voters seem “way too comfortable” with the concept of a dictatorship, so he is using newly-immune office of the Presidency to “give Americans a wee taste what that is” so they “can reconsider if they really want to screw up the democracy that made America great”.</li>
  <li>July 10, 2024, 1pm EST - President Biden issues an executive order that effective immediately all Presidential Executive Orders now have the force of law and are henceforth known as Presidential Decrees.</li>
  <li>July 10, 2024, 2pm EST - President Biden issues a Presidential Decree that requires the President of the USA be referred to as His/Her/They/Them(etc) Excellency.</li>
  <li>July 10, 2024, 2:05pm EST - His Excellency Biden issues a Presidential Decree that “temporarily defers” any further presidential elections until an indefinite date.</li>
  <li>July 10, 2024, 3pm EST - His Excellency Biden issues his “Clean House 24” Presidential Decree ordering a special “snap” federal election on Nov 5, encompassing ALL senate and house seats (not only seats previously slated for reelection this year).</li>
  <li>July 10, 2024, 3:30pm EST - His Excellency Biden, wearing sunglasses, issues a Presidential Decree to modify his 2pm decree and now requires the President of the USA be referred to as His/Her/They/Them(etc) Dark Excellency.</li>
  <li>July 10, 2024, 4pm - His Dark Excellency Biden, in an official act, instigates via Presidential Decree an immediate 5 year supermax prison sentence and immediate and permanent expulsion for “treason and gross dereliction of their sworn duty” of all 147 house members who objected to certifying the 2020 election results.</li>
  <li>July 10, 2024, 4:05pm EST - When confronted by states that suddenly find themselves without any representation in the House, His Dark Excellency Biden, wearing dark sunglasses, urges voters in those states to “do better” when they vote in November “because if you keep voting for traitors I can keep this up indefinitely.”</li>
  <li>July 11, 2024, 9am EST - His Dark Excellency Biden issues two Presidential Decrees to a) outlaw any stock trading by members of of the house or senate or their staff, b) “repatriate” 100% of all stock market gains earned by past/present members of the senate or house during the prior 15 years.</li>
  <li>July 11, 2024, 9:05am EST - When asked why he waited a day for these two decrees instead of including them in the July 10 onslaught of decrees, His Dark Excellency Biden removed his sunglasses, paused, and scornfully replied “C’mon man, I’m getting older and I can only type so fast.”</li>
  <li>July 11, 2024, 4pm EST - His Dark Excellency Biden downgrades by decree the prison sentences of 147 former house members (ordered 24 hours earlier) to “only 3 years and only a medium security prison, I was just screwing with those yahoos about that whole supermax thing because I can. They <em>wanted</em> a dictator, they <em>got</em> a dictator.”</li>
  <li>July 15, 2024, 3pm EST - His Dark Excellency Biden publicly congratulates Russian President Putin for “finally seeing the light, causing Russia to withdraw completely from Ukraine and pay $500 Billion in reparations, also surrendering all of his personal bank accounts to the Ukrainian Treasury, and retiring from public life to live on his modest government pension in his one remaining Dacha (a smaller one not demolished by Seal Team Six).”</li>
  <li>August 4, 2024, 2pm EST - By unanimous votes in the diminished senate and house, the constitutional amendment is passed banning social media sites from, among other things, deploying any type of algorithm to promote or prioritize the visibility of content. Opting-in to clearly labeled categories such as “cat videos” is permitted, and exclusion by default any content not originated by friends or friends-of-friends must be honored.</li>
  <li>August 6, 2024, 5pm EST - By unanimous votes in the diminished senate and house, the “Kiss That Lifetime Bullshit Goodbye, Scrotus” constitutional amendment is passed specifying a 20 year Term Limit and an age limit of 69 are imposed upon all members of the executive and legislative and judiciary branches, effective immediately (except the office of the presidency which becomes effective Dec 31, 2024). The door hit him in the ass on his way out as Clarence “Coke Can” Thomas stopped to pontificate about what he termed another high-tech lynching.</li>
  <li>August 7, 2024, 5pm EST - Also passed unanimously in the diminished senate and house was the “Rue the Day You Lied about Roe, Scrotus” constitutional amendment enshrining Roe v Wade and terminating the tenure of the mendacious Supreme Court Justices who, when asked about Roe during their appointment hearings, misled congress about their true intentions by asserting “Roe is established precident”.</li>
  <li>August 8, 2024, 5pm EST - Also passed unanimously in the diminished senate and house was the “Stop the Scrotus Sale of Democracy” constitutional amendment negating Citizens United, eliminating corporate and SUPERPAC donations, and strictly limiting political donations to $1000 per individual, while sanctioning each of the Justices who affirmed that decision 12 months’ pay for “just making shit up about the constitution to the detriment of the democratic process”.</li>
  <li>
    <p>August 9, 2024, 5pm EST - Also passed unanimously in the diminished senate and house was the “You Had Your Chance so Now We’ll Do It For You, Scrotus” constitutional amendment setting the size of the Supreme Court to 17 and imposing a “zero tolerance” ethics code forbidding acceptance of any gifts or donations, to be enforced by the Attorney General who is authorized to disbar Justices who are found guilty of violating the Ethics Code.</p>
  </li>
  <li>
    <p>November 6, 2024, noon EST - An all-new senate and all-new congress are sworn in.</p>
  </li>
  <li>November 7, 2024, noon EST - By unanimous vote in the senate, the filibuster is eliminated, and the unanimous consent rule is renamed the “Almost Unanimous Consent” rule which now requires 5 senators to hold up military appointments and other such matters typically handled by unanimous consent. And by unanimous vote, the action by Biden to expel permanently the 147 traitorous former house members is ratified in both the house and senate.</li>
  <li>November 7, 2024, 3pm EST - By unanimous votes in the senate and house, a constitutional amendment is passed declaring no one is above the law, including the President of the United States, who cannot pardon himself, and that the July 1, 2024 Supreme Court decision on presidential immunity is declared “null, void, and patently antithetical to the principles of the United States Constitution”.</li>
  <li>November 8, 2024, noon EST - His Dark Excellency Biden issues an Executive Order terminating as of today all his prior executive orders from July 10 and gives a short speech noting “My work here is done, now I expect congress to do the right thing and depose the dictator”.</li>
  <li>November 12, 2024, noon EST - By unanimous votes in the senate and house, President Biden is impeached for “subversion of democracy”. By a 90% vote, a resolution is also passed thanking President Biden for “throwing himself on his figurative sword via his highly unorthodox yet largely successful efforts to flush the toxic sludge that had accumulated in congress and the Supreme Court.”</li>
  <li>
    <p>November 12, 2024, 2pm EST - In his “Well let’s hope we learned something, America” resignation speech former President Joe Biden notes “I hated to go the ‘tough love’ route even for a few months, but it was my duty as your President to get America back on track. I told you all along I would be a one-term transitional president.”</p>
  </li>
  <li>November 13, 2024, noon EST - By unanimous vote in a detoxed senate and house, a presidential election is re-scheduled for March 4, 2025. “BETTER LATE NOW THAN NEVER AGAIN” read the NYTimes front page headline.</li>
</ul>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[There’s a lot of snark this week about ways Biden could seize upon the Supreme Court’s unconstitutional grant of immunity to presidents… comments such as “Biden should send Seal Team 6 to Maralago then” (predictably, uttered on the X cesspool).]]></summary></entry><entry><title type="html">How to pronounce ‘X (formerly Twitter)’</title><link href="/2024/06/29/how-to-pronounce-x-formerly-twitter.html" rel="alternate" type="text/html" title="How to pronounce ‘X (formerly Twitter)’" /><published>2024-06-29T00:31:00+00:00</published><updated>2024-06-29T00:31:00+00:00</updated><id>/2024/06/29/how-to-pronounce-x-formerly-twitter</id><content type="html" xml:base="/2024/06/29/how-to-pronounce-x-formerly-twitter.html"><![CDATA[<p>I for one am sick of reading “so-and-so posted such-and-such on X (formerly Twitter)”</p>

<p>Can we all just agree to call it “Shitter” from this point on?</p>]]></content><author><name>Pardner Wynn</name><email>howdyhowdy@pardner.com</email></author><summary type="html"><![CDATA[I for one am sick of reading “so-and-so posted such-and-such on X (formerly Twitter)”]]></summary></entry></feed>