RSSAmplifier

Blog

(untitled)

ktema.orgRSS feed ↗87 posts

Latest posts

Build better software to build software better

On Minimalism in Software

Please stop calling software minimalist . It does not mean very much, and it suppresses productive and inclusive discussion of the choices we make when we build software. I see these descriptions all the time. Project A is a "minimalist window manager". Project B is a "minimal but featureful RSS reader". Project C offers "everything you need, without all the bloat". D "does one thing and does it…

Stave

Stave is a free and open source application for roller derby events. Stave provides a signup form builder, cross-league calendaring, a smart crew designer, and email templates. Roller derby leagues can recruit officials and other volunteers for events from a single game to a multi-day tournament, while officials can calendar their open applications, track acceptances, and store profile…

The Worst Thing I Ever Built

More than twenty years ago, I cut a corner to save the princely sum of about $200. I am still supporting the technical debt from that decision today . This is the story of the worst system I've ever built. My father was already wearing many different hats for our local community association when they had need of a new bookkeeper. He wasn't a bookkeeper, but we were confident we could set…

monitor-affinity

Route bars and widgets to monitors based on criteria like "largest" or "rightmost". For users of polybar and similar tools on X.

NSO Paperwork and Statsbooks

This talk covers how non-skating official (NSO) paperwork "works": how the different sheets interact, how they are entered into a statsbook, where mistakes have high impact, and the basics of statsbook data entry. You'll be equipped to understand the "why" of NSO paperwork and ready to make judgements about how to fix problems live.

Scoreboard Operations

This talk walks through how to operate the Roller Derby Scoreboard (often called CRG) as a non-skating official. We set up the scoreboard software. Then we walk through setting up games, running a game, troubleshooting, and downloading paperwork. We talk about the SBO role and how not to be afraid of CRG.

Intro to Tournaments and Sanctioned Play

This talk guides non-skating officials (NSOs) on how to move from officiating scrimmages and home mixers to the higher levels of sanctioned play and tournaments. We cover what makes a sanctioned game sanctioned; what behaviors are important for NSOs; how to get into a tournament; and how to succeed once you're there. This session expands slightly on a previous session offered in early 2024.

Non-Skating Official Guides

I've launched a new project: a suite of manuals for tournament-level non-skating officiating. Check out Non-Skating Official Guides (manuals for PBM and Jam Timer written so far!) My goal is to create resources that bridge the gap between scrimmage-trained officials and officials who succeed in high-level play. I start from and defer to all WFTDA, MRDA, and JRDA resources, pulling together…

Tournaments and Sanctioned Play for Non-Skating Officials

On Creating Automation Products

The most important skill I learned from Jason Lantz was seeing products hiding inside business problems that are usually addressed with tools . That approach drove the success of the team that created CumulusCI , MetaDeploy , Metecho , and a number of other automation-focused products for teams building on Salesforce. It's also a subtle distinction, between products and tools . I've been…

The Overengineered Resume with Zola, JSON Resume, Weasyprint, and Nix

Maintaining a resume is not the most interesting use of time. Naturally, when I needed to bring my own up to date, I decided to spend a great deal more time on it and overengineer the process. I wanted a bunch of things that didn't necessarily fit together that well: A split between content and presentation, so that I could maintain my resume data separately from how it's rendered and…

Supercharge Developer Productivity with Delivery Cloud

Understanding Build Orgs, Part 3: Manipulating the Build Org

This discussion is derived from my experience building packages, writing packaging clients via the public API, and inspecting the public source code of the SFDX CLI. No internal or proprietary information about the Salesforce packaging system is included. This third part of the series, which began with Understanding Build Orgs: Environmental Dependencies , What does unpackagedMetadata do for a…

PayTransparency.work

I'm very excited to launch PayTransparency.work , a new site dedicated to sharing pay transparency rules across the United States. More and more states and local jurisdictions are mandating that employers disclose salary ranges to job-seekers and employees. I've written about pay transparency in Colorado in the past, and I'm very excited about creating a platform to present…

Understanding Build Orgs, Part 2: How a Build Org is Built

This discussion is derived from my experience building packages, writing packaging clients via the public API, and inspecting the public source code of the SFDX CLI. No internal or proprietary information about the Salesforce packaging system is included. In Part 1 and in a previous discussion of build orgs and runtime dependencies , we looked at how the platform provides a number of different…

Understanding Build Orgs, Part 1: Build Orgs and Environmental Dependencies

This series discusses second-generation managed and unlocked packages. It does not apply to org-dependent unlocked packages or to managed packages built with the Skip Validation option. Portions of this discussion also apply to first-generation managed packages, but different techniques apply in that context. Creating a second-generation package version seems almost magical: there's no…

The Sneaky Way to Install a JWT Connected App

If you build backend services that integrate to Salesforce, you may have encountered this unusual scenario while setting up the JWT Flow. You've built a service, Service A. You've created a Connected App in an org you control (Connected App Org). Meanwhile, you have one or more production orgs you plan to integrate with Service A (Orgs B-F). You're using the JWT Flow, because…

Salesforce DevOps: Top Tech Trends

I had a great time discussing DevOps (and broader landscapes) with the inimitable Jason Lantz, Mitch Spano, and Rob Cowell. It was particularly neat to see insights from different lenses - internal Salesforce, large enterprise, and ISVs - honing in on shared principles. Check out the video hosted by Gearset.

Supercharge Developer Productivity with Cumulus Suite

The Magic of APIs for Admins

The Charlotte, NC Nonprofit Users Group was kind enough to have me for a talk about APIs for admins: what is an API, why is it an important concept, and how can we use it to solve business problems? I started my career as a nonprofit admin who was incredibly excited about using the Salesforce API to build things, so this topic was near and dear to my heart.

Why Does `git rebase` Merge Conflict?

I've got a really ugly branch ( daves-feature ) going. I started my branch from main , but later realized it was better suited to be based on parent . My commit history looks like this: ac1f97e (HEAD -> daves-feature) Hush, Pyright 1a48f15 Cleanup c18fe09 Working parallelization with passing tests b99aef1 Merge 8c048ba (parent) Add multi-status field 30084f1 WIP c7c4f26 Try a different…

Wage Transparency in Colorado and Beyond

Important disclaimer : I am not an attorney. This is not legal advice. My home state of Colorado's Equal Pay for Equal Work Act went into effect in January of 2021. This law has a number of important provisions, including a prohibition on wage discrimination across multiple protected classes. One of the most broadly visible provisions, though, is the requirement of salary transparency .…

The Risks of Copying and Pasting Apex

It's a tricky position to be placed in: you're an admin, a declarative developer, or a junior developer, and your leadership comes to you with an ask that you know requires Apex that you haven't been trained to write. What do you do? You're a problem-solver and you want to deliver value to the business, so you hit the Salesforce content sphere on your search engine of choice…

What Does `unpackagedMetadata` Do for a Second-Generation Package?

Second-generation packaging offers the opportunity to specify unpackaged metadata for package version creation tests . It's always been a little unclear to me what this actually meant, and I took a very good question on Salesforce Stack Exchange as a chance to find out. Put simply, the unpackagedMetadata directory specified for a second-generation package is deployed into the build scratch…

The Dangers of Anonymous Apex and the Developer Console

The Developer Console and Anonymous Apex seem like appealing ways to learn, to do ad-hoc exploration of the system, to perform quick fixes, and to prototype ideas in Apex. Unfortunately, the low barrier to entry with these tools masks some very subtle complications that can turn into traps, especially for learners and early-career Salesforce developers for whom that low barrier to entry may carry…

The Bridge Package Pattern

Managing your package architecture for a Salesforce platform product is a major challenge not because it's difficult as such, but because in many cases your decisions must be made very early in the lifecycle of the product and are very difficult or even impossible to change. This challenge is especially prominent when designing extension packages, which build upon existing managed packages.…

Design Safe, Fast, Parallel Salesforce Integrations with Rust and Baris

Create Your Low-Code, Free, Open Source CI Solution

Salesforce Developer Podcast: CumulusCI with David Reed

I chatted with the fantastic Josh Birk about CumulusCI, broadening the value proposition of DevOps, and my journey in the Salesforce landscape on the Salesforce Developer Podcast .

Find Bugs Earlier with Second-Generation Packaging

Extend NPSP with 2GP Unlocked Packages

Bibliothekai: "What's the best translation of...?"

I've launched a new app, Bibliothekai , to help answer this question. I've been wanting to build this for many years, stemming from my time as a desk librarian hearing the question "What's the best translation of X?" all the time, and my delight in collecting unusual translations of Homer. Bibliothekai is my contribution towards an answer. Bibliothekai currently tracks over 900…

How Salesforce.org Uses DevOps

Building the NPSP Trailhead Installer with MetaDeploy

Automate the App Lifecycle with CumulusCI

Baris: Safe, Parallel Salesforce Integrations in Rust

Do What You Can With What You Have

Automate the App Lifecycle with CumulusCI

Automate the App Lifecycle with CumulusCI

Effective Lifecycle Management with Portable Automation and CumulusCI

Automate the App Lifecycle with CumulusCI

Automate the App Lifecycle with CumulusCI

Handle the Right Errors: Building Resilient and Reliable Apex

Working with JSON in Apex: A Primer

This post is adapted from a community wiki I created for Salesforce Stack Exchange . Apex provides multiple routes to achieving JSON serialization and deserialization of data structures. This post summarizes use cases and capabilities of untyped deserialization, typed (de)serialization, manual implementations using JSONGenerator and JSONParser , and tools available to help support these uses. The…

Automate the App Lifecycle with CumulusCI

Recently, I've been delighted to visit the Salesforce Developer Groups in Denver, Colorado, where I live, and in Kitchener, Ontario, to talk about Salesforce.org's Portable Automation toolchain for continuous integration and automation throughout the application lifecycle. Thanks to Sudipta Deb, leader of the Kitchener group, I'm able to share video from "Automate the App Lifecycle…

Automate the App Lifecycle with CumulusCI

Build Applications with CumulusCI

On Writing Good Exception Handlers

This post is adapted from an answer I wrote on Salesforce Stack Exchange . This post follows a previous discussion about what makes a bad exception handler. I'd like to talk a little bit about what good exception handling patterns look like and where in an application one ought to use them. What it means to handle an exception is to take an exception al situation - something bad and out of…

On Not Writing Bad Exception Handlers

Unlike some languages (such as Python) where exceptions have a greater role in flow control, in Apex, exceptions generally are exceptional : they connote some relatively uncommon bad state in the application that prevents the normal path of execution from continuing without some special handling. An exception is a message from the application to you, and one that you ignore at your, and your…