yaakov.online

yaakov.online


I fight with computers

yaakov.online

I fight with computers


Learning Kubernetes at Home: Becoming the Helmsman

After dipping my toes into containers a while ago, I've been trying to experiment with scaling containers out for a low-fuss highly-available system. I originally tried Docker Swarm, but while it has a very low barrier to entry, it was problematic in other ways that I ended up dumping that experimen…

mDNS Name Resolution in Linux

If there's one thing I love being able to do on my home network, it's resolving host names. Traditionally Windows, macOS and Linux have never really spoken the same language and without a DHCP+DNS server it becomes difficult to track what hosts have which IP addresses. RFC 6762 defines the .local to…

Windows 10 Fall Creator's Update: IIS

After upgrading my work PC to the latest version of Windows 10, Internet Information Service (IIS) no longer worked. Specifically, the only Application Pool that could start was DefaultAppPool. All other worker processes failed to start. The only clue was this error message, logged to the Windows Ap…

The Changing World of .NET

The following blog post is adapted from an internal presentation I gave at work a couple weeks ago. Overview In the last few years, Microsoft has shifted it's platform strategy drastically. Instead of being all about Windows, Microsoft has started to embrace the rest of the world. For example: Micro…

Configuring Wi-Fi on Raspbian (Jessie)

If you Google, DuckDuckGo. or even Bing how to set up Wi-Fi on Raspbian CLI, there are a bunch of guides I've found while trying to solve the same problem. Unfortunately, most of them are wrong. As of writing this I've just spent about half an hour running through a few of them, and they either have…

NFS on Raspbian (Jessie) at boot

To automatically connect to a NFS share when booting: Add a line for your NFS share to /etc/fstab. For me, I'm connecting to my NAS named Scarif, on a share named PiData, and mounting it to /mnt/pidata. scarif.local:/volume1/PiData /mnt/pidata nfs The fstab line is in three parts: What to mount - i…

HTTP/2 Header Casing

HTTP/2 is slowly becoming more and more widespread, and as it does, confusion gets to spread with it. Recently a colleague at work asked why they were getting lowercase header names from their local development web server. After a few hours of digging, it turns out that: This developer had recently…

Vehicular UIs can be dangerously bad

When someone is in control of a vehicle, the primary thing they have to do is control the vehicle. In aviation there's a popular phrase, "Aviate, Navigate, Communicate". This is the things a pilot must do, in order of priority: Aviate: Fly the aircraft. Keep it above the ground, away from…

The downside of working in a global company

This afternoon, towards the end of the day, one of my coworkers asked me for help. There was a PC in the New Zealand office that had run out of disk space because the temp folder was full, and the files in the temp folder had my name all over them. I went over to his desk as he had remote access to…

Thunderbolt Networking

Earlier this year I upgraded my MacBook Pro to one of the new ones with USB-C / Thunderbolt 3, and rebuilt my PC with a Thunderbolt 3-capable motherboard and a Thunderbolt 3 add-in card[1]. Although I couldn't find much information online at the time, I can confirm that the Thunderbolt Bridge networ…

Red-Green Trees

One of the many things I do at work is contribute towards one of our internal build tools. Without going into too many details, at a high level this build tool: Analyses all our project files Figures out what each project's output is Figures out what each project's dependencies are Builds a dependen…

Stack traces from async methods in .NET

Microsoft's .NET stack has one of the two best implementations of asynchronous code through coroutines that I've seen, and the only one actually available for me to use. (The other is some weird stuff Valve have internally within Steam.) .NET's task-based asynchronous APIs follow a similar idea behi…

Debugging CoreFX on macOS

A few weeks ago I was trying to set up a small iOS application when I came across an error in .NET Core when attempting to connect to the new HTTP/2-based Apple Push Notification System gateway. It appears that the issue is two-fold: The version of curl and libcurl that Apple ship with macOS does no…

Using HTTP/2 in .NET client applications

For some weird reason I don't understand, HTTP is a key part of Windows. It's integrated into Windows so much that in order to get WebSockets server support, you had to upgrade your PC to Windows 8 or Windows Server 2012. Similarly, to get HTTP/2 server support, you have to upgrade your machine to W…

Setting a proxy for Aptitude (on Windows)

In Windows, almost everything inherits the "Internet Explorer" proxy settings. I was somewhat surprised when the Linux Subsystem for Windows (beta) did not. For most Linux applications, you can set a proxy by setting the environment variable HTTP_PROXY, e.g. $ HTTP_PROXY=http://my.proxy.se…

Waiting for a Process with Timeout in .NET

Along the same lines of my last post, we might want to be smarter about launching a process and waiting for it to exit. Particularly if that process is part of a critical system such as your build process, you don't want a hung process to be able to cause your entire build system to stop dead in it'…

Redirecting process output in .NET

In .NET, you can use the System.Diagnostics.Process APIs to start a process and get it's output. It seems fairly simple, but there's a few interesting caveats beneath those APIs. In this post I'll be looking at the simple case of starting a process, waiting for it to finish, and reading the contents…

"Different and new is relatively easy. Doing something that's genuinely better is very hard." -- Sir Jonathan P. Ive

Taking a Tesla Test Drive

If you started talking about a vehicle with a nose cone and autopilot, I'd immediately assume that you were talking about an aircraft. With the Tesla Model S, that assumption no longer holds[1]. I had the chance to test-drive one recently - where chance I mean I asked them nicely by filling out a fo…

Core Graphics on iOS Draws Circles Backwards

Let's say we want to draw a custom view on iOS. This is usually where you we jump straight into Core Graphics and override - (void) drawRect:, or in Swift 3, draw(_ rect: CGRect). (I'm going to use Swift 3 for this blog post as this is what I was using when I stumbled across this issue, as a learnin…

Switching to Let's Encrypt

Setting up a website nowadays is a very easy process (compared to last decade), but SSL/TLS is still typically a pain in the rear end. It's also expensive, costing typically anywhere from $10/year upwards for a certificate, per domain. [Let's Encrypt][1] is a free and automated Certificate Authority…

Pokémon Go Walk

So unless you've been living under a rock, Pokémon Go - the new[1] Augmented Reality Pokémon game came out this week. After playing around with it for a bit, it seemed to be just single-player with two options: Visit "Pokéstops" to find items Catch Pokémon (No, I wasn't level 5 yet.) I ask…

SQL Server is smarter than I had assumed

Here's something neat about Microsoft SQL Server that I learned this week. I don't know if it applies to PostgreSQL, MySQL and other such systems, but I'd hope they're also as clever. Let's assume we're building an improved of the 5-minutes-of-fame app Yo. As well as being able to send a 'Yo' to ano…

"... always remember, if you do ask [a question], you may appear foolish for an instant, but if you do not ask, you may remain ignorant for a lifetime!" -- Rabbi David Freedman

A Clean Start

I often think "I should blog more" and then never do anything about it. I've tried a few times, but in a marvelous effort to create a nice, clean blog, I kind of forgot about usability for myself. My last blog, which has gone from Wordpress to Squarespace and then to Statamic, is a bit of…