https://md.ekstrandom.net/blog/I Fight for the Users2024-03-28T09:13:25.547Zhttps://github.com/jpmonette/feedMichael Ekstrandmd@ekstrandom.nethttps://md.ekstrandom.netMichael Ekstrand's blog.https://md.ekstrandom.net/favicon.pngCopyright Michael Ekstrand. CC-BY-NC-ND.https://md.ekstrandom.net/blog/2024/03/ecir-impacts2024-03-27T04:00:00.000Z
Photo by
Jordan
McDonald on
Unsplash
There are more intervention strategies in heaven and earth, Horatio,
than are dreamt of in your philosophy.
— Hamlet, sort-of
From my side, this paper grew out of a couple of things:
Resonance between what I am trying to accomplish by working on
information access fairness and what Sole is doing with IR for
understudied and underserved users (also discussed in my IR4U2 keynote).
Frustration with what I perceive as an overemphasis on algorithmic
fixes and metric disparities, when there are a wide range of metrics,
intervention sites, and strategies that we can use to improve social
impacts such as fairness, harm reduction, etc. in information access
systems.
Lex & Henriette joined us to broaden the argument to deal with an
expansive notion of “impacts” of IR systems, including discrimination,
misrepresentation, utility, accessibility, etc., and argue that effective IR impact work has
four key characteristics:
It is grounded in
specific impact goals.
It contextualizes
those impacts and goals in the broad landscape of the ways an IR system
can affect its consumers.
It flows from creative and
expansive thinking about the range of possible methods
and intervention sites for addressing that impact.
It matches the impact
to a strategy that is appropriate given technical and organizational
constraints and the specific ethical, legal, economic, and other
dimensions of the impact concern.
We also provide three “maps” of impact goals, candidate
operationalizations, and intervention sites & strategies to support
such work. There is a wide range of possible intervention sites and
corresponding strategies for adjusting IR system impact, some of which
are not widely-discussed. One in particular is the engineering
process: if we have a robust mediation analysis that identifies
the causes of an impact or impact disparity, that can be used
to inform process planning. For example, if users of a particular group
are receiving lower-quality service, and it seems to be because the
system is less effective at handling certain types of queries that they
use more often, then the team could prioritize efforts on improving the
system’s handling of those queries over other improvements that will
primarily benefit users who already receive good results.
Read the paper for more details,
and check out the talk if you’re at ECIR!
I often get comments, and sometimes questions, about my Zoom and
video lecture setup in my office. In this post, I want to talk a bit
about it, my choice of equipment, and things that can improve the
quality of video recordings, remote teaching, and videoconferences.
Additional, much more expensive investments — like soundproofing room
treatments — can really up the game, but I’m going to leave those out of
scope. There is a lot you can do without remodeling your house.
With few exceptions, I’ve actually used the products I talk about
here, most of them fairly extensively. For a quick TL;DR, here are a few
good choices:
For a reasonably-priced, relatively portable setup, get the Jabra
Evolve 40 headset and use your laptop or phone camera. The Jabra mic
isn’t as good as the Yeti or Shure, but it provides clear audio without
Bluetooth artifacts or picking up the rest of the room.
For a good and moderately-priced upgrade for a stationary office
setup, I recommend the Yeticaster,
the Anker PowerConf
C200 webcam, and a comfortable set of headphones. The Shure
MV5 is also quite good, and is more compact and less expensive than
the Yeti.
Microphones
Audio quality is, in my opinion, the biggest boost to video recording
or conference quality — visuals are good and important, but sound
quality is vital to making sure you are clearly understood. A good
quality microphone setup will do a few useful things:
Clearly capture your voice.
Not capture other sounds in the background.
There are other things you probably want to consider as well, such as
form factor, size and weight, and price; different ones will also fit
different spaces better. I currently use 3 different microphones for my
home office, university office, and on the go. Microphones are also a
place where Wirecutter’s
recommendations are pretty good.
I also recommend a microphone setup that connects to your computer
with USB rather than the microphone jack: this keeps the analog audio
processing circuitry separate from your computer to reduce EM noise
interference with your audio signal. MacBooks have pretty clean audio
processing, but PCs can be a mess in that regard.
For capturing just your voice, either for a recording or a conference
call, you probably want a cardioid
microphone: the microphone’s pickup pattern focuses in front of the mic,
with little response to sound from the sides or rear; this improves
sound isolation (while requiring you to be somewhat careful how you
position the mic). For other contexts, you need other pickup patterns:
for a group of people, for instance, you need an omnidirectional
microphone.
If you watch video podcasts, you probably see 2–3 microphones a lot:
the Blue Yeti, the Shure MV7, and the MV7’s older and larger brother,
the Shure SM7. Both the Yeti and the MV7 are excellent microphones. I
haven’t used the SM7, but assume it is quite good; it is most often used
for vocal recording in studio environments, while it is my understanding
that the MV7 is designed for use in less sonically refined spaces like
offices with poor sound isolation, and from my experience it is very
good in them.
Blue Yeti
I used the Yeti for several years at Boise State, including to record
my data science
lectures. Mine was in the Yeticaster
configuration, with shock mount and boom arm; a boom arm helps you
position the mic closer to your face to make it easier to pick up your
vocals without background noise, and the shock mount reduces the amount
of keyboard clicks, desk jostles, etc. that make it into the sound. I
found both the sound quality and the sound isolation of the Yeti to be
excellent, and it did a very good job of capturing my voice without also
recording our furnace’s attempt to mimic a malfunctioning jet-powered
freight train. The Yeti is also a very flexible microphone, with 4
different pickup patterns: the cardioid is good for recording and
conferencing, while the bidirectional and omnidirectional patterns are
good when you want to record both yourself and a guest with one mic.
I generally recommend the Yeti for people looking to upgrade a
stationary office setup. The combination of sound quality and
flexibility is good for most people (starting to sound like Wirecutter
here, I know…). It’s also relatively reasonably priced (often $100–130
for the mic itself; the Yeticaster setup lists for $199 but I’ve seen it
on sale on Amazon for $130–150). It is important to note that when the
Yeti is in cardioid mode, the front of the mic is the front
side, not the tip. The Blue logo should face you, and you talk
into the side of the microphone.
Whether you should get a desktop stand or a boom stand depends on
your preferences and the constraints of your desk space. I like the boom
stand, both to get the microphone closer to my mouth and to not take up
as much desk space; the boom also swings out of the way when not in use.
It does occlude vision a little, but I got used to that and have no
problem seeing my monitor with the mic in my peripheral vision. Note
that the Yeticaster configuration consists of the Yeti microphone, the
Compass boom arm, and the shock mount, but does not include the
desktop stand that you get if you just buy the Yeti on its own. The Yeti
also has a standard 5/8” threaded base for mounting on other stands.
Shure MV7
As I noted in my tools report, when
setting up at Drexel I decided to change things up and get the Shure
MV7. There were a few reasons for this:
I like Shure microphones in general (there is a reason they are the
standard in a wide range of situations).
The MV7 is lighter and less bulky (and takes less space in my field
of vision on the boom arm).
The online reviews I read indicated the MV7 is exceptional at sound
isolation in untreated rooms like my office (the Yeti was already good
in this regard, but I partly wanted to see what the Shure could
do).
I haven’t regretted this decision at all — the MV7 is an excellent
microphone. It is, however, more expensive (USB version lists for $249),
and the USB controls are also harder to access (on the top of the mic,
tilted away from you, instead of on the front).
I actually bought the MV7X model, which omits the USB interface in
favor of only providing an XLR jack, and connected it to a Focusrite Vocaster
One dedicated USB interface. With this setup, the control ergonomics
on the microphone aren’t an issue because I control volume and hardware
mute from the Vocaster sitting on my desk; this also allows me to
directly connect my headphones to the interface without trying to run
their cable to the back of the microphone, and gives me an easy hardware
volume control for the headphones. The Vocaster is a great piece of kit;
in particular, its auto-gain feature means I don’t have to worry about
levels basically at all. I only have two complaints about the
device:
I can’t control or disable sidetone (the monitoring signal feeding
from the microphone into your headphones to help you regulate your
voice); since I use open-back headphones, I don’t really need sidetone
and would just as soon turn it off, but no dice.
The hardware mute does not synchronize with Zoom’s software mute, so
I have to make sure both mutes are off in order to talk. Some hardware
mute buttons can synchronize, but the drivers aren’t set up to do that
with the Focusrite at this time.
I have an old Mackie Onyx Blackjack interface at home that I’m not
really using, I might take that into the office and see how much I miss
the auto-gain. We’ll see. I’m generally very happy with the MV7X +
Vocaster setup, though; sounds great, doesn’t pick up much background
noise, and auto-gain is my friend. This is a more advanced and expensive
setup, though, so I would generally recommend the Yeti.
I mounted the MV7X on a scissor-style boom arm I found on Amazon. It
uses a standard 1/4” threaded mount (the other standard size for
mounting A/V gear).
Shure MV5
At home, my desk area is not as spacious, and I don’t really have
room for a boom arm (or a large desktop microphone), so based on
Wirecutter’s recommendation I bought the Shure
MV5 at home. It stays out of the way, works pretty well, and the
sound quality is pretty good even with it just sitting on the desk
instead of being positioned more optimally near my mouth. It’s a great
little piece of gear. Its hardware controls do have some ergonomic
difficulties (both mute button and mute indicator are on the back, so I
wouldn’t want to use them as my primary mute controls while on a call;
the headphone level control is also a tiny knob that’s hard to reach,
but I don’t use its headphone output anyway).
The MV5 is also less expensive than the Yeti, so if either space or
funds are at a premium, I second Wirecutter’s recommendation that it’s a
great little mic.
Sound on the Go
All of these microphones are for stationary office setups (well, you
could take the MV5 with you, but I probably wouldn’t). On the go, you
can still get some nice improvements.
When we all went home for COVID and I needed something better than my
Surface’s built-in mic fast, I bought a Jabra
Evolve 40, and continued to use it as my at-home calling headset
after partially returning to the office. The sound quality (either
recording or playback) is definitely not as good as the other equipment
I recommend, but it’s pretty good, and for $100 you get both mic and
headphones in one package that can fit in your laptop bag. It’s a pretty
good deal for a first upgrade or for a secondary on-the-go setup.
I like to travel very light, however, so long-term I wanted
something more compact to toss in my bag for on-the-go calls (and
occasionally teaching from a hotel room). I use the now-discontinued Jabra
Elite 85t for travel and as my primary earphones for my phone; the
call quality is very good for true wireless earbuds, and they sound
great listening to music as well. Unlike most wireless earbuds, they do
not provide a complete seal, allowing some ambient noise through; I find
it difficult to talk with my ears sealed, so this is very helpful for
me. They also have active noise cancellation, a hear-through mode, and
configurable sidetone, so I can dial them in to the sonic landscape I
want for a particular situation. Very happy with them, and recommend
them if you can find a pair; in general, though, Jabra makes pretty good
on-the-go audio setups, so a newer Jabra set that matches your needs is
likely to be pretty good (and the Elite 7 Pro’s bone conduction
microphone capabilities look very interesting).
Cameras
MacBooks, iPhones, and iPads, as well as higher-end Android phones,
all have very good cameras. However, if you are using an external
monitor, or have a PC laptop, you probably want a webcam. A good camera
makes it easier for others on the call or watching the video to see you,
and also provides a better image for background removal (either with
AI-powered virtual backgrounds or traditional chroma-key).
For an effective camera, I like to see a few things:
Full HD (1080p) resolution — even though final video is most often
in smaller windows on Zoom or shrunk down in a lecture video, having
full HD gives me a high-resolution original for video editing, and lets
me use the camera video at full frame for intros/outros and other
contexts where I’m not combining with other visual elements (I render
all my lectures and other recorded videos at full HD resolution).
Clear, crisp image without significant noise or grain in normal
office lighting. Supplementary lighting is useful for a quality boost in
recordings that need to meet a higher quality standard, but I don’t want
to need to shine extra lights at my face for all of my calls and utility
recordings.
Reasonably accurate and vibrant color. This will vary a lot; Apple
does significant image processing to ensure that their products’ camera
images look clear and vibrant. Other cameras often have fuzzier or less
saturated colors, and a cheap off-brand webcam we bought for home use
when name brands were hard to get in 2020 has truly terrible color
reproduction.
I’ve used a few different external webcams in recent years:
I used a Brio as my primary webcam at Boise State from late 2021
onward. To save some startup funds at Drexel, I went with the C920s for
my university office (Wirecutter’s former
pick), and I recently bought the Anker C200, Wirecutter’s budget
pick, for my home office. The C615 (or its predecessor) was the first
webcam I bought at Boise State back in 2016.
Of these, the Brio has the best image quality by far, but at a steep
price. I’m not very happy with the C920s; the image is pretty grainy,
and it isn’t enough better than the less expensive cameras to really
feel worth it. The Logi Capture app that is necessary to change camera
settings, like the focal length, also doesn’t support modern Macs
(there’s a new “Logi Tune” that I haven’t tried yet). For its price
point, I’m very happy with the Anker, and the built-in shutter is pretty
neat (and easier to use than the flip-cover on the C920s).
My recommendation, therefore, is to get the Anker
C200 for a stationary office setup. I don’t have any experience
with the newer, less expensive (MSRP $130) Brio cameras that Wirecutter
recommends; they’re probably good, but it’s a question of whether they
are worth the premium over the Anker. From time to time, I’ve considered
the Razer Kiyo to get the built-in light, but haven’t found it necessary
yet (and external lighting is pretty easy to set up).
On the go, just use your laptop camera, at least if it’s a MacBook.
If you have a low-quality PC camera, there are portable webcams you can
get to clip on a laptop display, but I have no idea how good they are.
It would probably work just as well to put your phone on a tripod and
use that, either by joining the call from the phone or using an app to
use it as a webcam for your laptop (more on that in the next
section).
Secondary Camera
That’s all for the primary webcam for capturing yourself for calls
and lectures in a stationary office setting. A secondary camera can be
quite useful, though:
Document camera for hand-drawn diagrams, notes, etc., if that’s your
style. I like analog media, so if I’m going to draw freehand to support
a lecture or to show something in a meeting, I’d usually rather do it
with a pen and paper under a document camera than with a tablet.
Room or speaker capture for lectures, talks, panels, etc. Sometimes
I do this for class, but if you’re organizing workshops or things like
that it’s useful to be able to do DIY livestreaming, depending on the
facilities the host venue makes available.
For these purposes, if you have a decent smartphone, it’s probably
the best bet. Smartphone cameras are very good these days, especially in
flagship iPhone models. You can use the phone directly to record video
or join a Zoom call; I’ve often done this for recordings or workshop
rooms. It’s also possible to use a phone as a webcam for your main
computer to record or share on a video conference. There are a few ways
to do this (my instructions here are for iPhone; similar thing are
likely possible on Android, but I don’t know the software):
Recent versions of macOS and iOS directly support using your iPhone
as a webcam. This only works if you are signed in to both the computer
and the phone with the same Apple ID; if, like me, you use separate
Apple IDs for work and personal devices, this option isn’t
available.
Reincubate Camo is a very
good application that lets you use your phone as a webcam (works for
both iPhone and Android), connecting over the USB or Lightning cable.
Its pricing is pretty reasonable, and they have educational discounts.
The desktop app provides a dashboard that lets you control which camera
it’s using along with other settings like zoom.
Open Broadcaster Software
provides a lot of camera and scene management capabilities, and can
export its output as a virtual webcam that other applications can pick
up. It’s really oriented towards livestreamers, but I find it useful
when I need more live video composition or extra capture for recording.
I most often use it as just a conduit for my phone camera: the Camera for OBS Studio iPhone app lets you
connect your camera like Reincubate. The OBS desktop experience isn’t as
easy-to-use as Camo, but it works well enough. It’s my current setup for
phone-to-desktop, both for recording and to be a document camera in
class since at least some classrooms in my department don’t have
document cameras.
For mounting, I use the QuadLock system — it’s secure
and durable, and seems less expensive overall than the competing system
from Peak. It’s great for putting my phone on my bike, but also for
video work. In my office, I have the tripod
adapter on a second scissor boom arm for document camera work (it
does need a ball
mount to really work well, but connects to any standard 1/4” tripod
screw). I also carry the tripod
/ selfie stick in my bag for portable recording or streaming.
Lighting
Lighting is crucial to high-quality photography and videography;
above a baseline camera quality threshold (which is sadly not met by a
lot of built-in or budget webcams), better lighting probably improves
quality more than better cameras. There are a lot of usable, inexpensive
lighting options on places like Amazon; LED light panels and ring lights
can help a lot with clear face capture, although the glare and lighting
intensity can be quite distracting if you aren’t used to it. Diffuse,
indirect lighting is good and helps reduce glare, but the equipment is
often more expensive.
Before Camtasia got support for AI-based background removal, I used
chroma-key for my lecture videos, and that depends a lot on good,
uniform lighting on the background. I bought a few cheap 5–7”
USB-powered LED lighting panels, and they got the job done, but weren’t
very good; if I were setting up that kind of lighting again, I would
probably invest in a more expensive panel. I haven’t personally found
ring lights to be very useful, but a lot of people use them.
I don’t have any dedicated lighting right now. If I were engaging in
a significant buildout like our MOOC or my data science video class
again, I would probably invest in lighting, but for Zoom calls and the
odd recorded presentation or lecture, I find my office lights to be
adequate.
Software
For videoconferencing, the software is pretty set: Zoom, Teams,
Google Meet, or whatever your meeting is using.
For video recording and editing, I use Camtasia. Its
user experience is heavily optimized for lecture and demonstration
videos, so while it lacks a lot of the flexibility in terms of effects
and editing that a more general package like Final Cut Pro or Adobe
Premier would offer, it’s much easier to use for academics and has very
good support for screen capture, including slides in videos, annotating
the screen (e.g. putting in callouts to highlight important screen
elements), and basic transitions and effects. I wouldn’t call it the
most polished piece of software, but it gets the job done.
I don’t do a huge amount of editing on most of my videos, but do
clean up significant false starts (and when I detect such a false start
while recording, I’ll usually pause for several seconds and restart at a
clear point like the beginning of the slide to give myself a clear point
to edit in the final production). I usually also do a bit with how the
slides and speaker videos are arranged (often replacing my speaker
background with transparency or another image), and sometimes put in
some intro/outro effects and a title card. TechSmith recently added
virtual background replacement to Camtasia (in 2020, the only way to do
it was with a green screen and chroma-key).
Audiate is a
very useful application that complements Camtasia. Audiate uses
speech-to-text to transcribe your video’s audio. You can then edit the
resulting text to clean up transcription errors (so the transcript can
be used for higher-quality captions), but the really interesting thing
is that you can delete text such as disfluencies and false
starts. When you then export the project back to Camtasia, it includes
an edit list to edit those bits out of the video track as well.
Polishing up video in this way is very time-consuming when you try to do
it directly in the video editor, but Audiate makes it practical, and
lets you do the caption cleanup and video edit in one pass through your
recording. If you want linguistically-clean recordings and don’t have
budget for dedicated captioning and video editing labor, it’s a pretty
good option. I don’t have precise measurements, but it probably takes me
about 1–1.5 minutes of editing time per minute of video to polish a
video with Audiate. The biggest downside to Audiate is its price, and
while many universities have site license to Camtasia and/or SnagIt,
Audiate site licenses are less common; I’m therefore not currently using
it, but would get it again for a significant recording effort that
demands the higher level of polish it affords.
I still want to provide good-quality captions for my videos, though,
so I’m using MacWhisper for
transcription and captioning. Its speech-to-text capabilities are quite
accurate (better than anything else I’ve used, including Audiate), and
its automatic segmenting logic is also very good (Audiate was not great
at that, and also didn’t provide very good manual segmenting controls
when last I used it). My usual captioning workflow is this:
Export the audio track from Camtasia (Export → Audio Only).
Import and transcribe the audio track with MacWhisper.
Export the transcription to SRT-format subtitles.
Import the subtitles back into Camtasia.
Any further edits, or partial exports, also correctly affect the
subtitles after this. If there is some egregiously bad segmenting, I’ll
sometimes tweak up the subtitles using Camtasia’s subtitle editor; while
Camtasia’s editor is extremely tedious for drafting subtitles, it isn’t
bad for light editing of subtitles that are already there.
I edit and export all of my videos at full HD (1920×1080) resolution,
typically to a Local File that I then upload to Panopto, Kaltura,
YouTube, Bunny, or wherever I am publishing the video in question. With
the subtitles in place, Camtasia’s default for a local file export is to
“burn” the subtitles into the video (called open captioning); I
usually turn this off, re-export the subtitles to an SRT or VTT file,
and upload them separately as a caption file to the video hosting
service after uploading the video. This allows the viewer to control
whether captions are displayed or not (closed captioning).
Headphones and Monitors
Ok, all of that is about creating and sharing the video. What viewing
and listening during production, and hearing and seeing the people
you’re calling with?
Most of this is covered by general thinking about what kind of
monitor and headphones or speakers you want. I recommend getting a
relatively good monitor so the color reproduction is decent; this makes
it easier to catch significant color or lighting problems in your video.
I use the 27” 4K ASUS ProArt monitor; this is a professional-grade
color-calibrated monitor. Full color calibration isn’t necessary for
basic educational videos (and I don’t do color-calibrated work), but you
do want pretty good color calibration. Dell UltraSharp monitors are
pretty good, I’ve used those in the past; you mostly want to stay away
from the entry-level monitors (especially things costing $200 or less).
I have never used an Apple Studio Monitor, but don’t think they’re
likely worth the very expensive premium they command — a pro-level ASUS
or Dell monitor is fine, and costs $300–500 instead of $1500 or
whatever.
For audio, I strongly recommend a good pair of headphones. While some
calling software has pretty good software echo cancellation these days,
using headphones while on call means there isn’t echo that the software
needs to try to cancel. If you like listening to music while working, a
good set of headphones will also usually be higher-quality sound than
laptop or cheap desktop speakers.
Selecting headphones is a pretty personalized decision. A few things
to think about in identifying the ones that will work for you:
How do you want them to fit on your ears? Besides
earbuds, the two major designs are circumaural where the
headphone pad goes around your ears, and supra-aural where the
pad goes on your ears. There are also very different supra-aural
designs; small, often circular headphones like the Evolve
rest gently on your ears, mostly towards the center, while larger and
heavier ones press more firmly on the outer parts of your earlobes. Your
particular ear size and geometry will also make a significant difference
on how they fit.
Do you want sound isolation? Curcumaural and large
supra-aural closed-back headphones block out a good deal of
background noise to provide good isolation on the sound that you hear.
They also block out a lot of your own voice, so it can sound weird to
talk while wearing them. It’s also harder to calibrate your vocal volume
since you can’t hear yourself very well (sidetone helps with this).
Open-back headphones do not isolate: the back of the headphone
(away from your ear) is open, usually a plastic or metal mesh, so
ambient sound can come in. Earbuds are also available in both
sound-isolating and non-isolating varieties, depending on whether they
are designed to seal your ear, in addition to having or lacking active
noise cancellation.
What you connect the headphones to also makes a significant
difference. I’ve mentioned “sidetone” a few times; this refers to signal
from the microphone going into your earpiece (in pro-audio terms, it’s
usually called “monitoring”; sidetone is what it’s usually called in
telephony). It’s helpful for regulating your vocal volume, since our
brains rely on auditory feedback for that process. Sidetone or
monitoring is especially important with sound-isolating or
noise-cancelling headphones or earphones, because they block or cancel
your natural voice feedback along with the background noise. Any of the
USB microphones I mentioned above actually have a headphones jack on
them as well, so you can plug in your headphones to get direct
monitoring: microphone signal directly goes to the headphones
without going through the digital processing or your computer, so you
get zero-latency monitoring of your voice. USB audio interfaces for
podcasting or recording, like the Vocaster I use, also provide this
feature. You can configure your computer to do monitoring with the
headphones plugged in to your headphones jack, but this introduces a
small amount of latency (the computer digitally encodes the audio
signal, processes it through its audio stack, and decodes it back into
an audio signal for the headphones); we’re talking about milliseconds at
most, but it’s noticeable.
I personally find it very difficult to talk naturally with
sound-isolating headphones and have had mixed success relying entirely
on sidetone, so I prefer to use circumaural open-back headphones at my
desk and non-sealing earbuds on the go (I do use the earphones’
sidetone, and I’ve started to get used to it, but I don’t usually aim
for my highest-quality recording in that setting). The specific gear I
run:
Sennheiser
HD600 open-back circumaural headphones in my university office (MSRP
$450, I got them on sale for $250–300). Sennheiser is one of the
best-known names in headphones (like Shure is the go-to for
microphones), for good reason. I like using reference headphones (flat
frequency response designed for professional monitoring and production),
and the HD600 is in that category. This isn’t a particularly common
taste, and is influenced by some time I spent doing audio production in
my younger days; many people will probably find some of Sennheiser’s
other models, like the Momentum or the HD560, to have a more familiar
tonal quality.
I’m extremely happy with the HD600s — they are comfortable and secure
while also feeling light on my head, and sound fantastic. They also fit
comfortably around my ears.
Shure
SRH1440 open-back circumaural headphones for my home office. These
were the first open-back headphones I bought. I like their sound a lot
(and they definitely sound better than anything I had purchased before),
but the find the HD600 to both sound better and feel more comfortable
(the SRH1440 is noticeably heavier and the pads are relatively thick, so
it feels a bit like my head is in part of a football helmet).
Jabra
Elite 85t earbuds for travel & on-the-go calling. I talked about
these more under microphones, but they’re
a great (although not cheap) set of day-to-day true-wireless earphones.
They are unsealed, which is not common for this level of earphone, so
I’m a lot more comfortable calling on them than on sealed earphones.
They also have both sidetone and hear-through, making them quite
versatile for a range of listening and calling situations. Most of the
Jabra models (at least at the higher-end) have sidetone, so if you want
sealed earphones, they have several options.
I no longer have the Jabra
Evolve 40 (they were owned by the university), but as noted a couple
times above, they’re a pretty good and semi-portable headset. I wouldn’t
want to spend a lot of time listening to music on them, and they aren’t
outstanding for listening while doing video editing and post-production,
but they’re fine and worth the money.
One last headphone to note is the Sony
MDR-7506. These are a professional-grade closed-back supra-aural
headphone that Sony has had in production for over 30 years now. For my
ears, they aren’t the most comfortable for extended periods of
listening, but they sound great and are built to last. They also fold up
into a relatively bulky bag for some portability (could toss them in a
suitcase, but they’d take up quite a bit of a backpack). They’re a
workhorse in the professional live sound world, and earn that
reputation. If I started to do live sound work again for some reason, I
would definitely buy a pair. In the office, I prefer the Sennheiser.
I don’t have particular recommendations for other types or formats of
headphones. Sennheiser generally makes good headphones, so it’s hard to
go wrong looking through their product lineup for something that meets
your needs; Jabra is generally good as well, but is definitely more
optimized for office use than music or video production.
Additional Bits
That covers most of it. There are a few other things that can be
useful:
For extensive video editing, a shuttle
controller is extremely useful. This lets you easily “scrub”
backwards and forwards in the video to find the precise points to edit,
and most of them provide additional buttons that you can map to keyboard
shortcuts to perform common operations like splitting a video element or
deleting selected video. Microsoft’s Surface Dial is also supposed to
function as a shuttle, but I don’t have any experience with it.
Quick access to a mute button is helpful on calls. Zoom provides
some kind of global keyboard shortcut to mute/unmute on most platforms.
My keyboard is configurable, so I have set the volume knob to send that
key signal when I press it in. In the office, I also have the hardware
mute button on the Vocaster.
Video hosting can be a little trick. Both of my recent
universities have contracted with a hosting platform (Kaltura at Drexel,
Panopto at Boise State); that’s the best option for class videos, since
it integrates with the LMS and also complies with the university’s data
storage and access policies. For other videos such as talks or
promotional videos, I often publish to YouTube for visibility and
discoverability. When embedding video content in my website, however, I
don’t like that option: it embeds Google code (and sends traffic to that
page to Google), and I also don’t have any control over the ads or the
post-video recommendations. This last point is especially important for
educational videos, because I wouldn’t want the recommender sending
viewers or students off to some other source I haven’t vetted and which
I may be specifically avoiding. Since my site is relatively low-traffic,
I use Bunny Stream to host
embedded videos here. They don’t cost a lot, re-encode to a range of
quality levels, and their player is pretty decent.
If you really want high-quality background replacement, then a
good lighting setup and a green screen will produce better results than
using the “virtual background” feature of Camtasia or the
videoconference tool. However, for most academic purposes, it isn’t
worth the extra cost, space, and hassle in my opinion.
Wrapup
That’s… probably more than you were hoping to read, but I hope it is
helpful. Go out and make great videos!
]]>https://md.ekstrandom.net/blog/2023/12/20232023-12-27T05:00:00.000Z
Photo by
Vertex
Designs on
Unsplash
I’ve often closed out the year with two blog posts: my tool
report, and a year-in-review. It’s been a pretty full year!
One of the major accomplishments was moving to Philadelphia to take a
new position in the information science department at Drexel
University1. I’m very excited for the coming
years here, as the interdisciplinary information science context is an
ideal home for my approach to research and scholarship. I did have to
give up tenure for the move, but I think it was worth it.
Beyond that, a few other good things have happened this year…
Student Achievements
My first Ph.D. student Amifa Raj successfully defended in June, and is now
an applied scientist at Microsoft.
My second Ph.D. student Ngozi Ihemelandu successfully
defended in December, and is now on the job market.
Srabanti Guha
successfully completed her M.S. project and defense in May. Since Drexel
info sci’s M.S. programs are not research-based, she is probably my last
M.S. advisee for the foreseeable future.
Undergrad RA Christine Pinney
first-authored and presented a full paper
at CHIIR 2023 on gender in IR research, in collaboration with Amifa,
Alex Hanna, and myself.
Got a new grant (w/ Joe Konstan, Bart Knijnenburg, Robin Burke, and
Ed Malthouse) to build a personalized news recommendation platform to
support user-facing research on recommender systems.
This year I made a total of 10 paper submissions and posted 2
preprints (not counting preprints of accepted material); we had 4
rejects to get our 6 conference publications (some of which were
resubmissions of work rejected last year)2.
Joined the editorial board for Foundations and Trends in
Information Retrieval.
Drexel IS Ph.D. committee (ongoing).
Drexel IS faculty search committee (ongoing).
Traveled to CHIIR (Austin, TX), SIGIR (Taipei), FAccT (Chicago), and
RecSys (Singapore).
Wrapup
I’m pretty sure I’ve probably forgotten a thing or two here. It’s helpful to me to sit and
reflect on what I’ve gotten done in the course of a year. I’m especially
glad to have such a long section of student accomplishments to list. And
hopefully some reporting on rejection levels is helpful to others3.
And thank you very much to my excellent collaborators who have made
all of this possible.
For the next year, there are of course many new things in planning
(or progress), and I look forward to starting with some new
Ph.D. students at Drexel.
]]>https://md.ekstrandom.net/blog/2023/12/tools2023-12-26T05:00:00.000Z
Photo by
Dan
Cristian Pădureț on
Unsplash
It’s time for another review of my current toolkit!
With a new job and a new city, I needed to re-assemble my work
computing setup from scratch and am now running MacBooks both at home
and work, so there are a number of changes. I also completely overhauled
our home network. Quite a few software things have stayed the same,
though.
Endpoints
I’m now primarily on Apple (MacBook Air M2 at home, 14” MBP w/ M2 Pro
for work). This is working well, with much better performance and
battery life than when I was on Windows (even on an i7 Surface
Laptop).
I also maintain a small Windows remote desktop machine at work for
software and class instruction testing, and got an iPad Air for reading
and paper markup. Plus our old Windows desktop I mostly use for
gaming.
I now use a 27”
4K ASUS ProArt display. It looks great, and also works as a docking
station if you don’t need a lot of ports or an ethernet connection. So
far, the single 27” monitor with the laptop open on a stand is working;
don’t have a pressing need to get a second full-size monitor.
I’m still using a Kensington Expert
Mouse, now paired with a Keychron
K15 Pro low-profile Alice keyboard. I’m liking the Keychron a lot;
it doesn’t have quite the slope of the Microsoft ergonomics I’ve been
using for the last several years, but it doesn’t seem to be triggering
RSI recurrence. For mobile, nothing has changed; still on iPhone and
Apple Watch, and don’t anticipate switching.
Keyboard Configuration Notes
Since the Keychron is a third-party keyboard, it has two important
limitations on Mac: it can’t send a Mac “globe” keycode, and it doesn’t
support Touch ID. There isn’t a way to fix the Touch ID situation, but
since I don’t use Caps Lock, thanks to this
comment I do have a fix for the globe key issue, which is the
easiest way to enter emojis.
In Via, the config tool used by
Keychron keyboards, change the following mappings:
map Caps Lock to Control (much more useful IMO)
map a macro key (I use M1) to Caps Lock
In the modifier key settings in macOS, set Caps Lock to work as the
Globe key
With this, I can hit M1 on the Keychron to enter an emoji or special
character. I also have a few other keymaps set (photo above was taken
before setting them up):
Lock key sequence on one of the macro keys
Move Del above Delete
Map previous Del to Home, and other keys, so the top right column is
Home / PgUp / PgDn / End.
Pressing the rotary encoder is F13 (which mutes Zoom), so I have an
easy-access zoom mute button with my volume control.
At work, I also use a CalDigit TS4 docking station to have some extra
ports and Ethernet, and have a 4TB Crucial SSD for expanded storage on
my MacBook.
Video Recording & Conferencing
I didn’t feel like I was getting a lot of value out of the Logitech
Brio’s extra resolution, so when setting up at Drexel I got a C920s
instead. It is good enough, but not great; I think the Anker PowerConf
C200 I have at home is better.
For audio, I’m very pleased with my new setup: a Shure
MV7X connected to a Focusrite Vocaster USB
interface, with Sennheiser HD
600 for listening. Call and recording audio quality is outstanding,
and the headphones sound very good both for calls and music.
I’m still using Camtasia for recording and editing lecture videos. I
have added OBS to my toolkit, along with the iPhone
app, for capture from my phone camera when I need another camera
(e.g. for a document camera). Another useful addition has been MacWhisper for generating video captions. Its speech
recognition accuracy and segmenting logic are both very good, and it is
significantly less expensive than Audiate (although without the
text-based video editing capabilities).
Recommendations
I’m very pleased with my microphone setup, but usually still recommend
the Blue Yeti, especially in the Yeticaster configuration, to most
people looking to upgrade their Zoom audio quality. The Yeti is very
good at significantly lower cost than a Shure setup, although it is
heavier and bulkier. If you do want the Shure, the regular MV7 connects
directly to USB without needing a second interface. I wanted a greater
degree of control and decoupling in my own setup, as well as the
hardware controls of the USB interface.
Interactive Software
My general interactive computing has seen some changes, due to moving
to macOS and a new university that doesn’t use GSuite. I have a
subscription to SetApp, which yields a
number of useful utilities.
Browsing
Primarily browsing with Firefox; keep
Chrome around for Google apps, and use Edge on my home laptop for
accessing university things (Edge logged in to my Drexel account is a
decent “quick check work email” experience).
I’m now using NetNewsWire as my RSS reader, because Feedly did
something or another that made me pretty uninterested in continuing to
use their service. I don’t currently have a good bookmarking service,
since Pinboard is in a very low-maintenance mode and its creator decided
that defending JK Rowling would be a good use of his influence.
Reading and Writing
I still use Office for most of my general
writing, spreadsheets, and presentations, more so now that I’m at
Drexel, where we have Microsoft 365 instead of GSuite. I still use Google Docs for a lot of collaborative documents,
since it’s the de facto standard for academic collaboration, and Overleaf for authoring LaTeX. I’ve also started
using Bike
Outliner for note-taking, and may start using it to outline
drafts.
I’ve switched back to Zotero, which I used during my Ph.D. and the couple
years after. I liked PaperPile, but it is tied to Google accounts and
requires Chrome.
For the last few months I’ve been using Highlights as my
default PDF reader on both Mac and iPad, including for markup of student
work; it doesn’t allow freehand drawing like Drawboard, which I miss
sometimes, but it works well enough. I use Acrobat
Pro for last-stage preparation and touchup of PDFs.
Switching to Mac has introduced a weird element to my document
production workflow — Word now requires Microsoft cloud services to
create workable PDFs (with tags, outlines, etc.) and behaves quite badly
with fonts, and Acrobat Pro on Mac similarly does a very poor job and
requires cloud services (also with font problems). Acrobat Pro for
Windows still provides full-featured local PDF creation, so when I need
to convert a Word document to PDF for class, I usually open it on my
Windows remote machine and use Acrobat there.
General Productivity
I’m trying out Bike Outliner for general note-taking; it’s better
than other non-cloud things I’ve tried, but the jury is still out. I’m
also now using Taskpaper to track work to-dos and my runway document. I’m not entirely happy
with it, but Bike doesn’t have good filtering capabilities, and the
space of local-first infinite outliners or task managers that aren’t
org-mode is rather thin. I’ve augmented it with a few user scripts and a
custom style sheet, along with a command-line tool to print upcoming
tasks across multiple Taskpaper files.
For better or worse, I’m now using Outlook for my e-mail and calendaring; it has
definitely taken some acclamation, and on net I do prefer Gmail.
Unfortunately, Drexel also disables IMAP, so if I want to write some
scripts to fill in holes (which I’ve done before), I’ll need to do it
with the Microsoft Graph API.
When I first started my new position, I tried out OneNote and To Do
to see if they might meet my note-taking and task management needs, but
To Do doesn’t allow the level of automation and fluid keyboard operation
that I need.
At home, I use the Apple apps for email, calendar, and tasks, with
our email on Fastmail
and other things on iCloud.
System Utilities
There are a number of tools I use to make my day-to-day system usage
better:
Commander
One for file management, when I’m not just using Finder. I’ve also
used Marta, but Commander
One looks like a better option in the long term.
iTerm 2 as my
terminal, with Hack as my terminal font. I’m very intrigued by Monaspace
and am trying it out.
Soulver is a
ridiculously useful little program for general calculations, including
things I would have grabbed Excel for before.
iStat
Menus for more useful status displays in the menu bar.
Secretive to store SSH authentication keys in Apple’s
secure enclave.
1Password for password
management.
I just discovered Paste and will be trying it as a clipboard
manager.
Mobile
I also run quite a few different apps on my phone; a few that stand
out:
OTP Auth for 2FA.
RPN48 for my primary calculator.
Signal (preferred) and WhatsApp for secure messaging.
RideWithGPS for bike ride logging.
Pixelmator to edit images.
ImgPlay for GIF editing.
UniChar to access a wider range of
Unicode characters.
iPhone companions to much of the Mac software I use, such as
NetNewsWire and Banktivity.
Command-Line Software
A lot of my computing is in the terminal. I tried fish for a while this year, but am now back on
zsh. I’ve been trying oh-my-zsh, but I’m not sure
about some of its configuration choices yet. Several augmentation
utilities fill out my shell profile:
I’ve made some significant changes in my data management across the
board this last year, so that seems to merit a section of its own.
I’m now storing university data on OneDrive, as that’s what Drexel provides. I also
use OneDrive for most of my data syncing between my MacBook and iPad,
although I share some files with iCloud. Each account has 5TB available,
so it works pretty well. At home, I mostly use iCloud, and use an iCloud shared folder to share
files between work and personal computers (I use separate Apple accounts
for my home and work machines). I also store all photos in iCloud, and
use shared albums to send files between my phone and university
MacBook.
I use git for all of my source code
storage and version management. To have greater control over when and
where data files are synchronized and stored, I’ve started using git-annex
for data archival (as well as the assets for my website). I still use
syncthing for a few folders, but not as much
as I used to.
We’ve switched our home endpoint backup from Backblaze to Kopia, to have them more
under our control and to manage costs as Backblaze pricing has
increased. It’s configured to store backups on our NAS, which
synchronizes them to cloud storage regularly.
Recommendations
Kopia is working well for us, with our requirements and infrastructure,
but I still recommend Backblaze for most people, as it’s dead-easy to
set up.
I’m still using dvc for
experiment data. Recent versions have introduced some annoying
regressions, but I don’t have a better solution yet.
Programming and Data Analysis
Visual Studio Code is still my primary
programming editor across all languages I use.
I’m still using Python and Rust as my primary research languages. I’ve
started dabbling in R again, as we use it in
the class I taught this fall; I’m not sure long-term if what the
R/Python balance will be for statistical analysis and visualization.
I’ve also started using Quarto in place of Jupyter in some projects, and for
rendering my data tools
documentation.
The Polars library
has been a useful addition for data processing, both in Python and Rust;
it’s replaced Pandas for larger-scale data processing.
I’ve started using more TypeScript in my
JavaScript programming, and that’s been quite useful; my website is entirely TypeScript now. TypeScript’s type system
is one of the more expressive I’ve used, which has been fun, but it also
has several escape hatches that turn the guarantees one would usually
expect from a typechecker into more of set of best-effort guidelines. It
still gives me higher confidence in code correctness. I expect a lot of
my JavaScript work will be in TypeScript going forward, mostly with
Deno when not in the browser.
Finally (on the general-purpose front), I’ve also been writing more
Tcl in various places. I find it severely
underappreciated and quite like it as a glue and scripting language, and
the Jim interpreter makes it highly
portable.
As noted above, I’m still using DVC for
research data management and analysis pipeline automation. To work
around the limitations of DVC’s pipeline language, I’ve moved away from
the templates and weird TCL scripts I’ve experimented with in the past
and now use jsonnet to
generate non-trivial pipelines (see the Book Data Tools
for an example).
One significant change in my programming across languages is that I
have started using autoformatters when they are available. For Rust,
this is the standard rust fmt; for Python, I’m using Ruff (it’s also
replaced flake8 as my primary linter); and for TypeScript &
JavaScript, I’m using deno fmt. I’m also using either
Prettier or formatters built in to VS Code extensions for other
languages like yaml and jsonnet.
I’m still using Conda — usually with
conda-forge — for installing research software and Python development
dependencies. It remains the best solution I’ve found for reproducible,
cross-platform software environment installation.
Now that I’m back on Mac, I’m using Dash again for reading documentation, although I
still do quite a bit of that in the browser.
I’m still getting my university compute needs and resources figured
out, but I’ve started with one server node in our data center, with dual
64-core Epyc 7662, 256GB RAM, and an Nvidia A40 GPU.
Home Network
I completely overhauled our home network this year to get better
Wi-Fi, upgraded network storage, and a firewall that hasn’t taken up
conscientious objection to software updates. I’ve also standardized on
Debian Stable across our servers.
It was time to replace our old QNAP NAS; its Atom CPU was old enough
that it didn’t have hardware-accelerated crypto, and was having
increasing trouble keeping up with the amount of data I wanted to run
through it. I replaced it this year with a RockPro64 in Pine’s NAS
case, with 2 8TB Toshiba hard drives. This machine runs Debian
Stable, with syncthing, Samba, and git-annex for its primary data
transfer roles. It also serves as our primary backup host with Kopia
Backup.
After some experimentation, I settled on formatting the primary storage
with XFS on top of LVM RAID1, with the physical volumes encrypted on top
of an integrity layer (using cryptsetup’s built-in
integrity configuration support, so the integrity is a cryptographic
MAC). ZFS is nice, but doesn’t use the kernel’s crypto accelerator
support and doesn’t use Arm’s AES extensions on its own.
I also bought an R5C
to serve as our firewall & router. This little box has an RK3568 SOC
and 2 2.5Gbps Ethernet ports on the PCIe bus. It’s also running Debian
stable, and thanks to inindev’s
images is able to run a stock Debian install instead of Friendly’s
images with difficult-to-update kernels. A 5-port switch and a TP-Link
TL-WA3001
Wifi6 router complete our home network.
I’m using Tailscale for VPN
connections between home, cloud, and my devices when on the move. It
works great, and is much easier than managing Wireguard myself (or
messing with our old router’s OpenVPN support). I also use a Tornado VPS server to host my website
(behind Bunny CDN) and handle other coordination between home and remote
devices.
]]>https://md.ekstrandom.net/blog/2023/11/multiprocessing2023-11-10T05:00:00.000Z
Photo by
Markus
Spiske on
Unsplash
It is a truth universally acknowledged that parallel computing on
Python is an experience that ranks somewhere alongside “facial
exfoliation with a rusted cheese grater” in its pleasantness.
In this post I’m going to briefly review our particular (common!)
problem, the state of multiprocessing in Python, and why it
unfortunately appears necessary to continue using my own parallel
processing layer in LensKit.
Shape of the Problem
LensKit supports parallelism in two different places: model training
and batch evaluation. Model training uses the threading support of the
underlying compute engine (BLAS and Numba, although I’m looking to get
away from Numba). Batch evaluation uses the Python standard library’s ProcessPoolExecutor
through a custom wrapper layer (more on this later).
In batch evaluation, we have a problem that is common to many machine
learning batch “inference”1 problems: we have a
large model object that is read-only (except for ephemeral caches), and
multiple threads or processes need to compute results using this model
object (in our case, computing recommendations for the thousands or
millions of test users). Since this model is large, it presents two
constraints:
We only want one copy in memory, no matter how many workers we use
(if we eventually support multi-node evaluation, we would want one copy
per node).
We don’t want to have to re-serialize it for each task (user).
Usual API design
Typical Python parallel processing APIs are designed around
submitting tasks with arguments to the executor pool. At a surface
level, our use case maps reasonably well to the typical map
function provided by e.g. Executor:
defmap(func, *iterables):# apply func to items in zip(iterables), in parallel
Most Python parallel APIs provide a function like this, and differ
primarily in their implementation details and optimizations. However,
there is one element of this API that does not match our use case: the
function needs access to the large shared model object in addition to
the per-task arguments it gets from iterables.
Current Solution
The ProcessPoolExecutor works on top of multiprocessing.Pool,
which allows us to provide a worker setup function that will be called
to instantiate each worker thread, as well as provide arguments to the
setup function. This conceptually maps quite well: if we have a way to
put a model in shared memory, we can use worker setup functions to store
it in a global variable, and then supply a task function to
map that fetches the shared model and passes it, along with
the per-task arguments, to the batch evaluation function.
In Python 3.8, the pickle module gained support for the
new Protocol 5 pickling format, which allows application code to provide
a custom callback for serializing anything that implements the Python
buffer API, which includes the NumPy arrays that make up
the bulk of our model’s saved data. If we “serialize” those by copying
them to shared memory, then the remaining object structure is a
relatively small pickle. The binpickle library leverages
this to provide an on-disk serialization format that supports
memory-mapping buffer contents.
I created LensKit’s Invoker
framework to abstract all of this this. Its ModelOpInvoker
implementations take a model object, and do the following:
Serialize the model to shared memory (if it isn’t already
serialized). It supports both Python’s SharedMemory and binpickle, which was created
for the purpose and can be used to share through memory-mapped disk
files if /dev/shm has insufficient space for the shared
memory.
Deserialize the model in the worker processes, using shared memory
for the buffers.
Wire up logging so that log messages are properly passed back to the
lead process.
Provide the model object to a “model op”, a function that takes the
model and the task (e.g. user ID) and returns the results.
It works pretty well, all things considered. There are a few
outstanding problems, though:
I’m maintaining a parallel processing library.
Naïve use still has 2 copies of the model in memory, because we
cannot move the model’s buffers, we can only copy
them. I have workarounds, but they’re not pretty, and require
binpickle (basically, serializing to a memory-mappable
binpickle doesn’t require the output to be in memory, so you serialize
to disk, drop the original model object, and then have the invoker use
the pre-serialized model, which its’ capable of doing).
Excessive worker process logging can overwhelm the logging
pipe.
So I spent some time this week trying to see if someone else has
built a good solution I can use instead of continuing to maintain the
invoker library.
Current Status
So far as I can tell, there really hasn’t been a lot of movement
towards a solution for this specific problem shape. I also may not be
looking in the right places, but I see surprisingly little uptake of
Pickle 5’s ability to facilitate shared memory.
The things I’ve looked at in my current exploration include:
ProcessPoolExecutor,
didn’t expect anything new here, and it’s what we’re already using.
joblib, which I used in
an earlier version of LensKit. Joblib focuses on providing a very clean
and robust parallel implementation of map, and admits that
this comes at the expense of other functionality; there is no way to
provide per-worker model data (at least not without configuring your own
executor). It uses loky and cloudpickle to
work around old bugs in Python’s concurrency library, improve
performance, and increase the number of things that can be pickled; the
relevant Python concurrency bug has been fixed in the versions of Python
I support, and I haven’t found pickle’s limitations to be a
problem in our code paths. Joblib also provides
dump/load routines that allow memory-mapped
Numpy arrays, but it’s a hacky solution that predates Pickle 5.
binpickle was born from “what if we did Joblib’s dump/load
but on top of Pickle 5?”. For my purposes in LensKit, joblib doesn’t
provide much value on top of Python’s standard library, so it isn’t
worth the dependency.
mpire supports
large shared models, but it does so through fork, so that
feature doesn’t work on Windows (or with any other multiprocessing spawn
model). Good Windows support is a priority for LensKit.
ipyparallel claims
support for “zero-copy” buffers, but the devil is in the details. This
zero-copy support only works when you actually pass the NumPy array to
the map or push function, not when it is an
implementation data structure of an object you pass (with a few
exceptions). The serialization layer is extensible, so I could use
Pickle5 to serialize anything wtih zero-copy buffers, but it gets to the
next problem: the zero copies are in the process of preparing the data
to send, but as near as I can tell, it is still copied over the zeromq
pipe. Therefore it isn’t zero-copy in the sense that I need, but rather
1 (instead of 2) copies in the driver process and one copy in each of
the worker processes. Supporting true shared model objects still
requires the same serialization logic I use to work with the standard
library.
dask.distributed and ray are both
interesting, but very much seem to want you to work within their
framework. LensKit is designed to fit with whatever tools the user wants
to use, particularly fro model implementation, so forcing evaluation
into a heavier framework like them would be a paradigm change. It also
appears like I would still need the custom shared memory serialization
logic, although that may not be entirely correct. I also just haven’t
had good success getting actual speedups from Dask when I have tried it
in the past.
torch.multiprocessingdoes go there, for
PyTorch tensors — when you send an object to a worker, it moves the
tensor into shared memory and allows the workers to access it. Only
works for PyTorch, not numpy or other buffer-based APIs.
That’s what I’ve been able to learn so far. Multiple operations with
single large shared model object just does not seem to be a
well-supported pattern outside of PyTorch and heavyweight cloud- and
cluster-oriented frameworks. With LensKit’s goals of good single-node
performance and minimal constraints on users’ environments, there
doesn’t seem to be a better solution than what I’m doing now.
Sidebar: Subinterpreters
Python recently added “subinterpreters”, which are multiple isolated
Python interpreters in a single process, and Python 3.12 allows each
subinterpreter to have its own global interpreter lock. This seems to
open the door for a very good solution: parallelize with threads, giving
each thread its own subinterpreter; share the buffer memory between
subinterpreters and keep using pickle for the object structures and
other inter-thread communication. However, there is significant work to
upgrade extension modules to support subinterpreters, and it doesn’t look like a
priority for NumPy yet.
Moving Forward
It looks like I need to keep maintaining a parallel compute API for
large shared model objects in order to enable LensKit’s parallel
evaluation. I’m looking to make a few changes to make it more usable and
ergonomic, and encourage adoption (and co-maintenance?) by others:
Create a new library for the invoker code so it can be maintained
separately and used by non-LensKit projects. It will continue to support
both Python shared memory and binpickle mapping, depending
on the use case. I may also consider adding support for
plasma, but I’m not sure that would gain us much on top of
Python’s shared memory API.
Add support to Binpickle to deserialize directly to shared memory,
so users don’t need to have separate compressed BinPickle files for
model storage and mappable ones for parallelism, unless they
specifically need the increased memory capacity afforded by BinPickle
mapping.
Add progress bar support.
Add optional “destructive pickling” that tries to dismantle NumPy
arrays (by resizing them to 0) once their bytes have been transferred,
to enable “move to shared memory” semantics. This is possible because
the buffer callback API in Pickle 5 makes the buffer’s owner available.
Destructive pickling will leave objects in unusable states and must be
used with care, but it seems worth trying for the common cases of models
that will not be used after they have been serialized.
Eventually: consider adding support for ipyparallel, with the
same custom deserialization logic currently used for process pool
executors. When used with memory-mappable binpickle files
stored on NFS, this will allow multi-node parallelism with one model
copy per node.
I’ll update this post with links once the new library is up and
available. Hopefully people will find it useful!
]]>https://md.ekstrandom.net/blog/2023/08/final-paper-checklist2023-08-10T04:00:00.000Z
Photo by
Cedric
Verstraete on
Unsplash
There are a number of steps in preparing the final (or
“camera-ready”) version of a paper for publication. This post attempts
to document them. Many of these points are about making the paper
consistent with itself, so that it doesn’t look sloppy. This list
probably isn’t complete, but hopefully it’s a helpful start.
Proofreading
Correct errors noted in reviews.
Carefully proofread for spelling, grammar, unclear language, and
unhelpful redundancy. Make sure tense and pluralization are
appropriately consistent in all sentences.
Check that figure and table references are consistent. Specific
points:
“Fig.” vs. “Figure” and “Table” vs. “Tbl.”; can mix and match
e.g. “Fig.” and “Table”, but not “Fig.” and “Figure”.
Capitalization — when a reference is in the middle of a sentence, is
the label (e.g. “Fig.”) capitalized? (At the beginning of a sentence, it
should always be capitalized.)
Some journals or publishers have a specific style regarding how
figures and tables are referenced: follow that if applicable. Springer
is one such publisher.
If the publication venue does not specify a style, be consistent
within the document. Look at a few recent papers to see what other
authors usually do.
Typical style for ACM publications is to use “Fig.” and “Table”, and
to always capitalize.
When using LaTeX to render the final version: edit paragraphs so
we don’t have last lines with only 1–2 words.
Section headings should all be in title case. When a style uses
all-caps for some headings, it is better to write them in title case and
let the style code convert them to all-caps for display (LaTeX, Word,
and CSS are all capable of this); that way, the PDF bookmarks, table of
contents (when present), and similar navigational aids display them in
title case.
Figure and table captions should be consistent in terms of how
they are written.
Are they written as short headings or as complete sentences with a
period?
Do they use title case or sentence case? (complete-sentence captions
should only use sentence case.)
Be consistent within a type of caption. It’s fine to use
heading-style captions for tables and full-sentence captions for figures
(this is common practice); but you shouldn’t have some of the figure
captions be heading-style and others be full sentences.
Each bulleted or numbered list should be consistent within
itself. All elements in the list should either be complete sentences or
sentence fragments; don’t mix-and-match.
Check for correct and consistent use of punctuation:
Use quotation marks properly and consistently (single vs. double,
matched opening and closing quotes).
Be consistent about how quotation marks and other punctuation
interact. I typically use the British style, where the punctuation goes
outside the quotation marks; in computer science, where we often need to
quote code that may include important punctuation, this method is more
precise than the American style, as it ensures that only what is
actually being quoted is inside the quotation marks. For example,
write:
According to Smith et al., “quotational accuracy is vital”.
instead of:
According to Smith et al., “quotational accuracy is vital.”
Use the serial (Oxford) comma in comma-separated inline lists.
That is, write “one, two, and three” instead of “one, two and three”. In
almost all cases, it is less ambiguous.
Use semi-colons to separate items in complex inline lists that
have commas within the list items, to reduce ambiguity. It should be
clear what is a list element and what is a subclause of a list
element.
Use appropriate dashes in appropriate places: a hyphen (-,
-) to separate hyphenated words; an en-dash (–, LaTeX
--) to denote a numerical range (e.g. 7–10); and an em-dash
(—, LaTeX ---) as a parenthetical or marker in
text.
Use em-dashes consistently. It’s fine to have space around an
em-dash (like — this) or not (like—this), but be consisten throughout
the paper.
Make sure all adjectival phrases are properly hyphenated (e.g. “a
log-based metric”, not “a log based metric”).
Figures
All figures should look good (not pixellated) when zoomed way in.
Figures should be at least 300 dpi when rendered to a raster format
(e.g. PNG). This means a 7×5 image should be at least 2100×1500
pixels.
Text should be legible at a reasonable PDF zoom
resolution.
Text should be a relatively consistent size between figures,
especially subfigures within the same figure. This is easiest to do by
rendering all images to the same width (relative to their width in the
final paper) in Python or R; 5 inches is often a good width for an image
that will appear in one column in a two-column format with
\includegraphics[width=\textwidth].
Figures should not be distorted vertically — their aspect ratio
in the paper should match their source aspect ratio. In LaTeX, never use
height= when including an image; instead, resize it based
only on the width.
References
Make capitalization of paper and conference publication titles
consistent. ACM style is to use title case, but sometimes our BibTeX has
sentence case, depending on where we got it. If you use title case in
your BibTeX, then BibTeX will automatically display it in sentence case
if that is what a style demands; words that should remain capitalized
need to be enclosed in braces (e.g. {LensKit}). It cannot
convert the other direction.
If you use Zotero (which I recommend), it has a further limitation
that it cannot convert from title case to sentence case (because the
braces are a BibTeX thing, not Zotero). The solution for this is:
Better BibTeX will convert the sentence case to title case in the
BibTeX and insert the protective braces, and your final bibliography
should be correct.
Be consistent about abbreviated vs. full conference proceeding
names (e.g. “Proceedings of the 43rd ACM SIGIR International Conference
on Advances in Information Retrieval” vs. “Proc. SIGIR ’20”). I
typically use the full title when we don’t have a length limit on
references, but the important thing is that we are consistent throughout
the bibliography. Also applies to journal titles, but the problem is
more common in conference proceedings.
Be consistent about what fields are included - no one really
cares that the ACM is in New York, and we don’t have that info for all
proceedings, so it can be dropped.
If we have a DOI, we don’t also need a URL. BibTeX doesn’t
usually include both, but check.
If we have an ACM / IEEE / Springer publication that doesn’t have
a DOI for some reason, look it up and add it.
If citing a preprint, check for a current formally-published
version of the work and cite that instead, unless we are specifically
citing the work for something that only appears in the
preprint.
Sometimes we can get duplicate citations. Check for these and
only cite one.
When using BibTeX, I recommend making most of these changes in your
reference manager, re-exporting. That way, the citations are consistent
for the next paper you write. There are two exceptions: removing URLs
(leave the URL in the reference manager, but remove it from the BibTeX
after export) and abbreviating proceedings titles (I usually find it
works better to keep the full title in the reference manager and edit
the BibTeX to have the abbreviated one if we are using those).
Content
Clarify writing on points that reviewers found confusing (either
because they directly commented on the confusion, or because it is a
likely cause of other confusion about the paper reflected in their
comments).
Make sure we have appropriate acknowledgements. Usually need to
mention:
Funding source(s).
Special computing resources (e.g. the compute cluster, with a
citation if appropriate).
People and organizations who provided resources for the paper
(hardware donors, data donors, etc.). We don’t need to mention things we
obtained publicly, such as a publicly-available data set; the citation
is enough for those. But if someone gave us data privately, we need to
acknowledge them.
Ensure author names and affiliations are complete and consistent,
and author names are listed as each author prefers (e.g. I publish as
“Michael D. Ekstrand”).
If we have promised code, make sure that has been uploaded and an
appropriate link inserted into the paper.
In 2016, I joined Boise State
University, and founded the People and
Information Research Team with Sole Pera. This was the first (only?)
multi-PI research group in the department, and one of a very small
number of multi-PI recommender systems groups in the US.
In our 7-year run, we’ve graduated (or will soon graduate) about 20
students, published over 100 papers of various kinds, and engaged in
numerous other endeavors. Some were joint, such as co-chairing RecSys 2018; others were one
or the other of us with the PIReTs serving as a home base, cheerleading
team, and sounding board to refine and improve the ideas, such as the FAccTRec and KidRec workshop series.
I’m very proud of what we’ve accomplished through the group. I’ve
also grown a lot through these years and through my ongoing discussions
with Sole about how to support our students and how do effective
research. Collaborative mentoring is a fantastic thing — no one really
teaches us how to advise graduate students, so being able to do it in a
context where another professor has a high degree of visibility into
your student’s work and successes and struggles, and you can discuss how
best to support them, is immensely valuable. I’m a significantly better
researcher, scholar, teacher, and adviser because of the time that we’ve
spent leading this little crew together.
But the time has come to bring the PIReT ship to port and take down
the sails. Today was the last regular group meeting. It isn’t completely
done yet, as I have two grad students who will finish under its banner
later this year, and papers in the pipeline that will still be under its
auspices. When Sole moved to TU Delft last summer, we discussed quite a
bit what to do with the group; she stayed involved remotely this year
while we figured out the next steps and the students who started while
she was here (and for some of whom she’s on their committees)
finished.
The conclusion of “what’s next for the group?” is that it’s also time
for me to leave Boise. Jennifer and I are moving to Philadelphia this
summer, where I will be joining the Drexel
University Department of Information Science. I’m really excited
about this opportunity, and the interdisciplinary IS environment will be
a very good context to continue to grow and to develop my scholarship in
the directions I think it needs to go to meaningfully advance the
science of socially-responsible information access.
The PIReT flag is a grouping that best describes what we built at
Boise State, and while we might use it to brand some future
collaborative work neither of us plan to use it as a group name going
forward. It wouldn’t make sense for one thing — she’s in the Web &
Information Science group, and I’m joining an information science
department, so while “people and information research” set our lab apart
in a computer science context, it’s an accurate descriptor for
everything happening in our respective new departments. (I don’t have a
name for my new lab at Drexel yet.)
We spent the group meeting today reflecting on where the group has
been and where we’re each going. It was a good time; there are
definitely feelings about the fact that the ship is sailing
its last voyage, but I’m incredibly proud of what we’ve accomplished
with it, and I’m excited for what’s next in my career, in Sole’s, and in
our students’. This is also just the end of a label, not the
collaboration — Sole and I plan to keep working on things together
(hashtag acabesties?), so stay tuned for more research and maybe some
collaborative service ☺️. And you can find Sole’s reflections on
the birdsite.
In the words of a particular hobbit, “I think I’m quite ready for
another adventure.” And go Phillies!
]]>https://md.ekstrandom.net/blog/2022/12/in-review2022-12-31T05:00:00.000Z
Photo by
Kelly
Sikkema on
Unsplash
A few years ago, I posted annual
reviews of what I did in the year; thought that this year I might
bring that tradition back.
This year has been a year of some major achievements and changes. I
earned tenure, published a major piece of integrative scholarship that
I’ve been working on for a few years, and one of my Ph.D students
successfully defended her proposal.
I’m also working on figuring out what the next phase of structure and
operation looks like for my research lab, since Sole Pera moved to Delft. I’m
thrilled she got this new position! It’s been a very good 6 years
building the PIReTs and having other academic adventures with her, and
we continue to work together remotely on various things. For now, she’s
been continuing to meet with the research group while some of the
current students finish and we figure out what the long-term future of
the PIReT ship will be.
So here’s the list (possibly incomplete):
Earned tenure!
Taught our undergraduate ethics class, CS 230, for the first time.
Taught CS 533 for
the third time in its current form (my 5th time overall), this time as a
hybrid class with a few in-person synchronous sessions.
Published our monograph on
fairness in information access (with Anubrata Das, Robin Burke, and
Fernando Diaz) in Foundations and Trends on Information
Retrieval. This has been a major effort for the last few years, and
it is very satisfying to see it finally in print.
Served as Program Chair for RecSys 2022 with Bracha
Shapira.
Carried out a new project with undergrad Christine Pinney in
collaboration with Alex Hanna
and Amifa on the use of gender in information retrieval; this has been
accepted for publication at CHIIR 2023.
Preprint coming in January.
Published a preprint on values in
recommender systems (led by Jonathan Stray; my primary contribution
was to draft the discussion of fairness and related metrics).
Unsuccessful paper submissions: SIGIR (1 perspectives paper),
CIKM (1 short paper), CHIIR (2 full papers), FAccT (1 full paper),
RecSys (1 demo), PERSPECTIVES workshop @ RecSys (1 paper), CSCW (1
paper).
Submitted a position paper to the Transactions on Recommender
Systems special issue on Perspectives on Evaluation.
Amifa Raj successfully
defended her Ph.D proposal.
Srabanti Guha successfully defended her M.S. project
proposal.
Submitted 3 NSF proposals, including a small corner of an AI
Institute proposal. One declined, two pending.
It’s time for this year’s State of the
Tools. Things are a bit in flux this year, as I’m working on
transitioning my endpoints from Windows to macOS, but I’ll run down
where I’m at and where I’m headed; there have also been substantial
changes in our personal computing infrastructure.
Hardware & OS
Organizing these posts can be a bit random, so let’s start with
systems themselves.
Work Endpoint Computing
I’ve moved entirely into my Surface Laptop 4 (i7, 32GB/1TB) running
Windows 11 for work computing now, and reloaded my i9 to be a Linux
compute server that lives on my desk. Since I work from home 1–2 days
most weeks this is a lot more convenient than having different sets of
windows and browser tabs at work and home. It also addresses the problem
that Zoom refuses to allow me to log in to more than one computer at a
time — I can mostly just be logged in on the laptop.
At the office, this connects to a Surface Dock 2 driving 2 4K Dell
monitors, and the laptop sits to the side to give me a 3rd screen. I use
a Surface bluetooth ergo keyboard and the wireless version of the Kensington
Expert Mouse. I’ve used some version or another of the Expert Mouse
since about 2010, and it’s a solid product that helps a lot with my RSI.
The product has been on the market for probably 20 years at this point,
and if they ever stop production it will be very sad.
I also have an M1 Mac Mini for software testing and driving my shared
monitor, and an old MacBook Air for debugging on Intel-based Macs. I
also still have the Surface Go 2, which I mostly use as a tablet. In my
next work computer refresh, I plan to get a 14” MacBook Pro, and keep a
Windows VM on a server somewhere for Windows-based testing and
debugging. While I appreciated the travel weight benefits of a 10”
tablet for my portable computing, life and the world change, and it’s
really more convenient to have a usable keyboard and screen that are
still portable.
Work Backend Computing
I’ve moved more computing to remotely-accessed iron since switching
to a purely laptop endpoint. My Dell workstation is now a compute server
(8-core i9, 64GB RAM, 512GB SDD + 10TB HDD), and I put a new 8GB
Turing-based Quadro card in it (pretty modest, but the largest card this
computer’s case and PSU can handle). Note to self, don’t by a small form
factor box for heavy compute. This machine is only used by me, not the
lab.
My research group has a dual Xeon server with 24 total cores for data
storage and modest compute. The CPUs are ancient and only clocked at
2GHz, so it isn’t very fast, but it has a lot of memory & a decent
amount of disk, so it’s just fine for storage and interactive computing.
Large compute-intensive jobs we run on the university’s clusters. I run
medium jobs on my dedicated server.
Both of these machines are running RHEL8 with XFS filesystems; DVC
can use the reflink feature in modern XFS to reduce storage requirements
quite a bit.
Personal Endpoint
We’re diving a bit deeper into the Apple ecosystem this year, and
bought an M2 MacBook Air to replace my aging (and showing its age)
Surface Pro 4. I used a Mac for work at Texas State 2014–2016 and didn’t
really like it, but working with this thing I am pretty much sold. The
battery lasts for ages, it’s incredibly fast, and having a consistent
CLI experience between local and remote systems is nice. The hardware is
also very nice. I can even do a bit of light gaming on it.
We also still use a Windows desktop for most of our gaming some
personal computing work. I’m thinking hard about getting a Steam Deck
and moving most of my gaming over to that in the next year or two, but
we will see. Not planning to make that purchase in the next few months.
Overall, I think the Deck (or the Deck 2 that I assume is coming) would
be a pretty good fit for my particular gaming needs and style,
especially driving the TV with a dock and my XBox controller.
Personal Infrastructure
Our QNAP TS-269L NAS is still chugging along, and in addition to
storing backups of teaching materials, it’s doing extra duty as our
router and firewall and boasting an upgrade to 8TB of mirrored storage.
Its CPU is pretty meager; an Atom D2701 that, while 64-bit, doesn’t have
crypto extensions or even frequency scaling. For the time being, though,
it is getting the job done.
It took over router duty when our NetGear router decided for whatever
reason that software updates are optional. Even after I manually
installed the latest firmware, it refused to detect and install
subsequent updates. Security updates are pretty important for the home
network perimeter, so I decided to move routing & firewall duties to
a machine whose OS I could control directly and make sure was up to date
and use the NetGear in AP-only mode. Since the NAS has two network
ports, it’s filling that role for now.
The NAS started the year running Alpine with XFS on Linux software
raid, but I tried out FreeBSD on it again with ZFS. This was a pretty
ergonomic environment, and pf is a very approachable
firewall language when it came time make it a router
(iptables has usually confused me), but there were a couple
big issues:
Significant performance problems when doing CPU- and disk-intensive
work, such as synchronizing large file directories. I do not know the
cause, but my suspicion is that its task scheduler is not as effective
at handling significant load on underpowered hardware; filesystem and
the transfer application would get priority over network routing, so our
machines would fall off the network.
FreeBSD’s security reputation is… spotty. From what I’ve read in
various sources trying to get a good picture is basically that there are
some good ideas, but without near the attention that Linux has had,
there are likely many outstanding security-relevant bugs and things
don’t get caught as quickly.
So back to Alpine Linux but keeping ZFS (which Alpine supports very
well). After a few false starts, I got the necessary firewalling rules
working in nftables (which is a substantial ergonomic
improvement from iptables IMO). Alpine also has a pretty BSD flavor to
its administration, due to using OpenRC and lots of classic shell
scripts. I like the niceties of modern Linux for a lot of things, but
for my basic network infrastructure at home Alpine is working quite
well, and I haven’t seen a recurrence of the performance problems I had
on FreeBSD. And with the gcompat package, VS Code remote
editing even works. I’ve also installed Wireguard for personal device
VPNs, so I can browse (more) securely while traveling.
The Raspberry Pi 0 media widget isn’t seeing a lot of use these days,
but it’s still there, and still running Alpine fine, with shairport-sync
attempting to provide Apple streaming support but glitching out rather
more frequently than I would like.
In the next year or two, I’m hoping to add a dedicated router (NanoPi
R5C is the current leader), replace the NetGear with a WiFi 6 access
point, and upgrade the NAS to something with a more modern CPU.
Mobile
Not much to say here. Still on iPhone & Apple Watch, no plans to
change that.
Interactive Software
Across my various devices, I tend to rely on the same software for my
interactive (graphical) computing:
Chrome for work browsing, Firefox for personal.
Office for editing, spreadsheets, and presentations; I do use Google
Docs for work stuff that is lightweight and/or needs high
collaboration.
FreeCommander for Windows file management, Marta on macOS (when I am
not just using the system’s native file browser).
The Affinity suite for graphics & photo editing.
Visio for diagramming (when PowerPoint or diagrams.net won’t do).
I’m not using Grapholite much any more. After switching to Mac I will
look at OmniGraffle.
Drawboard PDF for tablet-based PDF reading and annotation; Acrobat
Pro on laptop/desktop.
1Password for password management.
iTerm 2 for my macOS terminal (Microsoft Terminal on Windows).
Command Line
I do a fair amount of work from the command line, both for running
the software and analyses I’m doing and also for general file and data
manipulations. Key pieces of this load:
zsh on *nix (including WSL), PowerShell on
Windows.
nano for quick terminal editing; I’ve also been
experimenting with Helix and Micro but the nano keybindings
are pretty engrained now.
tmux for terminal multiplexing / disconnection.
mosh for connecting to servers at home, will probably
start using it more across the board. I’m now just using OpenSSH’s
direct PKCS#11 support for my YubiKey.
direnv to provide ergonomic project-specific
configuration.
zoxide (on *nix) and ZLocation
(PowerShell) for directory navigation.
htop for performance monitoring.
bat for file viewing.
fd for finding files.
ripgrep for searching files.
ndcu and dust for managing disk
usage.
exa for listing files.
pandoc for Markdown processing.
Data Infrastructure
On the personal side, we moved off of Microsoft for our primary data
infrastructure. E-mail is now on Fastmail and we’re using iCloud for
file sharing, calendars, contacts, tasks, etc. Microsoft was working
fine for us, but with moving towards macOS it wasn’t making as much
sense, and we were able to cut our infrastructure & services bill a
bit. Using Syncthing for data transfer between endpoints and the NAS,
Samba/CIFS for direct access to NAS storage, and Backblaze for endpoint
backups.
For work, there are a few things in play:
Google Drive for cloud/synchronized document storage (and all the
Google Doc storage, of course).
git and GitHub for source code and text document
management. Most of my documents either live in Google Drive or a Git
repo.
Minio (S3-compatible storage server) for storing and synchronizing
DVC-managed data.
rsync and robocopy for CLI data transfer;
WinSCP for GUI transfer.
Kopia for endpoint backup, using a
university CIFS drive as the backup target.
Programming and Science
I am still using Python + Pandas + NumPy as my primary software
development environment for scientific computing & open-source work.
I wouldn’t say I love it, but it’s widely-known, gets the job done, and
has libraries for a lot of things. I’ve been working on filling a few
gaps myself, such as the seedbank package
for random number generator initialization. For plotting I’m mostly
using plotnine, but sometimes seaborn and
matplotlib.
I use Rust for high-performance data processing code; this year, I
finished rewriting the Book Data
Tools to be completely in Rust (except for notebooks computing
statistics on the data set) instead of a combination of Rust, Python,
and SQL.
JavaScript is my primary language for web stuff; this web site is
generated with a custom JavaScript codebase.
I’ve been experimenting with Deno some as an alternative to node.js, and
might start doing more with it. I also reach for JavaScript when doing
some data processing that is heavily web-native, like extracting data
from a Twitter archive dump.
I’ve also started playing around a bit more with TCL for lightweight
scripting. I’ve used it for a while for helping with some setup bits for
my Unix shell environment, and have now written some admin scripts in
it. It definitely has some warts and missing holes, but it’s a rather
pleasant language to do simple things in, and it’s fantastic for
building eDSLs.
I use Conda/Mamba (typically through the Mambaforge distribution
these days) for managing my primary scientific software environments, as
it allows me to get Python, Rust, R, and other tools as needed. These
days, if something isn’t in conda-forge or available on a
pretty basic OS install, I don’t depend on it in my research projects,
so that students and collaborators can get all the requirements from
environment.yml.
For projects that aren’t in Conda, I use rustup for
managing my Rust versions and asdf for managing most other
interpreter environments (Python, Node, Ruby, etc.). I’ve been using
pip-tools to pre-resolve Python dependencies for lack of a
better solution.
Media Production
I’m not recording as many videos as I did the year I did the
build-out of CS 533, but I do
still record and edit a fair number.
Camtasia is my go-to recording & video production software; it’s
much easier to use for my use case (educational videos) than something
like Preimier. I also have a USB shuttle to help with precise navigation
while editing.
The game-changing addition this year was TechSmith Audiate. It’s an
audio editor and transcriber that allows you to edit an audio track by
editing its text transcription. Corrections just correct the transcript
without editing the underlying audio; deletions edit the audio track as
well. This way I can more aggressively trim my videos to delete blank
spaces, false starts, etc.; previously, I only edited out big gaps,
because more detailed editing to clean up the speech is very
labor-intensive. It integrates with Camtasia, so I can export the audio
track from Camtasia to Audiate, clean it up, and round-trip back with an
edit list that Camtasia uses to trim the corresponding video. This
cleanup process also gives me working captions at the same time. I
haven’t gone back and re-edited all my videos with this, but it makes it
much less time-taking to produce both a cleaner video and edited
captions for new work.
For recording hardware, I’m using a Logitech Brio as my primary
webcam, and a Blue Yeticaster as the microphone. I have a green screen
that can clip to the back of my chair and some USB lights to facilitate
chroma-key work. I also use my phone sometimes, with the Camo software that turns a phone
into a webcam. This, combined with a desk-mounted boom arm and a
QuadLock mount, allows me to do document camera work in my office either
on video or on Zoom without needing to record and edit in a separate
video stream. I also use my phone for mobile video recording.
I’m still using Unsplash and The Noun Project for sourcing most of my
artwork & icons, with the occasional addition from OpenClipArt.
Analog Information
I’m still using Leuchtturm1917 A5 notebooks and a collection of
fountain pens for my daily and weekly productivity management,
note-taking, and journaling. I use a Pentel Orenz mechanical pencil for
working out maths, sketching diagrams, and other things where I need to
be able to erase.
I also bought a turntable this year and began collecting vinyl music.
Tactile, analog engagement helps me ground myself and feel more
connected to what I’m doing; it’s been effective in my journaling, and I
wanted to bring that to a more purposeful connection to music (in some
contexts — I still make heavy use of streaming as well). I’ve been
putting together an eclectic collection including P!nk, Sturgill
Simpson, The New York Rock & Roll Orchestra, Chicago Transit
Authority (before they changed their name — found that album for $1 in
the bargain bin), Carly Rae Jepsen, and many others. My weekly ritual has now extended to
include spinning an album to go with my whiskey and longhand
planning.
]]>https://md.ekstrandom.net/blog/2022/10/japan2022-10-05T04:00:00.000ZI’m starting to do some speaking again, and now that Japan has opened
back up for travel, I’m very pleased to be giving a couple of talks
later this month:
On November 19, I will be speaking at Waseda University,
hosted by Tetsuya Sakai.
On November 20, I will be giving a keynote talk at IBIS
2022 (Information-Based Induction Sciences). Thank you very much to
Toshihiro Kamishima for inviting me!
I’ll have a little time around the edges of my trip, so if you are in
Tokyo and would like to connect, send me an e-mail and let’s see what we
can arrange. Or say hi at IBIS!
]]>https://md.ekstrandom.net/blog/2022/08/late-work2022-08-13T04:00:00.000Z
White Rabbit from The Nursery Alice, illustrated by John
Tenniel.
As long as I have been teaching, I’ve used a “late day” policy in
most of my classes. I designed this policy after learning about
universal course design while taking Preparing Future Faculty
at the University of Minnesota, but I don’t think I’ve ever publicly
written down the motivations and design of this policy. So here you
go!
Why Keep Deadlines?
I generally cannot do away with deadlines in my classes. Deadlines
allow me (or the grader) to grade in a predictable timeframe, with all
the assignments in; it’s easier to maintain consistency when grading all
submissions in a single effort. They also provide a cutoff for working
on the assignment so I can share my solution with the class. For some
classes with assignments that produce more varied student responses,
this wouldn’t matter near as much, but most of my classes are
programming or data analysis classes where everyone is working on the
same problem for most of the assignments.
I did try a deadline-free approach one year for my graduate
recommender systems course — all material was due at the end of the term
— but the effect was that almost all students didn’t start working on
the assignments until the last week or two of class, and had significant
difficulty completing them in time. Students benefit from deadlines to
structure their own work as well.
For all of these reasons, it wouldn’t work to do away with deadlines
entirely in my teaching. I also don’t think it would work to just have
deadlines with unlimited free extensions — it might guide some students
to submission, but makes the deadlines relatively meaningless.
I do not enforce deadlines for the purpose of trying
to simulate the “real world” or something like that. The deadlines are
for the purposes of maintaining smooth operation of the course.
Principle: Empowering Students
My guiding principle for assignment logistics is that
students know better than I what is going on in their
life and how it affects their work. There are many different reasons a
student may need an extension on an assignment deadline, including but
definitely not limited to:
illness
accident or emergency
last-minute child care needs
car got towed while they’re eating supper before finishing the
assignment
difficulty understanding material, need another trip to office
hours
Further, I don’t really want to be in the position of adjudicating
what counts as a legitimate basis for an extension and what does not, or
obtaining backup justification, or anything like that. It isn’t fun,
it’s an unnecessary intrusion on students’ lives, it doesn’t advance
learning in any way, and it requires relatively arbitrary
decision-making.
Different students have different needs. So I want policies that will
meet a wide range of student needs, and empower students to do what they
need to in order to succeed in both the class and their lives.
Resources for Success
This led me, when I was preparing my first syllabus in Preparing
Future Faculty, to frame the question differently: instead of rules
and exceptions, can I design the class to provide my students
resources that they can deploy as their particular
situation requires?
The fundamental concept I landed on here was to provide late
days as a resource. In their current
form, they work as follows:
For the assignments, you have a budget of 4 late days to use
throughout the semester, at your discretion.
Each late day extends an assignment deadline by 24 hours with no
penalty.
Late days are indivisible, so submitting an assignment 12 hours late
uses an entire late day.
You may use up to 3 late days on a single assignment.
When submitting an assignment using a late day, state with your
submission the number of days you are using. I appreciate it if you
notify me (via a Piazza private message) prior to the deadline that you
are planning to submit late, but do not require you to do so.
I adjust the total number of late days based on the number of
assignments in the course and the level of the students; this version is
from a graduate course with 7 assignments. The number is relatively
arbitrary, but I’ve found 4 to generally work pretty well for such a
class. The limit on late days per assignment is to put a shorter
end-point on when all students have turned in an assignment. With
deadlines on Sunday night, a 3-day limit means I can teach through my
solution in class on Thursday.
The purpose of this design is to enable students to make the
decisions they need to in order to succeed, within a framework that
encourages them to think about those needs and select appropriate
tradeoffs. They could use most of their late days on an early assignment
just because they want more time, but that creates the risk of running
out of days later.
I round out this policy by also dropping their lowest assignment
score (or sometimes the lowest two scores, depending on the course). If
they’re out of late days, or something comes up that would require more
than the allowable limit, they can just blow off any one assignment
without penalty. Sometimes, when students talk with me about a late
assignment that they’re having difficulty finishing, I’ll encourage them
to just not submit it and save the late days for later. I have also, on
occasion, zeroed out a previously-submitted assignment and refunded the
late days for use on a later one.
Remaining Extensions
Late days and the dropped assignment cover the vast majority of needs
for extensions, so I very rarely grant extensions. About once every 2-3
terms a student will have needs beyond those accounted for in the base
course design, and I’ll work with them on a solution (additional
extensions, etc.), but for the standard extension requests I can point
students to the policy and they can take the extra time without needing
to justify themselves.
Alternatives
I have experimented with escalating penalties for late work — 5% the
first day, then 10%, then 25% — but that has felt more punitive.
Resources that can be used without grade penalty is, in my opinion, a
more success-oriented approach to managing course deadlines.
Assignment Timing
There’s also a lot of discourse sometimes about when assignments
should be due. I typically make my assignments due at midnight on
Sunday.
I use midnight as the deadline to allow students to work into the
evening while discouraging them from pulling all-nighters. When I’ve had
assignments due at the beginning of the next day (8 or 9 AM), I see
quite a few submissions at 4 or 5 AM. I’m lax on the precise time,
though, interpreting midnight as “before you go to bed”; if an
assignment is an hour or two late, I don’t count it as late.
The day is a little trickier. I’ve sometimes used other days, such as
Tuesday. If a course has class on Tuesday afternoon, I’ll sometimes make
the deadlines Tuesday at noon.
Some argue against Sunday deadlines, on the idea that it encourages
students to work on the weekends. I don’t find this argument persuasive,
as students have different needs and different lives. Many of our
students work during the week, especially upper-division and masters
students, and the weekend is the time they have set to work on their
course assignments. If I make the assignment on Friday, then students
who have plenty of time during the week have almost an entire week
longer to work on the assignments than the students who have to balance
their studies with a full-time job and family duties. In keeping with my
goal of empowering students to make the decisions they need for their
own lives, I put the deadlines either on Sunday night or early in the
week, with the expectation that if weekend work isn’t good for a
student, they can choose finish it on Friday, and the difference in
effective time for the assignment isn’t as large as it is if I used a
Friday deadline.
Student Response
Students have been overwhelmingly positive about this policy. There’s
sometimes a little confusion early on, or the first time a student
actually needs an extension (since they usually haven’t had the policy
in their other classes), but once I’ve explained the policy I have never
had a student complain about it. I have had a student say that all CS
courses should use my late day policy 😊.
If you find this policy useful, feel free to adopt it in your
courses. If you want to attribute it to me, a link to this blog post
would be fine. So far as I know, this particular policy was original or
at least independently developed; I don’t remember referencing any
directly similar policies while designing it, except perhaps some
general flexible extension policies, and was primarily informed by
universal design and what I was learning in class about how to
accommodate a wide range of student needs.
]]>https://md.ekstrandom.net/blog/2022/02/portfolio2022-02-15T05:00:00.000Z
Photo by
Wesley
Tingey on
Unsplash
A few years ago, early in my first faculty position, I wrote about how I tracked academic work. I
still implement the core ideas of that piece, but most of the details
have changed; I thought now, after working on my first annual review
after applying for tenure, would be a good time to write an update.
Academic Review
I’d like to start with a quick overview for new or prospective
academics. There’s the well-known Big Evaluation, when you apply for
tenure & promotion; and a few years after that the application to
Full Professor. Many institutions have a pre-tenure reappointment review
at around year 3. You will also likely have one or two annual reviews;
for pre-tenure academics, these serve as a check-in on your tenure
progress, and for all academics they’re used for performance evaluation
and determining merit raises (in institutions that use the evaluation
for raises).
When I was at Texas State University, tenure-track faculty had to
provide data for two reviews each year, because the progress /
reappointment review and performance review were separate processes with
separate deadlines. It was weird.
But for each of these reviews, you need to provide a complete log of
your activities, in the format required by your institution (often in
addition to keeping it current on your CV). You also need supporting
documentation. What precise documentation is required will vary from
institution to institution, but you can’t go wrong by saving everything,
even if you don’t need to submit it all to the institution.
Current CV
I keep my CV continuously updated as a part of my web site. Some of
the technical information is here; the web pages
for my publications serve as single-source-of-truth for publication
information, and my CV itself is a Markdown file that pulls in the
publication information, along with other content, for rendering to
HTML. WeasyPrint converts that to a PDF that I can
save, share, upload, etc.
Some institutions require you to highlight new things. Texas State
did that; I dealt with that by including the year in an HTML class or
data attribute on the relevant HTML <li>
elements, and a bit of CSS to recolor everything for a particular year.
These days I would probably just mark up the PDF in Acrobat.
Keeping my CV current as I get new publications means my annual CV
update is mostly adding new teaching & updating my service. Huge
time-saver at review time; time sink overall, but it’s my pet time sink
and I’m rather proud of it.
Logging Work
Different types of work have different logging needs. Paper
acceptances sort of log themselves, but you need to keep track of
service work, grant applications, teaching, etc. I have different logs
for different bits:
All reviewing work is logged in a DynaList notebook, by type; this
is also where I keep track of deadlines and my overall reviewing
workload.
I have a spreadsheet for grant proposals that lets me look at my
overall funding rate, etc.; I included a copy of this in my tenure
application.
Teaching I just update in my CV every year; our faculty effort
reporting system automatically gets it from the registrar’s office.
Many universities have online systems for tracking work; Boise State
uses Faculty 180. You will need to enter your work into this system for
review, but I find it completely useless for my own use. I recommend
keeping your own records, and then updating the effort tracker at review
time. This lets you keep them in a format that’s useful for you; also,
you can keep copies of them if you ever need them for a dispute, you get
fired, or you’re looking for a different position. Keeping your own
copies of vital professional records (so long as no FERPA or
otherwise-protected information is implicated) on your own private drive
is good practice.
Documenting Work
I maintain a Portfolio folder that I use for documenting
all my work: copies of my annual review reflections, documentation for
my accomplishments, copies of my CV each year, tenure application
materials, and whatever else is relevant to documenting my professional
career. I’ve gone back and filled it in all the way back to the
beginning of my Ph.D.
This folder is organized by year (calendar year, since we do annual
reviews on calendar year cycles at Boise State). Within each year, I
have several things:
That year’s reflections from my annual eval (Word documents)
End-of-year CV
A Papers directory with PDFs from all papers published
(or in some cases accepted) that year
A Proposals directory with every grant proposal
submitted
A Teaching directory with saved teaching resources
Syllabi
Student evals
Representative documents (assignments, final exam, project
description, etc.)
A Service directory with documentation & evidence
for major service assignments (e.g. thank-you letters for program
committees, etc.). If the only evidence available has confidential
information (such as the titles of papers or proposals reviewed), I
print it to a PDF and use Acrobat’s Redact tool to remove the private
info.
A Talks directory with documentation for invited
talks.
Other files to document random things (like my ACM Senior Member
designation).
After receiving a year’s evaluations (from chair, tenure committee,
dean, etc.), I save PDF copies into the year’s directory as well.
I try to drop things into this folder as they happen, but usually
need to spend an hour or two each year reviewing it and hunting down any
missing files. Making sure it’s up to date as a part of my annual eval,
though, means it’s already there and I don’t need to check for missing
things when preparing for one of the big evaluations.
In addition to the portfolio documents, I also have each class in a
separate working folder, organized by year and term, and keep those
indefinitely. All documents I create for the class, except things like
source code and web content that live in a GitHub repository, are there,
and I keep them indefinitely. If I need another document from a
particular class, it’s almost always in that folder, the class GitHub,
or Canvas (and most of my content on Canvas is links to documents or web
pages, very little except exams lives natively there).
A little organization in advance can save a headaches later.
]]>https://md.ekstrandom.net/blog/2022/02/dissertation2022-02-08T05:00:00.000Z
Photo by
Towfiqu
barbhuiya on
Unsplash
If we can aggressively simplify for a moment, earning a Ph.D has
three primary components:
Do research.
Write it up in a dissertation.
Convince a committee of faculty that what you’ve done and presented
is worthy of a research-based terminal academic degree.
There are some other things in each program, such as courses and
qualifiers, but this is the heart of what earns the degree.
But what is that mysterious “dissertation”?
It’s a full report on a body of research that is sufficient to
demonstrate competence as an independent researcher and earn a Ph.D: an
original contribution to knowledge in your field. Matt Might has a good
illustrated
guide to what it looks like to create new knowledge, and how that
relates to earlier academic training.
But that still leaves the question about the dissertation
itself: what should such a document contain, and how should it
be organized? When you do your dissertation proposal, what are you
actually proposing to do?
That’s what I hope to address in this post.
Scope
Before we get to the organization of the dissertation document
itself, I want to spend just a little time on the scope of a
dissertation.
A dissertation should contain the research content of approximately
three good papers (full conference or journal papers). There are
variations on this — sometimes there’s 4 papers, sometimes two short
papers replace a full paper — but it’s the basic idea. Not all papers
need to be published: at least one should, but the publication process
is fickle sometimes. The ideal is probably to have one published,
another published or accepted, and a third under review (or in
preparation for a deadline shortly after defense).
These three papers will also often not be the only papers you write
in the course of your Ph.D — while additional papers are not needed to
earn the degree, they’re usually necessary to have a competitive
application when pursuing research-oriented jobs.
The 3–4 papers should also be on a theme so you can tell a coherent
story of your dissertation work. Three disconnected papers on different
topics are hard to sell, and make it difficult for you to make a clear
pitch of research directions when you’re on the job market. There isn’t
one story for a dissertation, but there are a few general shapes that
tend to work well:
The Hammer
A “hammer” dissertation focuses on a particular toolset and demonstrates
its applicability across a range of problems; each paper is applying a
similar tool to a different problem, and the overall synthesis draws the
resulting knowledge together to show where the tool does and does not
work, what’s needed to make it effective, and how to adapt it to a range
of settings. You have a hammer, and you show that it can pound ordinary
nails, U-shaped nails, and some weird five-pointed thing.
The Problem
A “problem” dissertation focuses on a particular problem or problem area
and does a deep multi-paper exploration. The papers may apply different
techniques to the same problem, or they may examine different stages of
the problem or different perspectives on it. The key thing here is that
the problem, rather than the tools, are the unifying theme: in the
analogy you’re trying to study the problem of fastening things to wood,
and study using a hammer and nails, a screwdriver, and glue. Or maybe
you study different things to do with wood and similar materials, like
pounding, carving, and painting.
The Hybrid
A hybrid dissertation is between the problem and the hammer: it focuses
primarily on one application or problem for 2 of the papers, and spends
the third showing that the techniques and/or knowledge are also
applicable to a related problem. You focus on the problem of fastening
things to wooden objects, and then show the hammer can also be used for
something else.
There are likely other workable designs as well, but most coherent
stories for 3–4 papers will probably fit one of these patterns, more or
less.
Dissertation Outline
So you have some papers, and an overall narrative to show how they
form a connected and coherent body of work. What does the actual
document look like?
There are some variations, but I expect most dissertations I advise
to have an outline approximately like this:
Introduction. The first chapter casts your
overall vision: defines your topic and the terms needed to understand
it, presents your story, and previews your contributions. In particular,
it sets up your organizing theme (either the hammer or the problem
you’re solving). By the end of it, the reader should know (1) what
you’re trying to do (including your organizing principle), (2) why it
matters, and (3) your core contributions. The rest of the dissertation
is to then convince them that you actually make the contributions you
claim.
Background & Related Work. The second
chapter is your primary literature survey. This serves two distinct but
related roles1: first, it covers the necessary
background for a reader who is competent in computer science broadly,
but not your specific specialty, to understand the rest of your work.
Second, it positions your dissertation work in the broader research
space, and in particular other work on your problem and related or
precursor problems.
This is the literature survey for your whole dissertation.
Some later chapters may also contain small background and/or related
work sections that survey work specifically supporting that chapter’s
unique work, but the common elements should usually be factored out into
Chapter 2. In some dissertations, you may present most of the background
in Chapter 1, so Chapter 2 is just related work, but in my experience
there’s still background that’s needed in Chapter 2.
Common Infrastructure (optional). In some
dissertations, you’ll have some resource, such as software or a data
set, that you use throughout the entire dissertation. If it doesn’t make
sense to describe it in Ch. 2, it can be useful to spend Chapter 3
describing this resource in some detail. In some cases, if it is an
original resource, it may also be a paper, particularly if your
discipline has venues for publishing resources such as the SIGIR
Resource Track or the NeurIPS Datasets & Benchmarks track. Many
dissertations won’t have a dedicated chapter for this, though.
Research Content. The next 3–4 chapters present
your primary research content. Each of your component papers usually
becomes a chapter; much of the content can be reused from the paper, but
you usually need to make a few changes:
Rewrite the intro so it flows narratively as a chapter of a book
rather than a standalone paper, including discussions of how it relates
to the other chapters (particularly the previous chapters)
Rewrite the background and/or related work so that any ideas shared
with the other papers in the dissertation are moved to Chapter 2, and
the content chapter only has background that’s specific to that
chapter’s methods (or the methods that are introduced for use in later
chapters). You don’t want to introduce the same related work in three
different chapters.
Expand the writing to include useful details that you had to drop
from the published version for length reasons, further charts and
results that shed deeper insight on your findings, etc. In some cases,
you may need to re-run or update experiments, particularly if your
methods have improved in later portions of the work. What this looks
like will differ a lot between dissertations; in my own, Chapter 3
described our research software, which evolved quite a bit from the
first published version to what was released as I finished grad school,
so I largely rewrote that chapter to describe the software as it was at
the end, not the first version.
Conclusion. Your last chapter ties it all
together: given the vision outlined in Ch. 1, and the work presented in
the research content chapters, what do we know about your topic now that
we didn’t know before you started the Ph.D? What are the next steps to
advance knowledge beyond what you’ve accomplished in the
dissertation?
Appendices. Some dissertations have appendices;
their use varies. I’ve seen them used for additional research content
outside the main narrative flow, such as another paper the student
wrote. They’re also useful for additional supporting evidence for the
research content that would break the flow too much if you included it
in the chapter, but you want to make available to readers who wish to
check your work more thoroughly. This can include documentation for
software you developed, more complete output from statistical models,
supplementary charts, etc. If anything is needed to understand one of
your research results, however, it should go in the main chapter,
not an appendix.
There are some variations on the themes — I didn’t have a 1:1
relationship between papers and chapters in my own dissertation — but
for a typical computer science dissertation, this outline will usually
work pretty well, and strikes a useful balance (in my opinion) between a
pure staple dissertation that does no integration, and a complete
rewrite of all the material.
Planning
When you’re planning out your dissertation work, particularly around
the proposal stage, that’s what you’re planning to write. Make sure you
leave plenty of time for the writing — it can take longer than you
expect, and while the dissertation doesn’t need to be your best writing,
it should be reasonably good and definitely needs to be clear and
readable.
]]>https://md.ekstrandom.net/blog/2021/12/tools2021-12-30T05:00:00.000Z
Photo by
Takehiro
Tomiyama on
Unsplash
It has been a couple of years, hasn’t it? I thought I would do
another state of the tools. Last year I
had other things on my mind and didn’t get to this kind of thing, but
let’s give it a whirl.
Things I’ve Kept
My stack has stabilized quite a bit over the last few years; many
things are the same, or slightly upgraded, from 2019. Highlights:
Surface devices for portability (Pro 4 at home, Go 2 at work). In
2020 I upgraded from the original Go to the Go 2, which is significant
upgrade in performance.
Dell desktops (2016 XPS i7 at home, 2019 Precision i9 at work)
iPhone 13 Mini and Apple Watch (I upgraded from the SE to the 11 Pro
at the beginning of 2020, and am now on the 13 Mini; only had it for a
few days but quite happy with it).
Windows 10 on the client (with Windows 11 on my Go 2).
RHEL 8 on the work server.
Google for work e-mail; Office 365 for personal e-mail, docs, and
storage.
Chrome for work-related browsing (linked to university Gmail).
Signal and WhatsApp for most personal communication.
Slack and Hangouts for work messaging.
Word and Google Docs for writing; Paperpile for citation
management.
Python for most programming; Rust for targeted speed improvements,
JavaScript for web-related things.
Editing in VS Code almost exclusively; a little Nano in the
terminal.
Git and DVC for code and data management.
PostgreSQL whenever I need a relational (or JSON) database.
Paint.net for lightweight image edits.
Grapholite and Visio for diagraming.
Drawboard PDF for PDF reading and markup.
1Password for password management.
Leuchtturm1917 A5 hardbound notebooks and a collection of fountain
pens.
Small Changes
Switched from Edge back to Firefox for personal browsing. Edge
doesn’t scale well to large numbers of tabs, and I believe Microsoft’s
shopping assistant is actively harmful to small Internet
businesses.
iPhone upgrade mentioned above.
WinCryptSSHAgent
for YubiKey/SSH support. Considering moving to PuTTY-CAC
Increased usage of Rust for data processing.
Graphics and Document Software
I still use Paint.net for lightweight raster image editing, but have
switched to Serif’s Affinity
suite for more substantial work (Photos for raster images, Designer
for vector images, and Publisher for advanced document preparation).
They’re much less expensive than Adobe’s suite, seem generally more
robust and easier to use than the open-source ones I had ben using
(Krita, Inkscape, and Scribus).
I’ve also switched from FoxIt Pro to Adobe Acrobat Pro for PDF
manipulation at work, now that Boise State has an Acrobat site
license.
Bicycling
My Novara Gotham commuter bike suffered frame failure mid-fall. I am
replacing it with a Tout Terrain Amber Road (frame-only, will build up
with the components from the Gotham, several of which I had upgraded).
The result will be a steel-frame commuter with an Alfine 8-speed
drivetrain with dynamo hub and Gates carbon drive.
I’m still using the Wahoo ELEMNT Bolt for my road bike rides, but
have switched from Strava to RideWithGPS for my cycle tracking. The
ELEMNT Mini didn’t work out, both because it wasn’t very reliable, and
Wahoo’s software update on the app seemed to break the Mini after they
discontinued the product; rather than trying another dedicated computer
and hoping it would work, I got a QuadLock handlebar mount to just use
my phone for mapping and logging. However, on my commuter, it’s pretty
crucial to be able to quickly see the current time along with speed and
ride statistics, so I can see how long I have until an appointment at my
destination. Strava doesn’t display a clock and doesn’t allow the live
interface to be customized. RideWithGPS has a customizable live display
including a clock.
Home Network
I’ve standardized my home network devices (NAS and media widget) on
Alpine Linux.
The “media widget” is a Raspberry Pi Zero W with a HiFiBerry
DAC+ Zero attached, using librespot to play
Spotify on our stereo. It also has shairport-sync installed for AirPlay,
but we don’t actually use that very often. I tried Raspbian on it for a
while, but had update problems with a slow SD card; upgrading the SD
card fixed that, but switching to Alpine in “data” mode has worked very
well and has a pretty simple upgrade path that doesn’t tax the Pi Zero’s
meager processor as much. With only minimal necessary software
installed, the system takes about 50–60 MiB of memory, which leaves
enough of the board’s 512 MiB free for system operations. I packaged
(and maintain) librespot for the Alpine testing repository, so the
install and updates are generally pretty smooth. I am very intrigued by
the Pi
Zero 2 W, but am not in a hurry to upgrade.
The NAS is still our old QNAP 2-bay NAS, running Alpine for
consistency across our network (and to give an environment with more
resources to test Alpine things for use on the Zero). I don’t actually
use the NAS for much anymore; I was using it to backup teaching
materials, but need to find new software to facilitate that since the
Boise State network blocks Syncthing for unknown reasons. If and when it
dies, I don’t know if I will replace it or not; would probably do
something on a 64-bit Pi platform.
One of my projects this year has been to refactor and upgrade our Book Data Tools to be easier to
work with. Along the way I found some bugs in the original data
integration, and the process of finding these bugs and assessing their
impact forms a useful case study for some of the principles I teach in
my data science
class.
Current State
The current published version of the tools uses PostgreSQL for data
storage and integration, which is pretty good in principle but has
significant impedance mismatch with my use of DVC to automate the data processing and
integration process. It has an ugly set of hacks involving status files
and two DVC stages for almost every logical stage of the data
integration pipeline (because my other egregious hack of monkey-patching
DVC to support a custom URI schema to track PostgreSQL data status as if
it were external data broke with DVC upgrades). The result was a
repository layout and set of program interactions that are very
non-obvious, so it’s harder than it needs to be for others to extend the
tools.
It’s also harder than it needs to be to manage different version of
the data, as we have to have different PostgreSQL databases, keep them
straight (and synchronized with Git branches), and it all takes a lot of
space.
PostgreSQL has served us well, but it’s time to move on.
Upgrade Pathway
In the time since I built the original data integration, the Apache
Arrow project has made significant progress on the Rust version of
Arrow, along with the DataFusion query
engine that supports SQL queries (with a lot of PostgreSQL syntax)
over Parquet files.
I have used this to rebuild the integration primarily in Rust and
SQL, using custom Rust code for data processing and DataFusion to
implement many of the integrations. This fits much better with DVC’s
file-based input/output model, as each stage reads input files (from
CSV, compressed JSON, MARC, an intermediate Parquet file, or whatever)
and produces output in CSV or Parquet format. We can use DVC as
intended, without needing to document our own weird pipeline quirks on
top of the data structures and integration logic itself.
The result is much faster (2 hours instead of 12), takes less space,
and removes both the impedance mismatch and some of the complexity of
installation (as users no longer require a PostgreSQL installation). It
does mean extending it usually requires writing some new Rust, but we’re
generally using our dependences as they’re intended to be used, which
should help a lot with that learning curve.
Spotting Problems
One of the things I teach my students about data integration is to
always track the coverage or the success rate of each link in their
integration pipeline. I do that in this project: for each source of book
or rating data, I measure the fraction of records that fail along each
stage of the pipeline:
Can’t find a book
Book doesn’t have authors
Can’t find information about authors
Author doesn’t have a gender record
This is all reported in the statistics
notebook, and allows us to have a good view of the data
coverage.
I watched these statistics closely while I was reworking the code,
and ensuring we had (approximately) the same coverage was one of the
major criteria for making sure I hadn’t broken the logic.
When I was pretty much done, though, I had a problem: the GoodReads
coverage was broken. All my other coverages (Library of Congress,
BookCrossing, and Amazon) were fine — slightly better, actually, because
I had improved some of the ISBN parsing and resolution logic, and had
updated the source data to use more current versions of OpenLibrary and
VIAF — but GoodReads had gone from about 58% unresolved books to 68%. I
fixed two or three other bugs (including working around an annoying bug
in the Rust implementation of Parquet) to get there, but the GoodReads
coverage wouldn’t budge.
Finding the Problem
After digging around for a while (the details are rather boring), I
finally found the problem: the original PostgreSQL integration code had
a bug in the GoodReads interaction data integration, where I used an
inner join where I should have used a left join. The result is that if a
GoodReads book did not have an ISBN, its ratings and interactions were
dropped entirely, instead of included as interactions with unknown
books. A lot of these are either older books or Kindle exclusives (or
editions that haven’t been linked with their works yet); it was a rather
large number of books, but they don’t seem among the more active
books.
I verified this by replicating the erroneous join logic in the new
code, and my coverage jumped back up to where it was supposed to be.
Glad I found the problem, but disappointingly it was due to a bug in the
version that supported the published results. Once verifying the bug I
reverted the change, because including all the records is the correct
decision for our purposes.
How Big is the Problem?
This data integration is the data set backing our signature book gender paper. Since the bug only
affected books that didn’t have links elsewhere in the database, and
most of the analysis focuses on books for which we have data on the
author’s gender, I expected it wouldn’t have much impact on the
published results: it would affect our GoodReads coverage statistics,
and the collaborative filters would be trained on a larger data set (one
that includes interactions with these unknown books).
But we need to make sure.
The paper is supported by reproduction
scripts that use DVC to automate the entire experiment process: run
dvc repro on a large machine, and a day or three later
you’ll have the results. This has had quite a few advantages, including
allowing us to do a clean re-run and report the compute resources needed
to reproduce the experiments in the paper. My team is also using this
repository as the basis for further research, so I have been working on
upgrading it to use the new version of the data integration instead of
pulling from the PostgreSQL database.
So, I imported the new data into the book gender experiment and
re-ran it.
As I hoped, the results stayed the same. The coverage plots changed
to reflect the new data coverage, but nothing else changed beyond the
expected variance due to randomization.
Sigh of relief.
Lessons Learned
I spend a lot of time polishing data and experiment pipelines —
sometimes too much time — but the result here was finding an interesting
bug, correcting it, and being able to verify that it didn’t invalidate
any of our experimental results.
There are many reasons why reproducible pipelines are important, but
this is one. It takes time and effort to achieve, but the resulting
improvements in robustness and confidence in results are worth
significant investment, in my opinion.
Next Steps
I still have some more polishing and documentation to do before
releasing the new code, but I plan to update the public version of book
data tools to use the new system shortly. I’ll also be pushing a new
version of the scripts for the paper that reproduce its results using
the current integration, as an example of how to use it. Stay tuned!
Ritual is a powerful tool for navigating life. David Allen, in
Getting Things Done, promotes a weekly review to take stock of
your current Next Action lists, identify projects that need to be moved
up (or down) the stack, and plan what’s next.
Regular rituals are an important part of my work management, linking
together my notebook,
runway, and self-care. My particular
practices are modeled most closely after the tactical practices of
implementing Michael Linenberger’s One Minute
To-Do List on paper.
The Week
The most central of my rituals is on Sunday evenings. I make a
practice of not working on Sundays; in the morning we go (or “go”,
during COVID) to church, and in the afternoon I relax, often with a
video game.
Sunday evening I begin to prepare for the next week. I fetch my notebook and my pens, typically pour myself a whiskey
(tonight I’m drinking a bourbon from Wyoming Whiskey), and reflect on
what I need to do the next week. If I’ve been able to rest over the
weekend, my mind is starting to think of the next week’s work, and
committing those thoughts to paper helps me put them aside (“this is for
tomorrow, and it’s written down so I won’t forget”) and start the week
with better rest; if I haven’t, it helps me get mentally ready for the
week ahead.
I use this time to fill out my Weekly Plan and the (initial)
To-Do and Scheduled sections of my Daily Log for Monday (see my
notebook description
for more details on what these contain). I consult both my calendar and
my runway when planning this, to see
if there are things coming up that I need to touch this week, if only to
check on their status. This practice helps me contain my thoughts, and
makes it easier to go to sleep Sunday night knowing that I’ve written
down the things I remembered over the weekend that I should do, and I
have a plan of action to begin the week. If I don’t make my plans on
Sunday, it’s easy to lie awake pondering the things I need to do. Monday
morning, I can wake up and meet the day.
Daily To-Dos
I operate day-to-day with a Daily Log. Before beginning the
day’s work (or occasionally after a first-thing meeting), I write down
my schedule and a set of Desired Outcomes for the day. The details of
this ritual are a little more variable; it’s usually in the morning, but
I also commonly do it as I wrap up work the day before. The day before
option is often helpful when I’m feeling behind, as making a plan for
the next day’s work makes it easier to call today’s work done.
Re-Copying Lists
In both my daily and weekly work planning, I am regularly writing
down the same items, either because they are recurring, or because they
didn’t get done the first time. This physical act of copying them, as
noted by Bob
Greenberg, helps me feel connected to my work, and forces a regular
implicit review of what exactly it is that I’m trying to do.
I’ve used various digital to-do lists, including the rather flexible
auto-prioritization logic of TaskWarrior, and for me, nothing beats
regular, tangible contact with my workload.
Longer-Term Rituals
At the beginning of each semester, I take stock of what my goals are
for the term, what I hope to accomplish for myself and my students. I
review and update my runway, breaking
out the new term’s months if needed and assessing the planned and
committed work.
I used to do annual plans as well, but with the runway giving me a
continuous big-picture view, the semester plans seem adequate to the
role the annual review used to serve. For a few years, I had a practice
of writing a blog post at the end of the year summarizing what I had
accomplished with links to public outcomes (see e.g. 2018); I may resume this practice in the
future.
Conclusion
Regular, often physical, contact with my workload helps me keep on
top of what I need to do. It also helps my mental and emotional health,
as planned times to review my work and plan the next week let me offload
things occupying (anxious) brain cycles and rest soundly in the
knowledge that they’re captured in a form more reliable than neurons.
When I’m feeling particularly underwater, the act of writing down what I
need to do helps me find my way out and think, concretely, about what to
do next.
Different things will work for different people, but I find analog
rituals to be crucial and these are ones that work for me at this time
in my life. In a year or five I may well be doing something differently.
We will see what the future brings.
If you’re feeling completely overwhelmed and having difficulty
planning your way through the next day, I found One Minute To-Do
List helpful in that situation — it starts with a short analog
ritual, and provides useful tactics for taking back some control of your
workload.
]]>https://md.ekstrandom.net/blog/2021/02/runway2021-02-04T05:00:00.000Z
Photo by
Jordi
Moncasi on
Unsplash
In “Holes”, I noted
that one of the holes in my work planning and management is a good tool
for tracking and planning upcoming work over time. I have now filled
that hole with my Runway Document, which also replaces “The Wall”.
Runway Organization
I keep my runway in a document in DynaList, an online outliner (similar to
Workflowy but with multiple separate files). I have a section for each
upcoming term (spring, summer, and fall), at least through the next
year. The current term, and occasionally the next term, is broken down
with a subsection for each month.
Within these sections, I keep a list of the things coming up that
month. Most of these are deadlines or commitments, but some are other
planned activities or ticklers (e.g. a reminder to re-activate a
currently dormant project). If something has a known deadline, I include
that (as a Dynalist date).
When something is done, I mark it as completed; at the end of a
period, I mark the whole period (month or term) completed after dealing
with the unfinished items (moving them to a later period or deleting
them if they are no longer relevant).
Adding to the Runway
Whenever I commit to something with a time period, like a talk or a
conference PC, I put in the runway.
When a CFP comes out that I want to target, I put it in the runway.
If it’s more of an aspirational target, I’ll put a question mark after
it.
When I have a project that I’m ready to actually start working on,
I’ll make sure key pieces and the tentative target are in the
runway.
When I create the section for a new term that contains deadlines I
typically target (FAccT, RecSys, increasingly SIGIR), I put those in,
even if the exact deadline isn’t available yet.
If something comes up that’s further out than my runway currently
extends, I create a new section for that time block (e.g. upcoming
semester or summer).
Using the Runway
The result of this practice is that, in addition to the weekly and
daily plans in my notebook, I have
continuous telemetry on where I sit with respect to my planned work for
the next year (at least).
When I am sitting down to plan my week (a typical Sunday evening
ritual; I’ll write more about my rituals in a separate post), I can review the runway
to see what’s on my horizon that I need to be making progress on, and
should think about adding to the week’s Desired Outcomes.
When I get a new review request, I can look at the runway and see
what else I’ve already committed to during that time. I try not to be on
more than one regular conference PC in any given month.
Reviewing the Runway
At the beginning of each term, part of my term planning process is to
flesh out that term’s outline into per-month details, and review for
things I might be missing (as well as things I should drop or defer due
to overcommitment).
I also review it as needed and try to make sure it stays current
throughout the term; I re-evaluate at least once a month to make sure
the current term still reflects my goals and the term’s surprises to
date.
Wrapping Up
I’ve been using the runway document for a little over a year now, and
it has significantly improved my ability to keep track of my work over
time and make more realistic plans on a longer time horizon. I wish I
had started this practice years ago — work is less overwhelming when I
have it slotted in to specific times and can think ahead about what to
expect in future months and terms. I finally feel like I actually have
strategic control of my future work, in addition to the tactical control
the other pieces of my productivity strategy afford. Time and
commitments are also a more useful way to manage future planning at this
time than the Kanban-style board modeling the research pipeline.
The runway is a plan, not a prison. I don’t treat it as a firm
commitment to myself, and adjust it liberally as my priorities change,
new opportunities arise, and projects take more or less time than
expected. It does help make space for things, though; if a new
collaboration possibility comes up, for example, I can think more
concretely about what I might need to give up to make it work, or
communicate up front about a realistic timeline for my involvement.
I’m not entirely sure “runway” is really the best name for this
document, because I’m always accelerating and never taking off.
Sometimes it feels a bit more like the little dog, building his railway
track just in time to ride on it, but it’s more like he’s got the
controls for a robot that’s laying it out a few more feet in
advance.
I use Jupyter notebooks extensively for data analysis and
exploration. It’s fantastic to be able to quickly see output, including
plots, and have it all saved and persisted and viewable on GitHub.
However, when it comes time to prepare for publication, I need to
save high-resolution and/or vector versions of the plots for use in
LaTeX or Word. The display in Jupyter does not have nearly high enough
resolution to copy and paste into a document and have it look acceptably
good.
Most of my projects, therefore, have a convenience function for plots
that are going into the paper. This function saves the plot to disk (in
both PDF and 600dpi PNG formats) and returns it so it can also be
displayed in Jupyter. That way I don’t have two copies of the plot code
— one for saving and one for interactive exploration — that can get out
of sync.
Python Code
The make_plot function takes care of three things:
Chaining the ggplot calls together (since the syntax is slightly
less friendly in Python)
Applying the theme I’m using for the notebook, along with additional
theme options
Saving the plots to both PDF and high-DPI PNG
Returning the plot for notebook drawing
This function is built for plotnine,
a Grammar of Graphics plotting library for Python that I currently use
for most of my statistical visualization. It should be possible to write
a similar function for raw Matplotlib, or for Plotly, but I have not yet
done so.
It uses a global variable _fig_dir to decide where to
put the figures. The extra keyword arguments (kwargs) are
passed directly to another theme call, to make per-figure
theme customizations easy.
Code:
import plotnine as pndef make_plot(data, aes, *args, file=None, height=5, width=7, theme=theme_paper(), **kwargs): plt = pn.ggplot(data, aes)for a in args: plt = plt + a plt = plt + theme + pn.theme(**kwargs)iffileisnotNone: outf = _fig_dir /fileif outf.suffix: warnings.warn('file has suffix, ignoring') plt.save(outf.with_suffix('.pdf'), height=height, width=width) plt.save(outf.with_suffix('.png'), height=height, width=width, dpi=300)return plt
I also have an R vesion from some older projects, before I switched
to Python. This one requires you to use + yourself; it
doesn’t have any automatic ggplot calls.
I also don’t have automatic theming in the R version, but it would be
easy to add.
]]>https://md.ekstrandom.net/blog/2020/08/teaching-data-science2020-08-23T04:00:00.000ZThis fall is my third time teaching CS533 (Introduction to Data
Science). I co-developed the class with Casey Kennington and taught
the first offering in 2017.
This intro is a class I had long wanted to create — when I was on the
job market the first time around, it was my answer to ‘what class would
you like to create?’ — but I haven’t yet really been able to achieve
what I wanted with it. This fall I am taking a step back and rebuilding
it. I hope it’s successful.
This post discusses my design goals and parameters for the class, and
its overall structure. I hope to expand on some specific aspects of it
in future posts.
Goals
One of the major goals of this class is to lay a foundation for
students’ further data science education that is grounded in goals,
questions, and principles, rather than tools, while simultaneously
giving them the technical foundation in commonly-used tools that they
need in order to do further data science work.
This creates an interesting dance, because students need to learn the
tools (in our case, the PyData stack), but do so in a way that makes it
clear that ‘learning data science’ and ‘learning
Pandas/SciKit/TensorFlow’ are different things. I try to do that by
leading with talking about defining questions and connecting them to
data, with the following working definition of data science:
Data science is the use of data to provide quantitative insights on
questions of scientific, business, or social interest.
I have deliberately crafted this definition to try to make clear two
key points:
Data science is in service of other interests, and should be
evaluated on its ability to further the goals for which it is employed.
Doing things with data for no particular purpose is just a fun
exercise.
Data science provides quantitative insight, not the
final, definitive answer the exclusion of all other sources of
knowledge. Later in the semester, I plan to contextualize data science
specificially, and quantitative knowledge generally, in a broader space
of sources of knowledge, and make it clear that while this class is
focused on quantitative methods they are by no means the only methods,
and that qualitative, analytical, and critical methods provide much
value.
I also want students to think pervasively of issues of ethics,
representation, bias, and justice in their data science work. I am
planning a module specifically on bias and social effects, but if it is
just one module that adds on to everything else, this goal will
completely fail. I am therefore building in concern for the people
represented and affected by data from the very beginning of the
course.
Flipping
This class is a prime candidate for a flipped-classroom design. The
classroom setting is perfect to practice the critical thinking and
iterative refinement needed to turn goals into questions into insights,
while lectures on how to write split/apply/combine operations, estimate
parameters, and train models can be consumed independently. I tried to
flip it the first time I taught, but it did not work because I didn’t
put enough time into creating and curating the out-of-class resources
needed to effectively support the flip.
Under COVID, though, video lectures have become my go-to strategy.
Due to my experience with the RecSys MOOC,
I’m already familiar with pre-recording lectures, and it has good
properties for enabling students to more easily catch up on material
they miss if they’re out with the roundboi for a couple of weeks. When
we suddenly went online in the spring, I used asynchronous video + open
office hours on Zoom during class time for my databases class.
COVID therefore is a forcing function to make me do the asynchronous
content delivery that I should have done the first time I tried to flip
the class. I’m designing the material with hope that I can keep using
most of it when we return to normal classrooms. This fall, I’m doing a
‘remote/online flip’: content delivery is through the videos, Tuesday
class time will have structured discussion and activities via Zoom, like
we would in the classroom, and Thursdays are for open Q&A.
COVID Design Parameters
Mild cases of COVID seem to usually take the form of ‘I cannot do
anything for two weeks’. I take a universal design approach to my class
structures as much as possible, so I adopted the design parameter that a
student needs to be able to miss 2–3 weeks of class and assignments with
negligible impact on grade and learning outcomes, without needing any
special accommodations. If they have a more severe case, or other
health, family, or personal issues arise that remove them from the class
for longer, then I expect to need to work with them individually on a
plan to either complete a sufficient subset of the class or take an
incomplete.
‘I got COVID’ is, of course, not the only way the pandemic will
impact me and my students’ lives. General stress, disruption, Internet
access, family needs, etc. all impact us in normal times, and those
effects will be exacerbated this year. I usually take a universal design
approach to those as well, through late work policies that provide
accommodation for students without demanding proof.
I document COVID-relevant policy design in my syllabus, but in
summary, here are the things that I’m trying to use to provide a
baseline level of flexibility:
Pre-recorded videos so they can catch up on content at their own
pace.
Two options for the synchonous class time.
Refined version of my late-day policy to give flexibility for things
arising that prevent assignment submission.
A makeup exam for a missed midterm.
Drop-lowest-grade policies for assignments and synchronous
participation (2/8 assignments, and 5/15 weekly participation
checkpoints).
A steady, predictable workload, to the extent I can accurately
estimate required effort, so it’s easier to plan and negotiate class and
the rest of life.
Structure
The first
week is all built out. A given week will have several video
lectures, broken down into small-ish pieces and totalling around 90–100
minutes per week. It will also have some reading; sometimes a paper,
sometimes online resources. For some material, there will be multiple
different resources that students can pick from.
Each week is going to have a page that has all of that week’s content
in one place, with the material needed for Tuesday’s class clearly
marked.
I’m also providing a Resources section that contains
software instructions, links to general reference readings, and will
include Jupyter notebooks that provide info on various programming
techniques we will be using.
I am forgoing a project in favor of regularly-paced assignments. The
first assignment is a warm-up with no original intellectual work, so
that when they do need to figure out course concepts, they aren’t also
fighting with how to run and submit a notebook.
Technical Infrastructure
I’m using Piazza for discussions and Blackboard for submitting
assignments. I looked at OKpy for assignments, but it didn’t do the one
thing that push me off of Blackboard — provide a good interface for
annotating Jupyter notebooks.
I’m building out course content in a static site hosted on Netlify,
with video on Panopto (provided by Boise State) and slides hosted on
OneDrive. I considered self-hosting video and playing with Video.js, but I couldn’t get it to work
very reliably and it was going to be quite a bit of effort to provide
videos at multiple quality/bandwidth tradeoff points. YouTube won’t let
me embed videos without some form of recommendations in them. I’m
recording and editing videos with Camtasia, using a Blue Yeticaster for
audio.
Privilege
There are a couple of things that make this substantially more
workable than it might otherwise be.
First, I’m navigating COVID from a maximally privileged position.
Second, Boise State is giving departments a good deal of autonomy for
how they meet their students’ needs, and in my department that means
individual faculty get to decide for the most part. This means that I
have been able to plan on this course design from the beginning of the
summer, rather than trying to prepare in a holding pattern while others
decided how I would offer my class. The immigration stuff in July did
throw a wrinkle into my plans, but that meant I was trying to find a way
to have a meaningful, minimal-risk in-person component as a hybrid
design, not change the whole plan.
Wrapup
COVID is forcing me to make some changes to this class that I think
are going to make it better even if we are able to return to some kind
of normalcy in the next year or two.
I expect that I’ll need to adjust and adapt as the semester
progresses, but it’s a plan, and I think it’s a pretty workable plan,
all things considered. We’ll see how it goes!
This is the third entry in Spoiler Alert, an intermittent
series of thoughts on media. These aren’t formal reviews, or essays
submitted for academic consideration, and I do not pretend the thoughts
are entirely original. They are just some of my thoughts about the work,
why it’s meaningful to me, what I think it says to the world, that sort
of thing. They are also opinionated and full of spoilers — if you would
prefer to avoid them, the close-tab button is up there somewhere.
This post contains spoilers for both Star Trek: Picard and
Star Trek: Discovery. And Voyager. And the rest of the
canon.
Star Trek, when it’s doing its job, has something to
say.
TL;DR: Picard has something to say.
Sometimes, that thing begins with an ‘f’, at least when said by one
of his co-adventurers.
The Measure of a Trek
Star Trek and The Next Generation tell the classic
Trek story: humanity — and sentient life in general — can
better itself, defeat its demons, achieve utopia, and go on missions of
exploration, diplomacy, and finding truly weird stuff, with the
occasional laser battle.
Deep Space Nine brings a new lens to the Trek
universe. They solve the puzzle of the week, but then — horror of
horrors — they have to deal with the consequences, instead of watching
them disappear in the aft sensor array at warp 8. There is actual,
lasting conflict that Sisko needs to negotiate. And he is not
Picard.
Right from the first episode, we know this isn’t the Star
Trek we know. First, it’s possible for someone to actually dislike
Picard. Second, the non-religious and deeply skeptical commander is the
local religion’s Emissary of the Prophets.
As the show develops, though, it reveals a deeper character. It is
driven by a question: ‘what does the glorious, utopian Federation do
when its back is really against the wall?’ While The Next
Generation made the Borg an existential threat, that was mostly
off-screen; DS9 has a front-row seat for the Dominion War. It starts to
deconstruct Roddenberry’s vision, probing its edges and revealing more
of the contradictions that lie beneath its surface and the lies that
hold it together.
Voyager likewise embraces conflict, and also has a question.
‘What does the Federation do when no one is looking?’ Will they uphold
their ideals, or compromise to shorten the journey home?
I’m pretty early in Enterprise, but am a little spoiled. It
fills in more of the picture: how did we get to the Federation in the
first place?
The movies do their own things; they fill in stories, but I don’t
draw great lessons from most of them. Into Darkness perhaps had
the most to say, with Kirk’s closing speech calling us to leave the
apocalyptic darkness that defines so much current sci-fi and return to
the path to utopia. I will note that Nemesis also has a
question, namely, ‘what happens when you let someone who has no idea
what they are doing make a Star Trek movie?’, which worked
about as well as letting William Shatner direct one.
You can only tell the story of utopia for so long. At some point, you
need to ask what makes it tick, and whether it really works as well as
everyone says. In different ways, DS9 and Voyager did
that, and did it admirably.
But Voyager missed the landing. The time-travel
transwarp-conduit nonsense that brought Voyager home was too simple. The
details would be different, but they could have pulled that rabbit out
of their hat any time after the first season or two. It cheapened the
entire show, in my opinion — if all it takes to get home is Future
Janeway playing a little loose with the temporal prime directive, why
did we put the crew through these seven seasons?
Discovery
Discovery was full of promise. Fascinating characters and
meaningful conflict. Michael Burnam, the human reaching for Vulcan
logic, a mirror of Data. Characters neither white nor male at the center
of the show.
Then they killed Phillipa Georgiou in the pilot.
And spent a half a season in the Mirror Universe, for no particular
reason. But at least we get Georgiou back, and Captain Killy was
splendid.
Then they put Pike in command of the ship, and showed that ‘stranded
in the Delta Quadrant’ isn’t the only reason the Federation doesn’t
ensure fleet-wide rollouts of new uniform designs.
The second season of Discovery did have some of the better
character and relationship work I think we’ve seen in any Trek.
The writing and acting as Michael and Spock’s troubled relationship
unfolded was brilliant. Control provided a new lens to address synthetic
intelligence. We get some backstory on Section 31.
But Discovery still faced the problem of its pre-written
future: a propulsion system far more advanced than any Enterprise we’ve
seen could boast, Spock’s human sister, and no one said anything about
either of these developments.
They wrote their way out of this problem, and set the stage for
seasons 3 and later to explore truly new territory, but at the expense
of what came before. When Discovery followed the Red Angel’s wormhole to
the 32nd century, and everyone with knowledge of it — or Control — swore
themselves to silence, it meant the first two seasons were just stories.
The had no significant impact on the broader universe.
I like stories, and I look forward to seeing where Season 3 goes. But
I also look for what Star Trek tells me about its world, and by
extension ours, and Discovery hasn’t really delivered yet.
Picard
Picard opens perfectly: Picard playing poker with Data. It
quickly moves to its question: what did the Federation do that Picard
could no longer wear its badge?
Picard’s fundamental goodness and unshakeable commitment to life
become the lens to tell of a Federation that failed its ideals. The
virtue he showed on the Enterprise, specifically but not only when he
defended Data’s personhood in ‘The Measure of a Man’, becomes a foil for
the fear that drives a beacon of freedom and universal dignity to
abandon refugees and outlaw an entire class of life. The retreat from
evangelistic utopia is accented by Seven, who has gone vigilante to
provide some safety, and if possible a little justice, to people the
Federation left behind.
Much of that is background — crucial background, but background — to
the show’s face story about synthetics fighting for a chance to live.
Their ‘humanity’ is never in question for Picard, or for Riker and Troi
(who we visit for a little while), but they are outlaws to the
Federation and anathema to the Romulans.
So we see Mass Effect in the world of Trek. Beyond
the edge of the galaxy is a race of super-synthetics, and if synthetic
life opens the portal, they’ll come and destroy the Quarians all
organic life. Synthetic and organic life cannot live in harmony.
Brother Adrian is going to help them.
It’s a gritty romp with a bit of nostalgia — besides bridge officers
we love, Hugh is back leading the project to free Borg from a disabled
cube and Icheb returns just long enough to die. It has some great new
characters, like Raffi and Rios. And Seven is queer.
Not exactly original, but it worked.
A Broken World
The world in which this story unfolds is deeply broken. Much of that
is well-told, with Rios, Raffi, and Picard each living in a different
way with the trauma of the Federation’s failures (and some Romulan
treachery).
But someone really needs to give the writer’s room some reading
material on mental health communication. The show displayed multiple
suicides on-screen, clearly implied the means of more, and had supremely
unhelpful comments from both Maggie Agnes and Narissa about the
value of life.
Could we not? I don’t mind dark tales, but it doesn’t mean we need to
throw best practices out the window. And they didn’t need to show
Icheb’s torture multiple times.
To Conclude
At the end of the day, Picardhas something to
say. It explores new angles of the Star Trek universe
and gives true closure to the song of Picard and Data, especially now
that Picard is synthetic too. It matters.
We’ll see what Discovery, the new Section 31 show, and
Picard do next. I’m still a bit skeptical but more optimistic
about the future of the Star Trek than the shows seem to be
about their universe.
About a year ago, I switched from technical liners to fountain pens
for the bulk of my writing. It started with picking up a Platinum
Preppy, and Jennifer giving me a Speedball set for my birthday. I now
have quite a few, with different inks and purposes.
Many of them I use largely to write in my notebook; analog
productivity rituals are important to me. Most of the ink reports here
are on the paper in a Leuchtturm1917 notebook, my primary notebook for
both work logging and personal journaling.
Metropolitan
My principal journaling pen is a fine-nib Pilot
Metropolitan loaded with Noodler’s Blue
Black ink. It writes beautifully and smoothly with a clean, fine
line.
The Noodler’s ink is relatively slow-drying, though. It’s fine for
writing flowing text in my journal, but for more outline- or
bullet-oriented text in my work notes, I wind up smearing rather too
much ink on my hands.
Blackheart
I can find no objective reason that I should love this pen as much as
I do, but I truly adore it. It’s a Hongdian Forest
Matte Black, EF nib, loaded with Waterman
Intense Black ink. I picked it up for less than $20 on Amazon;
cheap pens from unknown vendors can be hit-and-miss on writing quality,
but this has been a reliable hit. I use it as my primary pen in my work
notebook, as well as for other random black-ink writing.
The Waterman ink is working well enough, I definitely plan to finish
the bottle before changing. It’s not quite as dark as I might like, but
I’m hesitant to use Platinum Carbon Black in it. This pen’s solid heft,
steel construction, and literate metal steampunk aesthetics make me
think it could pair well with an iron-gall ink, so I might try Rohrer
& Klingner’s black next.
Purple Rain
This purple Pilot Metro Pop (equivalent to
the Metropolitan, but with flashier trim), also fine-nib, I keep filled
with Pelikan 4001 Violet ink. I use it for
marking up student work and papers I am reading, along with quite a bit
of my grading. It also provides accent colors in my work notebook.
You Shall Not Pass
This is a Faber-Castells NEO Slim, EF-nib,
that I filled with Rorher & Klingner Morinda
Red. I originally bought this pen hoping it would be my go-to
black pen, but when filled with the Waterman ink it was on the scratchy
side and had more feathering to the line than I wanted. It seems to
actually work better with the Morinda, and is serving quite well for
notebook accents and paper markup. I picked up the Morinda ink because
JetPens rated it highly for writing on plain copy paper, and it hasn’t
disappointed.
Something Blue
I use blue from time to time, my Platinum Preppy was running out of
ink, and its durability was not such that I wanted to invest in keeping
it going (plus Preppys are a mess with a converter). So I browsed around
on Amazon and found this Parker Vector for $15.
It’s not a great pen, it truly feels cheap, but it also somehow feels
right. It seems to be pretty durable — I’m not worried about
the barrel cracking like they do on the Preppy — and works admirably as
a tertiary pen in my active collection.
Right now I’m running the blue Parker cartridge it comes with. Once
that is empty, I’ll put in a converter and pick up another blue ink for
it.
Orange
This is the latest addition to the collection; I like my black
Hongdian enough, when I decided I needed to be able to write in orange
too, I bought the Hongdian 516 Stainless Steel
(F nib) and filled it with Pilot Iroshizuku Sunset
Orange (Yu-Yake). It just came today, so I don’t have much
experience with it. Its nib design is similar to that of the Parker and
Faber-Castells, very rounded and curved down at the point. It doesn’t
seem to write as smoothly as the Matte Black, but we’ll see what happens
as I use it more. My first impression is that it will do its job
admirably, but I probably don’t want it as a primary pen.
Sport Black
I have a Kaweco Sport, stocked with a
cartridge (usually Kaweco, but I have a few other short international
cartridges lying around too). It fits in my pocket, and writes tolerably
well but not as pleasantly as the Pilot or Hongdian. I have problems
with the cartridge coming loose and spilling ink all over the inside of
the pen, which gets annoying.
Inactive Pens
I started out my fountain pen adventures with the Platinum Preppy; these are cheap ($5) and write very
well. They have two problems, though, that keep me from using them as my
regular pens. First, they are not very durable: it is easy to crack the
barrel screwing it on to the section. Second, the nib and section design
is very difficult to clean after filling with a converter, as there is a
groove around the nib that fills with ink, which it then drips all over
your paper and the inside of the cap. This second weakness is also
shared with the more durable Platinum Plaisir,
which I tried for a little while as my primary black; I still keep it in
my desk to have a pen handy. I whole-heartedly recommend the Preppy to
anyone who wants to see if a fountain pen is right for them, however, as
it is a minimal-cost way to get started.
I also bought a 4-pack of Wing Sung 3008
piston pens. These pens were fantastic for trying out different inks as
I was getting started with fountain pens, but they are bulky and
uncomfortable for sustained writing. I keep them around for future ink
experimentation, but do not use them regularly. They do write well
enough, though.
This is the second entry in Spoiler Alert, an intermittent
series of thoughts on media. These aren’t formal reviews, or essays
submitted for academic consideration. They are just some of my thoughts
about the work, why it’s meaningful to me, what I think it says to the
world, that sort of thing. They are also opinionated and full of
spoilers — if you would prefer to avoid them, the close-tab button is up
there somewhere.
When I first saw the Jedi: Fallen Order banners showing up
in Origin, I was intrigued. Something struck me that this could be a
really good game. Possibly good like Knights of the Old
Republic, one of my favorite games.
That’s a high bar. Fallen Order is not KOTOR; is it
as good? I don’t know, and I don’t know if the question even makes
sense.
But I had a great deal of fun playing it, and also appreciate what it
did with video games as a creative media. It’s a good game, in my
opinion, and shows what can be done with Star Wars as a video game
environment.
Gameplay
Fallen Order is not an RPG. There are level-up and crafting
mechanics, but those are the only RPG-like dimensions; there’s no
morality system, no conversation trees, and the only real customization
points for your character are lightsaber aesthetics and which order you
choose to add skills at level-up.
It’s a straight puzzle-platformer with fantastic combat mechanics. If
you think “Lara Croft: Jedi Knight”, you wouldn’t be too far off.
And this game is hard, though I don’t consider myself a
particularly good gamer. I played most of the game on “normal”
difficulty (Jedi Knight), and found it challenging but rewarding. I
haven’t played many of the older Star Wars Jedi games (logged a few
hours in Jedi Academy), so I don’t have a good comparison. But
this is probably one of the most difficult games I have played in a
while. Boss fights reliably took a dozen tries, at least. Some
(particularly Ninth Sister and the Wanderer) took me substantially more.
But with one exception, the challenge was rewarding, so I kept plugging
away and eventually beating them. (I found the fight with the gryffon
thing on Dathomir annoying, so I beat it in Story Mode.)
I liked the lightsaber combat a lot. The game is a progressive
sequence of figuring out how to make the most of the new moves and
abilities you collect as Cal progresses. The game is advertised as
letting you “feel like a Jedi”, and I think there it delivered. It isn’t
lying, however, when it warns you that you really need a controller when
you try to play with keyboard & mouse — I don’t think it’s
physically possible to do some of the combos you need to be effective in
later-stage battles without a controller.
The fights also really felt like dueling, and not just
spamming attacks and health until the boss falls. Combat focuses on
combinations of parries, attacks (of various forms), and force powers.
It also doesn’t reward Use the Cool Stuff; while the dual lightsaber is
incredibly useful in some situations, it is not effective in single
combat, so you need to think about what will be most effective in each
particular encounter.
Story and Characters
The story was interesting and well-executed, but I didn’t find it
particularly memorable. I don’t remember any moments that were as
emotionally impactful as the reveal at the mid-point of Knights of
the Old Republic.
The characters carried it along well enough, though with flaws better
covered by others. Greez was fun. Merrin and Trilla were probably the
most interesting characters, but significantly underexplored. I also
think Aimee
Hart has a pretty good take that there is a lot of great character
and relational material the game overlooks, to its detriment. It also
sounds like the reasons that went into Cal’s design were pretty
bad. I also found an essay a couple months ago, that I can’t locate
again, arguing that Cal’s development overturns the toxic masculinity
that often accompanies white male video game protagonists, showing Cal
connecting more with his emotions.
The game’s droid, though. BD-1 is one of my favorite droids now. He’s
a small two-legged droid, much like a mini chicken walker, that the game
imbues with a good deal of personality.
Progression
One thing I think the game did especially well is leverage the
progression of the player’s skills for worldbuilding and storytelling.
It is important to note that the character does not progress much in
power — there is one level-up each to increase lightsaber damage,
health, and force capacity, and each force power has a power-increasing
level-up, but you don’t have the steady crawl of strength and HP
increases. Increased progression comes primarily through additional
skills (some of which, like the split saber attack, have more power than
earlier skills) and your own practice with the combat mechanics.
There are quite a few boss fights, and the second half of the game
keeps the coming hard and fast, both through scripted fights and the
random appearances of bounty hunters that provide a fight comparable to
an early-mid-game boss fight (the first 2–3 times, they wasted me
handily; by about midgame, I was able to reliably beat the bounty
hunters). They get hard; as I mentioned, Ninth Sister and the Wanderer
are especially potent foes. It may well have taken me 50 tries to beat
Ninth Sister.
But the recurring theme is Cal’s confrontations with the game’s
principal antagonist, the Second Sister. She’s a fascinating character
in her own right, but the connection of her combat with the player’s
skill progression and end-game reveal are a master class in using
gameplay to communicate.
There are three fights with Second Sister. The first is a brief
battle in the game’s initial escape sequence; you exchange a few
parries, and it’s clear that Cal is entirely unprepared to face her. The
duel ends quickly with the Mantis rescuing Cal.
The second confrontation is about 40% through the game, where she
intercepts Cal while he is trying to get to the second tomb. This is a
full duel, and brutal; I did not feel ready for it, either in terms of
Cal’s skills or my own practice with the game. You also don’t actually
win this duel; you survive and deal damage long enough for BD-1 to
rescue you, which happens when the Sister reaches about 25% health.
The game reached its climax in the Second Sister’s own turf, dueling
her for the holocron in the heart of the Fortress Inquisitorious. She is
in full form; after a half-dozen defeats, I figured out the trick and
was able to dispatch her relatively quickly, thanks in part to skill
upgrades and a better grasp of the interaction of force mechanics. The
Power of Friendship upgrade, so health packs replenish force power, was
critical. But it’s important that she didn’t get any easier; I just got
better at the game, and had a few character skills that let me maximize
those abilities.
Then, with the Second Sister defeated and the holocron in my
possession, Darth Vader shows up.
And completely destroys me in a single blow.
After Vader kills you the first time — an act I’m not sure it’s even
possible to prevent — you get his tactical advice card in the databank.
It provides one bit of advice: run.
So you run, and it’s a Tomb Raider-style escape chase to get
off the fortress, get rescued by the Mantis crew, and get the end-game
cut-scene to wrap up the story.
The result was a brilliant use of gameplay to apply the principle of
“show, don’t tell” to communicate just how powerful Darth Vader actually
is. You just beat the Second Sister, the game’s toughest baddie, who you
could not come close to matching for most of the game. If the duel in
the end was relatively easy, as it was for me, it creates a sense of
“I’ve gotten pretty good at this!”
And Darth Vader is playing an entirely different game. There is
absolutely no way to match his power or skill. You got good, you
defeated the most difficult villain in a difficult game, and cannot
touch Vader.
When rewatching Lord of the Rings last week, I was reminded
of this when Sauron steps onto the field in the opening battle: no one
stands a chance.
But, and this is a significant problem: this bit of brilliant
storytelling mechanics turns a compelling woman of color into a device
to talk about Darth Vader. The mechanism could have been put in service
of a better arc and turn.
Conclusion
There’s a lot of good debate and critique to be had about what
Fallen Order did or did not achieve with its story and
characterization. I don’t think either rose to the heights of either
Knights of the Old Republic or the older game’s flawed but
brilliant sequel.
But I had a great deal of fun playing the game, the duels were
satisfying, and I think there were things it did really well,
particularly to showcase the capabilities of gameplay itself as a
narrative device. There’s a pretty good chance I’ll play it again,
possibly at a harder difficulty.
Surface devices for portability (Pro 4 at home, Go at work). When it
is time to replace my now-aging Pro 4, I will probably get a Go
(hopefully a Go 2 by then) for home, as I really like the portability
and do most of my gaming on the desktop now.
Dell desktops.
iPhone SE and Apple Watch.
Windows 10 on the client.
Red Hat (now RHEL 8) on the work server.
Google for work e-mail; Office 365 for personal e-mail, docs, and
storage.
Signal and WhatsApp for most personal communication.
Slack and Hangouts for work messaging.
Word and Google Docs for writing; Paperpile for citation
management.
Python for most programming; Rust for targeted speed improvements,
JavaScript for web-related things.
Editing in VS Code almost exclusively; a little Nano in the
terminal.
Grapholite, Paint.net, and occasionally Inkscape or Krita for
graphics. Lightroom and PS Express for mobile editing.
Drawboard PDF for PDF reading and markup.
1Password for password management.
Additions and Changes: Scripting and Editing
This year, I have adopted Data Version
Control (dvc) for scripting and managing data in experiments. Last
year I mentioned that I was not happy with Invoke; DVC has filled in the
gaps and is quite a nice tool for managing experiment steps,
dependencies, and output files.
I now use docopt for writing the
command-line interfaces to individual scripts, which are then controlled
by DVC.
I have also leaned more heavily into VS Code, as its Remote mode is
the best experience I’ve ever had editing code on servers. It also makes
the Surface Go even more viable as an all-purpose portable device,
because the code analysis server can run on the (beefy) remote server
instead of the local machine.
Finally, I have refined my YubiKey setup, making work with
remote servers (including VS Code remote sessions) pretty seamless.
Experimenting with Citations
I spent some time this year using Zotero as my citation manager
again, but switched back to Paperpile early in the fall. Paperpile’s
interface is more polished, and it now has a Word plugin. It also
doesn’t take nearly as much local disk space.
Pens
I continue using the Leuchtturm 1917 notebooks for my daily planning. This year
I switched from technical liners to fountain pens.
I have had a great deal of fun with fountain pens. They can be a bit
messy, but feel great and write well. I get a joy from writing with them
that I haven’t had from writing in a while. My current set is:
Faber-Castell NEO Slim Stainless Steel with Waterman Intense Black
ink
Purple Pilot MR Retro Pop with Pelikan 4001 Violet ink
Wing Sung 3008 with Rohrer & Klinger Morinda Red ink
Kaweco Sport with Kaweco black cartridges
Pilot Metropolitan with Noodler Blue Black ink
Platinum Preppy EF (several colors)
I tend to run F or EF nibs, preferring EF for my planning notebook. I
don’t particularly like the Wing Sung pen; Amazon had a set of them
cheap, and it was an inexpensive way to quickly expand my color set. I
have been replacing the Wing Sungs one by one, and don’t expect to keep
using one for my red ink much longer. I might load a couple up with
green and orange.
The Preppy is a fantastic pen to get into fountain pens. They are not
very durable, but write quite well and can be had for around $5
each.
My favorite for writing are probably the Pilots (MR Retro is just a
Metropolitan with a different design). Smooth, reliable, and pretty
clean. The Noodler Blue Black ink has a long dry time, so it isn’t very
good for my planning notebook, but it’s great for journaling or other
sequential writing. The Morinda Red is beautiful; I bought it in part
because JetPens reported that it worked particularly well on copy paper,
but I mostly use it for highlights in my Leuchtturm. I use the purple
Pilot for markup, grading, and contrast / highlights in my planning
notebook.
The Faber-Castell has been a little disappointing. Once ink starts
flowing, it works well, but it usually takes a bit to start. The Pilot
pens reliably start writing immediately.
Cycling
I had been using Trails on my phone for tracking bike rides. It
worked pretty well, and I loved that it kept all my cycle records
locally on my phone. It also conneted nicely with my Topeak speed and
candence sensor. However, the development team seems to have dropped
away (their server SSL certs have been expired for several months), and
my phone battery doesn’t last for longer rides, especially when my route
takes me out of cell service area.
So I got the Wahoo
ELEMNT Bolt for my road bike, started tracking my rides in Strava,
and generally have been pretty happy with the arrangement. It works with
my existing Topeak sensor, has great battery life, solid physical and UI
design, and Wahoo’s mapping is quite good as well (at least in
Boise).
I also made some upgrades to my commuter: rebuilt the front wheel
around a Shimano Alfine dynamo hub and installed Bush and Müller lights.
Not worrying about charging my bike lights every day is wonderful. End
of the year, replaced the Cateye Padrone I was using with an ELEMNT Mini
so I can track my commutes in Strava as well.
Bikes are a Specialized Diverge Sport (road) and Novara Gotham
(commuter).
What’s Next?
I’m upgrading my work desktop; sticking with Dell, but getting an i9
with 64GB RAM at the beginning of the year.
I’m not sure how much longer I will stay with the iPhone SE; I love
the SE’s form factor, but since iOS 13 I am having no end of battery
problems, and the OLED display in the iPhone Pro 11 is extremely
tempting. A larger screen would also make it easier to read more on my
phone.
I’ll probably make a few other changes as well, but seem to be
settling in to a set of tools that work well with minimal maintenance
headaches.
It has taken me forever to find acceptable financial software,
though.
]]>https://md.ekstrandom.net/blog/2019/10/yubikey-ssh2019-10-12T04:00:00.000Z
Photo by
CMDR
Shane on
Unsplash.
Some time ago, I got a YubiKey 4. I use it to secure access to a
number of web services I use, but also to authenticate myself over SSH.
Among its features, it supports being an an OpenPGP smartcard, which
means — with some fiddling — it can be used for SSH authentication, so
my SSH private key does not actually live on my physical computers.
This page documents the pieces I need to put together in order to get
it working on Windows with all of the different SSH interfaces I use:
PuTTY, WinSCP, OpenSSH for Windows, and Git. I do this through the
Pageant agent.
Software and Requirements
I use SSH in several places in my workflow:
Remote shells via PuTTY, MobaXterm, or Windows OpenSSH.
Transfer files with WinSCP.
Push and pull from GitHub. Most of my local repositories are pulled
over HTTPS, but a couple use SSH, and I use SSH (authenticated with a
forwarded SSH agent connection) for all my repositories on servers.
Visual Studio Code remote sessions.
The first three can all be done with PuTTY, so as long as I can
connect PuTTY to the smartcard, I’m good. VS Code, however, only
supports Windows OpenSSH for its remote sessions, so I need it to be
able to connect as well.
I occasionally use WSL, which induces yet a third set of requirements
for connection. I don’t do this very often, though.
History: GPG4Win
Most existing documentation focuses on using the YubiKey with GPG4Win
and gpg-agent’s OpenSSH and Pageant compatibility
layers.
This works, but I found gpg-agent to be less than
reliable, particularly when I inserted and removed my key. I commonly
needed to restart the agent in order to make the public keys available
again. I wrote a script to do that, but it was annoying. It also
required custom editing of the configuration file to actually use my
YubiKey.
But since I was using GPG4Win when I started, I used it to initialize
the YubiKey’s keys. I therefore cannot provide instructions for setting
up the public and private keys without GPG.
Installing: Scoop
I use Scoop to install a lot of my
Windows command line (and some GUI) utilities. Most of the software I
use here is available with Scoop:
PuTTY (and compatible programs, such as WinSCP and MobaXterm) use the
Pageant SSH agent (included with PuTTY). This agent lives in your system
tray and handles authentication with your SSH private keys. Before using
a YubiKey, I used it as my standard SSH agent on Windows with an on-disk
private key, and it worked well.
Dr. Peter Koch has made a smartcard-enabled version of
Pageant that Just Works, without configuration, and I have never
needed to restart it after inserting my YubiKey.
I have Pageant SC automatically start on startup, and have no
problems connecting any of my PuTTY-compatible programs to it. To start
it on startup, create a shortcut in the following directory:
%USERPROFILE% is the path to your user profile
directory, that contains all your user folders. For me, it’s usually
C:\Users\MichaelEkstrand or something like that.
Connecting Git
By default, Git uses its own bundled version of OpenSSH (which is
distinct from Microsoft’s OpenSSH for Windows project). This SSH cannot
talk to Pageant.
I fix this by configuring Git to use plink.exe from
PuTTY. I set the GIT_SSH environment variable (in the Start
menu, search for ‘Edit the environment variables for your account’) to
the path to my plink.exe executable. Since PuTTY is
installed with Scoop, this path is:
%USERPROFILE%\scoop\apps\putty\current\plink.exe
By using the current path, I avoid needing to change it
when I update PuTTY.
Connecting Windows OpenSSH
The last piece is to connect Windows OpenSSH (and if desired, WSL).
The wsl-ssh-pageant
program does this quite well, and it is available in Scoop.
I created another shortcut in the startup directory to run the
following command:
This exports an OpenSSH-compatible agent connection and proxies it
Pageant, which in turn hands it off to the YubiKey.
To make OpenSSH use this connection, set the environment variable
SSH_AUTH_SOCK to \\.\pipe\ssh-pageant. Running
ssh-add -l in PowerShell should show your YubiKey’s
keys.
Next Steps & Final Remarks
The WSL/SSH Pageant bridge supports WSL in addition to Windows
OpenSSH. I haven’t needed it yet, but once I do and get it working, I’ll
update these instructions with the details.
All of this software works without administrator privileges,
so this setup is usable in e.g. university computing lab
environments.
Alternatives
I have spent some time experimenting with doing everything with
Windows OpenSSH, with a per-machine private key stored in each machine’s
SSH agent. There are a few drawbacks to this approach, however:
WinSCP and MobaXterm don’t work. File transfer and X11 forwarding
are therefore more difficult.
There is no prompting for any kind of PIN or passphrase after
enrolling a private key in the Windows OpenSSH agent. It’s therefore
possible for authentication attempts to happen without my knowledge, and
without any way to stop them. While I am already in substantial trouble
if an attacker is running code on my machine, the ability to easily
bridge from my machine to another without any notice or plug to pull is
troubling.
Managing a different public key for each client machine is
cumbersome, as I need to install that public key on several different
servers and web accounts. There are at least 4 different places I need
to store public keys for regular access.
We’re going to try something new here. Writing about books. And maybe
other creative works. I’d like to put some more content on my blog, and
books seem like a good source of that.
This isn’t a formal review, or an essay submitted for academic
consideration. It’s just some of my thoughts about the work, why it’s
meaningful to me, what I think it says to the world, that sort of thing.
It’s opinionated and full of spoilers — if you would prefer to avoid
them, the close-tab button is up there somewhere.
So with that, let’s get started. Isaac Asimov’s Foundation
trilogy (comprising Foundation, Foundation and Empire,
and Second Foundation) was probably, until last year, my
favorite trilogy.
Premise: Quantitative Social Science, Perfected
Foundation follows the standard pattern of ‘straight’
sci-fi1: posit a scientific development or
context and work out social, environmental, and other implications of
it. I enjoy reading sci-fi that does that and does it well.
When Foundation opens, we aren’t left guessing at the premise. The
recently-perfected science of ‘psychohistory’ — quantitative history,
sociology, political science, etc., developed to be as predictive as
physics in terms of the statistical behavior of societies of people —
has shown that the Galactic Empire will soon collapse, and there will be
10,000 years of war and conflict before a similarly stable arrangement
is once again achieved. Hari Seldon, the discoverer and principal expert
of psychohistory, has discovered a means of shortening this period to
1000 years, and to that end, created two foundations at opposite ends of
the galaxy. The books are primarily directly concerned with the
activities of the First Foundation, ostensibly founded to curate an
Encyclopedia of galactic knowledge and history. Through psychohistory,
Seldon predicted that creating these foundations, with particular goals
and instructions, would cause the emergence of a second empire after
only 1000 years of conflict.
What are the ramifications of such a science? In this scheme of
predictable courses of human events, what are the roles of science,
commerce, religion, and government? These are the questions with which
Foundation is concerned, at least at the outset.
Asimov at his Height
These books are, in my opinion, the height of Asimov’s creative work.
Short stories were the form in which he was by far the strongest, and
Foundation was written and originally serialized as 8 short
stories (4 for the first book, and 2 each — approaching novellas in
their length — for the second and third).
With the spare strokes of a sketch artist, Asimov tells his story —
the story of the first few centuries of the inter-empire conflict — by
dropping in to key moments and describing specific events and characters
that shape the broader universe. He paints its inflection points, and
leaves the reader to interpolate the rest of the curve.
Most of Foundation would make terrible TV or cinema.
Science and its Subjects
The single most fascinating thing to me about the world of
Foundation is the social-scientific premise: that we can
predict the future course of human events with the same accuracy with
which we can chart orbital mechanics.
Two crucial caveats to ‘psychohistory’ make it particularly tenable
as a premise. First, it is statistical; it operates at the level of
societies, at least as large as a good-sized city (better if it’s being
used to model an entire planet’s population). It cannot predict the
behavior of individual people, and it becomes less accurate as the size
of the group being modeled decreases. This is how we would expect any
such science to work.
Second, the predictions are invalid if the population for which they
are computed is aware of them. Members of society can be aware of the
existence of pyscho-history, but cannot know its particular predictions;
as a corollary, if sufficient members of the society in question know
pyscho-history, then they could deduce and thereby invalidate the
predictions, and thus there were no psychohistorians in the Encyclopedia
Foundation.
I’ve wondered how we could test whether widespread dissemination of
the findings of social and behavioral science affect their future
validity. In some cases, could effects fail to replicate because they
became sufficiently well-known so as to inoculate future research
participants against them?
The necessity for subjects’ ignorance also brings us to a major
weakness: psychohistory is only deployable in heavily paternalistic
settings. The Seldon Plan is the mother of all Nudges. There is
no room for autonomy, for self-determination, except within the degrees
of freedom afforded by the intrinsically statistical nature of
psychohistory.
Breaking the Premise
The first book and a half are entirely concerned with working out the
course of history under psychohistory in a relatively straightforward
fashion.
In the second part of Foundation and Empire, the story ‘The
Mule’, we take a turn: what happens when events arise that psychohistory
cannot account for? In this case, it was the rise of ‘the Mule’, a
mutant who is able to telepathically influence significant groups of
people. Psychohistory cannot model individuals, and when an individual
arises with such outsized ability to affect the course of events things
break down.
Second Foundation describes the search for the other
foundation. Seldon said he founded two, but did not specify the location
of the second it had no visible activity or influence; some were
questioning whether it ever actually existed. In concluding the search,
however, Asimov takes us to a second level of breaking down the premise:
what if psychohistory never really worked? Or, at the very
least, what if it was incomplete? The Second Foundation, it turns out,
was entirely psycho-historians, working out the remaining details of the
Seldon Plan that he was unable to complete before his death.
As a reader, I loved the trajectory of the scientific premise.
Psychohistory itself was almost a character. What if it works? What
happens when it meets an insurmountable obstacle? What if it never
really worked as well as we were led to believe?
Staring in STS at the Great Men
But the Foundation is cracked. For all his imagination,
Asimov couldn’t create a world where the Important Decisions weren’t
mostly being made by old men of unmarked race literally smoking
cigars in private meetings in back or upper or whatever rooms. We
have interstellar travel, safe nuclear power that fits in your pocket,
an empire that spans a galaxy, and the day-to-day of who is deciding the
course of history and how is precisely as it was in 1950s America,
cigars and all. We get a small breath of change in the last installment
of the trilogy, when young Arkady Darrel works around her father’s rules
and heads off to follow her grandmother’s footsteps searching for the
Second Foundation, but it is a very standard story of that type; it does
not represent any real subversion or re-imagination of the workings of
of society. Everything is entirely predictable, continuing as it did
when Asimov wrote. Could psychohistory account for the rise and
consequences of intersectional feminism? Can it conceive of a society
that takes seriously the work of building itself upon equitable
justice?
It is perhaps this frustration that caused me to resonate so deeply
when, on Page 3 of The Fifth Season, N. K. Jemisin said of the
government and its trappings:
None of these places or people matter, by the way. I simply point
them out for context.
No one book will do everything, but can we have a little imagination
on what makes society tick? Please?
Throughout Foundation, Asimov also has a complex
relationship with the Great Man view of history. Psychohistory itself,
and the enactment of the plan, depend heavily on the Great Man Hari
Seldon. He has research assistants, but there is little sign of serious
collaborators. When the Second Foundation is revealed, however,
psychohistory has taken a significantly more collaborative turn. It’s a
rite of passage for members of the Second Foundation to contribute
something to the Seldon Plan, to work out some theorem of history that
fills in one of its many remaining holes.
As the history unfolds, Asimov focuses on the men at the heart of the
action for each of the inflection points. Psychohistory’s inability to
model individuals at first seems like it precludes a Great Man view, but
yet, at each turn, it is a Man who brings about the shift that
psychohistory predicted. Governance of the foundation’s society shifts
to the mayors; Mayor Hardin solidified and strengthened the office of
the Mayor and made it happen. History was destined to flow through the
rise of the Traders and Merchant Princes; Hober Mallow made it happen.
We’re left with an unclear picture of how socio-environmental factors
and individuals relate in the balance of influence on history, but the
picture is one that is uncomfortably reliant on great men, a reliance I
felt went beyond credibility.
Finally, the social science underlying Foundation is
exclusively quantitative. There is little room for qualitative work (or
if there is room, it is not well-stated), let alone critical
analysis.
Other Books
Many years after publishing the trilogy, Asimov wrote two successor
books (Foundation’s Edge and Foundation and Earth) and
a few prequels.
I can’t recommend anything other than the trilogy. Foundation’s
Edge is a good enough book — it’s clunky, but a significant
improvement on some of Asimov’s earlier attempts at novels. It’s an
interesting story that explores in much more depth things we learn about
the Second Foundation.
But it leaves some questions open, and to answer those questions, one
turns to Foundation and Earth.
In my humble opinion, Foundation and Earth is one of those
rare books that retroactively makes other books worse. In his later
career, Asimov was working to unify his sci-fi worlds (Robot, Empire,
and Foundation) into a single, coherent universe. Connecting Foundation
and Empire works well enough, but the way Foundation and Earth
connects them to the Robot stories I found profoundly unsatisfying.
Recasting the origin of psychohistory and the Seldon Plan so that they
were really the work of telepathic robot R. Daneel Olivaw who has been
secretly guiding human history across the galaxy from his secret base on
the moon for 20–50K years, instead of a scientific discovery we could
roll with as a premise, left a pretty bad taste in my mouth and stripped
the wonder I experienced when I first read Foundation. So I
prefer to pretend they do not exist, and enjoy the trilogy on its
own.
(I haven’t read the prequels at all — Asimov wrote them after
Foundation and Earth, so I can’t see how they wouldn’t be
predicated on the Robot connection I didn’t like.)
Conclusion
I first read Foundation in grad school, at a time when I was
beginning to think more about the import of social science on my
understanding of the world and my work as a computer scientist. To read
sci-fi that grabbed a social science premise head-on and ran with it was
thrilling, and helped me sharpen some of my thinking about how the
science I was learning interacted with life. It was also a series that
John enjoyed, if my memory
serves, and the time in which I read it was the time I was really
starting to have productive discussions about this science-life
interaction with him. Some of my fondness may well be a result of that
context and impact, rather than any intrinsic merit of the trilogy. I
don’t particularly care.
It’s unimaginative in problematic ways. It’s got holes you can drive
a visi-sonor delivery truck through. But I expect I’ll read it again a
few more times, and dearly love the way in which the story unfolds
through little painted windows. I appreciate literature that gives a
window on a much larger story, and in that respect, Foundation
delivers.
I hope this won’t be the last of these I do! I’m going to aim for
writing them on Sundays for a while; we’ll see if that’s regular, or
more of an intermittent Sunday activity. Not making any promises. But I
hope to write one of them about my new favorite trilogy.