© Ashton Wiersdorf 2025| Lambda Land
I used Pandoc and the Biblatex bibliography format. What’s nice about this is that you can enter in all the information you know about the source, keep it nice and organized in a file, and then change the citation style on the fly. Imagine if you thought you had to use MLA, but then realized you needed to switch to APA citation styles. You can do that instantly with Pandoc and Biblatex.| Lambda Land
Bedrock Version 1.5.0 Released| Lambda Land
Programmers and Their Monospace Blogs| Lambda Land
What's New in Emacs: Last Decade Edition| Lambda Land
About Me # I’m Ashton Wiersdorf, and I’m a PhD student at the University of Utah studying programming languages with Ben Greenman. I live in Salt Lake City, Utah. My most recent place of employment outside of academia was with Spiff, where they were nice enough to let me hack on their interpreter. Before Spiff I worked at a few other positions as a full-stack engineer. I’ve sung with the BYU Men’s Chorus and I play the piano. Other hobbies include swimming and hiking—Utah has some o...| Lambda Land
I got to visit the Stasi museum in Berlin this week, and it gave me a newfound appreciation for why it’s important to resist surveillance. Interestingly, surveillance is not exclusively limited to one kind of government: it can appeal to both left- and right-wing governments, and corporations in the digital age use surveillance to make money. In every form, surveillance is evil and must be resisted. Stasi = Abbreviation of Stadt Sicherheit (“state security” in German). For those of you ...| Technical Blog on Lambda Land
We’re going to be writing a BF compiler for a class I’m in. Last night I threw together a little interpreter for the program in about an hour; it doesn’t do input—that should be easy to add—but it’s enough to handle some benchmarks for the language, albeit slowly. You can see my repository on Codeberg for the source code. I needed one function to do two closely related jobs—the logic was identical, but some parameters needed to change. Fortunately, first-class functions in your ...| Technical Blog on Lambda Land
I started using the Zsh a few years ago and I’ve liked its completion features. I tried out Oh-my-zsh for a while and I liked the stock Robby Russel prompt. It gave me all the information I cared about: the status of the last command, current directory, and the state of the current Git repository. However, I didn’t like how slow Oh-my-zsh was making my shell startup. This mattered especially, I think, because my Emacs config would fire up a shell on startup to read the ENV so it could con...| Technical Blog on Lambda Land
Today I learned about using zero-knowledge proofs in the context of passwords. These are my rough-and-ready notes from reading. Apparently OpenSSL has an implementation of the SRP algorithm. Math-based ZKP example # Source for this example comes from Wikipedia. It might be good to read that in tandem with these notes. In this example Peggy is the person who wishes to prove knowledge about something to Victor, the verifier. Peggy is proving that she knows some value \(x\) , but she doesn’t w...| Technical Blog on Lambda Land
I take a blend of digital and hand-written notes. It’s a bit of a hodgepodge, but it’s working. I used to lean heavily into full-digital notes, but I started drifting towards a mixture of digital and hand-written notes. Initially it was complicated, but I think I’m converging on a good setup. What I describe here will continue to evolve I am sure, but I am enjoying where it’s currently at. Pen and paper is best for thinking # I’ve fallen down the fountain pen rabbit hole. I used to ...| Technical Blog on Lambda Land
Programming languages are too slow! I’m not talking about execution speed—I’m talking about evolution speed. Programmers are always building new libraries and embedded DSLs, but the host programming language—particularly its type system—doesn’t understand the domain-specific aspects of these things. Example problem: my type system doesn’t speak PCRE # Consider regular expressions—most programmers would understand that a regular expression like [a-z]+([0-9][0-9]), if it matches...| Technical Blog on Lambda Land
I’m starting my third year as a PhD student. I thought it would be good to look back on some of the things that have helped me to this point. I study programming languages, but I imagine these things will help anyone in computer science—and some might have application to other STEM fields as well. There are many softer skills that you need as a PhD student: curiosity, good work ethic, organization, etc. These are essential and nothing can replace them. (Note: that was not an exhaustive li...| Technical Blog on Lambda Land
I’ve made some big changes to my blog! This post is just for me to document what I’ve done and why, as well as to test some of the new features I’ve added. New fonts # First off: new fonts! I am using Valkyrie for the body text and Concourse for the headings. I’ve increased the font size on larger displays for added legibility. I also made the background a little darker for better contrast. Margin notes and sidenotes # I stole the margin notes code from Tufte CSS. It’s still a littl...| Technical Blog on Lambda Land
The Tao gave birth to machine language. Machine language gave birth to the assembler. The assembler gave birth to the compiler. Now there are ten thousand languages. Each language has its purpose, however humble. Each language expresses the Yin and Yang of software. Each language has its place within the Tao. But do not program in COBOL if you can avoid it. The Tao of Programming I probably hate writing code in your favorite programming language, whatever it may be. This is because I get frus...| Technical Blog on Lambda Land
I got a paper published at ECOOP this year! This is my first big paper published at a big conference. As such, I wanted to write down some things that I learned so that in the future I can remember a bit better what was hard for me. That way, should I one day advise PhD students working on their first papers, I can help them through the learning curve better. For us, this artifact took the form of a Docker container with a bash script that ran all the code examples from our paper to support t...| Technical Blog on Lambda Land
Chorex is a brand-new Elixir library for choreographic programming [3]: Chorex provides a macro-based DSL that lets you describe how processes communicate to perform a computation. This top-down description of interacting processes is called a choreography. From this choreography, Chorex creates modules for each process that handle all the message-passing in the system. The interactions performed by the generated code will never deadlock by construction because the choreographic DSL ensures t...| Technical Blog on Lambda Land
If you ask anyone what the best Emacs packages are, you’ll almost definitely hear Magit (the only Git porcelain worth using) and Org Mode (a way to organize anything and everything in plain text) listed as #1 and #2. And they’re right! I use those packages extensively every day. Besides those two powerhouses, there are a handful of packages that make using Emacs a delight. If I had to ever use something else, I would miss these packages most: Avy Jump around your screen crazy fast. Telepo...| Technical Blog on Lambda Land
This is the story of how I solved a problem (ugly, cumbersome boilerplate code) that I ran into while writing a program in a functional language (Elixir). Functional programming languages often pride themselves on expressiveness and elegance; but occasionally they are not amenable to the most obvious solutions to the problems we wish to solve. In this case, the simplest solution to my problem would have been to have a global mutable variable. But no one likes those. The solution most programm...| Technical Blog on Lambda Land
Somewhere in my adolescence I got stuck with the notion that functional languages were slow while languages like C were fast. Now, a good C programmer can eke more performance out of their code than probably anyone else, but the cost you pay to keep your code correct goes exponential as you get closer and closer to the machine. Functional languages abstract a lot away from the machine. Higher languages in general abstract away the machine and make code easier to maintain. So I think I had it ...| Technical Blog on Lambda Land
Macros are tricky beasts. Most languages—if they have macros at all—usually include a huge “here there be dragons” warning to warn curious would-be macro programmers of the dangers that lurk ahead. What is it about macros that makes them so dangerous and unwieldy? That’s difficult to answer in general: there are many different macro systems with varying degrees of ease-of-use. Moreover, making macros easy to use safely is an open area of research—most languages that have macros do...| Technical Blog on Lambda Land
Something I’ve wondered about for a little while: why don’t more languages have a call/cc operator? Having first-class continuations in your programming language gives your programmers a powerful construct. So why do only a handful of languages have it? The short answer is: it’s tricky to implement efficiently. One way to get call/cc is to convert your code into continuation-passing style. Then, call/cc simply takes the continuation in that representation and binds it to a variable. Mos...| Technical Blog on Lambda Land
Or: Approaching the Y Combinator These are some of my class notes. Learning to derive the Y Combinator from first principles is something I’ve always wanted to do. This isn’t quite the Y Combinator, but it’s very close and it still gets you recursion without relying on recursive structures to begin with. In the beginning, we write a recursive function to compute the length of a list: (let*([len (λ(lst)(if(null? lst)0(+1(len (cdr lst)))))])(len '(123))) The let* syntax allows us to crea...| Technical Blog on Lambda Land
I got a strange email the other day. Here it is, with parts redacted: Hi there, My name is G—, I am the main editor at —————. While browsing your site, I noticed you have an amazing article from this page: Link to an extremely old post of mine My team actually just published a comprehensive article on “Semi-related title” which I think your visitors would truly appreciate and add value to your awesome article. You can check it out here: ——————— If you were willin...| Technical Blog on Lambda Land
I started my PhD program about a year ago. In my first year I have: Taken 4 “normal” 3-credit-hour classes Participated in 3 seminars Switched advisors Attended 2 conferences (PLDI @ FCRC, JuliaCon) Presented my work at JuliaCon It’s been a lot of work, and there’s been a lot of stress. I’m in a much better place now than when I started, and over all I’m happy where I’m at and where I’m headed. Changing advisors # Some of the stress has come from finances: it’s hard to suppo...| Technical Blog on Lambda Land
Here’s a nifty Emacs workflow for doing a project-wide search-and-replace on steroids. While I do use refactor tools that come with language servers,1 sometimes those aren’t enough. Consider the case where you not only need to change the name of a function, but also e.g. need to swap the order of two of its arguments. Or you’ve broken one function out into two that need to be chained together. Whatever—there are plenty of ways where the IDE won’t be able to do everything that you ne...| Technical Blog on Lambda Land
I hiked up Desolation Trail with Scott Wiersdorf. It had rained a little bit the night before, so the trail was neither dusty nor muddy—perfect for hiking. Figure 1: Hike overview Lots of pretty plants on the way. Figure 2: This flower is called Arrow Leaf Figure 3: Some pretty ground cover Figure 4: A neat old tree that got split The way up was nice and scenic. Figure 5: View from the trail looking at Church Fork or Grandeur Peak—I forget which Views at the top were spectacular. Figure 6...| Technical Blog on Lambda Land
There are a bunch of different ways of writing a macro in Racket. There are also some tricky things around phases to keep in mind. This is to help me keep them all straight. 3+1 ways to make a macro # This form: (define-syntax-rule(foo args ...)(use args ...)) is equivalent to: (define-syntax foo (syntax-rules()([foo args ...](use args ...)))) Which, is in turn equivalent to: (define-syntax foo (λ(stx)(syntax-case stx ()[(gensymed-foo args ...)#'(use args ...)]))); gensymed-foo is like foo b...| Technical Blog on Lambda Land
I recently made an update to how I build my blog. I like writing my posts with Org-mode because it provides a richer markup language than Markdown. Plus, more Emacs = more good. Hugo has support for Org files, but there was a problem with the RSS feed generation: all of my posts written in Org got truncated at some point. I don’t know if the fault lies with Hugo itself or with some problem in the theme I use—whatever it was, I don’t have the time right now to debug that and submit a goo...| Technical Blog on Lambda Land
I believe computer science plays as integral of a part to a well-rounded liberal arts education as does mathematics and linguistics. Why? A liberal arts education is designed to help you think in new and better ways. Computer science teaches novel ways of thinking, reasoning, and approaching problems that are hard to get anywhere else. I took a class on pedagogy when I encountered this puzzle. I answered the question easily, and I caught myself using reasoning patterns from work in programmin...| Technical Blog on Lambda Land
I recently managed to get access to my Outlook email from Emacs. This took some doing as my university had disabled app passwords. I consider Outlook to be harmful, but inasmuch as companies and schools continue to enforce OAUTH-only authentication with email systems, it is good to find workarounds. This is how I set up email sending/receiving on my computer running macOS with DavMail. I also use mbsync (confusingly also known as isync) to actually fetch my email, and mu/mu4e to index and rea...| Technical Blog on Lambda Land
Some years ago I came across a blog post that described programmers as being in one of three camps. It's a fun, short post, so I encourage you to go read that real quick, but the gist of it is that programmers generally fall into one of three categories according to what they primarily value: Applied mathematicians, who appreciate elegant solutions to problems. Program execution on von Neumann machines is incidental. These programmers like high-level languages and mathematically correct reaso...| Technical Blog on Lambda Land
My grandfather G William Wiersdorf passed away Monday morning. He was 82 and survived COVID, a decades-long existence with MS, and World War II. While his health wasn't the best, none of us were expecting this. You can read his obituary here. German obituary UPDATE 2023-03-18: I've translated my grandpa's obituary into German. Here it is: G William "Bill" Wiersdorf verstarb friedlich am 13. März 2023 mit seiner liebevollen Frau Kathy an seiner Seite. Bill wurde am 11. Dezember 1940 zu Anna M...| Technical Blog on Lambda Land
The story I once worked as a part of a company with four employees, all of us programmers. We formed a sort of daughter company with a bigger—though still modest-sized—company that handled our payroll and whatnot. Our work directly helped the parent company, but we were organizationally independent development-wise. I really liked working with that small team: we had a one-hour meeting each week to plan out our work, and a short, casual stand-up each morning to get things rolling. Almost ...| Technical Blog on Lambda Land
It's interesting for me to reflect on how my aspirations have changed as I've grown up. When I was a little kid I wanted to be a computer programmer like my daddy. I wanted to have my own cubicle and a work station and write Perl programs all day long in Emacs. There was a phase where I had to shake my head at that—a cubicle-dweller? Seriously? After experiencing some open-office work spaces, the shoulder-high walls afforded a privacy and sound muffling that any hipster coder would be envio...| Technical Blog on Lambda Land
Background # This is a question I’ve been wrestling with for a little bit. My first experience with a type system was with Java, and I didn’t like it. It just felt like an annoying constraint on the kinds of programs I could write. I was coming from Perl, which sports weak dynamic typing, so Java’s rigidity came as a bit of a shock. After Java I learned some C, which too has types. C’s types are different from Java’s in a big way: in C they’re really just directives to the compile...| Technical Blog on Lambda Land
Are you tired of having a particular buffer pop open in the wrong direction? Do you wish, for example, that the Racket REPL buffer showed up on the right in a vertical split, rather than below in a horizontal one? Look no further. I give you, display-buffer-alist: (add-to-list 'display-buffer-alist'("\\*Racket REPL </>\\*"(display-buffer-in-direction)(direction . right))) That little snippet will make sure when you hit C-c C-k inside of a racket-mode buffer, a REPL will pop up on the right-si...| Technical Blog on Lambda Land
This year I discovered the profound joy of giving toys to a little girl. Our daughter is beginning to babble and walk, and nothing has brought me more happiness than playing with her and watching her grow in her capabilities. She's still young enough that she has no clue as to what is going on, but she did like getting some new toys wrapped in paper and bows! Christmas is so much better giving presents to your kids than it is getting presents as a kid. I am grateful for good health. My family...| Technical Blog on Lambda Land
I'm well aware that I may have a bit of an obsession with fonts. I don't think that's too unusual for someone who works in tech, however. Sites like Programming Fonts exist to let people test drive and compare a bunch of different fonts. Just for fun, I thought I'd write up some of the features I look for in a programming font that I've come to deliberately pick out. Critical letter forms: i, I, l, 1; o, O, 0 These are probably the most important letters to get write in any font that's meant ...| Technical Blog on Lambda Land
In a study that Ars Technica reported on, researchers found that an alarming number of computer repair technicians snooped through clients' devices—and female clients were way more likely to have their data accessed. Yikes! I once had to take my laptop to get some repairs done. The TAB key on my 2016 MacBook Pro had started glitching, and that wasn't going to fly when I was working on code and needed my tab completions and app switching to be seamless. I took my laptop to the Apple-authoriz...| Technical Blog on Lambda Land
I had a friend ask me what continuations are, and why they're useful. There's a ton of literature about continuations; this is just a simple example meant to showcase something small and hopefully grokkable. You will need to understand a little bit of Racket, but if you know any Scheme, that should be good enough. If you just want a quick primer, check out Learn X in Y minutes for Racket. #lang racket;;; Export these symbols(provide fail pick non-deterministic-factor);;; Global stack of choic...| Technical Blog on Lambda Land
Wikipedia1 cites a few different sources on what "Unix Philosophy" is. Peter Salus summarizes it as: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface. That second bullet point is my favorite: making composable programs rather than monolithic systems. In this way, Unix is designed to be a forge for easily building new tools. The first rule—writing programs that do one thing well—is...| Technical Blog on Lambda Land
Yes, it’s time to redo my blog again. This time I found an ultra light-weight blog theme. This page here is under 100KB! I wanted to make something that acts more like a homepage for my research, rather than a blog. I still have all my blog posts, but now the focus will be on a more professional presentation of my work. This theme is really what I’ve wanted all along: a home page with a max-width for the text, table of contents, and built-in local search!| Technical Blog on Lambda Land
It's hard to overstate how important email is in our modern world. Even as hip new platforms like Slack &co. gain traction in the workplace, so much communication takes place in a crusty old medium that's outlived every purported "email killer". Where does it get its staying power from? Email predates much of the Internet as we know it today. Its current incarnation first emerged in the early 80s, though it has roots in earlier forms of digital messaging from as far back as the 60s. "Email" i...| Technical Blog on Lambda Land
Something I learned today from a coworker: if you turn your monitor sideways, subpixel anti-aliasing gets completely broken. This isn't as much of an issue on today's high-dpi displays, but for anything lower than a 4k screen, the effect can be noticeable. Just a little interesting thing I learned today. Thanks to my good, knowledgeable friend and coworker Jonner Steck! Also, while we're on the topic of font rendering, I've updated Iosevka Output to more closely match Input Mono: the cross-ba...| Technical Blog on Lambda Land
This week I created a custom build of the Iosevka font. I've used Input Mono for a long time now, and was very happy with it. However, it was missing a few glyphs that I wanted to use. Moreover, I didn't have a license for the Input font to use on e.g. my blog. Iosevka is stupendously customizable, so I thought I'd see if I could get something close to Input's styles. Iosevka's default style is extremely narrow. However, I discovered that the width of Iosevka extended at 13pt matched Input at...| Technical Blog on Lambda Land
All the source for this may be found on my Codeberg repository. Synopsis # Experimental type checker/inferer for a simple lambda calculus Description # This is a type inference system for a little language. (Described below.) It uses a fusion of type inference algorithms from PLAI, ESP, and μKanren. (See Resources) Broadly speaking, our type inference engine works by: generating typing constraints from the program solving those constraints We’ll describe each of those in more detail. Langu...| Technical Blog on Lambda Land
Today I figured out how to add a tab-bar to Emacs. I didn’t like having it in the mode-line: it gets duplicated for every window and my mode-line space is precious. In contrast, the right side of the tab-bar was always blank. I’ve just been using my OS’s clock, but I started using non-native fullscreen with Emacs, so I wanted a view of the clock again. Add this to your early-init.el or the like: (add-to-list 'tab-bar-format'tab-bar-format-align-right'append)(add-to-list 'tab-bar-format'...| Technical Blog on Lambda Land
I’m not on many social media platforms these days. I like it like that. I mostly follow some academics and people who post interesting stuff. I post only occasionally, usually to show off my recent hiking exploits. I’ve come up with some rules for myself (all subject to change) about what I post. A post must meet all the following criteria: It must be positive and uplifting. There’s enough that’s negative on the internet. Don’t add to it. It must be interesting I’m a bad judge of ...| Technical Blog on Lambda Land
μKanren (“micro-Kanren”) is a tiny, embeddable logic programming language. It’s easy to understand and implement in almost any language. It’s a great case study of an embedded language: unlike other common “embedded” languages like SQL or regex, which normally are represented as just plain-old strings, μKanren takes more advantage of the host language’s features. I recommend reading the original paper: it’s short, well-written, and easy to understand. I did a write-up which ...| Technical Blog on Lambda Land
Brief update on the blog: I had been running a custom fork of the Anatole theme; it diverged pretty heavily, and I found a nice way to customize the CSS. Behold! The new-and-improved blog. Some of the new extensions to Anatole include the ability to set a static page as your profile; I’ll do this and include links to lists of publications and whatnot. This should make my blog a better place for my professional/academic life. I have lost my comments and metrics plugins; I’m debating about ...| Technical Blog on Lambda Land
I have a hard time keeping these terms straight: liveness vs. safety soundness vs. completeness This is intended as a short guide for myself; maybe someone else will find it useful too! Note that this is all to the best of my knowledge and understanding at the present time; if there be faults, they be the faults of myself. I welcome correction and clarification if I am wrong. Liveness vs. Safety # Liveness and safety deal with properties of a system. Contrast that with soundness and completio...| Technical Blog on Lambda Land
It’s my first Christmas being a dad. The end of the school semester was unusually stressful; I didn’t have much time or energy to anticipate Christmas. But I’ve felt a marked lack of eagerness for getting presents. That feeling wanes each year—something I’m grateful for—but this year I only felt an eagerness for a time of peace and celebration with my family. Peaceful it has been. My family isn’t perfect. (My baby daughter is about as perfect as they come, though!) The time I’...| Technical Blog on Lambda Land
A collection of what worked well and what didn’t in classes that I took this semester. This is partially for me to record what things reduced friction for me as a student so that one day, should I become a professor, I’ll be able to run the lowest-friction class ever! Synopsis # The best classes made it easy for me to see a list of everything that was due, when it was due, and what each assignment entailed. Exhaustively-written lab write-ups hosted on GitHub were a highlight. The worst wa...| Technical Blog on Lambda Land
The following is from a essay from a class on German literature and film. Fritz Lang’s movie Metropolis is primarily about the struggle between the oppressed working class and the ruling elite. What drives this tension, however, is a particular view of technology and technological progress that exacerbates the problems the film focuses on. This mentality is called high modernist ideology by Scott in his book Seeing Like a State: What is high modernism, then? It is best conceived as a strong...| Technical Blog on Lambda Land
What does this program do? At the most reduced level, one could say that a program’s behavior is defined by the effect it has on the hardware running it. That’s not very useful however; when we’re programming, we often have to deal with legacy code and tease out the original intent of the code. Saying that the meaning of a program is entirely encapsulated by the code is saying that the intent and the implementation are the same. They so rarely are! Today I found some Elixir code that lo...| Technical Blog on Lambda Land
Last week I was studying outside of a lecture hall where someone was teaching an introductory course on computer programming. There was a lot that I overheard that I disagreed with; this essay is an attempt to help me crystallize what exactly I disagreed with. What is programming? What is good programming? What should programming be like? How you answer depends a lot on what you value. What I value in programming has not always been the same, and I think I’m the better for having toured aro...| Technical Blog on Lambda Land
I feel uncomfortable with many symbols. I might have opinions about a subject, but there’s rarely a camp that has some symbol, flag, slogan, etc. that I’m comfortable with adopting because that camp does not accurately reflect my opinion. All too often, a slogan takes on more than its surface meaning, and that can make using that slogan tricky. A simple example is with politics. On certain topics I agree with whatever happens to be defined as the “conservative” viewpoint. On other iss...| Technical Blog on Lambda Land
My wife and I got a chance to go to a place that lets you paint pottery and then have it fired. The pottery is all pre-made; you just get to paint it. It’s been a very long time since I’ve worked with a physical art medium, so the mug looks kinda dumpy. I did alright with the Racket logo on the bottom-inside of the mug though! I’m working on some fun projects with Racket. It’s been a really enjoyable language to work with. If you haven’t given it a whirl, I recommend checking it out...| Technical Blog on Lambda Land
It’s going to be another long night. My baby has reached the point where she’s too tired to sleep. She alternates between screaming at 90+ decibels and sleeping fitfully. She only transfers from the crying state to the sleep state after prolonged, labored rocking and soothing. She transfers back to the base crying state on her own after a few seconds. I still love her. I just don’t appreciate her as much during these times. One thing that I’ve learned while watching my baby grow a lit...| Technical Blog on Lambda Land
When I get a little money I buy books; and if any is left I buy food and clothes. — Erasmus of Rotterdam Used bookstores are my arch nemesis. I have two such stores in disturbingly close proximity to me. The first is Boomerang Books—within a short walk of my house and right next to Burgers Supreme (almost as dangerous)—and they carry textbooks at a fifth of the original price. Last time I went there I walked out with a book on graph theory I most certainly don’t need. The second is Pi...| Technical Blog on Lambda Land
Control-Flow Analysis is a popular technique for performing static analysis of many different kinds of programming languages. It’s most often needed in cases where you have some kind of dynamic dispatch: either where you have first-class functions or when you have objects and you call one of their methods. Imagine for a moment that you were given a program which you were asked to analyze manually. You might start by going to the top of the program, running through each branch, and keeping t...| Technical Blog on Lambda Land
It’s cliché at this point to say that 2020 was a rough year. I’m grateful in that I and my wife were relatively unscathed by the pandemic. I had some personal health issues however that by themselves made 2020 a bit of a struggle. I learned some important lessons. In February I had a big choir concert. That same weekend I had a large project for one of my CS classes due. I got an extension on my CS project so I could sing in the concert; but despite the extension, I was rushed and I spen...| Technical Blog on Lambda Land
I love Easter. In my mind it is just as important as Christmas. Indeed, if Christ had not died for our sins and been resurrected, then there would be no reason to celebrate His birth. I recorded a short, simple vocal arrangement of “O Savior, Thou Who Wearest a Crown” by J. S. Bach with my wife. Recording of "O Savior, Thou Who Wearest a Crown" Your browser does not support the audio element. Download it here. I’m no audio engineer, but I tried to make it fun to listen to with headphone...| Technical Blog on Lambda Land
For one of my classes I am required to take a short weekly exam via Proctorio. There’s been some controversy surrounding this software. Although it claims it’s trustworthy, it’s not open-source, so no one can verify their claims. So naturally, I was reluctant to install it on my primary machine. Enter: the spare raspberry pi I have sitting around. All it took was a USB webcam hooked up to a raspberry pi. For this project I wanted to maximize comparability, so I chose stock Ubuntu. I ins...| Technical Blog on Lambda Land
This is the story of how I managed to get FreeBSD running on a Raspberry Pi 4 with 4GB of RAM, though I think the setup story is pretty similar for those with 2GB and 8GB.1 I also managed to get Rust built from source, (kind of) which is nice because the default Rust installer doesn’t seem to work for FreeBSD running on a Raspberry Pi. If there’s anything awry with these steps, please contact me so I can fix it. Installing FreeBSD # First, get yourself a Raspberry Pi 4 and an SD card. (I ...| Technical Blog on Lambda Land
I noticed that my Internet was acting strangely: whenever I visited a web page, my browser would hang for a good second or two before it started loading anything. Zoom calls worked without a problem for school, so this tipped me off that something was wrong with the DNS lookup or the handshake. Sure enough, I popped open my Pi-Hole admin console, and was greeted with this: The green number in the Total Queries box would jump by 10, 20, or sometimes even 100 every second. I tried turning off, ...| Technical Blog on Lambda Land
I am an avid Emacs user. I’m using it right now to compose this post. I use it every single day for everything from work to school to personal notes. Most of my activity on GitHub comes from me tweaking little things in my configuration files. I now have an editor that perfectly fits my hands. Emacs is a big part of my life. I’m afraid it’s dying. Richard Stallman, one of the principle creators of Emacs and the head of the GNU Project, has made several choice in the past several months ...| Technical Blog on Lambda Land
I just finished watching The Social Dilemma, and here’s my hot take: The Social Dilemma is an emotive, accessible introduction to problems that, without exaggeration, pose an existential threat to life as we know it. If you can, watch it. Having read Technopoly by Neil Postman, I didn’t feel like The Social Dilemma was revelatory in saying that technologies have unintended side-effects. What’s different about The Social Dilemma is that it is really accessible and it highlights real, pre...| Technical Blog on Lambda Land
Today is September 11th. I remember waking up 19 years ago, coming into the living room, and my dad getting down on one knee so he was closer to my level. He told me that earlier that morning two airplanes had crashed into some tall buildings in New York City. I didn’t know what that meant at the time, but I soon found out. For several anniversaries thereafter, my elementary school class would spend a minute of silence in remembrance of those who died. Each year I learned more about what ha...| Technical Blog on Lambda Land
It’s been a long six months that we’ve been under quarantine and other disease-limiting measures. It hasn’t been easy, but thanks to something I saw at Königsstein Fortress I’m not complaining. Here’s why: Königsstein1 Fortress, also known as the Saxon Bastille, overlooks a section of the Elbe river and is located just south of Dresden. This is a little bunker built on top of the fortress. This is what the sign says: In the year 1680 40 people died of the plague at the fortress. I...| Technical Blog on Lambda Land
In Technopoly: The Surrender of Culture to Technology, Neil Postman argues that our infatuation with technology has insidiously eroded our culture. We gain much through technology, but it comes at a price; all too often we are blind to that price. This book seeks to call attention to the costs of a technology-focused society. I felt this poignantly because I, as a technology worker, know what that infatuation feels like. This book review will be pretty limited in scope: I’ll only talk about...| Technical Blog on Lambda Land
I’ve been thinking about programming languages a lot recently. A question I asked myself was: why do we work on, refine, and create new programming languages? I thought of several reasons, but they seemed to boil down into two broader reasons: Better abstractions and more automation: some languages automate and ease some tedious tasks like memory management, concurrency, or type annotations. Almost all languages give you some ways of creating abstractions that let you reason with concepts i...| Technical Blog on Lambda Land
I went on an adventure today. I left behind the stable comforts of the terminal and compiled bleeding-edge Emacs that uses a native window system. This is a big deal for me. As long as I can remember, I’ve used Emacs from within a terminal. I’ve decided to give the GUI’d Emacs a whirl. My Journey # I’m running macOS Catalina (10.15.5). Originally I tried using the pre-built packages via brew (brew cask install emacs) and those available at Emacs for Mac OS X. However, all these pre-bu...| Technical Blog on Lambda Land
An analogy occurred to me this evening as I was thinking about programming language design: Choosing good keywords and function names is like picking a good font; the ideas conveyed may be the same, but a change can drastically impact legibility and enjoyment of use. PHP does a spectacular job of providing a bad example. It’s like the Comic Sans of programming languages. Now there are many reasons why PHP is not a good language—I’d like to investigate this particular aspect of its desig...| Technical Blog on Lambda Land
Overview # The primary thrust of this book is that television has degraded our mode of public discourse. Our news, politics, education, and even religion are delivered to us primarily through television, where they were once delivered via the written word. This transformation of medium is not irrelevant: just as poetry doesn’t survive fully intact when translated from one language to another, likewise ideas do not survive translation of medium. This book was written in 1986. What foresight....| Technical Blog on Lambda Land
Masks have become a hot issue. Here’s my 2¢. Summary # I think everyone should wear a mask, unless they have a compelling medical reason not to. Look at it this way: a mask will either help you and those around you, or it will do no harm—beyond a little social awkwardness. If we look at the trade-offs in a game-theory-style matrix, we get: | | Masks Help | Masks don’t help | |——————-+————+——————| | Wear a mask | +100 | 0 | | Don’t wear a mask | -100 | ...| Technical Blog on Lambda Land
Computers are funny things. At the lowest level they’re just a pile of ones and zeros that we assign meaning to. It’s something you can easily take for granted, but there’s a disconnect with how we talk about how things operate at the hardware level and then again at the software level. Since writing a compiler, I’ve been able to bridge that gap in part. The fundamental idea is that we represent some meaning in a concrete, though still high-level form. Example: we might represent an e...| Technical Blog on Lambda Land
I’ve been building a compiler for a small lambda calculus that compiles to x86. It’s pretty broken, and I decided to start from scratch. I checked out a new branch in Git, and then deleted the entirety of my compiler before I had a chance to do anything else. It hurt. But it was a good kind of hurt. I don’t usually just blow everything away like that. Even this time, I’m keeping many of my auxiliary functions. I’m not rewriting the parser or some of my x86-helper routines. Those can...| Technical Blog on Lambda Land
I’m a FreeBSD guy. My first computer was a FreeBSD machine that my dad had running in a closet. I learned how to use Emacs as well as the command line on that black-screen white-text no-mouse interface. That’s how real programmers spend their childhood! 😎 😜 I’ve only heard good things about FreeBSD. While not known as particularly desktop-friendly (various Linux distros win here) I’ve heard tales of its rock-solid stability. I wanted to try running on FreeBSD again, just to see ...| Technical Blog on Lambda Land
Yet again, I’ve tweaked my emacs configuration. The big change this time is switching to Ivy from Helm. I’d like to say right off the bat that Helm is a great tool. I used it for several months and enjoyed it. Once thing that I love about helm is how discoverable it makes commands and functions. helm also got me into using bookmarks. I don’t keep many bookmarks; I tend to collect a few when working on a multi-file project long-term. The bookmark that I use most consistently is to my .em...| Technical Blog on Lambda Land
I gave a presentation at the Utah Elixir Meetup this February. Here’s the recording of my presentation: Watch on YouTubeI’ve posted the slides as an HTML file, along with some materials to follow along with, on my GitHub account. Check it out!| Technical Blog on Lambda Land
Today I figured out how to get Pandoc to automatically generate MLA citations for me! I used Pandoc and the Biblatex bibliography format. What’s nice about this is that you can enter in all the information you know about the source, keep it nice and organized in a file, and then change the citation style on the fly. Imagine if you thought you had to use MLA, but then realized you needed to switch to APA citation styles. You can do that instantly with Pandoc and Biblatex. First, you’ll nee...| Technical Blog on Lambda Land
Marked Man (mm) is a little program I wrote to view Markdown files like UNIX man pages. (Because who wants to leave their terminal just to open a file?) It uses Pandoc to convert between Markdown and the groff format. As a happy side-effect, this program can read basically anything as a man page: HTML, LaTeX, Word files (seriously), ePub, etc. Anything that Pandoc can read, Marked Man can handle. Installing # I’m working on getting this set up with Homebrew. For now, check out my GitHub rep...| Technical Blog on Lambda Land
DuckDuckGo is a search engine. Like Google Search, you just throw some keywords into a box and get a list of results. Lots of people use Google, but I don’t. DuckDuckGo works better for me, and this is why. The Duck ## Consistent Results Did you know that Google will give you different search results, based on who you are and what you have searched for in the past? This is called a filter bubble, and it’s annoying and dangerous. DuckDuckGo doesn’t put you in a filter bubble. Goodies and...| Technical Blog on Lambda Land
Life is messy. We devote a lot of time and effort into managing that chaos. I thought of a little “theory”, if you will, that helps me. The Home Theory # Everything needs a home. The class of things that need homes is broad. It includes: School assignments Legal documents Pictures Recipes Ideas Projects Books Charging cables Tools etc. The home needs to suit the thing that goes there. I have found that getting this right is really tricky. But once you have a home for a thing, you never lo...| Technical Blog on Lambda Land
I finished the semester! This is how I feel: Don’t you? Well, I still have finals. But those are easy compared to the projects I’ve had to push out. I’ll probably write about my escapades later. :)| Technical Blog on Lambda Land
I spend a fair portion of every day writing programs. As with all professions, using the right tools makes a huge difference in my productivity and general happiness. Having good tools helps me keep my gumption up. One of my favorite books is Zen and the Art of Motorcycle Maintenance. Contrary to what the title suggests, this book is actually not about motorcycles. It’s about a lot of things; one topic is about tools and caring about your trade. … By far the most frustrating gumption trap...| Technical Blog on Lambda Land
Today in my proofs class (MATH 290 at BYU) we talked about the concept induction. I like this, because it sounds a lot like recursion. On the Wikipedia article, there’s an excerpt from a book that illustrates the principle with an analogy using a ladder: Mathematical induction proves that we can climb as high as we like on a ladder, by proving that we can climb onto the bottom rung (the basis) and that from each rung we can climb up to the next one (the step). — Concrete Mathematics, page...| Technical Blog on Lambda Land
Life Hacks: Text Notifications # So many notifications come to us in the form of an audible alert, and this can sometimes be inconvenient. Who likes having their phone go off in church? The problem is that sound propagates regardless of the intended target. Touch, on the other hand, is an inherently personal sensation. Setting your phone to vibrate lets you know you’re being alerted, without notifying everyone else in the room as well. Unless you read Braille, touch has far less bandwidth t...| Technical Blog on Lambda Land
Deutsche Übersetzung folgt. I’ve left* Facebook. There’s an asterisk there. I’m not going to delete my account, but I’m no longer checking Facebook more than once or twice a month, if that. I’m not trying to be a recluse—below are a few ways to contact me that I do check far more often than Facebook. I want to be your friend, but I’d rather that friendship be through a real connection rather than some online “status”. Why I’m Leaving # First of all, I care deeply about my...| Technical Blog on Lambda Land
I once asked my dad over email how to improve my the potency of my words and thoughts. His reply came back as one word: Revision. Good writing does not emerge spontaneously; it comes as one practices writing. A “draft” is a pass of writing a particular work. It’s like sketching in art: when an artist starts a painting, they usually start with a rough sketch outlining where the figures will be, what the landscape will be like, etc. These sketches are composed of many lines: each coming ...| Technical Blog on Lambda Land
My girlfriend works for BYU SA—it’s the division of BYU that’s responsible for planning and running events. As part of her job, she has to review song lyrics and make sure that the song is okay to play at BYU functions. This can get rather irksome. Imagine reading text looking for vulgar words or phrases. Yuck. I took some time this evening to write a little website that checks MetroLyrics for any vulgar words or phrases. I have an extensible blacklist which gets initialized at server s...| Technical Blog on Lambda Land
Quick note for those who don’t know about Docker:Docker is a program that lets me take packaged-up programs (called images or containers) and run them without having to worry much about dependencies. Today I decided to upgrade my version of Ghost Blog. I’m using the Docker image on a Digital Ocean droplet. Updating should be simple, I thought. I would take down the blog then spin it back up again after pulling down the latest Docker image. I ran docker stop ghost-blog, removed the contain...| Technical Blog on Lambda Land
I recently wrote about using first-class functions to help make a BF interpreter. This is a follow-up post to describe a nifty solution to a tricky problem that made my program go 2–5× faster and put it about on-par with an interpreter written in pure C. A basic interpreter works by walking down the AST and evaluating nodes recursively: when the interpreter encounters an expression, it dispatches on the type of expression to decide how to perform the evaluation. Here’s the key insight to...| Lambda Land