普通视图

Received before yesterday

An Adapter Adapter

2026年3月23日 23:43

Over the weekend, one of the amazing student Technologists, Link did a clean and reorganizing of the resin 3D printer station. The printer gives off some nasty fumes, so she was able to procure an air purifier set up just for such printers. Unfortunately, the model available doesn’t directly connect with our Prusa SL1S. Link put the air filter in place, but had to resort to duct tape to get it ti connect to the resin printer. It didn’t work.

So when I came in this morning and saw the need for an adapter to the adapter, I knew what I was going to do today!

I spent some time thinking about the best options. An insert with magnets? But how does the original adapter stay put on the new adapter?

Well, there are screw holes, how about using them? Yep, that’s the ticket. Basically replicate the bottom of the original adapter so it can screw to the new, then add a whole bunch of magnets!

Alt text

And it worked on the first try! I had to double up the magnets in order to make it strong enough to stay on, and the gasket printed in TPU could be a little bit thicker. But it was a great success!

Alt text

The models are available on Printables.com for download and 3D printing.

Gear Train Assemble!

2026年3月19日 19:01

seven versions of the holder so far

On the heels of the knowledge gained from the last post figuring out the gear train numbers, I set out to model the gears and a holder.

And immediately I was confronted with an issue with my calculations.

The Problem

At the end of all my learning and calculating, I decided:

It looks like 36mm (servo) —> 12mm|36mm —> 12mm (pinion) 
has smaller gears and gives good enough range.

One thing I forgot to consider is the length of the servo horn that is used to connect the servo to the gear. I could do without it, but trying to design and print such a small toothed hole has issues. I have seen others try and filament 3D printing does not provide fine enough detail to mesh well with the servo gear. So using the supplied horn attachment makes things much easier.

The problem, is that the horn is about 22mm in length. If my gear is only 36mm in diameter, then the horn would stick out into the gear’s teeth!

Gear is too small!

Another sidetrack bump I had to overcome was the getting the dimensions of the servo horn. The dimensions I could fine online were unsatisfactory. So I measured one myself!

SG90 servo horn

And went ahead and 3D modeled it and put the 3D model and diagram files up on printables.com for anyone to use.

With all of that info, I can then recalculate the gear train dimensions so it fits with the servo horn.

The Correct Gear Train

I played around with different settings, but it seemed the best option (that being the smallest size for the servo and large combo gears) called for a 46mm servo gear → 20mm 46mm combo gear → 20mm pinion.
Servo motor → 46
              ↓
             20 (same shaft as) 46
                                ↓
                               20 (pinion)

Sidetracked Again!

The first day of modeling, I decided to jump the Fusion 360 train and try onshape.com. It’s a web based 3D modeling and CAD tool. It has been around since 2015, and is gaining ad time lately in many of the YouTube.com videos I see, so I thought I’d give it a try. I was prepared for some learning curves and to spend some time learning a new system, but two things got me to throw in the towel after a full day of working with it; 1) I couldn’t figure out how to do something pretty simple that would take 2 minutes in Fusion 360, 2) I didn’t care for the interface; it felt too unprofessional. If TinkerCad.com is the elementary school version of CAD, it looked like Onshape.com was the 9th grade version. I did love that it was browser based. And making double helical gears was a breeze! There’s a handy built in menu for all kinds of gears. Fusion 360 on the other hand is big L in gear making. You have to import 3rd-party scripts and I can’t get any of the fancy gear scripts to work.

Like many things, it was the fact that I could get things done much faster with the tool I already knew, and I was accustomed to the interface that led me back to Fusion 360.

Making the Gear Train

I had previous attempts at designing the gear train, but I decided to start from scratch since Fusion 360 doesn’t have an easy way to just change the size of gears when using the gear script plugin thing.

Servo Gear

So, first I designed the servo gear. Pretty easy to create a 46 tooth gear with the gear script plugin thing.

servo gear with inset for servo horn

I designed a cut out, or inset, for the servo horn to fit inside. This is the easiest way to attach the gear to the servo. 3D printing these gears with filament would not have enough resolution to print the fine teeth needed to interface with the tiny default gear on the servo shaft. Much easier to use the included horn.

Combo Gear

The combo gear was pretty easy, too. Just make another 46 Tooth gear, then make a 20 Tooth gear and stack them on top of each other.

combo gear

I set the diameter of the hole through the gear at 4.2mm. That’s big enough for a M4 bolt to go through, with just enough tolerance to allow the gear to spin but not wobble.

Pinion Gear

Another very simple gear to model. There’s nothing special about this, just a 20 tooth gear with a 4.2mm diameter hole.

pinion gear

Rack

The rack is pretty straight forward. I created a 20 tooth gear, then used one of those teeth to copy down the length of the rack.

pinion gear

pinion gear

Gear Holder

This was a little bit tricker. The gears were all prototyped in one go. The first print was great. This part took 7 tries so far.

seven versions of the holder so far

I started by creating a new Assembly in Fusion. Then adding in the gears and aligning them as needed. I went with a stacked approach so as to keep the footprint as small as possible. I had previously modeled the servo motor, so I was able to add that in as well.

It was tricky to get the servo aligned with the servo gear, and then get each of the gears aligned with the ones the mesh with. In realized that if a part has the sketch turned on, then that shows up in the Assembly file. I used that to create a construction line on the servo gear and put a point where the center of the combo gear should be aligned to. Then I did the same on the combo gear to align the pinion. Then adding the holder, servo motor, and rack.

assembly, color coded

It was a lot of back and forth between the designs for the parts and the assembly to align everything correctly. But in the end I think it lines up well.

Spacers

After the first version, I realized that the gears needed spacers to keep them in place. The holder is wider than the gears. So modeling and printing a couple of spacers is pretty easy.

spacer

Somewhat Working

I connected everything up, bolted in the gears, and plugged it in. And it works… mostly.

As the video shows, the gears work, somewhat. There is a bit of jittering, which may be due to the code just rotating the gears back and forth. A more normal behavior would be moving from one angle to the next and stopping there. The servo is also not moving at a full 180°. More like 100°. This is only about 111mm of travel, not the 150mm we’re hoping for. It might be time to consider better quality servos. Perhaps some that move 270°.

It is also a pain to swap the servo motor. Perhaps a redesign is in order.


Missed the first two posts?

Funding provided through a generous grant from UVA Arts Council. Alt text

DAC-DHC Fellowship 2026-2027 CFP

2026年3月12日 12:00

The Digital Humanities Center, in partnership with the Data Analytics Center, is excited to share our Call for Proposals for the 2026–2027 academic year.

Applications are due May 15, 2026.

Project teams should consist of one faculty and one graduate student as collaborators on humanities research in the University of Virginia. We welcome proposals that explore experimental humanities research through the use of high-performance computing resources. We encourage projects that challenge traditional understanding of digital humanities (or even what has been considered humanities research), involve ethical and philosophical issues raised by new technologies, or explore new opportunities for using high-performance computing tools and techniques to better understand the human record.

Find out more on our Fellowship Page!

Jump on the Gear Train! - Critical Making 2025-2026 - Part 2

2026年2月27日 20:32

This week I started figuring out the gear train and rack and pinion needed to move the states. I have tried in the past to get AI to do this for me, but the results from ChatGPT and Copilot are all over the place and offer varying results every time I ask. I decided to use AI to learn the math instead of trying to get it to figure it out for me. Instead, I’m learning the math behind the problem to work it out myself.

Be forewarned, there is lots of math!

math?!?

TLDR;

What helped immensely was GearGenerator.com

And a spreadsheet that AI generated to calculate the travel distance of a rack based on the pinion diameter and number of rotations.

With help from GearGenerator.com I created a gear train which starts with a 36mm gear attached to a servo motor that meshes with a 12mm gear which is on the same axle (or combined) with a 36mm gear that then meshes with a 12mm pinion.

Input Value Units / Notes
Servo Gear Diameter 36 mm
Servo Gear Rotations 0.5 rev (revolutions)
     
Combo Gear Small Diameter 12 mm
Combo Gear Small Rotations 1.5 rev
Combo Gear Large Diameter 36 mm
Combo Gear Large Rotations 1.5 rev
     
Pinion Diameter 12 mm
Pinion Rotations 4.5 rev
     
Output Formula Result
Rack Travel per Rotation 37.69911184 mm
Total Rack Travel 169.6460033 mm

But how did I get this this answer?

Well, let me take you on a journey to how I figured this out and understood the problem.

What am I trying to do?

Each state will move up and down based on the data given. Prof. Rich Ross and I want this to be a pretty dramatic difference between the lowest and highest states, so we decided on 150mm of movement. After much deliberation and looking at various options, Yashu and I decided that a rack and pinion would be the easiest way to accomplish the goal. What is a rack and pinion? It’s simply a gear that moves a bar with gear teeth. It turns a rotational movement into a linear movement. The round gear is the pinion, the bar with teeth is the rack. )

A rack and pinion, a large circular gear moving a long bar with teeth

We figured the servo can rotate the pinion and move the rack attached to the bottom of the state up and down. (See last week’s post with a video of the test case.)

First Gear

The first question we needed to answer was; How far does the rack travel based on the size of the pinion?

The formula to figure this out is

\( T = Dπ \)

T is the rack travel distance, D is the diameter of the pinion, π is yummy and 3.14159265359…

It’s basic middle school geometry. The travel distance is just the circumference of the gear.

But our servo motor only goes 180-degrees, or half a rotation, or half the circumference. So we’ll have to keep that into consideration.

\( T = {Dπ \over 2} \)

The smallest size gear we want to use is probably 12mm. I just pulled that number out of the air (but actually, we’ll use it because I already know it works within all the parameters and constraints for the project 😁 ).

A pinion gear with a diameter of 12mm will cause a rack to travel \( T = 12π = 37.699mm \) But since our servo can only do a half rotation, the rack travel length is \( T = {12π \over 2} = 18.85mm \). I want the rack to travel at least 150mm. So a 12mm gear is not going to work.

In order to get the rack to travel 150mm from a single gear, we can calculate that

\( T = {Dπ \over 2} \)

\( {2T \over π} = D \)

\( {2(150) \over π} = 95.493mm \)

We would need a 95.5mm diameter pinion!

The footprint of the smallest state is about 45mm square. So everything has to fit within that area. So the largest a gear can be is about 40mm. We’ll need a different way to do this.

One option is to use multiple gears. We can use multiple small gears to create the same effect as one large gear. How does that work?

Second Gear

Well, if we just have two gears and one is smaller than the other, then if we turn the small gear one full rotation, the bigger gear will turn less than one full rotation. If the bigger gear is twice the size of the smaller gear, then for every 2 turns of the small gear, the big gear will turn once.

The blue, smaller gear is the one moving, or driving the larger gear

small turning large

The opposite is true, too. If the big gear rotates one full revolution, the small gear revolves twice.

large gear turning a small gear

Large turning small

The ratio between the sizes of the gears is called the gear ratio. The gear ratio is derived from the diameter of the gear doing the revolving divided by the diameter of the gear connected to the moving gear. We can call these the driving gear (the one attached to a servo or some other source that generated the movement) and the driven gear. So we get the formula:

Ratio (R) = Diameter (D) of driven gear (n) / Diameter (D) of driving gear (g)

\( R = {Dn \over Dg} \)

If the ratio is greater than 1, then the output is a slower turning gear, a reduction in speed.

If the ratio is smaller than 1, then the output is a faster turning gear, an amplification of speed.

Start with a smaller wheel, the bigger wheel turns slower. Start with a bigger wheel, the smaller wheel turns faster.

We also write the ratio like this R = Dn:Dg

OK. Next, how do we figure out the gear ratios for the gear train, and how many do we need?

Let’s take two gears, one is 36mm in diameter and the other is 12mm.

If the 12mm gear is the driving gear (it is connected to the servo), then the ratio is \( R = {36 \over 12} = {3 \over 1} \) or 3:1. The ratio is greater than 1, so the output is a slower turning gear.

One way to look at it is to read the ratio from left to right. A bigger number is faster than a smaller number. R = 3:1. 3 to 1. This is a decrease. From speed 3 to speed 1. Slower.

But if the driving gear is 36mm, then the ratio is \( R = {12 \over 36} = {1 \over 3} \) or 1:3, the output is a faster turning gear.

Read from left to right. 1 to 3, is an increase. From speed 1 to speed 3. Faster.

If we stick with a 12mm pinion, how many times does it need to revolve in order move a rack 150mm?

The circumference of a 12mm pinion is

\( C = Dπ \)

\( C = 12π = 37.699mm \)

so

\( {150mm \over 37.699mm} = 3.9789 \) revolutions

A 12mm pinion needs to rotate about 4 times in order to move a rack 150mm.

So if we have a second gear turning the 12mm pinion, how big does it need to be. Recall that the servo gear will only be able to rotate half of a rotation. The gear ratio, then, needs to be 0.5:4. Half a rotation to 4.

\( {12 \over x} = {0.5 \over 4} \)

Doing some cross multiply,

\( 12(4) = 0.5x \)

\( {48 \over 0.5} = x \)

and we get that x = 96. Whelp. Back to a 96mm gear. This is because the servo gear only rotates halfway.

Third Gear

So, I ask myself, “Self, if you know the pinion size and how many rotations it needs to complete, how do you calculate the other gears in the train if you don’t know exactly what sizes and how many are needed?”

I replied, “You know, that’s something that I don’t know.”

Well, I asked Copilot, too. (Copilot took into account previous conversations where I told it the gear ratio was 0.5:4 and an earlier example using 36mm and 12mm gears. And it uses gear Teeth instead of Diameter, but these are the same thing.):

Copilot said:

Great question —- this is the heart of gear‑train design. When you know:

  • the pinion diameter (or teeth)
  • the pinion rotations required

…but you don’t yet know:

  • how many gears
  • what sizes
  • or which ratios

…you can still design the entire gear train systematically using a step‑by‑step math process. Below is the cleanest and most universal method mechanical engineers use.

✅ Step 1 — Convert rack travel to pinion rotations (if needed)

If you already know the pinion must turn N rotations, skip this. If you only know the travel distance:

\( Pinion Rotations = {Rack Travel \over πD} \)

✅ Step 2 — Determine the required gear‑train ratio

This is the most important step. You need to know:

  • How many rotations the motor (input) produces

vs.

  • How many rotations the pinion (output) must make

\( R_{total} = { \text{Pinion RPM or Rotations} \over \text{Motor RPM or Rotations}} \)

Example:

  • Servo rotates 0.5 turns
  • Pinion must rotate 4.5 turns

\( R_{total} = {4.5 \over 0.5} = 9 \)

So the gear train must create a 9× speed increase (or 1:9 reduction, depending on convention).

✅ Step 3 — Factor the total ratio into small ratios

Gear trains are built by splitting a large ratio into smaller multiply‑able pieces. For example, if your target is:

\( R_{total} = 9 \)

Then possible factorizations are:

  • 3 × 3
  • 1.5 × 6
  • 1.5 × 1.5 × 4
  • 2 × 4.5
  • 1.2 × 1.25 × 3 × 2
  • (36→12) × (36→12) ← your earlier example

You can pick any combination of small ratios that multiplies to your total.

✅ Step 4 — Assign tooth counts to each ratio

Each stage ratio is:

\( R = {T_{driven} \over T_{driver}} \)

For example, suppose you choose two stages:

\( R_{1} = 3 \), \( R_{2} = 3 \)

You now choose tooth counts that satisfy each:

Stage 1: ratio = 3

Examples:

  • 12 driving 36
  • 10 driving 30
  • 16 driving 48

Stage 2: ratio = 3

Same options.

A compound gear (two gears on one shaft) lets you chain them:

(motor) 36
        | (ratio of 3)
        ↓
       [12 same shaft as 36]
                          | (ratio of 3)
                          ↓
                (pinion) 12

Ratios multiply:

\( 3×3=9 \)

✅ Step 5 — Check physical constraints

When selecting gear sizes, check:

  • Gear diameters fit in available space
  • Teeth counts match a common module or DP
  • Shaft spacing is feasible
  • 3D printing tolerances allow proper meshing
  • Required torque is acceptable
  • Compound gears are not too small or too fragile

If something doesn’t fit, adjust tooth counts but keep ratio the same.

✅ Step 6 — Iterate until a valid mechanical layout exists

This is normal: you will often try 3–6 combinations until the gear spacing, shafts, and reductions all work.

🧮 A Worked Example (General Method)

Suppose:

  • You want 5 pinion rotations
  • Input shaft makes 1 rotation
  • Total ratio required:

\( R_{total} = 5 \)

Factor it:

  • 5 = 5
  • 5 = 2.5 × 2
  • 5 = 1.25 × 4
  • 5 = 1.666 × 3

Pick: 2.5 × 2

Assign tooth counts:

  • Stage 1: 12 → 30 (ratio = \(30 \over 12 \) = 30:12 = 2.5)
  • Stage 2: 15 → 30 (ratio = \(30 \over 15 \) = 30:15 = 2.0)

Total:

\( 2.5 × 2 = 5 \)

Build it as a compound:

(input shaft) 30T
              ↓
              12T -- same shaft -- 15T
                                    ↓
                          (pinion) 30T

Pinion rotates 5× per 1 input rotation.

🎯 The Key Insight

You don’t need to know the gear sizes up front. You only need to know the total ratio, and then you can:

  1. Factor the ratio into small ratios
  2. Assign teeth counts that match each small ratio
  3. Assemble them into a compound gear train
  4. Adjust until it fits mechanically

This process is how all engineered gearboxes are designed.

Fourth Gear

OK. That’s cool. Now to ask Copilot to figure it all out for me.

“Copilot, walk me through each step of how to calculate a gear train to drive a pinion 4 rotation with a servo motor generating 0.5 rotations and the largest a gear can be is 40mm, and using the smallest number of gears possible, and the gears should be easily 3D printed.”

Copilot said:

Reasoning completed in 3 steps

Absolutely-—let’s design a compact gear train that makes a pinion turn 4 rotations when your servo only turns 0.5 rotations, with the constraint that no gear may exceed 40 mm diameter, using the fewest gears possible and keeping everything easy to 3D print.

🎯 What we need (in plain math)

  • Input (servo): 0.5 rotations
  • Output (pinion): 4 rotations
  • Required speed increase:

\( S_{total} = {\text{pinion rotations} \over \text{servo rotations} = {4 \over 0.5} = 8 \)

So the gear train must provide an 8× speed increase (equivalently, a 1:8 reduction in the “driven/driver” convention).

  • Constraint: largest gear ≤ 40 mm diameter.
  • Goal: Fewest gears (i.e., 2 stages / 4 gears total with one compound shaft).

✅ We’ll target a two‑stage compound gear train (4 gears total). If we can’t meet printability constraints, I’ll give a 3‑stage fallback.

🔧 Design conventions (for easy 3D printing)

  • Use equal gear module (e.g., module m = 1 mm/tooth) so:

\( \text{Pitch diameter (mm)} ≈ m × \text{tooth count} \)

With m=1, a 40‑tooth gear ≈ 40 mm diameter—- perfect for your 40 mm limit.

  • Common printable tooth counts (no special profile shift): 12, 15, 16, 18, 20, 24, 30, 36, 40.
  • Pressure angle: 20° (typical for printable involute gears).
  • Try to avoid very small tooth counts (<12) to reduce undercut and fragility.

🧮 Step‑by‑step method

Step 1 — Decompose the total ratio into stage ratios

We need:

\( S_{total} = S_{1} × S_{2} = 8 \)

We’ll look for two reasonable stage increases (each <4×) that multiply to 8.

A convenient split is 3.333… × 2.4 ≈ 8.

Step 2 — Map stage ratios to tooth (or diameter) ratios

Speed increase for a stage (driver → driven) is:

\( S = {D_{driver} \over D_{driven}} = {T_{driver} \over T_{driven}} \)

(Assuming same module.)

So we want (example picks):

  • Stage 1 \( S_{1} ≈ 3.333 \): 40T → 12T (\( 40 \over 12 \) = 3.333…)
  • Stage 2 \( S_{2} = 2.4 \): 36T → 15T (\( 36 \over 15 \) = 2.4)

Total:

\( S_{total} = {40 \over 12} × {36 \over 15} = {10 \over 3} × {12 \over 5} = {120 \over 15} = 8 \)

Bingo.

Step 3 — Lay out the gear train (compound shaft)

[(A)40T Servo]  
    |
  meshes                        Stage 1 (40→12)                      
    ↓ 
[(B)12T same shaft as (C)36T]  
                        |
                      meshes    Stage 2 (36→15)
                        ↓
                 [(D)15T Pinion]
  • (A) is connected to the servo motor.
  • (B) and (C) are rigidly fixed on the same shaft (compound).
  • The pinion is gear (D) = 15T in this design.

Step 4 — Verify motion requirement

Servo turns 0.5 rev → pinion turns:

\( 0.5 × 8 = 4\text{rev} \)

Meets the spec. ✅

Step 5 — Verify size constraints (≤40 mm)

With m = 1 mm/tooth:

  • 40T → ~40 mm
  • 36T → ~36 mm
  • 15T → ~15 mm
  • 12T → ~12 mm

All ≤ 40 mm. ✅

Step 6 — Check printability & robustness

  • Smallest gear is 12T—printable in PLA/PETG with 20° PA; 15T pinion is sturdier and meshes well.
  • Keep face width ~6–10 mm for strength (depends on load).
  • Add 0.1–0.2 mm backlash target (or scale tooth thickness down ~1–2%) to compensate for printer tolerances.
  • Use fillets at hub/arm junctions; ensure set‑screw hub or D‑shaft interface.

✅ Minimal‑gear solution (recommended)

Two stages / four gears (one compound shaft):

  • Stage 1: 40T → 12T (3.333× speed increase)
  • Stage 2: 36T → 15T (2.4× speed increase)
  • Total: 3.333 × 2.4 =
  • Result: Servo 0.5 rev → Pinion 4 rev

This uses just 4 gears and fits the 40 mm cap.

Nice! If we have a 15mm pinion rotating 4 times, that moves the rack

\( T = π × D × 4 \)

\( T = π × 15 × 4 = 188.5mm \)

I plugged these calculations into a spreadsheet (rack_travel_calculator.xlsx) to help me play around with the gear sizes. I wanted something smaller than 40mm.

It looks like 36mm (servo) —> 12mm|36mm —> 12mm (pinion) has smaller gears and gives good enough range.

That’s a 3 × 3 = 9 total ratio. Better than the 8 needed.

12mm pinion rotating 4 times moves a rack

\( T = π × D × 4 \)

\( T = π × 12 × 4 = 150.796mm \)

That’s just perfect, but in a gear train, the pinion actually rotates 4.5 times, so the rack will move 169.646mm. Even more perfect!

gif of gear train at this ratio

Gear train

OK. Now with the math and numbers all figured out, and the some additional tips from Copilot about layout, it’s time to start modeling a gear train!

🧰 Practical layout tips

  • Center distance between meshing gears:

\( c = {m \over 2}(T_{1} + T_{2} ) \)

With m=1, 40T–12T center distance = (1/2)(52) = 26 mm;

36T–15T center distance = (1/2)(51) = 25.5 mm.

  • Maintain parallel shafts and allow axial shimming (washers) to tune backlash.
  • If you’re driving a rack, ensure the final gear module matches the rack’s module (e.g., both m=1).
  • For SG90 servos, print large driver gears with a robust hub and insert brass heat‑set inserts for screws if possible.

Phew! That was a lot! Next week, 3D model the gear train!

Funding provided through a generous grant from UVA Arts Council. Alt text

Read Part 1 - The Beginning

Critical Making Fellowship 2025-2026: Part 1

2026年2月20日 20:54

Introduction

Beginning in 2023, the Makerspace has funded a graduate student, usually in the humanities, to design and complete a physical project that represents or comes from their humanities research. Named the Critical Making Fellowship, the previous projects were Alexa Luborsky’s “Diaspora Poem” (2023), and Holly Zhou’s “Memory Maps” (2024 & 2025). This years Fellowship began as a collaboration with Statistics Professor Rich Ross and Makerspace Manager Ammon Shepherd. Generously funded by an UVA Arts Council Grant, the 2026 project was able to hire Yashu Tang for the Fall 2025 semester to get the process started. Below is the write up of the project and contributions from Yashu.

Project Overview

This project aims to visualize electoral voting patterns in previous presidential elections using an interactive data-sculpture. Each state is represented with a cluster of hexagonal cells equal to the number of electoral votes allocated to the state.

"2012 US Electoral map"

The state-block will have two actions in response to input data:

  1. light up blue or red depending on the party of the winning candidate and
  2. raise or lower itself proportional to the margin of victory.

The data on state-level electoral votes is from UCSB’s American Presidential Project website.

Data

The data has already been scraped from UCSB’s website and contains data on the 1924-2024 elections. They are stored in the election data folder on the shared drive, with a separate .csv file for each election year. Files are named with the convention Election_####, e.g. Election_1968. Years with atypical electoral votes have been noted in the data description document, which can also be found in the election data folder.

The data columns are as follows:

State: State where the data was collected

Total: total votes tallied for the state

Popular_D: Number of popular votes won by the Democratic candidate

Prop_D: Proportion of total votes received by the Democratic candidate

EV_D: Number of electoral votes won by the Democratic candidate

Popular_R: Number of popular votes won by the Republican candidate

Prop_R: Proportion of total votes received by the Republican candidate

EV_R: Number of electoral votes won by the Republican candidate

  • If a 3rd party candidate won electoral votes, the votes will be recorded with similar conventions as above, with “_3rd” as the suffix.

EV_Outcome: Column with electoral vote outcomes. Data is stored with integer values of electoral votes, followed by the party they were cast for, separated by spaces. E.g. 3 D 0 R 0 I, where 3 votes were cast for the Democratic candidate, and 0 for the Republican and Independent/3rd party candidate.

Margin: Margin of victory, calculated using

MOV = (Raw margin of victory) / (Total votes in state)

where the raw margin of victory is the difference in popular votes between the first and second place candidates in the state.

Hardware

The state-blocks will be 3D printed by Ammon at the Makerspace and mounted on a similar 3D printed rack-and-pinion mechanism to achieve the raising and lowering.

The vertical movement will be powered by 180-degree rotation Servo motors. They were chosen because their degree of rotation can be specified in code. This allows for an easy transition from the MOV value in the data into Servo motor directions. The Servo motors will be connected to the Adafruit 16-channel PWM bonnet, and a brief tutorial on connecting and using the bonnet can be found here. For this project, the bonnets will use the 3x4 right angle male headers, so the Servo motors can all interface to the pi.

The light-up portion of the project will be completed with the 5050Neopixels, whose product specifications can be found here. A pdf of the specs will also be in the shared drive. The pin configuration can be found on page 5 of the pdf. When connecting the Neopixel to the bonnets, the signal pin should connect to pin 2 (DIN), the power pin should connect to pin 3 (VDD), and the ground should connect to pin 1 (GND).

  • It should be possible to chain multiple Neopixels by chaining pin 4 (DOUT) to pin 2 (DIN) on another Neopixel, but I haven’t had a chance to test it.

Software

There is some Python code for powering the Servos simultaneously. This is on the Raspberry Pi and should be stored in the “Code” folder. The packages used for powering the Servos and Neopixels must be used in a virtual environment. On Thonny, you can go to “Run”, then “Select interpreter”, then choose the venv that is in the “Code” folder. Not much has been done for the software portion of this project.

February 2026 update

Further consideration about the project led us to expand the vision of the project. Instead of being tied to electoral data, the map will be able to use any two data points to compare states. The LEDs will not be exclusively red or blue, but RGB LEDs will be used to allow a range of colors.

As of February 2026, the hardware side of things has improved a bit. California was chosen for the test case as it is the largest with the most electoral votes. This would test the capability of the inexpensive 180 servo motors to move the 3D printed states.

Originally, it was hoped to use the output of data from the R statistical program to generate the 3D models for printing. The resulting hexagons from this workflow were inconsistent.

Map showing inconsistent hexagon and height

An additional issue, was that the generated file created a map with states at varying heights. We are going to account for this in the hardware by moving the states up and down, so they all need to be the same height.

Modeling each state by hand in Fusion 360 is the solution.

Model of California

Fusion 360 was also used to model the servo holder and a rack and pinion gear set to move the state vertically.

Model of the rack and pinion gear

To test the set up, two pieces of plywood were cut to house the gears and the state. Temporary supports were 3D printed to hold the two pieces of plywood together.

A test case using California can be seen in the video below.

Funding provided through a generous grant from UVA Arts Council. Alt text

Read Part 2 - Jump on the Gear Train

Interesting digital humanities data sources

2025年8月26日 12:00

I bookmark sources of data that seem interesting for digital humanities teaching and research:

  • showing humanists what data & datafication in their fields can look like
  • having interesting examples when teaching data-using tools
  • trying out new data tools

I’m focusing on sharing bookmarks with data that’s already in spreadsheet or similar structured format, rather than e.g.

  • collections of digitized paper media also counting as data and worth exploring, like Josh Begley’s racebox.org, which links to full PDFs of US Census surveys re:race and ethnicity over the years; or
  • 3D data, like my colleague Will Rourk’s on historic architecture and artifacts, including a local Rosenwald School and at-risk former dwellings of enslaved people

Don’t forget to cite datasets you use (e.g. build on, are influenced by, etc.)!

And if you’re looking for community, the Journal of Open Humanities Data is celebrating its 10th anniversary with a free, global virtual event on 9/26 including “lightning talks, thematic dialogues, and community discussions on the future of open humanities data”.

Data is being destroyed

U.S. fascists have destroyed or put barriers around a significant amount of public data in just the last 8 months. Check out Laura Guertin’s “Data, Interrupted” quilt blog post, then the free DIY Web Archiving zine by me, Quinn Dombrowski, Tessa Walsh, Anna Kijas, and Ilya Kreymer for a novice-friendly guide to helping preserve the pieces of the Web you care about (and why you should do it rather than assuming someone else will). The Data Rescue project is a collaborative project meant “to serve as a clearinghouse for data rescue-related efforts and data access points for public US governmental data that are currently at risk. We want to know what is happening in the community so that we can coordinate focus. Efforts include: data gathering, data curation and cleaning, data cataloging, and providing sustained access and distribution of data assets.”

Interesting datasets

The Database of African American and Predominantly White American Literature Anthologies

By Amy Earhart

“Created to test how we categorize identities represented in generalist literature anthologies in a database and to analyze the canon of both areas of literary study. The dataset creation informs the monograph Digital Literary Redlining: African American Anthologies, Digital Humanities, and the Canon (Earhart 2025). It is a highly curated small data project that includes 267 individual anthology volumes, 107 editions, 319 editors, 2,844 unique individual authors, and 22,392 individual entries, and allows the user to track the shifting inclusion and exclusion of authors over more than a hundred-year period. Focusing on author inclusion, the data includes gender and race designations of authors and editors.”

National UFO Reporting Center: “Tier 1” sighting reports

Via Ronda Grizzle, who uses this dataset when teaching Scholars’ Lab graduate Praxis Fellows how to shape research questions matching available data, and how to understand datasets as subjective and choice-based. I know UFOs sounds like a funny topic, and it can be, but there are also lots of interesting inroads like the language people use reflecting hopes, fears, imagination, otherness, certainty. A good teaching dataset given there aren’t overly many fields per report, and those include mappable, timeline-able, narrative text, and a very subjective interesting one (a taxonomy of UFO shapes). nuforc.org/subndx/?id=highlights

The Pudding

Well researched, contextualized, beautifully designed data storytelling on fun or meaningful questions, with an emphasis on cultural data and how to tell stories with data (including personally motivated ones, something that I think is both inspiring for students and great to have examples of how to do critically). pudding.cool

…and its Ham4Corpus use

Shirley Wu for The Pudding’s interactive visualization of every line in Hamilton uses my ham4corpus dataset (and data from other sources), which might be a useful example of how an afternoon’s work with open-access data (Wikipedia, lyrics) and some simple scripted data cleaning and formatting can produce foundations for research and visualization.

Responsible Datasets in Context

Dirs. Sylvia Fernandez, Miriam Posner, Anna Preus, Amardeep Singh, & Melanie Walsh

“Understanding the social and historical context of data is essential for all responsible data work. We host datasets that are paired with rich documentation, data essays, and teaching resources, all of which draw on context and humanities perspectives and methods. We provide models for responsible data curation, documentation, story-telling, and analysis.” 4 rich dataset options (as of August 2025) each including a data essay, ability to explore the data on the site, programming and discussion exercises for investigating and understanding the data. Datasets: US National park visit data, gender violence at the border, early 20th-century ~1k poems from African American periodicals, top 500 “greatest” novels according to OCLC records on novels most held by libraries. responsible-datasets-in-context.com

Post45 Data Collective

Eds Melanie Walsh, Alexander Manshel, J.D. Porter

“A peer-reviewed, open-access repository for literary and cultural data from 1945 to the present”, offering 11 datasets (as of August 2025) useful in investigations such as how book popularity & literary canons get manufactured. Includes datasets on “The Canon of Asian American Literature”, “International Bestsellers”, “Time Horizons of Futuristic Fiction”, and “The Index of Major Literary Prizes in the US”. The project ‘provides an open-access home for humanities data, peer reviews data so scholars can gain institutional recognition, and DOIs so this work can be cited’: data.post45.org/our-data.html

CBP and ICE databases

Via Miriam Posner: A spreadsheet containing all publicly available information about CBP and ICE databases, from the American Immigration Council americanimmigrationcouncil.org/content-understanding-immigration-enforcement-databases

Data assignment in The Critical Fan Toolkit

By Cara Marta Messina

Messina’s project (which prioritizes ethical critical studies of fan works and fandom) includes this model teaching assignment on gathering and analyzing fandom data, and understanding the politics of what is represented by this data. Includes links to 2 data sources, as well as Destination Toast’s “How do I find/gather data about the ships in my fandom on AO3?”.

(Re:fan studies, note that there is/was an Archive of Our Own dataset—but it was created in a manner seen as invasive and unethical by AO3 writers and readers. Good to read about and discuss with students, but I do not recommend using it as a data source for those reasons.)

Fashion Calendar data

By Fashion Institute of Technology

Fashion Calendar was “an independent, weekly periodical that served as the official scheduling clearinghouse for the American fashion industry” 1941 to 2014; 1972-2008’s Fashion International and 1947-1951’s Home Furnishings are also included in the dataset. Allows manipulation on the site (including graping and mapping) as well as download as JSON. fashioncalendar.fitnyc.edu/page/data

Black Studies Dataverse

With datasets by Kenton Ramsby et al.

Found via Kaylen Dwyer. “The Black Studies Dataverse contains various quantitative and qualitative datasets related to the study of African American life and history that can be used in Digital Humanities research and teaching. Black studies is a systematic way of studying black people in the world – such as their history, culture, sociology, and religion. Users can access the information to perform analyses of various subjects ranging from literature, black migration patterns, and rap music. In addition, these .csv datasets can also be transformed into interactive infographics that tell stories about various topics in Black Studies. “ dataverse.tdl.org/dataverse/uta-blackstudies

Netflix Movies & Shows

kaggle.com/datasets/shivamb/netflix-shows

Billboard Hot 100 Number Ones Database

By Chris Dalla Riva

Via Alex Selby-Boothroyd: Gsheet by Chris Dalla Riva with 100+ data fields for every US Billboard Hot 100 Number One song since August 4th, 1958.

Internet Broadway Database

Found via Heather Froehlich: “provides data, publishes charts and structured tables of weekly attendance and ticket revenue, additionally available for individual shows”. ibdb.com

Structured Wikipedia Dataset

Wikimedia released this dataset sourced from their “Snapshot API which delivers bulk database dumps, aka snapshots, of Wikimedia projects—in this case, Wikipedia in English and French languages”. “Contains all articles of the English and French language editions of Wikipedia, pre-parsed and outputted as structured JSON files using a consistent schema compressed as zip” huggingface.co/datasets/wikimedia/structured-wikipedia. Do note there has been controversy in the past around Hugging Face scraping material for AI/dataset use without author permission, and differing understandings of how work published in various ways on the web is owned. (I might have a less passive description of this if I went and reminded myself what happened, but I’m not going to do that right now.)

CORGIS: The Collection of Really Great, Interesting, Situated Datasets project

By Austin Cory Bart, Dennis Kafura, Clifford A. Shaffer, Javier Tibau, Luke Gusukuma, Eli Tilevich

Visualizer and exportable datasets of a lot of interesting datasets on all kinds of topics.

FiveThirtyEight’s data

I’m not a fan for various reasons, but their data underlying various political, sports, and other stats-related articles might still be useful: [data.fivethirtyeight.com(https://data.fivethirtyeight.com/) Or look at how and what they collect, include in their data and what subjective choices and biases those reveal :)

Zine Bakery zines

I maintain a database of info on hundreds of zines related to social justice, culture, and/or tech topics for my ZineBakery.com project—with over 60 metadata fields (slightly fewer for the public view) capturing descriptive and evaluative details about each zine. Use the … icon then “export as CSV” to use the dataset (I haven’t tried this yet, so let me know if you encounter issues).

OpenAlex

I don’t know much about this yet, but it looked cool and is from a non-profit that builds tools to help with the journal racket (Unsub for understanding “big deals” values and alternatvies, Unpaywall for OA article finding). “We index over 250M scholarly works from 250k sources, with extra coverage of humanities, non-English languages, and the Global South. We link these works to 90M disambiguated authors and 100k institutions, as well as enriching them with topic information, SDGs, citation counts, and much more. Export all your search results for free. For more flexibility use our API or even download the whole dataset. It’s all CC0-licensed so you can share and reuse it as you like!” openalex.org

Bonus data tools, tutorials

Matt Lincoln’s salty: “When teaching students how to clean data, it helps to have data that isn’t too clean already. salty offers functions for “salting” clean data with problems often found in datasets in the wild, such as pseudo-OCR errors, inconsistent capitalization and spelling, invalid dates, unpredictable punctuation in numeric fields, missing values or empty strings”.

The Data-Sitters Club for smart, accessible, fun tutorials and essays on computational text analysis for digital humanities.

Claudia Berger’s blog post on designing a data physicalization—a data quilt!—as well as the final quilt and free research zine exploring the data, its physicalization process, and its provocations.

The Pudding’s resources for learning & doing data journalism and research

See also The Critical Fan Toolkit by Cara Marta Messina (discussed in datasets section above), which offers both tools and links to interesting datasets.

Letterpress data, not publicly available yet…

I maintain a database of the letterpress type, graphic blocks/cuts, presses, supplies, and books related to book arts owned by me or by Scholars’ Lab. I have a very-in-progress website version I’m slowly building, without easily downloadable data, just a table view of some of the fields.

I also have a slice of this viewable online and not as downloadable data: just a gallery of the queerer letterpress graphic blocks I’ve collected or created. But I could get more online if anyone was interested in teaching or otherwise working with it?

I also am nearly done developing a database of the former VA Center for the Book: Book Arts Program’s enormous collection of type, which includes top-down photos of each case of type. I’m hoping to add more photos of example prints that use each type, too. If this is of interest to your teaching or research, let me know, as external interest might motivate me to get to the point of publishing sooner.

Designing a Data Physicalization: A love letter to dot grid paper

2025年2月11日 13:00

Claudia Berger is our Virtual Artist-in-Residence 2024-2025; register for their April 15th virtual talk and a local viewing of their data quilt in the Scholars’ Lab Common Room!

This year I am the Scholars’ Lab’s Virtual Artist-in-Residence, and I’m working on a data quilt about the Appalachian Trail. I spent most of last semester doing the background research for the quilt and this semester I get to actually start working on the quilt itself! Was this the best division of the project, maybe not. But it is what I could do, and I am doing everything I can to get my quilt to the Lab by the event in April. I do work best with a deadline, so let’s see how it goes. I will be documenting the major steps in this project here on the blog.

Data or Design first?

This is often my biggest question, where do I even start? I can’t start the design until I know what data I have. But I also don’t know how much data I need until I do the design. It is really easy to get trapped in this stage, which may be why I didn’t start actively working on this part of the project until January. It can be daunting.

N.B. For some making projects this may not apply because the project might be about a particular dataset or a particular design. I started with a question though, and needed to figure out both.

However, like many things in life, it is a false binary. You don’t have to fully get one settled before tackling the other, go figure. I came up with a design concept, a quilt made up of nine equally sized blocks in a 3x3 grid. Then I just needed to find enough data to go into nine visualizations. I made a list of the major themes I was drawn to in my research and went about finding some data that could fall into these categories.

A hand-written list about a box divided into nine squares, with the following text: AT Block Ideas: demographics, % land by state, Emma Gatewood, # miles, press coverage, harassment, Shenandoh, displacements, visit data, Tribal/Indig data, # of tribes, rights movements, plants on trail, black thru-hikers
What my initial planning looks like.

But what about the narrative?

So I got some data. It wasn’t necessarily nine datasets for each of the quilt blocks but it was enough to get started. I figured I could get started on the design and then see how much more I needed, especially since some of my themes were hard to quantify in data. But as I started thinking about the layout of the quilt itself I realized I didn’t know how I wanted people to “read” the quilt.

Would it be left to right and top down like how we read text (in English)?

A box divided into 9 squares numbered from left to write and top to bottom:  
1, 2, 3  
4, 5, 6  
7, 8, 9

Or in a more boustrophedon style, like how a river flows in a continuous line?

A box divided into 9 squares numbered from left to write and top to bottom: 1, 2, 3; 6, 5, 4; 7, 8, 9

Or should I make it so it can be read in any order and so the narrative makes sense with all of its surrounding blocks? But that would make it hard to have a companion zine that was similarly free-flowing.

So instead, I started to think more about quilts and ways narrative could lend itself to some traditional layouts. I played with the idea of making a large log cabin quilt. Log cabin patterns create a sort of spiral, they are built starting with the center with pieces added to the outside. This is a pattern I’ve used in knitting and sewing before, but not in data physicalizations.

A log cabin quilt plan, where each additional piece builds off of the previous one.
A template for making a log cabin quilt block by Nido Quilters

What I liked most about this idea is it has a set starting point in the center, and as the blocks continue around the spiral they get larger. Narratively this let me start with a simpler “seed” of the topic and keep expanding to more nuanced visualizations that needed more space to be fully realized. The narrative gets to build in a more natural way.

A plan for log cabin quilt. The center is labeled 1, the next piece (2) is below it, 3 is to the right of it, 4 is on the top, and 5 is on the side. Each piece is double the size of the previous one (except 2, which is the same size as 1).

So while I had spent time fretting about starting with either data/the design of the visualizations, what I really needed to think through first was what is the story I am trying to tell? And how can I make the affordances of quilt design work with my narrative goals?

I make data physicalizations because it prioritizes narrative and interpretation more than the “truth” of the data, and I had lost that as I got bogged down in the details. For me, narrative is first. And I use the data and the design to support the narrative.

Time to sketch it out

This is my absolute favorite part of the whole process. I get to play with dot grid paper and all my markers, what’s not to love? Granted, I am a stationery addict at heart. So I really do look for any excuse to use all of the fun materials I have. But this is the step where I feel like I get to “play” the most. While I love sewing, once I get there I already have the design pretty settled. I am mostly following my own instructions. This is where I get to make decisions and be creative with how I approach the visualizations.

(I really find dot grid paper to be the best material to use at this stage. It gives you a structure to work with that ensures things are even, but it isn’t as dominating on a page as a full grid paper. Of course, this is just my opinion, and I love nothing more than doodling geometric patterns on dot grid paper. But using it really helps me translate dimensions to fabric and I can do my “measuring” here. For this project I am envisioning a 3 square foot quilt. The inner block. Block 1, is 12 x 12 inches, so each grid represents 3 inches.)

There is no one set way with how to approach this, this is just a documentation of how I like to do it. If this doesn’t resonate with how you like to think about your projects that is fine! Do it your own way. But I design the way I write, which is to say extremely linearly. I am not someone who can write by jumping around a document. I like to know the flow so I start in the beginning and work my way to the end.

Ultimately, for quilt design, my process looks like this:

  1. Pick the block I am working on
  2. Pick which of the data I have gathered is a good fit for the topic
  3. Think about what is the most interesting part of the data, if I could only say one thing what would that be?
  4. Are there any quilting techniques that would lend itself to the nature of the data or the topic? For example: applique, English Paper Piecing, half square triangles, or traditional quilt block designs, etc.
  5. Once I have the primary point designed, are there other parts of the data that work well narratively? And is there a design way to layer it?

For example, this block on the demographics of people who complete thru-hikes of the trail using annual surveys since 2016. (Since they didn’t do the survey 2020 - and it was the center of the grid - I made that one an average of all of the reported years using a different color to differentiate it.)

I used the idea of the nine-patch block as my starting point, although I adapted it to be a base grid of 16 (4x4) patches to better fit with the dimensions of the visualization. I used the nine-patch idea to show the percentage of the gender (white being men and green being all other answers - such as women, nonbinary, etc). If it was a 50-50 split, 8 of the patches in each grid should be white, but that is never the case. I liked using the grid because it is easy to count the patches in each one, and by trying to make symmetrical or repetitive designs it is more obvious where it isn’t balanced.

A box divided into 9 squares, with each square having its one green and white checkered pattern using the dot grid of the paper as a guide. The center square is brown and white. On top of each square is a series of horizontal or vertical lines ranging from four to nine lines.

But I also wanted to include the data on the reported race of thru-hikers. The challenge here is that it is a completely different scale. While the gender split on average is 60-40, the average percentage of non-white hikers is 6.26%. In order to not confuse the two, I decided to use a different technique to display the data, relying on stitching instead of fabric. I felt this let me use two different scales at the same time, that are related but different. I could still play with the grid to make it easy to count, and used one full line of stitching to represent 1%. Then I could easily round the data to the nearest .25% using the grid as a guide. So the more lines in each section, the more non-white thru-hikers there were.

My last step, once I have completed a draft of the design, is to ask myself, “is this too chart-y?” It is really hard sometimes to avoid the temptation to essentially make a bar chart in fabric, so I like to challenge myself to see if there is a way I can move away from more traditional chart styles. Now, one of my blocks is essentially a bar chart, but since it was the only one and it really successfully highlighted the point I was making I decided to keep it.

A collection of designs using the log cabin layout made with a collection of muted highlighters. There are some pencil annotations next to the sketchesThese are not the final colors that I will be using. They will probably all be changed once I dye the fabric and know what I am working with.

Next steps

Now, the design isn’t final. Choosing colors is a big part of the look of the quilt, so my next step is dyeing my fabric! I am hoping to have a blogpost about the process of dyeing raw silk with plant-based dyes by the end of February. (I need deadlines, this will force me to get that done…) Once I have all of those colors I can return to the design and decide which colors will go where. More on that later. In the meantime let me know if you have any questions about this process! Happy to do a follow-up post as needed.

A #mincomp method for data display: CSV to pretty webpage

2025年1月15日 13:00

(Note: Brandon is going to blog about related work! Will link here once that’s live.)

This is a post to tell yall about a neat little web development thing that’s allowed me to easily make (and keep updated!) nifty things displaying kinds of data related to both professional development (easy CV webpage and printable format generation!) and bibliography/book arts (an online type speciment book, based on an easily-updatable Gsheet backend!). If you aren’t interested in the code, do just skim to see the photos showing the neat webpage things this can make.

Screenshot of a type specimen webpage created with Jekyll and a CSV of data
Figure 1: Screenshot of a type specimen webpage created with Jekyll and a CSV of data.

Screenshot of a CV webpage created with Jekyll and a CSV of data
Figure 2: Screenshot of a CV webpage created with Jekyll and a CSV of data.

Jekyll (skip this section if you know what Jekyll is)

Jekyll is a tool for making websites that sit in a middle ground between using a complex tool like WordPress or Drupal (a content management system, aka CMS) or completely coding each page of your website in HTML by hand, and I think easier to create and manage than either extreme. It’s set up to follow principles of “minimal computing” (aka #mincomp), which is a movement toward making technical things more manageably scoped with an emphasis on accessibility for various meanings of that. For example, using website development tools that keep the size of your website files small lets folks with slow internet still access your site.

If you want to know more about Jekyll, I’ve written peer-reviewed pieces on the what, why, and how to learn to make your own Jekyll-generated DH websites—suitable for folks with no previous web development experience!—as well as (with co-author Brandon Walsh) how to turn that into a collaborative research blog with a review workflow (like how ScholarsLab.org manages its blog posts). Basically, Jekyll requires some webpage handcoding, but:

  • takes care of automating bits that you want to use across your website so you don’t have to paste/code them on every page (e.g. you header menu)
  • lets you reuse and display pieces of text (e.g. blog posts, events info, projects) easily across the website (like how ScholarsLab.org has interlinked blog posts, author info, people bio pages, and project pages linking out to people and blog posts involved with that project)

DATA PLOP TIME

The cool Jekyll thing I’ve been enjoying recently is that you can easily make webpages doing things with info from a spreadsheet. I am vaguely aware that may not sound riveting to some people, so let me give you examples of specific uses:

  • I manage my CV info in a spreadsheet (a Gsheet, so I have browser access anywhere), with a row per CV item (e.g. invited talk, published article)
  • I also keep a record of the letterpress type and cuts (letterpress illustrations) owned by SLab and by me in a Gsheet

I periodically export these Gsheets as a CSV file, and plop the CSV file into a /_data folder in a Jekyll site I’ve created. Then, I’ve coded webpages to pull from those spreadsheets and display that info.

Screenshot of my letterpress specimen Gsheet
Figure 3: Screenshot of my letterpress specimen Gsheet

Data Plop Op #1: Online Letterpress Type Specimen Book

You don’t need to understand the code in the screenshot below; just skim it, and then I’ll explain:

Screenshot of some of the code pulling my letterpress Gsheet data into my Jekyll webpage
Figure 4: Screenshot of some of the code pulling my letterpress Gsheet data into my Jekyll webpage

I include this screenshot to show what’s involved to code a webpage that displays data from a CSV. What this shows is how I’m able to call a particular spreadsheet column’s data by just typing “”, rather than pasting in the actual contents of the spreadsheet! LOTS of time saved, and when I edit the spreadsheet to add more rows of data, I just need to re-export the CSV and the website automatically updates to include those edits. For example, in the above screenshot, my CSV has a column that records whether a set of letterpress type is “type high” or not (type high = .918”, the standard height that lets you letterpress print more easily with different typefaces in one printing, or use presses that are set to a fixed height). In the code, I just place “” where I want it in the webpage; you can see I’ve styled it to be part of a bullet list (using the “<li>” tag that creates lists).

In the screenshot, I also use some basic logic to display different emoji, depending on what’s in one of the CSV columns. My “uppercase” column says whether a set of letterpress type includes uppercase letters or not. My code pulls that column (“”) and checks whether a given row (i.e. set of letterpress type or cut) says Uppercase = yes or no; then displays an emoji checkmark instead of “yes”, and emoji red X instead of “no”.

Here’s how one CSV line displayed by my specimen book webpage looks (I haven’t finished styling it, so it doesn’t look shiny and isn’t yet live on my very drafty book arts website):

Screenshot of a webpage displaying letterpress Gsheet data in a nicely designed grid of boxes

And I was also able to code a table version, pulling from the same data:

Screenshot of a webpage displaying letterpress Gsheet data in a nicely designed table format

If the code discussion is confusing, the main takeaway is that this method lets you

  1. manage data that’s easier to manage in a spreadsheet, in a spreadsheet instead of coded in a webpage file; and
  2. easily display stuff from that spreadsheet, without needing to make a copy of the data that could become disjoint from the spreadsheet if you forget to update both exactly the same.

Data Plop Op #2: Keeping your CV updated

I used to manage my CV/resume as Google Docs, but that quickly turned into a dozen GDocs all with different info from different ways I’d edited what I included for different CV-needing opportunities. When I had a new piece of scholarship to add, it wasn’t clear which GDoc to add it to, or how to make sure CV items I’d dropped from one CV (e.g. because it needed to focus on teaching experience, so I’d dropped some less-applicable coding experiences from it) didn’t get forgotten when I made a CV that should include them.

UGH.

A happy solution: I have 1 CV Gsheet, with each row representing a “CV line”/something I’ve done:

Screenshot of a Gsheet containing CV data

I periodically export that CSV and plop it into a Jekyll site folder. Now, I can do 2 cool things: the first is the same as the letterpress specimen book, just styling and displaying Gsheet data on the web. This lets me have both webpages showing a full version of my CV, and a short version of my CV, and theoretically other pages (e.g. code a page to display a CV that only includes xyz categories):

Screenshot of a webpage displaying a CV

And! I’ve also coded a printable CV. This uses a separate CSS stylesheet that fits how I want a printed CV to look different from a website, e.g. don’t break up a CV line item between two pages, don’t include the website menu/logo/footer. Same text as above, styled for printing:

Screenshot of a webpage displaying a CV, with styling that looks like it would print to make a nice-looking printed CV

When I need a whittled down CV that fits a page limit, or that just shows my experience in one area and not others I’m skilled in, I can just make a CSV deleting the unneeded lines—my spreadsheet ahs category and subcategory columns making it easy to sort these, and also to tag lines that could appear in different sections depending on CV use (e.g. sometimes a DH project goes under a peer-reviewed publication section, or sometimes it goes under a coding section as I want my publication section to only include longform writing). But I add new lines always to the same core Gsheet, so I don’t get confused about what I’ve remembered to record for future CV inclusion where.

I currently don’t have this CV website online—I just run it locally when I need to generate a printable CV. But I’ll be adding it to my professional site once I have a bit more time to finish polishing the styling!

In conclusion

Jekyll + CSV files =

Screenshot of a letterpress cut consisting of a repeating row of 5 images; the image that repeats is a hand giving a thumbs-up next to the text "way to go!"

(One of the letterpress cuts recorded by my specimen book Gsheet/webpage, as discussed above!)

ISAM 2024 Conference Report

2024年12月17日 18:07

Each year educators, students, and staff of university makerspaces gather to share research, ideas and projects at the International Symposium on Academic Makerspaces conference. This was the first year since it’s founding in 2016 that the conference was held internationally, at Sheffield University in England. It was, perhaps, the international appeal that convinced several SLab Makerspace Technologists to submit a paper or project to the conference. Unsurprisingly (because these students are amazing) all of the papers and project were accepted for the conference.

It was a great conference, a fun trip, and we all did great on our presentations. The most unfortunate thing was that Link Fu came down with COVID two days before the trip and was too sick to travel with us. Resourceful as always, she recorded her part of the presentation and we were able to play that during our session.

by J.Phan and J. Truong

Recommending Makerspace Best Practices Based On Visualization of Student Use Data

by Holly Zhou and Ammon E. Shepherd

Typewriter Poetics: Creating Collaborative Memory Maps

by Qiming (Link) Fu and Ammon E. Shepherd

Mutualism between Interdisciplinary Student Organizations and Makerspaces: The Nutella Effect

Limited Letterpress Synonym Finder

2024年12月15日 13:00

I coded a quick web app for a particular book arts need: Limited Letterpress Synonym Finder. If you too also only have 1xA-Z letterpress type on hand (ie just the 26 characters of the alphabet, 1 sort per letter) and what to figure out what you can print without needing to carefully position (register) your paper and do multiple pressings between moving the letters around, you can enter words here to see only those synonyms you’re able to print (i.e. only synonyms using no more than 1 of each A-Z letter).

Screenshot of the Limited Letterpress Synonym Finder webpage linked in the post, which says "Limited Letterpress Synonym Finder. For when you only have 1 x A-Z type on hand. Finds synonyms for the word you input, removes any that use any letter more than once, then displays the rest. (Only works with single-word inputs, not phrases.)" There is a field to enter words, with the word "glow" entered in this example screenshot, followed by a "Find that subset of synonyms" button. There is a list of matching non-multiple-same-letter synonyms for "glow" shown, containing the words burn, beam, shine, gleam, and lambency. Below is a retro internet logo image:  on a black background, the text "Limited Letterpress: Synonym Finder" is in a glowing green neon Old English font.

Reframing AI with the Digital Humanities

2024年12月5日 13:00

A version of this piece will be an open-access chapter in a volume by invited speakers at the 10/23/2024 “Reimagining AI for Environmental Justice and Creativity” conference, co-organized by Jess Reia, MC Forelle, and Yingchong Wang and co-sponsored by UVA’s Digital Technology for Democracy Lab, Environmental Institute, and School of Data Science. I had more to say, but this was what I managed inside the word limit!

I direct the Scholars’ Lab, a digital humanities (DH) center that’s led and collaborated on University of Virginia ethical, creative experimentation at the intersections of humanities, culture, and tech since 2006. A common definition of DH encompasses both using digital methods (such as coding and mapping) to explore humanities research questions (such as concerns of history, culture, and art); and asking humanities-fueled questions about technology (such as ethical design review of tools like specific instances of AI). I always add a third core feature of DH: a set of socially just values and community practices around labor, credit, design, collaboration, inclusion, and scholarly communication, inseparable from best-practice DH.

I write this piece as someone with expertise in applicable DH subareas—research programming, digital scholarly design, and the ethical review of digital tools and interfaces—but not as someone with particular experience related to ML, LLMs, or other “AI” knowledges (at the levels that matter, e.g. code-review level, CS-journal-reading). A field of new and rapidly evolving tools means true expertise in the capabilities and design of AI is rare; often we are either talking about secondhand experiences of these tools (e.g. “Microsoft Co-Pilot let me xyz”) or about AI as a shorthand for desired computing capabilities, unfounded on familiarity with current research papers or understanding of codebases. (A values-neutral claim: science fiction authors without technical skillsets have helped us imagine, and later create.)

Convergence on the term “data science” has both inspired new kinds of work, and elided contributions of the significantly overlapping field of library and information studies. Similarly, “AI” as the shorthand for the last few years’ significant steps forward in ML (and LLMs in particular) obscures the work of the digital humanities and related critical digital research and design fields such as Science and Technology Studies (STS). When we use the term “AI”, it’s tempting to frame our conversations as around a Wholly New Thing, focusing on longer-term technical aspirations uninhibited by practical considerations of direct audience needs, community impacts, resources. While that’s not necessarily a bad way to fuel technological creativity, it’s too often the only way popular conversations around AI proceed. In one research blog post exploring the moral and emotional dimensions of technological design, L.M. Sacasas lists 41 questions we can ask when designing technologies, from “What sort of person will the use of this technology make of me?” to “Can I be held responsible for the actions which this technology empowers? Would I feel better if I couldn’t?” We don’t need to reinvent digital design ethics for AI—we’ve already got the approaches we need (though those can always be improved).

When we frame “AI” as code, as a set of work discrete but continuous with a long history of programming and its packagings (codebase, repo, library, plugin…), it’s easier to remember we have years of experience designing and analyzing the ethics and societal impacts of code—so much so that I’ve started assuming people who say “LLM” or “ML” rather than “AI” when starting conversations are more likely to be conversant with the specifics of current AI tech at the code level and CS-journal-reading level, as well as its ethical implications. The terms we use for our work and scholarly conversations are strategic: matching the language of current funding opportunities, job ads. We’ve seen similar technologically-vague popularizing on terms with past convergences of tech interest too, including MOOCs, “big data”, and the move from “humanities computing” to the more mainstreamed “digital humanities”.

Digital humanities centers like our Scholars’ Lab offer decades of careful, critical work evaluating existing tools, contributing to open-source libraries, and coding and designing technology in-house—all founded on humanities skills related to history, ethics, narrative, and more strengths necessary to generative critique and design of beneficial tech. Some of the more interesting LLM-fueled DH work I’ve seen in the past couple years has involved an AI first- or second-pass at a task, followed by verification by humans—for situations where the verification step is neither more onerous nor more error-prone than a human-only workflow. For example:

  • the Marshall Project had humans pull out interesting text from policies banning books in state prisons, used AI to generate useful summaries of these, then had humans check those summaries for accuracy
  • Scholars Ryan Cordell and Sarah Bull tested Chat GPT’s utility in classifying genres of historical newspaper and literary text from dirty OCR and without training data, and in OCR cleanup, with promising results
  • My Scholars’ Lab colleague Shane Lin has been exploring AI applications for OCRing text not well-supported by current tools, such as writing in right-to-left scripts
  • Archaeologists restoring the HMS Victory applied an AI-based algorithm to match very high-resolution, high-detailed images stored in different locations to areas of a 3D model of the ship Alongside any exploration of potential good outcomes, we need to also attend to whether potential gains in our understanding of the cultural record, or how we communicate injustice and build juster futures, are worth the intertwined human and climate costs of this or other tech.

One of DH’s strengths has been its focus on shared methods and tools across disciplines, regardless of differences in content and disciplinary priorities, with practitioners regularly attending interdisciplinary conferences (especially unusual within the humanities) and discussing overlapping applications of tools across research fields. DH experts also prioritize non-content-agnostic conversations, prompted by the frequency with which we borrow and build on tools created for non-academic uses. For example, past Scholars’ Lab DH Fellow Ethan Reed found utility in adapting a sentiment analysis tool from outside his field to exploring the emotions in Black Arts Poetry works, but also spent a significant portion of his research writing critiquing the biased results based on the different language of sentiment in the tool’s Rotten Tomatoes training dataset. (ML training sets are an easy locus for black boxing biases, context, and creator and laborer credit—similar to known issues with text digitization work, as explored by Aliza Elkin’s troublingly gorgeous, free Hand Job zine series capturing Google Books scans that accidentally caught the often non-white, female or non-gender-conforming hands of the hidden people doing the digitizing.)

We already know where to focus to produce more beneficial, less harmful, creative digital tools: social justice. At the Reimagining AI roundtable, my table’s consensus was that issues of power and bias are key not just to reducing ML harms, but to imagining and harnessing positive potential. Key areas of concern included climate terrorism (e.g. reducing the energy costs of data centers), racism (e.g. disproportionate negative impacts on BIPoC compounding existing economic, labor, and police violence threats), human rights (e.g. provision of a universal basic income easing concerns about areas ML may beneficially offset human labor), and intertwined ableist and computing access issues (e.g. AI search-result “slop” is terrible for screen readers, low-bandwidth internet browsing). In our existing scholarly fields and advocacy goals, where are current gaps in terms of abilities, resources, scale, efficiencies, audiences, ethics, and impacts? After identifying those major needs, we’re better positioned to explore how LLMs might do good or ill.

❌