Spaced repetition is an effective habit for memorizing small fragments of information for, effectively, an indefinite amount of time. The idea is to repeatedly challenge your recall of a piece of information, typically with a sort of flashcard, doing so at a frequency determined by your previous recall performance: new information is challenged frequently until you remember it, and previously learned information is challenged less frequently. The concept is simple enough to implement with a few index cards and a shoebox. Despite the simplicity, the landscape of software implementations of spaced repetition is relatively small. The venerable Anki is the best-known spaced repetition application, and I've used org-drill and org-fc in the past, but other than those three, I'm not aware of many other programs for it. These existing systems are fine, but I have a fairly specific use-case that none are appropriate for: I might want to do my reviews on a system where I'm unable to install Anki or GNU Emacs, and I don't want to have to trust a third-party with my cards. This rules out services like Quizlet and AnkiWeb. It's a simple enough concept, so I wanted to see if I could write a flash card application contained within a single HTML file. All we really need is a spaced repetition scheduler algorithm, a way of implementing the "challenge" piece in the browser, and a way of storing cards and their scheduling parameters across reviews.
read more →
When I started writing this article, I didn't mean to do anything more than describe a comment system I'd written in Guile. But as often happens when I write, I soon found myself disregarding that original scope and recording the history of every line of code I've written that's ever been run by a web server. I settled on allowing this to be an article about incorporating dynamic content into a Haunt site – a use-case that Haunt probably wasn't built to support, but which works surprisingly well due to Haunt configurations being ordinary Scheme programs.
read more →
For the past ten months, I've been using my PinePhone as a "daily driver." By
which, I mean it's been in my pocket everywhere I go, and it's the device I use
to make phone calls. Depending on your familiarity with the PinePhone (or the
state of "Linux Phones" more generally) this statement is either delirious, or
vapid (why should I care that you use a "smart" phone just like the rest of us?)
Don't be mistaken: the PinePhone is usable as a little cellular-capable PDA, and
it's in a league of its own. This article is my attempt to document my
experiences and rationale for wanting to use one, as well as my thoughts on
mobile Linux in general.
read more →
This is a post I've been meaning to write for a while now: one anecdotally
comparing programming languages in the Lisp family. I consider myself to be a
Lisp hacker. Perhaps that much was obvious from the letter λ adorning my
website's header, a reference to the λ-calculus which inspired John McCarthy to
design the first LISP [1]. Yet, "Lisp hacker" likely means little unless you,
too, consider yourself to be a Lisp hacker. Calling yourself one seems carry
some level of unstated meaning. Indeed, some identify with more specific groups.
"Schemer," or "Guiler," or "Racketeer," or "Clojurist." But "Lisp Hackers" ⊇
"Schemers". There is commonality shared among all, or at least most, of these
programming languages, and the Lisp hackers recognize and appreciate that
commonality – the characteristics that make a programming language a Lisp.
Homoiconic syntax, powerful metaprogramming facilities, and editor support that,
in my opinion, is unparalleled. (Yes, I am alluding to GNU Emacs.) This article,
however, is concerned with the differences. In it, I will be considering the
specifics of each dialect, and whether or not those specifics make for a
language I would want to use to develop a new piece of software.
read more →
If you're about my age and had a similarly dull upbringing, you probably also
have memories of playing video games behind a teacher's back whenever class
involved going to some sort of "computer lab." Flash games were the thing when I
was in elementary school, and when I was in middle school, I'd bring Quake with
me on a flash drive. By the time I was in high school, I'd realized that these
opportunities were better spent getting a head start on homework for other
classes, but I did have a few friends who still passed the time playing video
games. Rather than Flash games or Quake, though, these were browser games using
the new-fangled HTML5 canvas. I'd practically forgotten these games existed
until someone from my capture-the-flag team mentioned "krunker.io". Apparently
it's one of the more popular ones. It got me thinking about how I'd go about
writing cheats for a game in the browser. Writing cheats for CS:GO was a breeze,
so why would this be any harder? I had some time to spare over winter break, so
I decided to give it a go and see what kind of damage I could do.
read more →
It's been over a year since I last wrote about contenders for the throne that C
currently sits upon, so I'll spare you the prosy introduction and cut to the
chase. I'd like to share some thoughts on my recent foray into a little
programming language I came across while browsing lobste.rs some years ago:
Myrddin, the pet project of Ori Bernstein. From the language specification,
"Myrddin is designed to be a simple programming language. It is designed to
provide the programmer with predictable behavior and a pragmatic set of
semantics, providing the benefits of strong type checking, generics, type
inference, and modern features with a high cost-benefit ratio. Myrddin is not a
language designed to explore the forefront of type theory or compiler
technology. Its focus is on being a practical, small, well defined, and easy to
understand language for work that needs to be close to the hardware. Myrddin is
influenced strongly by C and ML, with ideas from too many other places to name."
The front page of the website specifically states that "[i]t aims to fit into a
similar niche as C, but with fewer bullets in your feet." I see these
descriptions and the cat-v-inspired stylesheets as a warning to those who don't
appreciate a spartan attitude towards software development. Fortunately,
I'm not one of those people.
read more →
Hey, there! I'm Jakob, a Google Summer of Code intern and new contributor to
Guix. Since May, I've been working on a DevOps automation tool for the Guix
System, which we've been calling guix deploy.
read more →
Rather than study for finals this week, I spent my time moving this blog over to
Haunt. Previously, I was using Hugo, and while ox-hugo made the authoring
workflow tolerable, doing anything on the rendering side of things was unsavory
at best. I eventually had enough and decided to look for another solution, of
which Haunt was the most enticing.
read more →
In the introduction of the previous post I wrote for this series, First
Impressions of the Rust Programming Language, I alluded to the presence of
arguments that programming language safety should be achieved by moving to
languages such as Java which run on a virtual machine. While "safety" may no
longer be the first thing that comes to mind in discussion of these languages,
especially with the hundreds of vulnerabilities in various implementations
of the Java virtual machine, it would be unfair to deny that the principle of
running programs in a sandboxed virtual machine is safer than running machine
code directly. This post won't be making any claims about safety, though, as I'm
more interested in writing about my impressions from a language design
perspective. So, how does Java fare in this regard?
read more →
Slime the World was my entry to this year's Autumn Lisp Game Jam, and it managed
to win second place. The theme was slime, so it’s a game about covering
everything in sight with slime, and the dialect of Lisp I chose to use was
Fennel, a simple and elegant Lisp that I feel perfectly matches the simplicity
and elegance of Lua. It takes on a more "modern" style that I associate with
Lisps such as Clojure. I had initially pushed Clojure to the side, feeling it
was too different from Common Lisp, but now that I've had a positive firsthand
experience with a Lisp where lists aren't the data structure you always reach
for, I'm hoping to return to it with an open mind.
read more →