Subfolders
Latest "Grimoires" Articles
Workshop » Reference Section » Grimoires » Trading Education Notes » Explainers, Definitions, & Terminology

Put Options or Collar Can Reset Your Short-Term Capital Gains Holding Period For Stocks To Zero, Or Worse

It's a bit complicated, but under IRS Title 26, most* positions which combine normal stocks and options on that stock which hedge or lower the risk of losses are considered a "straddle" for tax purposes.

https://www.law.cornell.edu/cfr/text/26/1.1092(c)-1:

(a) In general. Section 1092(c) defines a straddle as offsetting positions with respect to personal property. Under section 1092(d)(3)(B)(i)(I), stock is personal property if the stock is part of a straddle that involves an option on that stock or substantially identical stock or securities.

Stocks or options held longer than 12 months may be subject to lower long-term capital gains tax rates. However, if certain option positions are purchased on a later date than the stock, but within the initial 12-month period, this resets the stock's short-term holding period to begin again from zero on the day after the option positions are closed.

So if you hold a stock for…

Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » PHP

Enable PHP 8.4 in Apache on Debian

According to the installer, to enable PHP 8.4 FPM in Apache2 do:
a2enmod proxy_fcgi setenvif
a2enconf php8.4-fpm

private » Programming Hacks Used In This Site

War And Precedence: Plugin positioning of unpositioned elements that aren’t yet positioned by later-loading stylesheets: A CSS Odyssey

So, I had a crazy problem. You'll notice that there's various draggable elements on this site... such as the "Kupietools" plugin tabs seen at left, the occasional "the site is being worked on right now" notices that pop up, etc. You can drag them around with your mouse.

This is done with a plugin (also available as a standalone javascript module, a few versions behind the plugin as I write this) that retrofits code onto various HTML elements by giving the plugin the classnames it needs to make interactive.

I was doing some optimization on the site loading to speed things up, such as getting WordPress to load a lot of CSS file late so as not to interfere with initial page load stats. (This is a whole art, beyond the scope of this article.)
Suddenly…

Workshop » Reference Section » Grimoires » IT » Platforms » Web » Email setup)

Resolving cloudflare error “The number of lookups on your SPF record exceed the allowed limit of 10. This will result in emails failing SPF authentication”

I got the error "The number of lookups on your SPF record exceed the allowed limit of 10. This will result in emails failing SPF authentication" in my Cloudflare DNS dashboard.

My spx record for, say, kupietz.com was "v=spf1 include:_spf.myEmailHost.com include:kupietz.com ~all"

Turns out, the problem is, every include can get parsed to be multiple servers. the include:kupietz.com apparently causes a recursive loop, creating more than 10 lookups. I updated it to "v=spf1 ip4:[my server's external IP address] include:_spf.google.com ~all", removing the recursive lookup, and adding my server's IP so it can send me administrative notices.

Also today my ISP changed my IP address unexpectedly... all DNS updated.

Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » rsync & rsnapshot

How to backup a WordPress site via SSH

To make a complete local backup of a remote WordPress install over SSH, you need to perform two distinct steps:

  1. Download the files (using rsync).
  2. Export and download the database (using mysqldump piped through ssh).

Here is the step-by-step guide.

Prerequisites
  • SSH Access: You need the username, host (IP or domain), and password (or SSH key) for the remote server.
  • WordPress Path: You need to know where WordPress is installed (e.g., /var/www/html or /home/user/public_html).
  • Database Credentials: You will need the database name, user, and password. (I will show you how to find these below).
Step 1: Find Database Credentials (Optional)

If you don't know your database login details, run this command to read them from your remote wp-config.php file: ssh user@remote-server.com "cat /path/to/wordpress/wp-config.php" | grep 'DB_'

Note the DB_NAME, DB_USER, and DB_PASSWORD for Step 2.

Step 2: Download the Database (SQL Dump)…
Workshop » Reference Section » Grimoires » Trading Education Notes » Hypotheses to be tested

Size Down

I heard an interview with a trader (https://www.youtube.com/watch?v=1ETvTftY-tw) who never takes a trade that he is not willing to accept a complete loss on. I'm thinking about that PLTR protective bear spread that I sold when it was halfway to a $600 loss,, and price moved so it would have ended far in profit. By his philosophy: I should have halved the profit, not done that. I got greedy. His way of thinking is I should have taken half the size spread instead or not taken the trade at all. But I don't know, because it was protective... I was trying to protect against a loss. (Actually I should have used a collar.) In another video, this same guy said "Stop swinging for home runs. Start stacking small trades." Which fits.

He said "I only enter trades where if it goes to zero, I'm still good." He's limiting…

Workshop » Reference Section » Grimoires » Trading Education Notes » Hypotheses to be tested

Get Really Good At One Thing

Everybody seems to say this. For me it could be the strategy I've been working on paper trading lately. But everyone says lack of focus will cost you.

Workshop » Reference Section » Grimoires » Trading Education Notes » Hypotheses to be tested

Patience

You need patience. You can't say "I don't want to wait, I might miss the trade." You wait for confirmation and then only get in if you didn't miss the trade.

Lack of confirmation doesn't mean you're not wrong. Nor does confirmation mean you're right. But being right by not waiting for confirmation will cost you. You can't fomo the money you miss by doing this.

Workshop » Reference Section » Grimoires » Trading Education Notes » Explainers, Definitions, & Terminology

Open Interest

Open interest in options is how many live contracts are currently held.

Larry Williams points out that when there's a lot of open interest, there's nobody left to buy. It's not necessarily bullish. In fact it depends whose interest is open—institutional is bullish. Retail is bearish because they don't know what they're doing. https://www.youtube.com/watch?v=Qp6S0Onz_iw

Workshop » Reference Section » Grimoires » Trading Education Notes » Explainers, Definitions, & Terminology

Trading Thesis

Traders refer to a "thesis" a lot. I've come to believe this is just jargon for a hypothesis. "I think it will do this".

Workshop » Reference Section » Grimoires » Trading Education Notes » Options Trading Mindset

Options Are For Strong Conviction Trades

I got some advice recently that I liked: options are for strong conviction trades. "I think this might work" is for shares trades, not options.

"This is working as expected" is when you keep an options trade open.

"This still has a chance it might work as expected" is when you close an options trade. Maybe reopen a smaller position with shares if you absolutely have to gamble.

Pretty much, I'm thinking, whenever you think "It still might..." it's time to close the options trade. The thesis is broken.

Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » n8n

Starting a temporary instance of N8N accessible via IPv4 over the local network

N8n by default binds to localhost, and even binding it to listen on all interfaces, it still by default listens only for IPv6. You also may want to tell it to not use the Secure Cookie if you don't want to set up an SSL certificate or sign up for their cloud service. Make sure you only have it reachable on the local network if you do this, you don't want to open your instance to the entire world.

N8N_SECURE_COOKIE=false N8N_HOST=0.0.0.0 N8N_LISTEN_ADDRESS=0.0.0.0 npx n8n

Remember to open port 5678 on the machine's firewall if necessary.

Workshop » Reference Section » Grimoires » IT » Applications » Web Browsers » Plugins

Block Instagram share posts from Facebook’s “all” feed with uBlock Origin

Abstract:

With the browser plugin uBlock Origin, you can block shares from Instagram with the custom rule:

www.facebook.com##.html-div:has(a[href*="www.instagram.com"])

Note: Facebook changes their css often. This may not work for long.

Also, uBlock Origin is not always the fastest plugin, you may see the Instagram posts briefly on your screen before it removes them.

How to Block Instagram Shares from Facebook Using uBlock Origin: A Complete Guide

Social media platforms have become increasingly interconnected, with content from one platform frequently appearing on another. For Facebook users, this often means encountering Instagram shares in their news feed—sometimes from accounts they follow on both platforms, creating redundant content, and sometimes from accounts they don't follow on Instagram at all, courtesy of Facebook's algorithmic recommendations.

If you're looking to curate a cleaner Facebook experience by filtering out these Instagram cross-posts, browser extensions like uBlock Origin offer a powerful solution through custom…

Workshop » Reference Section » Grimoires » IT » Platforms » MacOS » Networking

Prevent MacOS from locking screen when you disconnect screen sharing

I screenshare into a Mac for playing video on my TV, and had an intermittent problem where Firefox would not play video while screen sharing was connected, but then locked the screen as soon as I disconnected.

It turns out that if the screen is locked when you log in via screensharing, MacOS defaults to locking it again when you disconnected, and, being MacOS, the ability to turn this off has been removed from the UI.

Enter this in terminal to turn it off: sudo defaults write /Library/Preferences/com.apple.RemoteManagement RestoreMachineState -bool NO

Workshop » Reference Section » Grimoires » Hearth & Home

How To Clean Suede

As with all other advice-y sounding things on this site, don't take my word for it. I'm just telling you what worked for me. Use your discretion. I'm not responsible for your actions or the consequences of anything you chopse to do. I'm just saying if you try to clean a stain off suede with vinegar and it winds up costing you a limb or killing somebody, that's not my fault. You're on your own recognizance.

Water is bad for suede. If stains haven't set yet, you can clean them off suede with a rag or sponge soaked in white vinegar. I've had pretty good luck even with stuff that's dried on there pretty good.

Workshop » Reference Section » Grimoires » Hearth & Home

How To Defrost A Frozen Steak In 30 Minutes

As this is a food handling tip, it is presented as documention of something I do. That does not mean I suggest you do it. As with all things, the foremost rule is: use your discretion. I am not responsible for anything you do.

I wish I could remember who showed this to me. This is one of the most useful tips I've ever received. I use this all the time. It even works for frozen-solid inch-thick pork chops. I just did it tonight.

To fully defrost a completely frozen steak in 30 minutes:

1.) Wrap it tightly in something 100% watertight. The watertightness is essential otherwise you will ruin it rather than defrost it. High-quality bags might work in lieu of anything else.
2.) Fully submerge it in a bowl or container of cold tapwater. Put something on top of it to keep it submerged if you…

Workshop » Reference Section » Grimoires » IT » Platforms » Web » WordPress » Yoast

CURL and Browser get different page versions (301 redirects, content changed, etc. — due to Yoast url parameter stripping only for non-logged-in users)

I had a truly maddening problem where my /embed/ functionality was sometimes returning full pages to CURL commands and online services like redirect-checker.org, etc.

It turned out, it was Yoast's URL parameter stripping. I had failed to update Yoast's settings with some new parameters I was using, and what Yyoast never tells you is that when you're logged in, it lets everything work fine, and only strips parameters for non-logged in users. It just lets you proceed on your way thinking everything is working fine until you can't figure out why curl -I https://mysite.com/blah?param1¶m2 is getting a 301 redirect while https://mysite.com/blah?param1¶m2 is loading fine in your browser. This is especially fun on sites like mine where things like /embed/ and ?embed get written back and forth to each other internally.

I lost several hours to this.

Yoast's docs say there's a way of registering parameters but,…

Workshop » Reference Section » Grimoires » IT » Applications » Web Browsers » CSS

Determining which javascript script changed an element’s attribute

Determining which script changed an element's attribute

So, I had an issue where quite a while ago I added some js code that would open a [code]details[/code] disclosure element if it contained a named anchor that was included in the page's URL. For instance if you loaded the URL [code]https://thisdomain.com/somepage.html#blahblahblah[/code], and the page had [code][/code] hidden inside a closed [code]details[/code] element, it would open that element by setting the attribute "open" on the details element, and scroll to reveal the anchor.

The problem was, I needed to make some changes to how that code functioned, and I couldn't find where I had added the script that did that.

Long story short: I temporarily added this script to the head of the page, and then reloaded it with an #anchor added to the URL, in this case [code]https://michaelkupietz.com/literally-hundreds-capsule-reviews/#puzzlehead[/code]:

[code] // Override the open property setter to catch when…
Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » SQL

SQL query to list all WordPress post revisions for archiving

Here's the SQL query to get all post revisions, which I do prior to cleaning them out of the database, which seems to make it much faster:

SELECT p.*
FROM [posts table name] p
WHERE (p.post_type = 'post' OR p.post_type = 'page') -- Include posts/pages
AND (p.post_date BETWEEN '2020-01-01' AND '2029-07-01') -- Adjust date range
OR (p.post_type = 'revision' AND p.post_parent IN (
SELECT ID FROM [posts table name]
WHERE post_date BETWEEN '2024-01-01' AND '2024-07-01'
));

To get just a count of revisions, change SELECT p.* to SELECT count(*).

Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » rsync & rsnapshot

Speeding up rsnapshot (rsync) backups by removing wildcard paths from exclude

I removed a bunch of wildcard paths from rsnapshot.conf's exclude, and suddenly tonight my backup ran in a few minutes instead of taking over a day like it usually does.

Interesting, I've been looking off and on for at least the better part of a year for ways to lighten the load of rsnapshot's under-the-hood rsync backup commands, which reliably took up about half my CPU power almost continuously, and never found this tip before. You can see, plenty of wildcard paths removed, plus a few other things.

Here's a diff, rsnapshot.conf before changes (<) vs after (>):
< verbose 1
---
> verbose 4
120c120
< loglevel 2
---
> loglevel 4
143a144,146
> rsync_short_args -Wa
> #-W is transfer whole files without prescan, recommended for performance by https://serverfault.com/questions/639458/rsync-taking-100-of-cpu-and-hours-to-complete
> #NOTE: if you set the above short…

Workshop » Reference Section » Grimoires » IT » Applications » Web Browsers » CSS

Display “fixed” elements still scrolling, not fixed to page (also, if z-index not working properly)

I had an interesting problem where I set an image's CSS rules to display:fixed and it still scrolled with the page. Here's what I discovered:

In CSS, display:fixed means fixed with regard to the nearest ancestor stacking context, not necessarily to the page coordinates. You can reset the stacking context by adding a transform, will-change, or other attributes (list provided below) to an element. If an ancestor element resets the stacking context, any descendant of it with display:fixed will stay fixed with regard to it, but if it scrolls with the page, will scroll too.

Ditto for the CSS attribute z-index. A higher z-index is only in front of objects in its stacking context. A new stacking context, lower down on the page, can contain elements with a lower z-index but that nonetheless appear in front of it visually, because they're not in the same stacking context.

Josh Comeau's site…

Workshop » Reference Section » Grimoires » IT » Troubleshooting log » Web Server

Performance troubleshooting & settings changes 2025aug29

Following several days of frequent freezes, I tried changing the following settings

updated in :

[opcache] original settings
;recommended by https://vpsfix.com/14433/virtualmin-post-installation-configuration-and-server-optimization-guide/
opcache.enable=
opcache.memory_consumption=
opcache.interned_strings_buffer=
opcache.max_accelerated_files=
opcache.validate_timestamps=
opcache.revalidate_freq=
opcache.save_comments=
;end recommendation

to

[opcache]
;recommended by https://vpsfix.com/14433/virtualmin-post-installation-configuration-and-server-optimization-guide/
opcache.enable=
opcache.memory_consumption=
opcache.interned_strings_buffer=
opcache.max_accelerated_files=
opcache.validate_timestamps=
opcache.revalidate_freq=
opcache.save_comments=

-
added var_dump(opcache_get_status()) to php status page to be able to monitor opcache usage

-
changed warning logs from E_ALL & ~E_DEPRECATED & ~E_STRICT to
----
noticed contained a LOT of processes being stopped for tracing
turned off request_slowlog_timeout by setting to 0s in
had been 4s
---
I had turned on lightspeed at 1:45 am est , aug 26. Seems like more problems since then.

None of the above seem to help, still getting freezes maybe every 30 minutes. Next…

Workshop » Reference Section » Grimoires » IT » Platforms » Linux » File management

Directory and File Locations particular to this server

PHP config -
Includes:
- opcache settings
- error warnings

PHP slow log setup is in

PHP log -

PHP error and slow logs by pool are in

Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » rsync & rsnapshot

Resolving an rsnapshot error — “rsync: –delete does not work without –recursive (-r) or –dirs (-d). rsync error: syntax or usage error (code 1) at main.c(1795)”

I discovered rsnapshot hadn't run in a few days. Checking /etc/rsnapshot.log, I found every recent day had this:

rsync: --delete does not work without --recursive (-r) or --dirs (-d). rsync error: syntax or usage error (code 1) at main.c(1795) [client=3.2.7]

A few days ago I had added the line rsync_short_args -W to /etc/rsnapshot.conf in an effort to get rsync to run without putting such a load on my system. Removing this and running rsnapshot -v hourly from the command line shows that without it, the first line of the rsync command was /usr/bin/rsync -ax --delete --numeric-ids --relative --delete-excluded \, but with it, the first line was /usr/bin/rsync -Wx --delete --numeric-ids --relative --delete-excluded \.

Changing the line rsync_short_args -W to rsync_short_args -Wa, with an a flag explicitly included, solved the problem. Apparently specifying custom short flags overrides at least one of the default flags.

Also: remember, when you run an…

Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » rsync & rsnapshot

Post-migration steps when migrating or restoring Linux from backup

There are intentionally vague broad steps, here just as a reminder to myself; best to look specific instructions for each of these steps up at restore time for the particular system you're restoring to.

A.) Backups should include all user data. Depending on who you ask, that's either:
1.) The entire filesystem except /dev/*, /proc/*, /sys/*, /tmp/*, /run/*, /mnt/*, /media/*, /lost+found (which can be pulled from a complete filesystem backup with rsync -avhP --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /mnt/olddrive/ /mnt/netdrive/)
2.)/home, /etc (except /etc/passwd and /etc/groups, these have useful information to back up but may conflict if written to a new install), /usr/local, /opt, /root, /var (exluding /var/tmp, /var/run/, /var/lock, or /var/spool except you DO want /var/spool/cron/crontabs/)

B.) After copying all the above to the new or restored disk, you need to update /etc/fstab with the new disk UUIDs.

C.) Install GRUB Bootloader.

D.) If you're using LUKS encryption, set that…

Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » rsync & rsnapshot

Fastest way to delete a large, deep directory in Linux

Per numerous references around the web, to delete /path/to/directory-to-delete/:

 cd /path/to/ mkdir empty_dir rsync -a --delete empty_dir/ directory-to-delete/ rm -r empty_dir rm -r directory-to-delete 

Disclaimer: this is for my own reference, not recommended for your use. Use it at your own risk. If I am wrong—and I may be—these commands can do tremendous damage to your system.

Workshop » Reference Section » Grimoires » IT » Applications » Web Browsers » CSS
Comprehensive List of CSS Units, A Reference For Web Developers

The Absolute Units: Comprehensive List of CSS Units, A Reference For Web Developers

Here’s a guide to all currently available CSS units, with explanations and common use notes. This includes all CSS units listed in MDN Web Docs as of 2025aug15.

Sections:

By Category Angle units
  • deg: Angle Degrees (360deg = full circle).
  • grad: Angle Gradians (400grad = full circle).
  • rad: Angle Radians (2πrad = full circle).
  • turn: Angle Turns (1turn = full circle).
    Used in transforms, gradients, and trigonometric functions.
          Frequency units
          • Hz: Hertz. Cycles per second (e.g., for aural/speech media).
          • kHz: Kilohertz (1000Hz). Rarely used in typical web CSS.
            Length Units: Absolute length units (fixed physical or device-referenced)
            • px: CSS pixel. The most common unit for on-screen layout. Scales with zoom; not a physical device pixel.
            • in: Inch (1in = 96px).
            • cm: Centimeter (1cm =…
            Workshop » Reference Section » Grimoires » IT » Troubleshooting log » VMWare

            VMWare VM unreachable via IP after reboot, even from host machine

            My VWWare VM lost internet connectivity after a reboot. Even the host machine could not access any service on it. Http/https got 523 errors.

            I powered down the VM, changed the networking to NAT, powered it back up, shut it down again, changed the networking back to Autodetect, booted it again, and everything seemed fine.

            Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » rsync & rsnapshot

            Reducing rsnapshot or rsync resource usage

            I've had sporadic problems with clearing the WP cache causing the server to return 520 errors for a few minutes. Usually other sites on the same server are fine, it's specific to this vhost. Logging in via SSH, checking with htop, rsync is usually hogging most of the cpu. Restarting the fpm and then restarting Apache restores the website.

            According to https://www.claudiokuenzler.com/blog/361/rsnapshot-backup-reduce-high-load-with-ionice, the big bottleneck with rsync, which rsnaphot runs on, is i/o, not cpu, and rsync can actually tie up i/o such that a web server won't respond to http requests. This can be solved by making the rsnapshot command in crontab ionice -c 3 [rsnapshot command] instead of just the rsnapshot command, which tells rsync not to wait until the disk is idle before trying to access it. So I did. In fact, I made it nice -n 19 ionice -c 3 [rsnapshot command] although…

            Workshop » Reference Section » Grimoires » IT » Platforms » Linux » Packages » Git

            Force Git to overwrite local changes if there is a branch conflict

            Use code you find here at your own risk! I am not responsible if you damage your data or system by following any instructions you find here.

            1. Navigate to your plugin's root directory:

              Bash

              cd /home/kupietzc/public_html/kartscode/wp-content/plugins/ktwp-draggable-elements

            2. Fetch the latest changes from GitHub:
              Bash

              git fetch origin

            3. Perform a hard reset to match GitHub's main branch (assuming main is your branch):

              Bash
              git reset --hard origin/main

              WARNING: This command is destructive. It will discard all local changes to tracked files and make your local repository exactly match your GitHub repository. Ensure you have a backup of any local modifications you wish to preserve that are NOT on GitHub before running this.

            4. Clean up any untracked files or directories (remnants from manual copying):
              …