Today is
 Per Diem
Donovan Howe
Columbus, OH
Est. 2017
Sprouting in CMH as an advocate for good people and good ideas.
☰ >:| Dono per Diem

Everything () that goes wrong, in one place.


12/16/18, ii: Moving a jquery calls to 3.3.1, using the async tag.

12/16/18: What is...pngquant?

One of the things that is probably crashing Google PageSpeed Insights is our massive image library. Let's dive in, using one of the GUI distributions of pngquant, PNGoo.

The goal here is to take our most egregious assets and see how far we can compress them. One of the original goals for this site was to move away from the kind of automatic compression that Tumblr was providing, giving us the ability to host large, print-quality scans and pictures. This has proven to be both:
a) Unnecessary (this website is never used that way)
b) Costly for our render time
Here's our biggest image asset:

That's a huge savings, but this is still a massive image hosted in the middle of a blog post.
The last step I'm going to take is to scale the PNGoo output in GIMP and recompress.
Original file size: 2827 KB
Final file size: 356 KB
Side note: There was going to be another image at the end of this post using Snipping Tool (I am a lazy man) to compare image quality between pre-compressed and post-compressed images. Normally, Snipping Tool captures are pretty small, but this one was more than 3 MB! Maybe ST automatically adjusts quality based on the source image? Regardless...

We're up to a 77, boys! DECENT

Here are the next GPSI opportunities:

12/15/18: Eventually got GPSI to finish yesterday, landing us in the 60's. Adding .mp4's back in, might have been Namecheap issues at 5AM.

Did you know? Site speed affects your Google ad ranking:
(Also: minification, GZIP, bit depth, delta encoding, switching from .png to .jpeg for our utility photos, automating image optimization, pngquant, ImageOptim, lazysizes.)

12/14/18: Converting site .gifs to .mp4s. Getting time_outs from Google Insights.

Taking out links to external images not hosted by our site. Get that green lock back!!

Also: Fixing the poster placeholder links in our video tags, cleaning up errors in .svg and older posts.
Commenting out our video links, no change.
Deleting .mp4s, no change.

12/13/18: What is...Google PageSpeed Insights, and why does it hate me?

So let's look at some articles, starting with:

Let's try it:

The needed ffmpeg syntax for me was: "ffmpeg -i input.gif -c:v libx264 -strict -2 -preset slow -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -f mp4 output.mp4"

Original .gif @ 1,772 KB
Converted .mp4 @ 140 KB
Heck yes!

12/12/18: More GA (Google Analytics). Our page load time is slow - let's try to get that down. We should be hosting thumbnail-sized versions of our large .pngs and splitting the Per Diem site out into quarters or months.

12/11/18: 404 page!
(404 pages require absolute paths for links and JS)

12/10/18: We had a little spike in our traffic recently. What is...bounce rate?

Bounce rate = A single-page session on your site

In the last 7 days, we got most of our referrals from "99 reasons for seo"

OK...what pages are they visiting?

That is not a subdirectory that exists on my website. What's going on?

Probably, referral spam. Some interesting writing on the subject:

12/09/18: Finalizing hardware and programming on TFT ornament.

12/08/18, ii:

12/08/18: Tessellating!

12/05/18: Enjoyed this overview of tesselations on the sphere:
Also, new CSS: hyphens: auto.
Also, self-referencing tessellations:



11/29/18: Assembling our TFT module (step-up power supply + Nano + TFT + on/off button.)

11/27/18: Mounting on/off button.

11/25/18: Thermoplastic. Lessons:
1. Do not handle with heat-conductive tongs, thermoplastic will form a symbiotic relationship with the tongs, making it impossible to remove.
2. This stuff is really easy to work with, but will bind to rough surfaces.
3. Thermoplastic is soft enough when cool to mark with your fingernail, but hard enough to cut a clean, faceted face into.

11/24/18, ii: Auto-power off based on this circuit:
What is the catch? This circuit bypasses the voltage regulator on the Arduino. sez:

5V. This pin outputs a regulated 5V from the regulator on the board. The board can be supplied with power either from the DC power jack (7 - 12V), the USB connector (5V), or the VIN pin of the board (7-12V). Supplying voltage via the 5V or 3.3V pins bypasses the regulator, and can damage your board. We don't advise it."

Next time: deepSleep().

11/24/18: What is an...AMX3d Lilypad Power Supply?

This supply is supposed to take any input from 1.2V-5V (such as an AAA battery) and output 5V. How does it do this? Let's take a look at the components: (I couldn't find the AMX3d schematic, here is the Sparkfun version:

A boost converter (or step-up converter) is based around an inductor. When a power supply is connected to the circuit, a magnetic field is created. When the power supply is disconnected, the magnetic field collapses and creates a voltage in the circuit. This voltage can be higher than the applied voltage.

If you add a capacitor to the circuit, you can increase the voltage every cycle. A MOSFET or other switching transistor can be used to do this automatically.
Here is visual walkthrough:

11/23/18: Blender Freestyle tutorials for "blueprints" (or an artistic approximation.)
Good walkthrough here:

11/22/18: Working with Adafruit TFT library. (Also, OBS for desktop recording.)

11/21/18: Working towards a pushbutton Arduino power on/timed shutoff. What is a...

MOSFET = Metal-oxide-semiconductor field-effect transistor with an insulated gate whose voltage determines the conductivity of the device

(Also, troubleshooting UNO that couldn't download from the Arduino IDE. If your Arduino case is constantly pushing down the reset button then it will not work.) :|

11/20/18: What Adafruit 1.44" TFT?

Vin = Power in (3-5V DC)
3.3V = 3.3V out
GND = Ground
CLK = SPI clock input pin
MISO = SPI Master In Slave Out pin (used for the SD card)
MOSI = SPI Master Out Slave In pin (sends data to the SD card and/or TFT)
TFT_CS = TFT SPI chip select pin
RST = TFT reset pin (connect to ground to reset the TFT)
D/C - TFT SPI data/command selector pin
Card_CS = SD card chip select (to read from the SD card)
Lite = PWM input for the backlight control. (default high = backlight on)
(Pulled from the excellent documentation by Adafruit:

Upside-down demo:

11/19/18: Changing some functions to not run every loop(), ISRs. Learned that the blocking function in our code is the Adafruit display library taking a measurable amount of time to refresh the screen. Only updating the display when an input changes.

11/18/18: Realized that if our microstepping is based on delayMicroseconds(), and we have 3 motors, the speed setting of each motor will affect all 3. Rewrote microstepping code based on micros().

11/16/18: Arduinos can only do one thing at a time. What is the right solution for 3 motors with external speed controls, a display, and an ultrasonic sensor? This is an interesting thread:

11/15/18: Examining options for mounting components.

11/14/18: Cleaning up motor code.

11/13/18: Firing our ultrasonic sensor ever 12 seconds with delay() was preventing other inputs. Using millis() and micros(). What is...?
millis() = Returns the number of milliseconds since the Arduino program was started.

(Also, classes, constructors. Next time - non-blocking stepper control.)

11/12/18: What is a SainSmart HC-SR04 ultrasonic randing detector?

The Trig pin is used to trigger a soundwave, the Echo pin waits for the soundwave to start and stop. This time is then converted into distance using the speed of sound (340 m/s).

What is...?
pulseIn(pin, value, timeout(optional)) = This Arduino IDE function reads a pulse duration. If the value is set to HIGH, pulseIn() waits for the pin to go from LOW to HIGH and back to LOW.

On our next show, replacing delay()...Thanks to for the excellent tutorial!

11/11/18: Our Shapeways battery holder-holder arrived:

I designed this to hold 3 of these 4xAA holders: The material is 1mm thick all around.

The box is flexible, once the battery holders are in there it feels very solid.

At $32.33 with shipping, I could have done a better job reducing the amount of material used to print (cutting the top half of this off wouldn't sacrifice much structural integrity.) Printed using the Shapeways "versatile plastic" material.

(Also testing rocker switches.) (Also buttons and state machines.) What is a...
Pull Down Resistor = A resistor used to hold the logic signal near zero volts when no other active device is connected.

11/10/18: Back up and running with A4988 replacements. Blew one up by connecting our Vmotor supply to the logic power rails.

Decided to get fancy and make a separate Nano-based A4988 tester board. Nano no longer recognized, possibly caused by using an external power source with the Nano. There are MASSIVE amounts of troubleshooting suggestions for this. Verbose output in the Arduino IDE, FT_PROG, CDMUNINSTALLER. Tried soldering together GRD and TEST on the Arduino FTDI chip per internet suggestion.

Using our Arduino Uno as an ISP. What is...
ISP = In-circuit Serial Programmer

1 million Arduino threads later -- pulling eject to get a go bagel.

11/9/18: Taking about 100 lines of code out of our Arduino sketch by defining a custom function. Checking out Shapeways store setup.

11/8/18: Setting up our oscilloscope. Probe compensation adjustment. What is a...
BNC Connector = Bayonet Neil-Concelman connector, a quick connect radio frequency connector for coaxial cable.

11/7/18: Software tweaks. Somehow caused a short back through the USB-B connector on our Arduino Mega to the Dell WD15 dock it was connected to. What was the issue?

One of our A4988 drivers has a short somewhere. We saw the same thing out of the box with a few of the other drivers. What could the cause be?
1. Heatsinks that overhang components causing a short
2. LC voltage spikes, causing issues for the ceramic capacitors on the A4988

Plugging the A4988 driver into our Arduino power rail causes flickering on our OLED before triggering the Arduino auto-shutdown.

Resolution: Will be powering the Arduino from a 9V battery, USB connection only when reprogramming. Will return in the future to see if we can better diagnose our component failure.

Thanks to Pololu for the LC voltage spike article:

11/6/18: Rotary encoder + OLED + stepper. Using the rotary encoders pauses the digital output to the steppers. Controlling forwards and backwards with encoders.

11/5/18: Identifying capacitor polarity (or non-polarity). Increasing serial speed. Tweaking arduino encoder code. The rotary encoder works better, but not at high rotation speeds. Incrementing by multiples. Capping motor limit at +-100%

11/4/18: Rotary encoder + 128x64 OLED.
These encoders have a lot of "bounce", meaning when you turn them, the reading you get back is not always accurate. This is minimalized when turning the knobs slowly.

11/3/18: Testing KY-040 rotary encoder.

11/2/18: Are loose wires making you weird and splenetic?

Here are DonoPont cable managers:

In your favorite 2.54mm pin pitch!

Easy to cut into your needed number of clips.

Now you are less haunted Go away voices! Ha ha ha (:

(Also, turning our HTTPS redirect back on.)

11/1/18: Firing up our little OLED display. What are these pins...?
SCL Pin = Clock Line
SDA Pin = Data Line
They let us communicate with I2C/TWI devices. What are...?
I2C = Inter-Integrated Circuit, pronounced I-squared-C, is a synchronous, multi-master, multi-slave, packet switched, single-ended, serial computer bus [...] It is widely used for attaching lower-speed peripheral ICs to processors and microcontrollers in short-distance, intra-board communication.
(thanks Wikipedia,
TWI = Two Wire Interface, similar to and compatible with I2C

We are starting with the I2C scanner here:
I2C scanner sez:

We are using the following libraries:
Adafruit SSD1306 library
Adafruit GFX library


Thank you to Jean0x7BE for the very good tutorial!


10/31/18: Always sad to see a mouse go, moved on to my second Logitech G502 (always RIP G9X from college). This G502 lasted about 29 months before succumbing to the well-documented Logitech left-click misfires.
Microstepping on the A4988.

10/30/18: When the power is out, LEDs make it possible.

10/29/18: Modeling a box for our 4xAA battery holders. Probably spent too much money on Shapeways having solid walls all around. Next time, mesh.

10/28/18: Multiple motors at once with speed control.

Plus, structural improvements to our motor base.

Desoldered the very loud buzzer from my Aroma rice cooker so I don't wake my girlfriend when I cook in the morning. Success! Could not fix the fact that it is an atrocious rice cooker.

10/27/18: Checking the permutations of coil ordering on our Nema 17 motor. Making a safety clip for our 16V power source so I don't short anything else. Motor working. What was wrong?
1. Delay between high/low pulses to the driver were too short (doubled from .5ms to 1ms)
2. Was pairing coil wires incorrectly.

Also: Stabbed to Death by Header Pins (sharp ouch)

Do all of our motors work? Yes.
Do all of our A4988's work? No, 1 doesn't do anything and 1 causes our Arduino to auto-shutdown.

10/26/18: Current limiting.

10/25/18: Powering up our Nema 17 motor. Directly measuring the current of our 12xAA stack caused a happy curl of smoke. Why?
Today made possible by our Fluke 117 not setting us on fire. Thanks, Fluke!

10/24/18: Why doesn't our 4xAA clip generate a voltage? If only our battery was a little longer...

Battery clip goes under the knife, there we go, now we've got 16V.

10/23/18: We submitted our DonoPont clip for production in 3 materials. Shapeways sez: partially rejected.

Material Min Supported Wall Thickness Min Unsupported Wall Thickness Order Status
Fine Detail Plastic
(Resin-based Acrylic Plastic)
0.3 mm 0.6 mm Processing
Professional Plastic
(HP Nylon Plastic PA12)
0.4 mm 0.5 mm In Production
Versatile Plastic
(Nylon Plastic PA12)
0.7 mm 0.7 mm Cancelled

Why didn't Shapeways reject all 3? Once more unto the breach, dear friends.

10/22/18: Blender wire clip to fit cables in a DuPont connector.

10/21/18: Learning to make DuPont connectors. Doing it upside-down the first 4 times proved highly ineffective.

Plus, looking inside one of these Nema 17 steppers, because the wire colors were in different orders on different units.

10/20/18: Tweaking spherebot base.

10/19/18: Calibrating spherebot.

10/18/18: Buck converter, tiny screwdrivers.

10/17/18: Quick maths. For our 80mm sphere project, the wheel contact points should be 60mm apart.

10/16/18: More component organization. Portrait of a screwdriver as a boy.

10/15/18: Relearning Arduino syntax.

10/14/18, ii: First test transmissions. Hello! Even with modules close together transmission is erratic. Destroyed LED ):

10/14/18: What is? A Longruner NRF24L01 transceiver module?

MISO = Master In/Slave Out
SCK = Serial Clock
CE = Chip Enable
GND = Ground
IRQ = Interrupt Request
MOSI = Master Out/Slave In
CSN = Chip Select Not
VCC = Voltage at the Common Collector (1.9-3.6V)
Thanks to for the excellent tutorial.

10/13/18: The warning diagrams from this JHD659 LCD module are amazing

Plus, loops, delays and reversing.


10/11/18: More component organization.

10/10/18: Multifunction component tester assembly, component organization.

10/09/18: Soldering our BNO055 9-DOF sensor. Adafruit libraries, Processing, rotating a cube.

10/08/18: Researching motor couplings.

10/07/18: LTspice! Setting up an IR breakbeam sensor on the Arduino. Ordered an Elisona Nano, arrived with a big blob of solder between the D2 and D3 pins. Initial googling doesn't reveal any obvious reason why, removed.

10/06/18: What is? An L298N shield? It is...

a high voltage, high current dual full-bridge driver designed to accept standard TTL logic levels and drive inductive loads such as relays, solenoids, DC and stepping motors."

Full-bridge driver = An H-bridge
H-bridge = An electronic circuit that switches the polarity of a voltage applied to a load
TTL = Transistor-transistor logic; transistors perform both the logic function and the amplifying function
Inductive load = Loads that resist changes in current (e.g. electric motors)
Relay = An electrically operated switch
Solenoid = An electromagnet whose purpose is to generate a controlled magnetic field
This is what an H-bridge does:
This is an inexpensive way to control multiple motors through an Arduino.

10/05/18: Shapeways project #2 arrived! Wax printed and cast in bronze.

10/03/18: More soldering tutorials.

10/02/18: Soldering tutorials. First solder joints!

10/01/18: Thinking about UV mapping, and ways of splitting a sphere.


9/30/18: Arrays, knife cuts, measuring tools in Blender.

9/29/18: Looking at these clever patterns for bending cut geometries aka kerf cuts, living hinges, sninges.

9/28/18: Raspberry Pi camera, CSI, Python 3, ribbon cable origami.

9/26/18: RDWorks, Learning Lab, Lightburn, living hinges.

9/25/18: Parametric modeling, arrays, ODS.

9/23/18: Testing some examples from the RFID library located here

9/22/18, iii: RC522, Arduino.

IRQ = Interrupt Request (Triggers an interrupt)
NSS = Slave Select (Pin the master can use to enable and disable devices)
SCK = Serial Clock (Synchronizes data transmission generated by the master)
MOSI = Master Out Slave In (The master line for sending data to the peripherals)
MISO = Master In Slave Out (The slave line for sending data to the master)
GND = Ground
RST = Reset
VCC = Positive voltage (3.3 Volts in this case)
Thanks to for definitions.

9/22/18, ii: 2nd model submitted for printing at Shapeways.

9/22/18: More 3D cleanup. Disconnected edges in several places. Subdividing edges for easier and more logical curve mapping.

9/20/18: Reworking our next mesh.

9/19/18: Raspberry Pi 3B+ (day 3), GPIO IN, buttons.
(Raspberry Pi is a trademark of the Raspberry Pi Foundation)

9/18/18: Raspberry Pi 3B+ (day 2), GPIO, Python 2, blinking LED.
(Raspberry Pi is a trademark of the Raspberry Pi Foundation)

9/17/18: Raspberry Pi 3B+ (day 1), heatsinks, NOOBS, Raspbian.
(Raspberry Pi is a trademark of the Raspberry Pi Foundation)

9/16/18: Carboard prototyping.

9/15/18: What shape is my wrist?

Our Shapeways model was approximately wrist-shaped, but it sat awkwardly, sticking out too much on the sides. I took it to the vise to figure out what felt right. It needed to be about 5mm taller and less rounded. The vise did crack the part in several places, but only on the edges where the metal is 1mm thick. In the redesign, I'll be looking at making the sides flatter and focus on advantages we can press in an asymmetrical design.

9/14/18: What shape is your wrist? It depends on whether your wrist is supinated, pronated, or in between. Your wrist is controlled by the motion of the two bones of the forearm, the radius (closer to your thumb) and the ulna (the "outside" of your wrist).

As you rotate your wrist, not only is the skin sliding over these bones, the muscles and connective tissue underneath change shape as well. A wide bangle (like the below) that fits snugly will have to accomodate a dynamic geometry in order to feel comfortable.

9/13/18: Arduino projects (15/15), optocouplers.

9/12/18: Arduino projects (14/15), Processing.

9/11/18: Arduino projects (13/15), capacitance.

9/10/18: Arduino projects (12/15), Piezo as sensor.

9/9/18, ii: We got our first Shapeways project back. Here it is as shipped (including residual manufacturing greebuloid material):

Density Yield Strength
Tuna Noodle Casserole 0.93 g/cm³ Pretty weak
AlSi10Mg Aluminum 2.68 g/cm³ 206-264 MPa
420SS/Bronze Matrix 7.86 g/cm³ 455 MPa
Sterling Silver 10.26 g/cm³ 100 MPa
18 Kt Yellow Gold 15.10 g/cm³ 250 MPa

Material: I printed this in Shapeways' 420SS/bronze option, 60% steel/40% bronze (this is an ExOne binder jetting/sintering/bronze infiltration process). The material is 8.45x more dense than tuna noodle casserole, according to this food density reference.

Accuracy: The model was submitted with a Z-height of 25.4mm. Caliper sez: 24.33mm. A 4.2% difference isn't a lot, but if we were making rings, that's more than an entire ring size. I'm only investigating the Z-height of the part, since I started testing the XY elasticity immediately out of the box.

Finish and color: The surface shows some pitting, similar to sand-casted materials. The pitted areas are a little warmer in color. The consistency of the material color is good throughout the part. According to the manufacturing process specs, the material is polished through tumbling, which might explain the bits of material left in the negative spaces. The finished part has parallel brush strokes on some of the large flat faces.

Overall: The finished part looks good and retained the detail of the original model well. With some iteration and experimentation on the surface finish, this could be a viable manufacturing option for someone without casting equipment.

9/9/18: Arduino projects (9/15), DC motor, external power, transistors, diodes.
Arduino project (10/15), integrated circuits (IC), H-bridges.
Arduino projects (11/15), LCD.

9/8/18, ii: Arduino projects (5/15), Servo motor, header pins, capacitors.
Arduino project (6/15), piezo.
Arduino project (7/15) Buttons in parallel.
Arduino project (8/15) Tilt sensor, millis().

9/8/18: Arduino projects (4/15), Pulse Width Modulation (PWM), phototransistors.

9/7/18, ii: Arduino projects (3/15), analog pins.

9/7/18: Arduino projects (2/15), digital pins.

9/6/18: Arduino projects (1/15), resistors. Red for power! Black for ground! Resistors are reversible. V=I*R

9/5/18: Arduino, diode, anode (+) --▷|-- cathode (-), H bridge, optocoupler, mosfet, platform assembly.

9/4/18: New day, new mesh.

9/3/18: Arduino IDE, sketches.


8/31/18: Moving from Portland, OR to Columbus, OH. How'd we do?
Miles: 2475
Fuel Consumed: 1458.65 lbs
MPG: 10.52 (Vehicle: GMC Savana Hicube)
States: 9 (OR, ID, UT, WY, NE, IA, MO, IL, OH)

8/30/18: Proportional editing!

8/27/18: Resubmitting updated design to Shapeways.

8/26/18: Joining objects, again (CTRL+J), Inset (I). Bevel (B).

8/25/18: Unpacked. Don't bring that weak geometry, sez Shapeways:
N panel, face area.

8/14/18: Gravity, rigid bodies, center of mass.

8/13/18: Figuring how to use knife project for rings.

8/12/18: More SVG manipulation in Blender.

8/11/18, ii: Importing SVGs, working with curves, exporting image strips.

8/11/18: Fly mode (Shift+F)! User Preferences:Auto Depth, Zoom to Mouse Position. First model submitted to Shapeways! Cooking my laptop, playing with shaders without a proper GPU.

8/10/18: Knife project, circles, curve modifier to wrap around an axis.

8/9/18: Remember to join your faces (CTRL+J) if you want to manipulate a plane as a single mesh! (Shift + Z) to move only on the XY plane.

8/8/18: MeshLab! Netfabb! Shapeways upload tool, material comparison.

8/7/18: Extruding for texture, materials, lightning. Mesh:cleanup tools.

8/6/18: Assigning to groups, materials. Losing undo history by switching between edit/object mode.

8/5/18: Modeling a cuff.
(Also || Snap to grid:increment, specials:remove doubles. Bezier circle, modifier:curve. Origin:origin to 3D cursor, origin:geometry to origin.)

8/4/18: Blender, modifier:solidify, modifier:simple deform, edge split, Sverchok, modifier:wireframe, edge slide, face tools:poke;fill;triangles to quads(alt+J),...load factory settings...deleting startup.blend...

8/3/18: Blender tutorials (x/41), vertex groups, keyframes, timeline, dopesheet, graph editor, select by trait, loose geometry, STL checks, tesselating meshes.

8/2/18: Blender tutorials (x/41), tracking constraints, rigging (again), modifier stacks, inverse kinematics.

8/1/18: Blender tutorials (x/41), sampling, rigging, parenting, null objects, armature, object constraints.

JULY 2018

7/31/18: Blender tutorials (x/41), shaders, cycles, node interface, Voronoi textures, light sources, fil/key/back lights, non-photorealistic shading, render output.

7/30/18: Blender tutorials (14/41), primitives, hiding/layers, interface. A weeping cobalt cube. Nurbs. A dirty chair.

7/29/18: Shapeways/Blender, normals facing out, no internal geometry, non-manifold geometry, Blender tutorials (3/41).

7/28/18: Tessellating [...]

7/25/18: Adding anchors for DPD entries.

7/24/18: Based on your location in Portland, OR, which Blue Star Donuts is closest? Here's a handy map generated with d3-voronoi, based on this example by Mike Bostock.

7/22/18: Enjoying these factorization diagrams by Brent Yorgey. How do you quickly identify an 11-sided, 13-sided, or 17-sided shape? Probably best to switch from a real representation to a symbolic one. Periodicity (by Jason Davies) or color gradients (by Nicholas Rougeux) might help. (side topics: Shadow DOM! +referencing SVG externally.)

7/21/18: SVG'ifying the hexes. (2018-12-14 svg code redacted due to errors)

7/20/18: Also, use single quotes if you need double quotes inside a string.


7/18/18: .last(), .remove(), transform: perspective.

7/17/18: Hexes! If you use JS to target a class, you must then specify which element in the array you want to modify.

7/16/18: Adjusting sidenav animation size.

7/15/18: SVG animation for IOHES sidenav.

7/14/18: Canvas animation, event listeners.

7/13/18, ii: For fun, let's take a look at relative frequencies of the first letters of words in the English language (top) versus the Dictionary of the Damned (bottom) as of today...(ignoring that there are no æ words in Peter Norvig's data.)

English DD
Favorite Letter T (15.978%) A and C (10.588%)
Average word length 5.1 6.4

What does it mean? The Dictionary of the Damned has a weird fascination with words that start with C (and is unimpressed by words that start with T [3.529% of the DD]).

+Google Analytics!

7/13/18: Spline interpolation with cubic bezier curves. Renaming <canvas> elements.

7/12/18: Standalone DD DoD page.

7/9/18: GIMP can export GIFs?

Fixing the DD's hidden sidenav pointer-event issue.

7/8/18: More CSS animation fiddles.

7/7/18: Frame-by-frame animation in CSS.

7/6/18: While loops, .firstChild, removeChild. SCSS!

7/5/18: MDN bouncing ball demo, object building.

7/4/18: Kinematics, dynamics. Did I know? You can declare arbitrary elements in HTML, like new friends <ball> and <square>:     !!! This bit of code causes these animations to restart after 400ms: document.body.innerHTML = document.body.innerHTML.replace('✪', ' ')}), 400).

7/3/18: Did you know? GIMP can export paths to SVG. Using inline SVG to replace little icons.

7/2/18: R, RStudio, ggplot2. This development environment alludes to the mythological idea of a World Package that supports the earth a single scatterplot on its back. It suggests that this package rests on the back of an even larger turtle package, which itself is part of a column of increasingly large packages that continues indefinitely.

7/1/18: Reformatting pt.ii. If you want to be the cool guy with visibility:none elements in your hidden sidebar, if they invisibly overlap your body's <a> elements, you will no longer be the cool guy.

JUNE 2018

6/30/18: Reformatting for better visibility.

6/28/18: Sticky footers, with and without flex layouts.

6/27/18: Formatting, standardizing pages.

6/26/18: First appearance of Wordbow. Header/footer bars to indicate the start and end of the content. More content filtering based on media width.

6/25/18: Tweaking the timing of synchronous js scripting.

6/24/18: PerDiem date key using d3.js, reformatting, reorganizing.

6/23/18: PHP (again), cURL, Uptimerobot API.

6/22/18: Uptimerobot!

6/21/18: Animations and d3.js.

6/20/18: More d3.js foolin'. setTimeout(), promises.

6/19/18: More d3.js formatting.

6/18/18: If you leave a script src= in your body with no valid target, nothing will happen. If you forget that script has a valid target locally but not on your website, your website may have ghosts. Email.

6/17/18: "About" link. HTTPS!

6/14/18: Did you know? "Damn" comes from the Latin damnum, "loss, damage".

6/12/18: If you tell your tr's and th's to have different hover events, Chrome will interpolate the results.

6/11/18: Sticky headers.

6/9/18: Looking at museum websites, Chase and Sketches sidenav index.

6/8/18: Revisiting our friend :active, thanks to friend of the show JRB.

6/8/18: Line breaks, block styling.

6/7/18: Colors, borders, bookmarks. :target, smooth scrolling to anchors. Now tracking number of Æ entries in the DD.

6/6/18: Styling tables (again). Content inserted with CSS cannot have events attached to the pseudo element.

6/5/18: Tooltips and visualizing bigrams.

6/4/18: Animation in d3.js, maths, bubble packing, stems and leaves.

6/3/18: d3.max(). Debugging and eating tasty NaN.

6/2/18: More adventures in d3, counting days, ranges.

6/1/18: Increasing data density.

MAY 2018

5/31/18: Month labels.

5/30/18: Colors, positioning.

5/29/18: Migrating between versions of D3.js.

5/28/18: Poking at

5/27/18: D3.js! (Today's post brought to you by best-in-class CSS color #blanchedalmond)

5/20/18: Adventures in offscreen rendering.

5/19/18: Cleaning up, first appearance of adverbs in the DD.

APRIL 2018

4/21/18: InDesign.

4/14/18: Quote from Albrecht Durer's "Of the Just Shaping of Letters" (1525): "For it is the easiest thing in the world for the Arts to be lost and perish; but only with difficulty, and after long time & pains are they resuscitated."

4/7/18: Toning up the site background. Thinking about majuscule and minsicule.

4/4/18: Toning down the site background.

MARCH 2018

3/31/18: Photoshop trial. The hardest part of GIMP, is letting go. Also Javascript key codes.

3/30/18: Math.random(), Crypto.getRandomValues().

3/26/18: SOWPODS search now looks only for whole words, not parts of words.

3/25/18: Notepad++, for when you need to quickly edit 250k lines simultaneously.

3/24/18, ii: Find a word in SOWPODS!
(Word list by

3/24/18: Reminder that "=" assigns a value, "==" checks equivalence, "===" checks equivalence and types. Word boundary associations.

3/23/18: Arrow functions!

3/22/18: fetch, readAsText, more SOWPODS.

3/17/18, iii: Definitions by

3/17/18, ii: When there is only one single-line text input field in a form, pressing enter will submit the form. If you have two separate functions in one script, they do not share variables.

3/17/18: Regex, str.replace, str.slice., Wikimedia API only needs origin=*.

3/16/18: Looking at XML, jQuery.parseXML()

3/15/18: More MediaWiki API!

3/13/18: .text(), .change().

3/12/18: Creative Commons licensing, first JSON script. SOWPODS word lists are possibly free to use? Query/parse of Wiktionary content.

3/11/18: Back to JSON and AJAX.

3/11/18: SPARQL, WDQS, MediaWiki API vs Wikidata Query Service, REST, API sandbox and etiquette.

3/9/18, ii: Wiktionary API!

3/9/18: Android user interfaces. Did you know? Android is a multi-user Linux system in which each app is a different user.

3/8/18: Kotlin? Lambda functions?

3/6/18: First Android virtualization, JMC, Netbeans. Oracle concepts overview: you are a blue square going 18mph, changing gears, with seborrhoeic dermatitis.

3/4/18: Android SDK, JDK, Java overview. Jimmy's got a bad case of the gradles.

3/3/18: Password protecting subdirectories through .htaccess and cPanel.

3/2/18, ii: Updating Chase.html gallery. Removed direct link to img source.

3/2/18: Tweaking intermediary gallery. Display "initial" is not your css's initial.

3/1/18: If you don't terminate a comment at the end of a script your js will FAIL! Fie upon your syntax highlighting for making you think you could get away with that applesauce!


2/28/18: Working on intermediary frame for pictures to display additional info before link to full size image.

2/26/18: Same-origin policy, scheme/host/port tuples, CORS, iframes.

2/25/18: Still occasionally getting loading error for previews on main page. Implemented one-time reload with a hash.

2/24/18: Twilio, Python, Heroku, SendGrid, Donocorp acquires first TFN. Meta descriptions. First appearance of Donocorp in the canon.

2/23/18: Fixing horizontal scrollbar on small screen width, thank you overflow-x, overflow-y. Will-change for sidebar smoothies.

2/20/18: Adjusting footer image, prep for About page.

2/18/18: "Back to top" link, setting up email. Iohes appears in Google search!


2/14/18: Logo design.

2/13/18: Considering the viability of an svg/js tracker, margin adjustments. Using a callback in DD graph instead of two parallel funcitons. Firing a blank js function will prevent the following js function from running.

2/12/18: Switching to a sidenav that doesn't push content, eliminating the 50px mini sidebar. Using a callback in DPD js instead of two parallel functions.

2/11/18: Web dev tools, consoles, debuggers. Smaller image sizes under x screen width. Removing borders from main page sections. Nth-child, nth-of-type selectors to create "lite" version of main page. Hiding elements on all pages under x screen width for any content that isn't meaningful when small.

2/10/18, ii: Learning about: Loading messages, SSL certificates. Cleaning up hr and SubmitDD js. CDN fallback/jquery fallback. Taking out body onload()s. Updating to jquery 3.3.1. Removing redundant jquery.

2/10/18: Favicons! Cleaning up directories. Removing body:before to fix loading on mobile. Real resized thumbnails for faster image loading.

2/9/18: Live! (nameservers, robots.txt, index.html, cpanel, .htaccess, title, looking into js inconsistencies)

2/8/18: Formatting DD entries, standardizing date format. Switching from visibility:hidden to display:none to fix formatting. Switching from lt() selector to gt() for main page to select intended elements. lt() and gt() didn't solve counting issue, moving td class to tr, updating DDForm js. Adding links back to jewelry and sketch pages. Adding additional classes to images for easier scripting.

2/7/18: Changing background color on .load using .css, updating js for DD form. Alt. sidenav format that doesn't push content; this doesn't work well with the 2-stage navbar in place. First use of .toLowerCase to match case for variables. Using tr:first, td:lt(6) instead of tr:first, tr:last in main page table loader fixes issue of graph counting the loaded dictionary entry as part of the graph.

2/6/18: Letting the div determine the width of canvas graphs to fix scaling issues, cleaning up margins, using css to hide table columns when screen width is smaller. Body onresize is a slow function. Once page is long enough for a scrollbar, width of page is shifted the width of the scrollbar, deemed nonissue. For now using html overflow-y: scroll to keep scrollbar always visible.

2/5/18: Getting out of div hell, switching grid from fixed to auto-fill.

2/4/18: Return of the chasing hammer icon, prepping for mobile.

2/3/18, ii: Removing noise from main page, clarifying naviation. Adding a bottom navbar link, but not, because it adds length to the page.

2/3/18: Using placeholders to diagnose .load issue, nesting .attr inside of .load function to fix inconsistent image loading, preparing formatting for content.

2/2/18: Lining up main page JS, more CSS classes and ids, DPD graph updates are now automated instead of hard-coded.

2/1/18: Parsing HTML, a billion answers to loading an img src from another page.


1/31/18: .attr, inserting src instead of loading the entire image.

1/30/18: CSS grid.

1/29/18: Re-examining Sketches.html CSS to line up better (moving from a flow to a tabular format).

1/28/18, ii: Converting dates to ISO 8601 format, Math(), js functions for returning the date, difference between today's date and most recent update.

1/28/18: Inserting most recent update into the main page, tr:first, tr:last., coping with inconsistent date documentation.

1/27/18, ii: Formatting main page, canvas padding, DD cleanup + reordering. .load() is depricated, replacing with .ready for one script.

1/27/18: thead, tbody, DD search formatting. If you have your css defined twice in the stylesheet your singular efforts will be WASTED. Using .getscript() to load js after $(function()).

1/26/18: .load(), .hide(), pulling graphs into iohes.html, DD is now searchable.

1/25/18: $(document).ready(function) is $(function), linting redundancies, subaxes, dblclick(), but also not to prevent intersection of click() and doubleclick().

1/24/18: Filter:grayscale, JS manipulations of pseudo-elements, figuring out what is between head and body, bar graph. Who is AJAX?

1/23/18: Canvas, graphing, svg, JSON. If the script is in the head, and the section elements are in the body, then they don't exist when the script runs.

1/22/18: Alphabet counter for DD, JS arrays.

1/21/18: Inserting HTML through JS, learnin' about security holes. /*comment syntax in CSS is different than html >:|*/

1/20/18: Cleaning, site background, jewelry mascot, less code on each page = more pages of code. DpD counter.

1/18/18: Added separate page for jewelry, sidebar spacing, cleaning up Sketches.html.

1/17/18: More cleanup, looking at options for main page. The devil told me to add sound, and I said no. (Also removed the dotted border around links.)

1/16/18: Replacing chunky js blocks with external scripts external .css, @import, Sublime keyboard shortucts.

1/15/18: ID ≠ Id. Animation pause when sidebar is open.

1/14/18: JS animations, pause, additional access points to sidenav.

1/13/18: Atom: high 5 down low too slow. Back to Sublime.

1/12/18: Update: FF57 has shape-outside turned off by default. Spirits crushed. Text re-rectangulated.

1/12/18: Shape-outside, shape-image-threshold, floats!

1/11/18: Quartering pages, typewriter effect.

1/10/18: Main page updates!

1/7/18: Updates, looking back upon the code of a madman.


(whole month): Little progress. Snow, rum.


11/25/17: Taking a look at GSAP.

11/23/17: Coordinate systems.

11/22/17: SVG.

11/21/17: More clip paths! Inkscape!

11/19/17: AHK, formatting dates for lists.

11/18/17: Clip paths!

11/13/17: Slideshows.

11/11/17: Standardizing subpages.

11/10/17: Clickable backgrounds.

11/7/17: Color schema.

11/6/17: Small aesthetic adjustments.

11/4/17: Making "terrible use of Javascript" (i.e. performing sorting tasks on the front end).

11/3/17: Hiding unused elements.

11/2/17: Color schemes and JS scope fixes.

11/1/17: Color schemes.


10/31/17: Cycling image galleries, .appendChild(), predictable directory structure to solve without a server-side solution.

10/30/17: Amounts of .getElementById.

10/29/17: Did you know double borders have to be at least 3px or they render as a single border?

10/28/17: Forms!

10/27/17: Thinking about depth perception, displaying 2d photos of a 3d object in a layered environment.

10/26/17: Flex setup for images to replace tumblr format.

10/25/17: Cleaning up headers, breaks.

10/24/17: Dictionary can count nouns, verbs and adjectives. Go verbs!

10/23/17: WAMP, every Visual C++ library ever, phpMyAdmin, PHP loaders, [...]

10/22/17: If you try to call two Javascript functions simultaneously and the first one doesn't exist, it will call neither of them!

10/21/17: Caliper!

10/20/17: Jquery for window size, margin:auto doesn't transition.

10/19/17: Did you know? ID selectors are case-sensitive. __ /\ \__ ___ __ __ \ \ ,_\ /' _ `\ /'__`\ /'__`\ \ \ \/ /\ \/\ \/\ __//\ \L\.\_\ \ \_ \ \_\ \_\ \____\ \__/.\_\\ \__\ \/_/\/_/\/____/\/__/\/_/ \/__/

10/18/17: Using the sidenav to cover content when open

10/17/17: Tables, styling, sorting.

10/16/17: Sublime, Sublime packages, flex boxes, style sheets.

10/15/17: Inline elements obey neither man nor code

10/14/17: Javascript counter, and the website can count to 2 <tremble>

10/13/17: Linting unusued resources, white-space for the sidenav.

10/12/17: Icons, resizing, reorganizing.

10/11/17: Icons, vertical-text.

10/10/17: Icons, blinky.

10/9/17: Icons, line quality.

10/8/17: Icons, not building features no one is asking for.

10/7/17: Javascript, sidebars, breaking everything.

10/6/17: ♩ More containers than A.P. Møller-Maersk, nothing in English rhymes with -Maersk ♫

10/5/17: No I wil NOT optimize this experience for mobile, college auditorium projector and eigenharp. If you are viewing this in anything other than 1024x768 click HERE (and find yourself one of them fancy websites).

10/4/17: I was going to make a classy website but I have RETHOUGHT MY STRATEGY

10/3/17: Thank you overflow: hidden, you are the PROPERTY OF THE WEEK

10/2/17: Quick Synfig detour for .gif'ing. If this grilled cheese rotates at less than 60fps the whole site gets rehosted on Tripod.

10/1/17: Quick animation detour before we head back to reality.


9/30/27: Purchased hosting. Purchased hosting again after going through the limitations of Weebly's content editor. Pouring out a <cold> one for signup fees >:|

9/29/17: All previews now done in-browser. Free as in bird = Finer sidebar?

9/28/17: "Containers" to split background content from foreground, disappearing placeholder text. Yes Satan I can make the text rotate but how do I get the baby to DANCE?

9/27/17: Divs, z-./, image filters, did I crash Atom? Old men tell a tale...

9/26/17: First hover animation. Crashed Atom. HTML Preview ≠ my friend :|

9/25/17: First animated element. Crashed Atom. HTML Preview ≠ Ferrari 308.

9/24/17: Changelog created. Crashed Atom. Free as in beer = Fear bee risen.

9/23/17: Registered domain. Installed Atom. The wise man looked through the eye of the Froot Loop, and gave us syntax highlighting.