Angry White Boy Polka

I’m an upper-middle-class American heterosexual white cis-male which puts me pretty close to the top of the food chain, privilege-wise.

I watch the news and see Alton Sterling and Philando Castile die for no reason, then William Ray not die for actually being threatening.

You can truly grieve for every officer who’s been lost in the line of duty in this country and still be troubled by cases of police overreach. Those two ideas are not mutually exclusive. You can have great regard for law enforcement and still want them to be held to high standards.
– Jon Stewart

I read stories about a 6-year-old kid getting suspended for singing a song he heard on the radio or a 13-year-old for sharing his lunch or about an Eagle Scout getting suspended for having his grandfather’s penknife in his car.

I read stories about the TSA’s failure to protect us again, or beating up a disabled teenager, or destroying medical equipment, or sexually assaulting another rape victim (these stories don’t come up much anymore because they’re so common), or someone getting kicked off of a flight for doing math, or daring to speak a foreign language (Arabic, Swahili, French, doesn’t seem to matter), or having a gun embroidered on a purse.

I read stories about the gross mistreatment of LGBTQ+ individuals through psychological, verbal, and physical abuse in many forms, usually in the name of “Christian love”.

I read stories about Planned Parenthood clinics getting vandalized whether or not any abortions are performed there. I read stories about women jailed for miscarrying—something they usually have no control over.

I hear my wife talk about students who are only able to eat when they’re at school, who’ve actually witnessed their parents or siblings murdered, whose parents work so many jobs to make ends meet that they don’t have time to help their kid struggling with homework, or teaching them to deal with menarche/periods.

And that’s barely scratching the surface here in the good ol’ US of A.

I read stories about academics in Bangladesh getting hacked to death for associating with someone who may or may not be non-Muslim. I read stories about non-Hindus getting murdered by Hindus for owning beef (they didn’t). In El Salvador women are occasionally executed for having a stillbirth. Even stereotypically peaceful Buddhists get in on the violence in Thailand, Myanmar, and Sri Lanka. There’s nearly constant conflict in Syria, Iraq, Israel, Gaza, Afghanistan, Sudan, South Sudan, and Somalia (probably other places, too). Bombings in Turkey and in Paris.

There are far more things than I listed above worth getting angry about, worth doing something about, but what? We have governors who seem to make a sport out of cutting school funding, congressmen who deny anthropogenic global warming despite mountainous piles of evidence against them, celebrities who insist that vaccines cause autism despite, well, mountainous piles of evidence against them…I could go on. Despite my privilege, I haven’t nearly the influence that the aforementioned idiots do.

Get involved, I know. The problem is deciding which of the bazillion issues to focus on. I can’t divide my time between 74 different advocacy groups, nor can I handle the toll so much outrage would take on my sanity. Do I care more about women’s choice? Rights of minorities in the US (racial, religious, sexual, etc.)? First, Second, Fourth, Sixth, Seventh, Eighth, or Fourteenth Amendment issues? Law enforcement overreach? There are too many that I’m too upset about. Ease of access? That might provide me a way to narrow these down, as proximity gets me near AU and local government. But currently, my schedule precludes me from involvement in either!

For the time being, I’ll try to avoid the issues that boil my blood and focus on the here and now, the paycheck-to-paycheck daily grind.

Lost as Anyone

This post will primarily deal with something I’ve not thought to do until today: I’m going to examine church belief statements, and how my views on these beliefs have evolved. I’ll be going through the current statements of beliefs of churches I have attended regularly throughout my life, though I will not use their names to protect the innocent/guilty parties. Also, these very well may have changed since I attended these churches—one church, in particular, has undergone a complete rebranding, but what I see it seems to maintain many of the things I remember. While the statements themselves could be used to identify the churches, I’ll be summarizing and combining them—noting differences as I find them, of course—to get a general sense of the world I grew up in.

I’ve attended 10 churches regularly in my 34+ years, which makes this a rather larger task than I thought when I started this post a few minutes ago, but something I’d still like to do. These churches have been from a variety of traditions/denominations: Evangelical Covenant, “Independent”, “Baptist” (meaning, I’m not sure what flavor), Southern Baptist, Nazarene, and Evangelical Free (not necessarily in that order). Some of these are more “legal” in structure than others; I’m not sure this is a requirement, but as I dug into the overview of a few I found the more legal language behind the overviews. Anyway, let’s get started:

The Bible

Statements

There of course exists more than one interpretation of the Bible or its role in the church throughout the statements I’ve collected. “The Bible is the only perfect rule for faith, doctrine, and conduct,” states the Covenant churches, and that is about as far as they go. Most of the others have some version of the idea that the Bible is the inerrant word of God—without error. Some say it was “verbally inspired”, some specify that it is inerrant “in the original writings”, and others say it was written by human authors under the guidance of the Holy Spirit. The Nazarenes specify 66 books. Regardless, every church I attended has pushed some version of Biblical inerrancy.

Commentary

The creation of the Protestant Canon is an interesting story. I’ll focus on the New Testament here (though the development of the Old is far more fascinating). One reason given for the idea that there are four gospels is because “there are four quarters of the earth…four universal winds…the church…should have four pillars…the gospel is quadriform.” Most people I know would likely consider this idea ludicrous. While the 27 books used today by most traditions were generally agreed on by 367 CE, this was far from a settled matter. Some churches rejected the Pauline epistles (a few also eliminated Acts); many eliminated Hebrews; the Armenians added a third letter to the Corinthians; Martin Luther wanted to remove Jude, James, Hebrews, and Revelation entirely from the Bible (after some pushback he simply relegated them to the end of his Bible). Mark 16:9-20, Luke 22:19b-20, Luke 22:43-44, John 7:53-8:11 did not appear in the Bible prior to 24 April 1870. A significant portion of 1 John 5:7-8 did not appear until 2 June 1927. So the Bible that we use today was modified even in the 20th Century, yet “God has promised to preserve every jot and tittle of what He inspired (Matt 5:18).

Salvation

Statements

The Covenant church doesn’t use the word, but speaks of “new birth” using the same terms as the other churches: commitment to Christ, receiving forgiveness, and eternal life. All the other statements specify its dependence on the death on a cross and subsequent resurrection of Jesus. The SBC goes to some length to detail each step of a process: regeneration, justification, sanctification, and glorification. But the Nazarene church goes several steps further, speaking additionally of atonement, prevenient grace, repentance, justification, regeneration, adoption, holiness, and sanctification. Unlike the other churches I’ve attended, the statement of faith here specifically says (though not in these words) that salvation can be lost in apostasy. This comes from the Armenian tradition, while other churches I’ve been a part of have been generally in the Calvinist tradition.

Commentary

Despite the majority of my upbringing in Calvinist churches, I always read the Bible seeming to support “conditional preservation.” This led to a great deal of guilt over every stray thought, the tiniest alteration of the truth, etc. I remember one instance of being in tears because, after returning from the grocery store, we discovered a candy bar that we hadn’t paid for in one of the sacks, and I was afraid that by participating in eating it (mom divided it between us) I was stealing, and thus sinning. I was very young at the time and such things eventually didn’t weigh on me as much—it was an honest mistake by the bagger or cashier or a previous customer. But lust, gluttony, greed, sloth, wrath, envy, and pride, even in the smallest degrees, haunted me for nearly 30 years. Salvation by faith, not works, saith all these statements of faith. While that’s what’s preached, that’s not what’s taught between the lines. Guilt was the rule, not the exception, and fear of hell was ever present, despite assurances to the contrary.

The Church

Statements

The statements all agree that the church is to be defined simply as a group of believers, and that this group should be self-governing and fully engaged in the work of evangelism, discipleship and missions. Some add additional duties such as education, worship, observance of sacraments, etc. Only one, the Southern Baptist, as far as I can tell, specifically excludes women from any office (that of pastor), though most of the churches I’ve been to would have the same opinion.

Commentary

While given its history the Baptists maintain a strong statement of faith about avoiding the use of civil power for the pursuit of its ends, and promotion of the free exercise of religion within a state, I find the political/religious entanglements promoted by Ted Cruz, Lindsey Graham, and Mike Huckabee to be hypocritical (which, considering the people mentioned, is hardly surprising). Other than this notation about the SBC statement of faith (which pertains more to politicians than to the church itself), I find little objectionable here.

Eschatology

Statements

Three statements of faith out of those I collected do not mention the “end times” at all. Those that do, some specify pre-millennial, or pre-tribulation, or “in his own time”, but agree that Jesus will return personally, visibly, and bodily to the Earth, that the dead will be raised, and all will be judged (the Sorting Hat will consign us to Heaven or Hell for the rest of eternity). Three of the churches specify the existence of a being called Satan as a supernatural evil counterpoint to God’s goodness.

Commentary

I did have three pastors at two different churches disagree with their respective church’s statements of faith on this issue, explaining that they believed in at least a post-tribulation return of Christ. The placement of this event in time has created and destroyed many churches over the course of time. Even placing the return of Jesus at some point in a futuristic 1007 year span causes division (the most common interpretations in Western churches whose traditions I’ve been exposed to seem to be at the beginning, 3.5 years in, or 7 years in). Ignoring the question of “when”, even the churches silent on the return specify some sort of judgement, where the emphasis on Satan and Hell or God’s wrath is often striking. Only a few seem balanced: one says “everlasting bliss” versus “everlasting suffering” in a single statement where others spend entire paragraphs talking about Hell and barely mention Heaven beyond its existence.

Conclusion

The structure of the statements given from here on are so divergent as to defy easy comparison, but I’ll probably construct a post or two focusing on the SBC statement—it’s by far the most comprehensive of all. I personally like their sections regarding Peace and War and Religious Liberty (though I disagree on minor points), but their sections on Education and Family I might consider outright dangerous.

Time

I have a project that is currently exists as no more than an idea in my head and a few equations in a Python script. The idea is to fix my telescope up with a couple of stepper motors and control where it’s pointing with my phone, including the ability to follow particular objects in the sky like the moon during an eclipse or Mars now near opposition.

Thing is, if I ask someone (e.g. “the Internet”) where, say, M45 is, I’ll get “RA 3h47m24s, D+24°07′00″”. This, unfortunately, doesn’t help me much. So I need to convert these equatorial coordinates to horizontal coordinates, which consist of the azimuth and altitude—the direction to point the telescope and how high it needs to be angled. In order to do that, though, I have to go through a bunch of other math.

Taking it a step at a time, I look at the equations to turn the equatorial coordinates (right ascension is \alpha, declination is \delta, hour angle is h) to horizontal (azimuth is A, altitude is a):

  A=\arctan{{\sin{h}}\over{\cos{h}\sin{\phi_0}-\tan{\delta}\cos{\phi_0}}}\\  a=\arcsin\left({\sin{\phi_0}\sin{\delta}+\cos{\phi_0}\cos{\delta}\cos{h}}\right)

Hang on a second, though, what’s hour angle h? I get that from local siderial time \theta_L, apparently. And where do I get that? From Greenwich siderial time \theta_G. And where do I get that? The best equation I can find is

  J_0=367y-\lfloor{\frac{7}{4}(y+\lfloor{\frac{M+9}{12}}\rfloor)}\rfloor+\lfloor{275\frac{M}{9}}\rfloor+1721013.5\\  T=J_0+{{h+m/60+s/3600}\over{24}}\\  \theta_G=\left({100.4606184+36000.77004T+0.000387933T^2-(2.583\times10^{-8})T^3}\right)+360.98564724{{h+m/60+s/3600}\over{24}}

where y is year, M is month, d is day, h is hour, m is minute, and s is second.

Using this information, for 25 June 2016 I get a \theta_G of 18h14m15.5875s. The Navy reckons it at 18h14m15.5860s. That isn’t too bad, but I am curious as to where the difference of 15/10000 comes from. I’ve tried a few other formulae that take slightly different approaches to the problem, and while they all agree at least down to the tenths place of the second value, they are further from this number. At this point, though, the difference is only annoying my overly mathematical brain, its practicality for a tiny telescope like mine and for the stepper motors that I’ll be using mean that such a difference is effectively irrelevant. In fact, I calculated the worst-case TFOV of my current scope and lenses and come up with 14 arcminutes. So if I’m off by 0.000025 arcminutes, it’d be impossible for me to notice.

Anyway, that’s step 1. I need local siderial time. This is a simple matter of adjusting it for where I am on the surface of Earth relative to the Greenwich meridian. Since it’s convenient for testing purposes, I used the same US Navy website’s default of Washington D.C. to test my own calculations for “local” siderial time. Subtracting 77°1’48.0″ from 18h14m15.5875s gives (after the appropriate conversions) 13h6m8.3875s. The Navy provides an answer of, hey presto, the same thing (give or take the same annoying 0.0015s)! This part of the calculation I can handle.

So, back to hour angle h.

h=\theta_L-\alpha

Yay! So, this weekend, if I’m looking for M45 in the sky at midnight local time

  h=\theta_L-\alpha\\  =10^h54^m29.1677^s-3^h47^m24^s\\  =7^h7^m5.1677^s
Futzing with the formulae above—oops!—while I get an azimuth of 127.6850°, I get an altitude of −6.7445°, so the Pleiades, from near my house this weekend at midnight, would be below the horizon in the ESE sky. A more useful use of these formulae would be to determine how high in the sky a particular object would actually get, and at what time. My first method, before doing the algebra of rearranging these so I can more easily maximize a, is to just stick in values for local time until I see the highest result. I find M45 will be at an altitude of 76.4255°, in the northern sky (azimuth just −0.0606°), but at 15:59, when the sun is still well above the horizon.

I want to make the hour angle offset the right ascension completely, so that h=\theta_L-\alpha=0, to find the exact time M45 is highest in the sky. Rearranging, I get

\theta_l=\alpha\\  \theta_G-\lambda_0=\alpha\\  \theta_G=\alpha+\lambda_0=3^h47^m24^s+-6^h28^m32.9^s=21^h18^m51.1^s

Working backwards to get UT (a time I can actually read), well, this is much, much harder. The only formula I found to do this is based on J1900.0, which is more annoying than a dealbreaker (the code I’ve written to implement this is based on J2000.0), but for any given sidereal time, there are two times each day with that value (or so it seems).

For instance, if I grab the sidereal time corresponding to a UT of 2016-06-25T15:21:21, the GST comes out 144.45° or 9h37m46.88s. When I go hunting for the UT that corresponds to that GST, I come up with 2016-06-25T15:11:19.602000. Converting each of these back to GST gives me the same result to the 14th decimal place. Obviously, however, something like M45 cannot be at its zenith twice in the space of 12 minutes (twice in 24 hours, on the other hand, certainly). Mathematically, this is extremely frustrating.

More (probably) to come!

99 Revolutions

Most of the following are from CODATA 2014 values found here. Some are updated based on recently published data; CODATA 2018 will redefine values and fundamental units (a redefinition of the kilogram, specifically, is anticipated) which will have an effect on the values here.

The numbers:

  • Magnetic constant, \mu_0=4\pi\times10^{-7}\quad{{\rm{H}}\over{\rm{m}}}\approx12.566\,370\,614\quad{{\rm{N}}\over{\rm{A}^2}}
  • Speed of light in a vacuum, c=299\,792\,458\quad{{\rm{m}}\over{\rm{s}}}
  • Electric constant/permittivity of free space, \varepsilon_0={1\over{\mu_0c^2}}\approx8.854\,187\,817\,620\times10^{-12}\quad{{\rm{F}}\over{\rm{m}}}
  • Impedance of free space, Z_0=119.916\,983\,2\cdot\pi\quad\Omega\approx376.730\,313\,461\quad\Omega
  • Hubble constant, H_0=\left(73.00\pm1.75\right)\quad{{\rm{km}}\over{\rm{s}\cdot\rm{Mpc}}}
  • Universal gravitational constant, G=\left(6.674\,08\pm0.000\,31\right)\times10^{-11}\quad{{\rm{m}^3}\over{\rm{kg}\cdot\rm{s}^2}}
  • Planck constant, h=\left(6.626\,070\,040\pm0.000\,000\,081\right)\times10^{-34}\quad{{\rm{J}}\over{\rm{s}}}
  • Planck length, l_P=\left(1.616\,229\pm0.000\,038\right)\times10^{-35}\quad\rm{m}
  • Planck mass, m_P=\left(2.176\,470\pm0.000\,051\right)\times10^{-8}\quad\rm{kg}
  • Plank time, t_P=\left(5.391\,16\pm0.000\,13\right)\times10^{-44}\quad\rm{s}
  • Planck temperature, T_P=\left(1.416\,808\pm0.000\,033\right)\times10^{32}\quad\rm{K}
  • Rydberg constant, R_\infty=\left(10\,973\,731.568\,508\pm0.000\,065\right)\quad{1\over{\rm{m}}}
  • Boltzmann constant, k=\left(1.380\,648\,52\pm0.000\,000\,79\right)\times10^{-23}\quad{{\rm{J}}\over{\rm{K}}}
  • Avogadro constant, N_A=\left(6.022\,140\,857\pm0.000\,000\,074\right)\times10^{23}\quad{1\over{\rm{mol}}}
  • Faraday constant, F=\left(96\,485.332\,89\pm0.000\,59\right)\quad{{\rm{C}}\over{\rm{mol}}}
  • Stefan-Boltzmann constant, \sigma=\left(5.670\,367\pm0.000\,013\right)\times10^{-8}\quad{{\rm{W}}\over{\rm{m}^2\cdot\rm{K}^4}}
  • Josephson constant, K_J=\left(483\,597.852\,5\pm0.003\,0\right)\times10^9\quad{{\rm{Hz}}\over{\rm{V}}}
  • Fine-structure constant, \alpha=\left(7.297\,352\,566\,4\pm0.000\,000\,001\,7\right)\times10^{-3}
  • von Klitzing constant, R_K=\left(25\,812.807\,455\,5\pm0.000\,005\,9\right)\quad\Omega
  • Molar gas constant, R=\left(8.314\,459\,8\pm0.000\,004\,8\right)\quad{{\rm{J}}\over{\rm{mol}\cdot\rm{K}}}
  • Elementary charge, e=\left(1.602\,176\,620\,8\pm0.000\,000\,009\,8\right)\times10^{-19}\rm{C}
  • Dark energy density/vacuum density, \Omega_\Lambda=0.691\,1\pm0.006\,2

Let Me Do

If you’re not familiar with SHEL, you should be. Their new album dropped recently!

Anyway, I have a compiler that does some funny stuff. When I write

I would expect the assembly to be

but instead I get

What does this accomplish?

I mean, sure, it’s doubling the input, and for the target it’s the same number of cycles, but it is somewhat confusing.

What’s more confusing, though, is that if r  is 3, I wind up with 3+3=2. Last I checked, this wasn’t the case. Oh, and apparently 2+2=0.

Secondly, if the result of all of my manipulation means that  r is 0, I would expect the line  return r; to assign 0 to the variable on the left side of the equal sign in the calling function (e.g.  var=function(); ). When I step through the code, however, the debugger at the return line tells me that r suddenly is 0xFF. And when the return happens, 0xA1 gets assigned to var. Does this make sense to anyone else?

Back to banging my head against the desk (figuratively) in an attempt to figure out what’s going on here!

Hemingway Burgers

Ingredients:

  • 1 lb ground beef (90% lean or better)
  • 2 cloves minced garlic
  • 2 green onions, chopped
  • 1 tsp India relish1
  • 2 tbsp capers
  • 1 tsp sage
  • 1/2 tsp Beau Monde
  • 1/2 tsp Mei Yen powder2
    • 3/20 tsp salt
    • 3/20 tsp sugar
    • 1/30 tsp MSG
    • 1/16 tsp soy sauce
  • 1 egg
  • 1/3 cup dry red or white wine
  • cooking oil

Directions:

  1. Mix all ingredients save the wine and oil thoroughly in a bowl
  2. Add wine and let marinate for approx. 15 minutes
  3. Heat oil in frying pan
  4. Form large patties (above recipe makes 2) and place in oil
  5. Cook approx. 4 minutes each side or until done
  1.  Heinz apparently still makes this, but I haven’t found it nearby. Replace with MTR Tomato Thokku Pickle, or similar tomato relish.
  2. The replacement listed is probably not realistic unless you have a very impressive selection of measuring devices. More reasonably, mix 3 tbsp (9 tsp) salt, 3 tbsp (9 tsp) sugar, 2 tsp MSG. Take 1/3 tsp of this resulting mixture, and 1/16 tsp soy sauce, as a substitute for the 1/2 tsp Mei Yen powder.

Strawberry Salad

Ingredients:

  • 1 brick (8 oz) cream cheese
  • 1/3 cup sugar
  • 1/2 tub whipped cream (e.g. Cool Whip)
  • 1 pkg frozen strawberries, chopped (10 oz)
  • 1 small can crushed pineapple
  • 3 chopped bananas (optional)

Directions:

  1. mix cream cheese & sugar
  2. stir in all other ingredients
  3. pour in 9×9 pan
  4. freeze for 4 (or more) hours
  5. serve frozen

Meatloaf

Ingredients:

  • 1 lb ground beef (90% lean or better)
  • 1 egg
  • 4 saltine crackers
  • 1 package meatloaf seasoning
  • salt, pepper, onion, ketchup, cheese to taste

Mix in bowl

Place in loaf pan

Bake at 375 °F for 30–35 minutes.

The Sound of Silence

[Updated 3/29/2016 to reflect updated urls at report-uri.io]

Qualys SSL Labs’ SSL tester here, and Scott Helme’s securityheaders.io here, have very useful tools when attempting to harden one’s website to things like XSS attacks. One of my websites gets an A+ on the SSL tester and all of them currently get at least an A on securityheaders.io. The latter is more difficult to please, and for good reason.

Content Security Policy

While rather straightforward in concept, creating a coherent content security policy was more difficult than I expected it to be. Turns out I had a heck of a lot more external resources on this (WordPress enabled) website than I expected. So one of my nginx config files features the following line (breaks added for the sake of clarity):

Lots of people reverse the double and single quotes, but that’s more of a preference thing, I believe. Doesn’t affect the outcome. Now I won’t go over all the elements, but I will point out a few things I learned. If you wish to restrict the protocol (http:// vs. https://), include that in the urls given. If you do not, a wildcard (e.g. “*://*.wp.com”) will not do what you might expect.

The keyword 'unsafe-inline'  I misunderstood at first. They allow the use of inline scripts and styles, which I first thought would be a given, but that can be unsafe, thus the restriction unless these are added. 'unsafe-eval' is similar in that it allows the use of the eval()  function in JavaScript. This I know to be rather unsafe, but rather than rewrite one particular script on my site, I decided to allow this, at least for the time being.

The report-uri directive was the hardest for me to get, because at first I thought I was going to have to create my own method for handling any and all requests this was going to generate. Then I found report-ui.io. Mr. Helme built that site as well, and it’s free to use while evaluating CSP and HPKP headers for one’s server.

ACME Protocol

Before I get to HPKP, there’s a “feature” of the ACME protocol that had me scratching my head for a long while. It requires an HTTP request (non-SSL/TLS) to verify ownership of the domain(s). The Let’s Encrypt client as well as others (lego, acme_tiny.py, etc.) set up their own servers to do the handshaking, which is fine as far as it goes, but in a production environment, one doesn’t want to drop a server even for the few seconds required to renew a certificate.

Anyway, I had configured my server to redirect all incoming URIs to use SSL/TLS, which meant even the directory that had to be accessible over HTTP was getting moved, and it wasn’t/isn’t in that server block. Eventually, I hacked together a new one:

Because of the way Chrome and Firefox at least cache the redirect, if one visits http://example.com, she is redirected to https://example.com. This is the typical desired behavior. If one subsequently attempts to visit http://example.com/.well-known/acme-challenge/index.html (assuming such a file exists), she would be redirected to https://example.com/.well-known/acme-challenge/index.html, which in the case of my server, does not exist. However, if one were to visit http://example.com/.well-known/acme-challenge/index.html initially, that page would display perfectly well—until any other directory on the server is viewed.

As far as I can tell, this does not cause an issue for most of the clients, as they don’t check other locations. I’m far from an expert on this, and am only relating my own experiences. The next section will eventually cover the ACME client I use and how I created my certificate(s).

HTTP Public Key Pinning

I still don’t totally understand this one. While I get the idea of ensuring visitors haven’t been duped into using a bogus or compromised certificate (that makes sense), exactly how this part works still is a bit confusing. The following is a work-in-progress.

My header:

I’m really not sure what comes next. I’m not sure if I’m supposed to have all three certificates in my chain in that header, or if one of them is supposed to be a backup certificate (which also seems to be recommended), or what. I’ve followed this post about Let’s Encrypt and creating a more generic certificate using the ACME protocol (so I now have a certificate that covers all my domains). Thing is, the protocol (or maybe just the script) seems restricted to port 80, and if I set up my websites to force SSL, port 80 will get switched to port 443, and the script (cron-based renewal) will fail. And I’ll have to reconfigure my server blocks to open port 80 up, even for one directory, for 60 seconds or so every 90 days…

Let’s just say I’m sure there’s a better way, or something I’m totally missing. And if/when that time comes, I’ll update this.