Full Width [alt+shift+f] Shortcuts [alt+shift+k]
Sign Up [alt+shift+s] Log In [alt+shift+l]
11
After quite the hiatus from Netrunner I had a chance to join a tournament here in Linköping with 14 participants. The number of players has grown a lot since the previous tournament which is really great. As I really wanted to win the wonderful Day Job playmat I went with two of the best decks I could come up with. I went with the Noise deck I’ve been playing a while which has been performing really well. I was expecting a lot of EtF so I was on the verge on playing a classic Looking 4 Job Whizzard deck but I switched to Noise just before the tournament as I’m more comfortable with it but I also find it more fun to play Noise than anything else. As for the corp I had played a little Foodcoats since it dominated worlds and it has felt extremely solid overall. Tournament structure We did 4 rounds of swiss without a cut, even though I was personally hoping for 5 rounds. The more games I can play the better it is, I just love to play you know. As usual you get 2 points for each game you...
over a year ago

Improve your reading experience

Logged in users get linked directly to articles resulting in a better reading experience. Please login for free, it takes less than 1 minute.

More from Jonas Hietala

Let's build a VORON 0

About 1.5 years ago I ventured into 3D printing by building a VORON Trident. It was a very fun project and I’ve even used the printer quite a bit. Naturally, I had to build another one and this time I opted for the cute VORON 0. Why another printer? I really like my VORON Trident and it’ll continue to be my main printer for the foreseeable future but a second printer would do two important things for me: Act as a backup printer if my Trident breaks. A printer made partially of printed parts is great as you can easily repair it… But only if you have a working printer to print the parts. It would also be very annoying if I disassemble the printer because I want to mod it and realize I’ve forgotten to print a part I needed. Building printers are really fun. Building the VORON Trident is one of my most fun and rewarding projects I’ve done. Why a VORON 0? These properties makes the VORON 0 an ideal secondary printer for me: You need to assemble the VORON 0 yourself (a feature not a bug) Prints ABS/ASA well (for printer parts) Very moddable and truly open source It’s tiny The VORON 0 to the left and the VORON Trident 250 to the right. It’s really small, which is perfect for me as I have a limited amount of space. It would be very fun to build a VORON 2.4 (or even a VORON Phoenix) but I really don’t have space for more printers. Getting the parts I opted to buy a kit instead of self-sourcing the parts as it’s usually cheaper and requires a lot less work, even if you replace some parts. This is what I ended up getting: A VORON 0 kit from Lecktor Parts for a Dragon Burner toolhead Parts for a Nevermore V4 active carbon filter Later on, I replaced the SKR Mini E3 V2 that came with the kit with the V3 Lots of delays I ordered a VORON 0 from Lecktor in February 2024 and it took roughly 4 months before I got the first shipment of parts and it wasn’t until the end of 2024 that I had received all the parts needed to complete the build. The wait was annoying… While I can’t complain about the quality of parts, with the massive delays I regret ordering from Lecktor and in hindsight I should’ve ordered an LDO kit from 3DJake, like I was first considering. Printing parts myself So what do you do when you can’t start the build? You print parts! A box of some of the printed parts for the build (and many I later threw away). There’s something very satisfying with printing parts you then build a printer with. This time I wanted to make a colorful printer and I came up with this mix of filament: PolyLite ASA Yellow Formfutura EasyFil ABS Light Green Formfutura EasyFil ABS Light Blue Formfutura EasyFil ABS Magenta I think they made the printer look great. The build I won’t do as detailed of a build log as I did when building the VORON Trident but I tried to take some pictures. Scroll on! Frames and bed The linear Y-rails. The kit comes with the Kirigami bed mod. The frame with A/B motors. Building the bottom of the printer with feet, power supply, and display. MGN9 instead of MGN7 X-axis After I assembled the X-axis I noticed a problem: The carriage collides with the stock A drive. The reason is that the kit comes with MGN9 rails for the X-axis instead of the standard MGN7 rails. This required me to reprint modified A/B drives, X-carriage, and alignment tools. The carriage passes the modded B drive. Belts Starting to install the belt. The belt is tight. Dragon Burner toolhead I got the parts needed to build the standard mini stealthburner… But I’m attracted to playing around with new stuff and I decided to try out the Dragon Burner instead. I went with it because it’s quite popular, it has good cooling (I print a bunch of PLA), and I haven’t tried it out yet. The fans are inserted. I don’t care about LEDs so I inserted an opaque magenta part instead. I think it looks really good. The back of the Dragon Burner. I opted for the Rapido 2 instead of the Dragon that came with the kit because the Dragon has problems printing PLA. I was a bit confused on how to route the wires as there was very little space when mounting the toolhead on the carriage. Routing the wires close to the fans, clipping off the ears of the fans, and holding together it with cable ties in this way worked for me. Galileo 2 standalone Dragon Burner together with the Galileo 2 extruder mounted on the printer. For the extruder I opted for the standalone version of Galileo 2. I’ve used Galileo 2 on the Trident but I hated the push down latch it uses in the Stealthburner configuration. The latch eventually broke by pulling out a heat-set insert so I went back to the Clockwork 2 on the Trident, giving me the parts to rebuilt the Galileo for the VORON 0 in a standalone configuration. The parts for Galileo 2. There will be left-overs from the Stealthburner variant. The build was really fast and simple—compared to the Stealthburner variant it’s night and day. I didn’t even think to take a break for pictures. Nevermore filter Since I want to be able to print ABS I feel I need to have an activated carbon filter. I wanted to have an exhaust fan with a HEPA filter as well, but I’ll leave that to a mod in the future. The Nevermore V4 is an activated carbon filter that fits well in the VORON 0. I fastened the fan using a strip of VHB—it was a struggle to position it in the middle. The Nevermore is mounted standing in the side of the printer. Just remember to preload the extrusion with extra M3 nuts when you assemble the printer. (I’ve heard LDO has nuts you can insert after… Sounds great.) Panels With the panel and spool holder at the back. Please ignore the filament path in this picture, it’ll interfere with the rear belt when routed behind the umbilical cable. With the tophat and door installed. I’m slightly annoyed with the small gaps and holes the printer has (mainly between the tophat and the panels at the bottom half). I later changed some of the parts related to the top hat to match the colorscheme better. Wiring Wiring was simpler than for the Trident but it was harder to make the wiring pretty. Thank god I could cover it up. The underside of the printer with the power, 5V converter, display, and Z-motor. Back of the printer with the Raspberry Pi and MCU. Raspberry Pi The Raspberry Pi only has two cables; power and communication over the GPIO pins and a display via USB. The Pi communicates and gets power over the TFT connection on the MCU. Toolhead The kit came with a toolhead board and breakout board for an umbilical setup: The toolhead board. The breakout board. I did run into an issue where the polarity of the fans on the toolhead board did not match the polarity of the fans on the MCU, leading to some frustration where the fans refused to spin. I ended up swapping the polarity using the cables from the breakout board to the MCU. Chamber thermistor The MCU only has two thermistor ports and they’re used for the hotend and bed thermistors. For the chamber thermistor (that’s integrated into the breakout board) I use the MOSI pin on the SPI1 8-pin header: The chamber thermistor connected to MOSI and ground on the SPI1 header. SKR mini E3 v3 I got an SKR mini E3 v2 with the kit but I replaced it with the v3 for two reasons: FAN output, used for the Nevermore Filter A filament runout sensor There’s not much to say about the extra FAN output but the filament runout sensor has 3 pins, while VORON 0.2 style runout sensor has 3 pins. I reused the prepared y-endstop I got with the kit, scratched away some of the plastic to make the 2-pin connection fit the 3-pins on the MCU (the +5V pin isn’t needed): The filament runout sensor connected to E0-stop. Klipper setup I followed the VORON documentation and chose Mainsail as I’ve been happy with it on my Trident. I’m not going to describe everything and only call out some issues I had or extra steps I had to take. MCU firmware The VORON documentation assumes USB communication so the default firmware instructions didn’t work for me. According to BigTreeTech’s documentation if you communicate over USART2 (the TFT port) then you need to compile the firmware with Communication interface set to Serial (on USART2 PA3/PA2). You then need to use this klipper configuration: [mcu] serial: /dev/ttyAMA0 restart_method: command It took a long time for me to figure out as I had a display connected via USB, so I thought the display was the MCU and got stuck at a Your Klipper version is: xxx MCU(s) which should be updated: xxx error. Filament runout [filament_switch_sensor Filament_Runout_Sensor] pause_on_runout: True runout_gcode: PAUSE switch_pin: PC15 Chamber thermistor According to this comment this is the config to use the SPI header for a thermistor: [temperature_sensor chamber_temp] sensor_type: Generic 3950 sensor_pin: PA7 pullup_resistor: 10000 Works for me™ Display It’s easy to flash the display directly from the Raspberry Pi although the first firmware I built was too large. There are optional features you can remove but I removed too many so the configuration for the buttons wasn’t accepted. These were the features that ended up working for me: [*] Support GPIO "bit-banging" devices [*] Support LCD devices [ ] Support thermocouple MAX sensors [ ] Support adxl accelerometers [ ] Support lis2dw and lis3dh 3-axis accelerometers [ ] Support MPU accelerometers [*] Support HX711 and HX717 ADC chips [ ] Support ADS 1220 ADC chip [ ] Support ldc1612 eddy current sensor [ ] Support angle sensors [*] Support software based I2C "bit-banging" [*] Support software based SPI "bit-banging" Sensorless homing I was nervous setting up sensorless homing, fearing that without a physical switch the printer might decide to burn the motor against the edge or something. (I really have no idea how it works, hence my fear.) In the end it was straightforward. The VORON 0 example firmware was already configured for sensorless homing and the only things I had to do was: X-DIAG and Y-DIAG pins on the board Tweak the driver_SGTHRS values (I landed on 85 down from 255) And now I have sensorless homing working consistently. What confused me was that the sensorless homing guide and the homing macros it links to were slightly different from the VORON 0 example firmware and it wasn’t clear if I had to make all the changes or not. (I did not.) Some random issues I encountered In typical 3D printer fashion, you’ll always run into various issues, for example: I got the mcu shutdown: Timer too close error a few times. I don’t know what I did but it only happened a couple of times at beginning. The filament sensor had some consistency issues. Some extra tape on the bearing seemed to fix it. The filament keeps getting stuck in the extruder after unload. I’m still having issues but forgetting to tighten the nozzle and using a too short PTFE tube didn’t help. I had trouble getting the filament to stick to bed. Super frustrating to be honest. I re-calibrated the z offset and thumb screws a bunch of times and (right now) it seems to work fairly well. Even though you’re not supposed to need automatic bed leveling for a printer this small, I can’t help but miss the “just works” feeling I have with the Trident. Initial thoughts on the printer A model I printed for one of my kids. It came out really well. I haven’t printed that much with the printer yet but I have some positive things to say about it: Dragon Burner is great when printing PLA (which I use a lot). But I have some negative things to say too: horribly loud but the print movement is also too loud for my taste. It’s poorly insulated. For example there are gaps between the top hat and the rest of the printer that I don’t see a good way to cover up. Overall though I’m very happy with it. I wouldn’t recommend it as a first printer or to someone who just wants a tool that works out of the box, but for people like me who wanted to build a backup/secondary printer I think it’s great. What’s next? With a secondary printer finally up and running I can now start working on some significant mods for my Trident! This is the tentative plan right now: Inverted electronics mod. Replace Stealthburner with another toolhead, most likely A4T-toolhead. Build a BoxTurtle for multi-color support. But we’ll see when I manage to get to it. I’m not in a rush and I should take a little break and play with my VORON 0 and perhaps work on my other dozen or so projects that lie dormant.

6 days ago 7 votes
I'll give up Neovim when you pry it from my cold, dead hands

I recently came upon a horror story where a developer was forced to switch editor from Neovim to Cursor and I felt I had to write a little to cleanse myself of the disgust I felt. Two different ways of approaching an editor I think that there’s two opposing ways of thinking about the tool that is an editor: Refuse to personalize anything and only use the basic features “An editor is a simple tool I use to get the job done.” Get stuck in configuration hell and spend tons of time tweaking minor things “An editor is a highly personalized tool that works the way I want.” These are the extreme ends of the spectrum to make a point and most developers will fall somewhere in between. It’s not a static proposition; I’ve had periods in my life where I’ve used the same Vim configuration for years and other times I’ve spent more time rewriting my Neovim config than doing useful things. I don’t differentiate between text editors and IDEs as I don’t find the distinction very meaningful. They’re all just editors. Freedom of choice is important Freedom of choice is more to be treasured than any possession earth can give. David O. McKay Some developers want zero configuration while others want to configure their editor so it’s just right. Either way is fine and I’ve met excellent developers from both sides. But removing the power of choice is a horrible idea as you’re forcing developers to work in a way they’re not comfortable with, not productive with, or simply don’t like. You’re bound to make some of the developers miserable or see them leave (usually the best ones who can easily find another job). To explain how important an editor might be to some people, I give you this story about Stephen Hendry—one of the most successful Snooker players ever—and how important his cue was to him: In all the years I’ve been playing I’ve never considered changing my cue. It was the first cue I ever bought, aged 13, picked from a cabinet in a Dunfermline snooker centre just because I liked the Rex Williams signature on it. I saved £40 to buy it. It’s a cheap bit of wood and it’s been the butt of other players’ jokes for ages. Alex Higgins said it was ‘only good for holdin’ up f*g tomatoes!’ But I insist on sticking with it. And I’ve won a lot of silverware, including seven World Championship trophies, with it. It’s a one-piece which I carry in a wooden, leather-bound case that’s much more expensive than the cue it houses. But in 2003, at Glasgow airport after a flight from Bangkok, it emerges through the rubber flaps on the carousel and even at twenty yards I can see that both case and cue are broken. Snapped almost clean in two, the whole thing now resembling some form of shepherd’s crook. The cue comes to where I’m standing, and I pick it up, the broken end dangling down forlornly. I could weep. Instead, I laugh. ‘Well,’ I say to my stunned-looking friend John, ‘that’s my career over.’ Stephen Hendry, The Mirror Small improvements leads to large long-term gains Kaizen isn’t about massive overhauls or overnight success. Instead, it focuses on small, continuous improvements that add up to significant long-term gains. What is Kaizen? A Guide to Continuous Improvement I firmly believe that even small improvements are worth it as they add up over time (also see compound interest and how it relates to financial investments). An editor is a great example where even small improvements may have a big effect for the simple reason that you spend so much time in your editor. I’ve spent hours almost every day inside (neo)vim since I started using it 15+ years ago. Even simple things like quickly changing text inside brackets (ci[) instead of selecting text with your mouse might save hundreds of hours during a programming career—and that’s just one example. Naturally, as a developer you can find small but worthwhile improvements in other areas too, for instance: Learning the programming languages and libraries you use a little better Customizing your keyboard and keyboard layout This is more for comfort and health than speed but that makes it even more important, not less. Increasing your typing speed Some people dismiss typing speed as they say they’re limited by their thinking, not typing. But the benefit of typing faster (and more fluidly) isn’t really the overall time spent typing vs thinking; it’s so you can continue thinking with as little interruption as possible. On some level you want to reduce the time typing in this chain: think… edit, think… edit, think… It’s also why the Vim way of editing is so good—it’s based on making small edits and to return quickly to normal (thinking) mode. Some people ask how can you afford to spend time practicing Vim commands or to configure your editor as it takes away time from work? But I ask you: with a programming career of several decades and tens of thousands of hours to spend in front of your computer, how can you afford not to? Neovim is versatile During the years I’ve done different things: Switched keyboard and keyboard layout multiple times. Been blogging and wrote a book. The one constant through all of this has been Neovim. Neovim may not have the best language specific integrations but it does everything well and the benefit of having the same setup for everything you do is not to be underestimated. It pairs nicely with the idea of adding up small improvements over time; every small improvement that I add to my Neovim workflow will stay with me no matter what I work with. I did use Emacs at work for years because their proprietary language only had an Emacs integration and I didn’t have the time nor energy to create one for Neovim. While Evil made the experience survivable I realized then that I absolutely hate having my work setup be different from my setup at home. People weren’t overjoyed with being unable to choose their own editor and I’ve heard rumors that there’s now an extension for Visual Studio. Neovim is easily extensible Neovim: a Personalized Development Environment TJ DeVries A different take on editing code I’ve always felt that Vimscript is the worst part of Vim. Maybe that’s a weird statement as the scriptability of Vim is one if it’s strengths; and to be fair, simple things are very nice: nnoremap j gj set expandtab But writing complex things in Vimscript is simply not a great experience. One of the major benefits of Neovim is the addition of Lua as a first-class scripting language. Yes, Lua isn’t perfect and it’s often too verbose but it’s so much better than Vimscript. Lua is the main reason that the Neovim plugin ecosystem is currently a lot more vibrant than in Vim. Making it easier to write plugins is of course a boon, but the real benefit is in how it makes it even easier to make more complex customization for yourself. Just plop down some Lua in the configuration files you already have and you’re done. (Emacs worked this out to an even greater extent decades ago.) One way I use this customizability is to help me when I’m blogging: Maybe you don’t need to create something this big but even small things such as disabling autoformat for certain file types in specific folders can be incredibly useful. Approachability should not be underestimated. While plugins in Lua is understandably the focus today, Neovim can still use plugins written in Vimscript and 99% of your old Vim configuration will still work in Neovim. Neovim won’t go anywhere The old is expected to stay longer than the young in proportion to their age. Nassim Nicholas Taleb, “Antifragile” The last big benefit with Neovim I’ll highlight—and why I feel fine with investing even more time into Neovim—is that Neovim will most likely continue to exist and thrive for years if not decades to come. While Vim has—after an impressive 30 years of development—recently entered maintenance mode, activity in Neovim has steadily increased since the fork from Vim more than a decade ago. The amount of high quality plugins, interest in Google trends, and GitHub activity have all been trending upwards. Neovim was also the most desired editor according to the latest Stackoverflow developer survey and the overall buzz and excitement in the community is at an all-time high. With the self-reinforced behavior and benefits of investing into a versatile and flexible editor with a huge plugin ecosystem such as Neovim I see no reason for the trend to taper off anytime soon. Neovim will probably never be as popular as something like VSCode but as an open source project backed by excited developers, Neovim will probably be around long after VSCode has been discontinued for The Next Big Thing.

a month ago 17 votes
Securing my partner's digital life

I’ve been with Veronica for over a decade now and I think I’m starting to know her fairly well. Yet she still manages to surprise me. For instance, a couple of weeks ago she came and asked me about email security: I worry that my email password is too weak. Can you help me change email address and make it secure? It was completely unexpected—but I’m all for it. The action plan All heroic journeys needs a plan; here’s mine: .com surname was available). Migrate her email to Fastmail. Setup Bitwarden as a password manager. Use a YubiKey to secure the important services. Why a domain? If you ever want (or need) to change email providers it’s very nice to have your own domain. For instance, Veronica has a hotmail.com address but she can’t bring that with her if she moves to Fastmail. Worse, what if she gets locked out of her Outlook account for some reason? It might happen if you forget your password, someone breaks into your account, or even by accident. For example, Apple users recently got locked out of their Apple IDs without any apparent reason and Gmail has been notorious about locking out users for no reason. Some providers may be better but this is a systemic problem that can happen at any service. In almost all cases, your email is your key to the rest of your digital life. The email address is your username and to reset your password you use your email. If you lose access to your email you lose everything. When you control your domain, you can point the domain to a new email provider and continue with your life. Why pay for email? One of the first things Veronica told me when I proposed that she’d change providers was that she didn’t want to pay. It’s a common sentiment online that email must be cheap (or even free). I don’t think that email is the area where cost should be the most significant factor. As I argued for in why you should own your email’s domain, your email is your most important digital asset. If email is so important, why try to be cheap about it? You should spend your money on the important things and shouldn’t spend money on the unimportant things. Paying for email gives you a couple of nice things: Human support. It’s all too easy to get shafted by algorithms where you might get banned because you triggered some edge case (such as resetting your password outside your usual IP address). Ability to use your own domain. Having a custom domain is a paid feature at most email providers. A long-term viable business. How do you run an email company if you don’t charge for it? (You sell out your users or you close your business.) Why a password manager? The best thing you can do security wise is to adopt a password manager. Then you don’t have to try to remember dozens of passwords (leading to easy-to-remember and duplicate passwords) and can focus on remembering a single (stronger) password, confident that the password manager will remember all the rest. “Putting all your passwords in one basket” is a concern of course but I think the pros outweigh the cons. Why a YubiKey? To take digital security to the next level you should use two-factor authentication (2FA). 2FA is an extra “thing” in addition to your password you need to be able to login. It could be a code sent to your phone over SMS (insecure), to your email (slightly better), a code from a 2FA app on your phone such as Aegis Authenticator (good), or from a hardware token (most secure). It’s easy to think that I went with a YubiKey because it’s the most secure option; but the biggest reason is that a YubiKey is more convenient than a 2FA app. With a 2FA app you have to whip out your phone, open the 2FA app, locate the correct site, and then copy the TOTP code into the website (quickly, before the code changes). It’s honestly not that convenient, even for someone like me who’s used this setup for years. With a YubiKey you plug it into a USB port and press it when it flashes. Or on the phone you can use NFC. NFC is slightly more annoying compared to plugging it in as you need to move/hold it in a specific spot, yet it’s still preferable to having to jump between apps on the phone. There are hardware keys other than YubiKey of course. I’ve used YubiKey for years and have a good experience. Don’t fix what isn’t broken. The setup Here’s a few quick notes on how I setup her new accounts: Password management with Bitwarden The first thing we did was setup Bitwarden as the password manager for her. I chose the family plan so I can handle the billing. To give her access I installed Bitwarden as: I gave her a YubiKey and registered it with Bitwarden for additional security. As a backup I also registered my own YubiKeys on her account; if she loses her key we still have others she can use. Although it was a bit confusing for her I think she appreciates not having to remember a dozen different passwords and can simply remember one (stronger) password. We can also share passwords easily via Bitwarden (for news papers, Spotify, etc). The YubiKey itself is very user friendly and she hasn’t run into any usability issues. Email on Fastmail With the core security up and running the next step was to change her email: Gave her an email address on Fastmail with her own domain (<firstname>@<lastname>.com). She has a basic account that I manage (there’s a Duo plan that I couldn’t migrate to at this time). I secured the account with our YubiKeys and a generated password stored in Bitwarden. We bolstered the security of her old Hotmail account by generating a new password and registering our YubiKeys. Forward all email from her old Hotmail address to her new address. With this done she has a secure email account with an email address that she owns. As is proper she’s been changing her contact information and changing email address in her other services. It’s a slow process but I can’t be too critical—I still have a few services that use my old Gmail address even though I migrated to my own domain more than a decade ago. Notes on recovery and redundancy It’s great to worry about weak phishing, weak passwords, and getting hacked. But for most people the much bigger risk is to forget your password or lose your second factor auth, and get locked out that way. To reduce the risk of losing access to her accounts we have: YubiKeys for all accounts. The recovery codes for all accounts are written down and secured. My own accounts can recover her Bitwarden and Fastmail accounts via their built-in recovery functionality. Perfect is the enemy of good Some go further than we’ve done here, others do less, and I think that’s fine. It’s important to not compare yourself with others too much; even small security measures makes a big difference in practice. Not doing anything at all because you feel overwhelmed is worse than doing something, even something simple as making sure you’re using a strong password for your email account.

2 months ago 40 votes
First impressions of Ghostty

There are two conflicting forces in play in setting up your computer environment: It’s common to find people get stuck at the extreme ends of the spectrum; some programmers refuse to configure or learn their tools at all, while others get stuck re-configuring their setups constantly without any productivity gains to show for it. Finding a balance can be tricky. With regards to terminals I’ve been using alacritty for many years. It gets the job done but I don’t know if I’m missing out on anything? I’ve been meaning to look at alternatives like wezterm and kitty but I never got far enough to try them out. On one hand it’s just a terminal, what difference could it make? Enter Ghostty, a terminal so hyped up it made me drop any useful things I was working on and see what the fuzz was about. I don’t quite get why people hype up a terminal of all things but here we are. Ghostty didn’t revolutionize my setup or anything but I admit that Ghostty is quite nice and it has replaced alacritty as my terminal. I just want a blank canvas without any decorations One of the big selling points of Ghostty is it’s native platform integration. It’s supposed to integrate well with your window manager so it looks the same and gives you some extra functionality… But I don’t know why I should care—I just want a big square without decorations of any kind. You’re supposed to to be able to simply turn off any window decorations: window-decoration = false At the moment there’s a bug that requires you set some weird GTK settings to fully remove the borders: gtk-titlebar = false gtk-adwaita = false It’s unfortunate as I haven’t done any GKT configuration on my machine (I use XMonad as my window manager and I don’t have any window decorations anywhere). There might some useful native features I don’t know about. The password input style is neat for instance, although I’m not sure it does anything functionally different compared to other terminals: Cursor invert cursor-invert-fg-bg = true In alacritty I’ve had the cursor invert the background and foreground and you can do that in Ghostty too. I ran into an issue where it interferes with indent-blankline.nvim making the cursor very hard to spot in indents (taking the color of the indent guides, which is by design low contrast with the background). Annoying but it gave me the shove I needed to try out different plugins to see if the problem persisted. I ended up with (an even nicer) setup using snacks.nvim that doesn’t hide the cursor: Left: indent-blankline.nvim (cursor barely visible) snacks.nvim (cursor visible and it highlights scope). Minimum contrast Unreadable ls output is a staple of the excellent Linux UX. It might look like this: Super annoying. You can of course configure the ls output colors but that’s just for one program and it won’t automatically follow when you ssh to another server. Ghostty’s minimum-contrast option ensures that the text and background always has enough contrast to be visible: minimum-contrast = 1.05 Most excellent. This feature has the potential to break “eye candy” features, such the Neovim indent lines plugins if you use a low contrast configuration. I still run into minor issues from time to time. Hide cursor while typing mouse-hide-while-typing = true A small quality-of-life feature is the ability to hide the cursor when typing. I didn’t know I needed this in my life. Consistent font sizing between desktop and laptop With alacritty I have an annoying problem where I need to use a very different font size on my laptop and my desktop (8 and 12). This wasn’t always the case and I think something may have changed in alacritty but I’m not sure. Ghostty doesn’t have this problem and I can now use the same font settings across my machines ( font-size = 16 ). Ligature support The issue for adding ligatures to alacritty was closed eight years ago and even though I wanted to try ligatures I couldn’t be bothered to “run a low quality fork”. Ghostty seems like the opposite of “low quality” and it renders Iosevka’s ligatures very well: My configured ligatures of Iosevka, rendered in Ghostty. Overall I feel that the font rendering in Ghostty is a little better than in alacritty, although that might be recency bias. I’m still undecided on ligatures but I love that I don’t have to feel limited by the terminal. I use a custom Iosevka build with these Ghostty settings: font-family = IosevkaTreeLig Nerd Font font-style = Medium font-style-bold = Bold font-style-italic = Medium Italic font-style-bold-italic = Bold Italic font-size = 16 Colorscheme While Ghostty has an absolutely excellent theme selector with a bunch of included themes (ghostty +list-themes) melange-nvim wasn’t included, so I had to configure the colorscheme myself. It was fairly straightforward even though the palette = 0= syntax was a bit surprising: # The dark variant of melange background = #292522 foreground = #ECE1D7 palette = 0=#867462 palette = 1=#D47766 palette = 2=#85B695 palette = 3=#EBC06D palette = 4=#A3A9CE palette = 5=#CF9BC2 palette = 6=#89B3B6 palette = 7=#ECE1D7 palette = 8=#34302C palette = 9=#BD8183 palette = 10=#78997A palette = 11=#E49B5D palette = 12=#7F91B2 palette = 13=#B380B0 palette = 14=#7B9695 palette = 15=#C1A78E # I think it's nice to colorize the selection too selection-background = #403a36 selection-foreground = #c1a78e I’m happy with Ghostty In the end Ghostty has improved my setup and I’m happy I took time to try it out. It took a little more time than “just launch it” but it absolutely wasn’t a big deal. The reward was a few pleasant improvements that have improved my life a little. And perhaps most important of all: I’m now an alpha Nerd that uses a terminal written in Zig. Did I create a custom highlighter for the Ghostty configuration file just to have proper syntax highlighting for this one blog post? You bet I did. (It’s a simple treesitter grammar.)

2 months ago 54 votes
2024 in review

It’s time for my 15th yearly review. Nerdy things I enjoyed I read a lot of fantasy books this year! My favorite new series were The Kingkiller Chronicle, Gentlemen Bastards series, and The Stormlight Archive. If you’re curious about Sanderson’s books but a little apprehensive about jumping into a massive series such as The Stormlight Archive then I’ll recommend The Emperor’s Soul as an excellent little introduction. The standalone book Warbreaker is also fantastic (available for free on Brandon’s website). Customizing Neovim was fun and rewarding. It’s amazing I got anything productive done this year… I really enjoy working with Rust in my own hobby projects. Types are coming to Elixir and I’m loving it. (I recently migrated some small projects to v1.18 and found a bunch of errors.) The Gleam programming language shows a lot of promise. My one gripe is the pain of manually encoding/decoding JSON (even with the various libraries). Compared to for example Elixir dynamic encoding or Rust’s #[derive(Deserialize)] it just feels so bad that I’ve avoided Gleam for some projects. Shame on me? CSS is alive and better than ever. Things I accomplished I quit my job and started my own company. At the moment I’m focusing on consulting but maybe something else can grow from it one day? I wrote 26 blog posts—it was quite a productive blogging year for me. I built a custom keyboard together with a custom keyboard layout. Made the eBook for Why Cryptocurrencies? freely available and finally finished the How I wrote ‘Why Cryptocurrencies?’ series. I wrote a Tree-sitter grammar for Djot. I need to be more active maintaining it… But it’s hard to get motivated as I’ve got so many other interesting things I’d like to work on. Managing an open source project is not for the faint of heart (or the easily distracted). Finished the blog series about building my first 3D printer. I’m up to over 2100 printing hours with the machine so it’s safe to say I’ve been using it, not only playing around with. Rewrote my lighting home automation from Python to Elixir. I realized that meta-blogging is a great way to get virtual points on Hacker News. Tentative plans/goals/wishes for 2025 For some reason the idea of writing a fantasy novel got stuck in my head. I had a stint where I listened to dozens of hours of advice for aspiring writers and started planning a series. The excitement tapered off a bit during the Christmas holidays and I don’t know if this was just a temporary sidetrack or if it’s something I’ll actually end up doing. Design a one-handed keyboard layout. Again, this was just something my brain got stuck thinking about and I’m not sure if it’s just a fleeting idea or something I need to do so I can stop thinking about it. (Sometimes just a little planning plus solving the most difficult problems are enough—I don’t have to finish all the crazy/dumb ideas I get for my mind to consider them “done”.) Complete my second 3D printer. There’s no point in having a single printer; what if I break it and I can no longer print replacement parts for it? Develop my home automation system more. I’ve got a ton of things I’d like to improve (or play around with). For instance, yesterday I received the Home Assistant Voice Preview Edition that I hope works as well as advertised.

2 months ago 48 votes

More in technology

How the government can raise taxes – and get away with it

It's time to treat Trump like the crisis he is

18 hours ago 2 votes
I've moved to Ghost Pro

Here's hoping this post is short and sweet… Back in 2019 I moved my blog off of WordPress and over to Ghost. In short, I wasn't happy with WordPress and wanted a blogging engine that felt more like it was made for blogging than a

11 hours ago 1 votes
Humanities Crash Course Week 13: The Qur’an

This week, I sampled one of the world’s great spiritual texts: the Qur’an. I also read poems by Rumi and saw a movie that led me to question my understanding of both. Readings As with many other people in the West, my understanding of Islam mostly comes from the news — often, in negative light. Also, I was raised Catholic and can’t help but parse these teachings through that tradition. Which is to say, I tried to read objectively, but aware that I’m likely biased. That said, I relished the opportunity to experience this book firsthand. The Qur’an has an interesting structure. Like many other books, it’s divided into chapters (surahs.) But instead of a chronological or topical organization, chapters are roughly sequenced from longest to shortest. (Except the first, which is a short prayer.) Gioia recommended fifteen surahs. As I often do after reading classic texts, I asked ChatGPT for a summary. Here it is verbatim: 1. Al-Fatiha (The Opening): A short prayer for guidance, mercy, and the straight path. Central to every unit of Muslim prayer. 2. Al-Baqara (The Cow): Longest surah; covers law, ethics, worship, community life, and stories of earlier prophets. Establishes Islam’s moral and legal foundations. 3. Al-Imran (The Family of Imran): Addresses Christians and Jews, emphasizes the unity of divine messages, and recounts the stories of Mary and Jesus with warnings against disbelief. 4. An-Nisa (The Women): Focuses on justice, women’s rights, inheritance laws, and proper conduct in war and peace; warns against hypocrisy and betrayal. 5. Al-Ma’ida (The Table Spread): Deals with dietary laws, contracts, and relations with Jews and Christians. Emphasizes loyalty to God’s covenant and the finality of Muhammad’s message. 12. Yusuf (Joseph): A narrative surah telling the story of Joseph in a literary and emotional style. A tale of patience, betrayal, forgiveness, and divine providence. 17. Al-Isra (The Night Journey): Takes its name from Muhammad’s mystical journey to Jerusalem and heaven. Emphasizes the Qur’an’s authority and the consequences of moral choices. 18. Al-Kahf (The Cave): Contains allegorical stories (Sleepers of the Cave, Moses and the Wise Man, Dhul-Qarnayn) about faith, knowledge, and the trials of life. 32. As-Sajda (The Prostration): Stresses the importance of divine revelation and resurrection. Calls for humility and recognition of God’s signs in creation. 36. Ya-Sin: Considered the “heart of the Qur’an”; focuses on God’s power, the resurrection, and human accountability, often recited for the dying. 55. Ar-Rahman (The Most Merciful): A poetic celebration of God’s mercy, creation, and judgment—famous for the refrain: “Which of your Lord’s favors will you deny?” 67. Al-Mulk (The Sovereignty): Reflects on God’s dominion over life and death. Encourages awe and contemplation of the natural world as a sign of divine power. 103. Al-Asr (Time): A short, stark reminder that time is running out—success lies in faith, good works, truth, and patience. 112. Al-Ikhlas (Sincerity): A concise declaration of pure monotheism: God is one, eternal, without equal or offspring. As may be evident here, the Qur’an blends spiritual teachings with social instruction, proposing norms, values, and institutions for a society centered on God. If Christianity’s core message is love, the core here is belief — specifically, belief in one supreme God. All else falls in line behind that idea. Reading Rumi deepened my understanding and appreciation. Through his poems, I perceived signals of what it might be like to live in a world saturated with God: ecstasy at the sight of a flower or the moon’s reflection in a still pond. Still, he reminds us these are only words: This is how it always is A great silence overcomes me, Gioia recommended a selection of Rumi’s poems, but I’ve enjoyed them enough that I’ve decided to read a whole collection. Rather than speedruning through it, I’ll read a bit at a time during my morning journaling sessions throughout the rest of the year. Audiovisual Music: Nusrat Fateh Ali Khan plus music from Tunisia. I was familiar with Ali Khan; his music was everywhere in the 1990s. He’s also one of the performers in the LAST TEMPTATION OF CHRIST soundtracks I highlighted earlier this year. Revisiting his music now gave me a new appreciation; like Rumi, he seems to express the ecstasy of living in a world soaked in divinity. Art: Gioia recommended looking at Islamic architecture. I’ve had the privilege of visiting two of the world’s great Islamic buildings, Hagia Sophia in Istanbul and the Alhambra in Granada. So that’s where my mind went. Hagia Sophia is one of the most impressive spaces I’ve ever been in; it must be experienced firsthand. That said, this NOVA program explains the building’s historical, cultural, and structural significance: This short presentation helped me understand the spiritual significance of sequencing and structure in Islamic religious buildings: The Alhambra is impressive for different reasons. For one thing, it’s not a religious structure. It’s arguably most famous for its beautiful mosaics. This video focuses on the palace’s hydraulic network, one of the world’s great engineering feats: This TEDEd presentation helped me understand the significance of the astonishing geometric decorations in these buildings: Both of these buildings also highlight Islam’s complex relationship with Christianity. Hagia Sophia started as a Christian church before being converted into a mosque, and the Alhambra stands as a reminder that part of Europe was under Islamic rule for a time. Cinema: rather than selecting a movie related to this week’s readings, I chose one I’d wanted to watch for a long time: Hal Ashby’s 1979 satire BEING THERE, starring the great Peter Sellers. By chance, a sheltered, single-minded, TV-obsessed, illiterate gardener named Chance is unwittingly thrust into the highest echelons of economic and political power. Due to his genteel demeanor, his naive utterances are continually misinterpreted as profundities. He remains aloof and uninvolved even as he becomes incredibly powerful. Rather, he becomes powerful because he is aloof and uninvolved. He has no awareness of (or concern for) how his words are interpreted, so he remains cool and neutral. This amplifies his image as a sage, feeding his growing myth. He and his interlocutors live in diverging worlds, reading into each others’ utterances meanings that aren’t there. Reflections Or are they? The movie suggests words don’t have inherent meaning; the meaning is in how we interpret them. Context informs understanding. Lacking an official backstory, people parse Chance through their preconceptions. In the first act, he introduces himself as “Chance the gardener.” But the idea that this seemingly refined gentleman is a mere gardener seems so unlikely that his interlocutor misinterprets his name as the more upper class Chancey Gardiner. And so it remains. When Chance(y) says “I like to watch,” he means something very different than what others hear, leading to particular and often unexpected actions. And it’s actions that ultimately matter. The Talmud puts it succinctly: “We do not see things as they are, we see them as we are.” I think about this whenever I engage with ancient scriptures. These texts were produced by and for very different cultures. The words mean different things to me than they likely meant to their original audiences. It’s not just that they were written in a language I don’t understand: they were written in a world I don’t understand. And yet, they endure. Why? We make the meaning. More precisely: meaning emerges as we parse the text through our particular understandings. And meaning adds value to our lives. What I took from my reading is that Islam positions itself as the culmination of monotheism. Characters, stories, and themes from the Jewish and Christian scriptures are present here too, but with a different focus. Somewhere along the line, Judaism and Christianity softened on the idea that there’s only one God. Islam aims to correct course. The idea of single-mindedly centering your life on something other than yourself is appealing. (Post-Freud, we’d say ego is the enemy.) The concept isn’t unique to Islam, of course. (And again, I’m likely reading into it.) What seems different is the Qur’an’s confident assertion of its message’s universal relevance. I can see how this all-encompassing vision can be seen as incompatible with secular post-modern societies. The Abrahamic traditions are also closely related, which can foster mutual understanding but also intensify disagreement. But I also sense the conflict emerges from literal readings, which we shouldn’t do. Again, these words emerge from — and speak to — different contexts. And I see the transcendent beauty in Rumi’s poems, the patterns of the Alhambra, and Nusrat Fateh Ali Khan’s singing, much as I do in Chartres Cathedral, the Mass in B Minor, and the Divine Comedy. All remind me that words can connect people to higher orders of being and to each other, elevating us all. Does God come in through the words or through what we bring to the words? Does it matter? It does. As Nietzsche warned, once we lose sense of the words’ specialness, we approach them differently — much like Chancey’s friends would hear him differently if they knew he was mere Chance. Some might say truth is what ultimately matters: that Chance is just a gardener who is, in the words of a character who knows, “stuffed with rice pudding between th’ ears. Shortchanged by the Lord, and dumb as a jackass.” But another character who also knows opts to not reveal the “truth” to avoid destroying his dying friend’s comforting illusion. An act of mercy? Delusion? Both? And then there’s the film’s last shot, which I won’t spoil. Let’s just say it casts doubts on whether any of these characters — or us voyeurs in this world of Chance — really knows what is in front of our eyes. Notes on Note-taking I used ChatGPT more extensively this week than at any previous point in the course. I started a ChatGPT project with the following system prompt: You are an expert tutor in literature, history, music, cinema, and more – in short, the humanities. I am in a year-long program to read through (and listen to and watch) the most important humanities works from across the world. You’ll provide summaries, pointers, and advice. Respond concisely but helpfully. Whenever possible, contextualize content by pointing out possible parallels with the modern day. Within this context, I asked ChatGPT to bring perspective to what I was reading — especially some of the most difficult passages and parallels between the other two Abrahamic traditions. I found parts of surah 4 challenging — especially those that address warfare and justice. I asked ChatGPT for a charitable interpretation of the scripture, and the LLM helpfully responded with explanations that helped me understand the text in its broader context. ChatGPT didn’t recommend it, but this video from Bishop Robert Barron also reminded me that the Judeo-Christian scriptures also have similarly difficult passages and that we must interpret them in the context for which they were written: After watching the TEDEd video about geometry in Islamic architecture, I asked ChatGPT, “How does the repetition through tessellation evident in Islamic decoration reflect the religion’s spiritual values?” I’ll quote its answer verbatim, since I found it both insightful and exemplary of the value I’m getting from using AI in this way: Beautiful question—and one that gets at the visual theology of Islam. Islamic decoration, especially through geometric tessellation, is not just ornamental—it’s deeply expressive of spiritual truths. Here’s how repetition, pattern, and abstraction in Islamic art reflect the core values of the faith: ⸻ 1. Unity in Multiplicity (Tawhid) The oneness of God (tawhid) is Islam’s central belief. Repeating geometric patterns express how divine unity underlies all diversity—a single pattern unfolds into infinite forms, just as all creation reflects the One. Spiritual message: Beneath complexity lies a single divine source. ⸻ 2. Infinity and the Transcendent Tessellations can theoretically extend forever—they have no beginning or end. This evokes infinity, a symbol of God’s eternal, boundless nature. The viewer is drawn into a contemplative state by the endless repetition. Spiritual message: God is beyond time, form, and limit. ⸻ 3. Non-figurative, Non-idolatrous Representation Islamic tradition discourages figural imagery in sacred contexts to avoid idolatry. Abstract, geometric art avoids representing God and instead points toward Him by evoking beauty, harmony, and transcendence. Spiritual message: God cannot be pictured—but can be reflected in patterns of perfection. ⸻ 4. Contemplation and Remembrance (Dhikr) Like repeated prayer or names of God, visual repetition becomes a form of remembrance. Islamic art invites stillness, reflection, and mental surrender—a visual dhikr. Spiritual message: Still the ego, contemplate the divine, dissolve into the pattern. ⸻ 5. Mathematics as Sacred Language Islamic artists used advanced geometry and symmetry, often guided by spiritual cosmology. The precision of the art mirrors the divine order in the cosmos, hinting that the universe is intelligible, ordered, and meaningful. Spiritual message: Creation is a sign (ayah) pointing to its Creator. The LLM included a helpful table: Artistic Feature Spiritual Reflection Repetition / Tessellation Unity, infinity, divine order No images of God or people Transcendence, anti-idolatry Symmetry and precision Balance, harmony, divine perfection Infinite extension God’s boundlessness and eternal presence Meditative patterning Encourages contemplation and surrender It concluded: Islamic art, in this sense, functions like visual theology: it doesn’t depict the divine, but invites you to perceive it—not through representation, but through pattern, balance, and beauty. Would you like to see some examples or diagrams that illustrate how these patterns are constructed mathematically or spiritually? I was intrigued by this last question, especially given that OpenAI just released improved ChatGPT image rendering capabilities. So I responded, “Yes, please show me an example diagram that illustrates these principles.” At this point, ChatGPT generated this image: Up Next We’re moving into the second quarter of the course. Gioia recommends books 1 and 2 of the Aeneid, book 1 of Ovid’s Metamorphoses, and a few other Roman poems, aphorisms, and proverbs. So we’re on our way back to Rome! Again, there’s a YouTube playlist for the videos I’m sharing here. I’m also sharing these posts via Substack if you’d like to subscribe and comment. See you next week!

17 hours ago 1 votes
Yesterday's 'golden age' turns into today's mess

Nick Timiraos for the Wall Street Journal: Corporate America’s Euphoria Over Trump’s ‘Golden Age’ Is Giving Way to Distress Investors were caught flat-footed by Trump’s animus toward Canada, which wasn’t a part of last year’s election campaign. Global

2 days ago 2 votes
Reading List 03/29/25

US bridges at risk of ship collisions, Airbus testing an unducted fan, an earthquake in Myanmar, China’s undersea cable cutter, and more.

2 days ago 2 votes