George MacRorie

George MacRorie

@georgemac.bsky.social

Maker of internet things. Currently deploying ClickHouse all over the place. Previously flipt.io, InfluxDB, Codeship, and more lost to time. https://george.macro.re

167 followers200 following174 posts

George MacRorie reposted

I have a few months open for new work. If you're scaling a #startup and need hands-on help with automation, #kubernetes, or #o11y let's talk. If you're trying to figure out where AI actually fits in your product without the hype also me. Pragmatic hitch-hiking available. 🚐 shippingbytes.com

George MacRorie reposted

We (restate.dev) are hiring for infra roles (my team) and some engineers on the GTM side. For infra, if you have experience operating stateful applications on kubernetes, building k8s operators and general cloud provider IaC then please apply! πŸ‘‡ jobs.ashbyhq.com/restate

restate.devRestate - Build innately resilient distributed appsRestate is a lightweight runtime that lets developers build innately resilient distributed apps without the complexity tax.

Anyone else getting their inbox absolutely hammered by a second wave of #zendesk support abuse emails? I got this the other day. Loads of activation requests from different companies. I ignored them. Today they seem to have filed tickets someone with maybe 60 different companies.

George MacRorie reposted

No one: Robots:

Chris Paxton@cpaxton.bsky.social

NOETIX robot: 44lbs, <4 feet tall, 18 dof, Jetson on board. Starting at $5.5k. At this rate I am fairly convinced there will be robots absolutely everywhere within 5 years; although probably more form factors than just humanoids.

Mark did a load of cool shit to get this together πŸ€™ it’s a fun read.

Mark Phelps@markphelps.github.io

Just published a technical deep dive that's been brewing β˜•οΈ for a loooong time. From FFI to WebAssembly, we share our journey building SDKs that work (almost) everywhere. Would love your feedback! blog.flipt.io/from-ffi-to-...

George MacRorie reposted

I feel like I need two forms of contact for most folks now. My mortgage advisor just had their email / dropbox hacked. They sent me (and other customers) a dodgy who knows what payload disguised as a PDF. Lucky I had him on WhatsApp and could ping him directly about it. He replied "delete it now!"

Last year my Grandmother got hacked, they read her emails and impersonated her tone of voice. Leant into the fact she is quite religious and built up a story about needing help to buy a gift voucher for a friend, but was getting stuck and confused. I fell for it that time πŸ˜‚

George MacRorie reposted

New example image for #goshot and I kind of love it. Also updated the wiki and added a list of all themes, including several new #colorblind friendly schemes. I am getting pretty close to a v1.0 release hopefully. Just need to fix some stuff with the terminal rendering. #go #golang #foss

George MacRorie reposted

Yesterday @markphelps.github.io and I finished our first MVP of history and rollback capabilities in Glu. Now each phase in Glu has its own relevant and isolated history of versions that can be explored and when needed, rolled back to. #buildinpublic #golang #gitops 🧡

View full thread

This new, fine grained history can be leveraged to reverse just the operations necessary to rollback the particular pipelines relevant changes. It also means, that the history view per phase, only contains the points in Git history that effected our particular application.

But this is just Git history right? That's the point of putting it in Git in the first place. True, and Git and it's commits remain the source of truth for Glu. However, Git's history contains entries for all my applications, and a single commit could touch multiple of them in our pipeline.

So Glu goes a step further and builds per phase history using your code. When you implement a Glu pipeline, you explain (in Go) how to marshall what changes to and from the filesystem per phase. When commits come in, Glu runs this code per phase to extract the relevant changes and log them itself.

I am doing silly things with #golang iterators again. So thought I would share in the hope it is helpful, or maybe someone will show me a better way. This time I have a collection type, which exposes its own abstraction for iterating over its contents. Instead, I want it to use the iter package. 🧡

View full thread

Also, notice that our iterator does a range on our channel of entries. This will run until this channel is closed. We close this channel in a defer in the goroutine which calls ascend/descend. This ensures both conditions "btree is exhausted" and "iterator returned early" coordinate and cleanup.

I am doing silly things with #golang iterators again. So thought I would share in the hope it is helpful, or maybe someone will show me a better way. This time I have a collection type, which exposes its own abstraction for iterating over its contents. Instead, I want it to use the iter package. 🧡

View full thread

Now we can start our Ascend / Descend old style iterator in a goroutine. Remember these take a function which operates on each entry in the tree. So, we're going to use this opportunity to send on our channel. We use select in our function to switch between our send operation or a receive on stop.

The stop channel is going to allow our iterator to signal an early exit when the new style iterator recieves a false when calling yield. This happens when a for range over the iterator returns early (e.g. in a break or return). Notice we close this channel in a defer in our iterator sequence.

I am doing silly things with #golang iterators again. So thought I would share in the hope it is helpful, or maybe someone will show me a better way. This time I have a collection type, which exposes its own abstraction for iterating over its contents. Instead, I want it to use the iter package. 🧡

View full thread

We need to be able to control iteration, yielding to range at our own discretion with the iter package. However, btree's style of iteration enters a feeding loop when we call Ascend or Descend. So how can we go about coordinating these two styles together? Enter goroutines and unbuffered channels.

We're going to call Ascend / Descend in their own goroutine as we dont want to block returning an iterator. We're going to use a channel (well two, we will come to that) for passing our entries from old iterator to the new one. A buffer of zero ensures we synchronize our sender and receiver.

I am doing silly things with #golang iterators again. So thought I would share in the hope it is helpful, or maybe someone will show me a better way. This time I have a collection type, which exposes its own abstraction for iterating over its contents. Instead, I want it to use the iter package. 🧡

On initial glance, this looks a looks a lot like the new iterator style in Go, which also involves a function for handling individual entries in the collection. However, the contract is actually the inverse. With the iterator package in Go, we are given a function to yield to.

George MacRorie reposted

Whilst working on implementing payments I realised I needed access to the courses admin page so I quickly whipped it up. As usual I used Golang and HTMX to implement the filtering, infinite scroll and editing capabilities to make the app feel like a SPA. #buildinpublic

Gianluca is a legend πŸ‘Œ and kindly listened to me rant on about Glu this week.

Gianluca@gianarb.it

Monday @georgemac.bsky.social demoed Glu to me and yep! He is up to something fun! A framework that can be used to pilot a deployment system. Kind of nice to glue together the million tools we need to deal with then it comes to releasing software!

Today I am thankful for the seagull population of Brighton for keeping me on target for my diet goals. Second pastry stolen this year. Third attempt they’ve made on me too this year. They’re 2 for 3. Sadly I will never learn.