Booting 5000 Erlangs on Ampere One 192-core| Underjord
This is the first part of an experimental journey as I explore how many instances of my favorite IoT framework I can run on the 192 core Ampere One.| Underjord
Binary deltas of firmware via fwup has been a supported feature for a while. There has also been a kind of rudimentary support for it in NervesHub. We can now remove the word rudimentary. There is now proper delta support in NervesHub. It is not in a tagged release quite yet but NervesCloud runs off of main and so can you if you would benefit from this.| Underjord
It all started when I visited Gig City Elixir. Or maybe it started when I did a workshop in preparation for a Code BEAM in Stockholm. But that actually started from reading Priya Parker's book The Art of Gathering. Maybe this has been coming for a while.| Underjord
We all have varying degrees of exposure to Big Tech. Some of it seems fine, stable and can be relied on. Some of it feels like shifting sand under your feet. React seems to move a lot on whims, I don’t envy tracking that. Go seems like it might be fairly stable? With the current geo-political climate I don’t find massive corporations to be a guarantee for stability. People may be getting fired even though they chose IBM.| Underjord.io
I wanted there to be an Elixir shirt you could buy. I talked to some people. Made some calculations. Took some debatable photos. And now you can pre-order The Elixir Shirt. The Officialness This is an officially approved use of the Elixir logo trademark, by explicit permission from the Elixir core team. Usually the trademark can’t be used commercially. I was granted permission to make and sell products with the brand.| Underjord.io
Me and the team had a meeting which we dedicated to talking about architecture. Sort of an ad-hoc exploration of patterns and concepts. How systems usually fit together. Which is mostly through various types of queues. And a bunch of common patterns like request/response, publish/subscribe and workers on a queue. And most request/response is essentially workers on a queue going in two directions. This post was originally written as part of my newsletter which is a weekly thing that I’ve don...| Underjord.io
I hacked on something quite useful in the last few weeks, off and on. Voice Activity Detection in Elixir with Silero VAD through ONNX. I’ll show what I did and try to give an idea of what it is and why it is useful. It boiled down to this gist as a proof of concept. Should work on most Elixir installs. These days Membrane will even try to pull pre-compiled dependencies for the libraries it wants.| Underjord.io
What feels like forever ago but what was probably a year and a half I gave a talk about Lively LiveView with Membrane. Video is available for the curious. It was a stunt talk but also a talk about creativity and how Elixir let’s me plug things together and try things that feel magical. That feeling has never left me. Some of the magic is a goddamn pain. Take the Membrane framework.| Underjord.io
One of the Erlang ecosystem’s spiciest nerd snipes are hot code updates. Because it can do it. In ways that almost no other runtime can. I use Elixir which builds on Erlang and has the same capabilities. The standard way of doing Elixir releases via mix release does not support Erlang hot code updates. As in, it will not generate the necessary files for you. And if you do want to do it there are several blog posts you need to stitch together or you need to use the Erlang docs in great detail.| Underjord.io
Working on the Nerves project, the Embedded framework for Elixir, has given me an increased appreciation for how Frank Hunleth and his collaborators through the years have structured things. And while I’ve found crossing into the Linux-heavy part of it difficult and frustrating there has been reasonable steps to take all the way from building the application layer in Elixir all the way back to fighting the bootloader. I’ll try to detail how a Nerves system is built up in this post.| Underjord.io
The Nerves project is a way of building embedded Linux devices where the BEAM virtual machine takes care of running things. This does not constrain what you can run in any significant way. The easiest way to think of it is as a replacement for systemd. Though it is not only that. I will attempt to explain the different ways you can run things via the BEAM and consequently, on Nerves.| Underjord.io
I adore Nerves. I recently joined the core team. And I’ll be doing my best to help people get along with this lovely way to co-mingle hardware and massively concurrent reliable software. Getting started Assuming you have a comfortable Elixir & Erlang installed, preferrably the most recent. Most conveniently through asdf/mise, but I don’t judge. Instructions are lifted from the official docs but I will try to keep it leaner as I assume you are comfortable with Elixir.| Underjord.io
I’ve kept very busy recently and as I look at what I published last it has clearly kept me from blogging. I don’t love that. I like having a blog and I like tending to it. I’ve not missed a beat on the newsletter’s weekly cadence but that might not be your jam. Let’s catch up. I’ve been diving into embedded Linux with Elixir. My latest non-newsletter issue was about The Future Stack.| Underjord.io
I did a livestream where I talked about Object Storage. The how and the why. The Bad Old Days. And also the neat and interesting stuff just beyond the basics. I figured I’d cover that in text as well. You can watch the stream here. Transparency notice: The livestream and this blog post have been work supported by Tigris. We collaborate on the topics, they provide resources and pay for some of my time so I can do this stuff instead of writing software for clients.| Underjord.io
TLDR: the tricky part is “Large”. “Language” and “Model” seems manageable. But largeness has all sorts of trouble associated with it for mobile devices. Not insurmountable, but challenging. Also makes for finicky development. To start off, I am not an AI expert. I am not an ML engineer. I’m a web and systems dev that mostly works in Elixir these days. Through the Elixir community I got connected with ElectricSQL and have done some collaboration with them.| Underjord.io
In this series I’ve been unpacking various facets of Elixir. Mostly this has meant trying to explain Erlang and the BEAM through the lens of Elixir. Now we are moving into the domain of the web framework. This is where I dare say that Elixir has much more to say than Erlang. Erlang has to my understanding never landed fully on a canonical preferred web framework. Elixir has Phoenix and this post will be unpacking Phoenix.| Underjord.io
This series covers a lot of fundamentals about the underlying BEAM VM and Erlang as consequence of covering Elixir fundamentals. A lot has been said about The Actor Model when it comes to Erlang. That’s kind of funny. Because the only thing that as a matter of terminology should definitely be called actors in the Erlang world are Bjarne Däcker, Joe Armstrong, Mike Williams and Robert Virding as featured in Erlang: The Movie.| Underjord.io
Elixir supports the usual supects of observability. Open Telemetry (OTel), log handlers, capturing metrics. And it does it well. This post will mostly focus on the observability you have on the BEAM that is either incredibly rare to see elsewhere or possibly entirely unique. The previous posts on concurrency and resilience might give useful context around how processes work and how supervision trees are structured. I will try not to lean too heavily on them but if you feel the need to underst...| Underjord.io
We of the blessed church of Functional Programming pride ourselves on our immutability, purity and lack of noxious side-effects. We do not mutate the state. We only produce new and better state. Deterministic state. Correct state. The best state. Except that I work in Elixir. Elixir is built on Erlang. I like to think Erlang being FP is mostly an accidental side-effect of trying to solve a bunch of complex requirements around distributed systems, fault tolerance and consistently low latency (...| Underjord.io
I was a Python developer for some time and one great joy of Python is that you have an expressive language that you can use for your serious apps as well as for your hacky little one-off script or bespoke pieces of automation. By expressive I mean that typing very little can give you a lot of progress towards your result. I’ve scripted a fair bit in Python. Now I do it with Elixir.| Underjord.io
Another question might be; why do machine learning at all? I’m not big into ML/AI though I’ve been poking it more recently as the open models, such as Stable Diffusion and the more practical Whisper, caught my curiosity. I have a very decent GPU (3090 Ti) and I’ve poked around a bit. I don’t consider ML a super exciting solution to all the problems or a harbinger of general artificial intelligence.| Underjord.io
Last week I attended ElixirConf in Portugal and had a lovely time. I’ll try to capture my experience of the conference here in this post. For me and for you. The last ElixirConf I visited was Prague in 2019. Pre-pandemic. I had just gotten into Elixir and kind of decided that I should actually really engage and try to do the whole community thing with this language as it seemed like it had a community of a comprehendable size.| Underjord.io
I like production gear. Audio, video and .. miscellaneous. I like things that seem like they’ll make me oh-so-very productive. I’m a sucker prosumer as a hobby. Let’s talk about Elgato, Elixir and why I never actually get anything done. This is unfortunately not sponsored by a prosumer brand, or anyone, that’d have been something. Ad-style pitch for a business-thing: I help companies find competent, capable or promising Elixir developers. If you build in Elixir and want to spend less ...| Underjord.io
My presentation from ElixirConf Africa. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } Original 720 low Sorry, your browser does not support embedded videos.| Underjord.io
A short video on the importance of terminology in computing. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } Original 720 low Sorry, your browser does not support embedded videos.| Underjord.io
Are computers really all about queues? At some level. Probably. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } Original 720 low Sorry, your browser does not support embedded videos.| Underjord.io
I share my reactions to the Phoenix keynote at ElixirConf 2022. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } Original 720 low Sorry, your browser does not support embedded videos.| Underjord.io
Code has always been about creative pursuit for me. This video showcases Sonic Pi. It is an open source project that I really appreciate. Sonic Pi enables live coding of music. If you are already a programmer it can turn your hard-earned, often dry, programming capabilities into musical potential. If you know music, you might just learn programming. If you know neither it is a fantastically fun place to start.| Underjord.io
A short video on databases. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } Original 720 low Sorry, your browser does not support embedded videos.| Underjord.io
As part of running Underjord I’ve done both mentorship and some teaching. Both in the form of a working relationship where I have seniority and am responsible for supporting their learning as well as mentoring entirely external people of varying experience levels. I find it incredibly hard to transmit everything I think people need to get familiar with when they want to do development. Why? Well, I learned it all incrementally.| Underjord.io
Twice burnt, getting the hang of this fire thing. There’s a thing I’m wary of with both companies and developers: when they seem to operate mostly on fear. In the case of companies, fear can lead to heavy screening during the hiring process, heavy-handed, detail-oriented project management or distrust towards employees. To my mind, these things either come from the basic mode of operation of some founding member or from cultural scars caused by a bad hire, a runaway project or very anxiou...| Underjord.io
I’ve been trying to address this particular topic and I find it challenging. It is a topic that’s very easy to turn into a negative rant and that’s not what I like to do. If you enjoy any of the stacks I dismiss in this post, please know that is not a jab at you or your work. I have worked in these stacks and I’ve mostly transitioned away from them where they aren’t necessary.| Underjord.io
Slack, Teams, teamchat. We all use them in our jobs. It is unclear whether that’s even legal. I wanted to present one of the more well-known open source options and how to get started with it. This video is a collaboration with GleSYS. Keep them in mind for your cloud and data center needs in the Nordics. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.| Underjord.io
I’ve been thinking about shared experiences: culture and tradition. As the seed of this was written close to the holidays, it might be that they are to blame. But this post isn’t about Christmas or the new year; it’s about my reflections on these human matters and how they apply in the software development world. How we run dangerous commands Have you ever had to run a potentially dangerous command on a production server?| Underjord.io
In this very serious video I will tell you exactly how you must build your products. Actually, I’m just outlining the tools I’d typically look at and consider right now. I hope you enjoy. I rather like the intro personally. Also on YouTube. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play();...| Underjord.io
A video on doing LiveView with Nerves and having fun with input devices. Published as I finish up my backlog of publishing all my videos to my site. It should calm down now. This was also more thoroughly covered in text in this post. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return fal...| Underjord.io
This video covers the steps to set up Plausible Analytics. Previously published on YouTube and part of me catching up on site publishing :) function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } Original 720 low Sorry, your browser does not support embedded videos.| Underjord.io
Out of freak fortune I haven’t significantly used React. This was an experiment in just diving in and trying to use it. Be warned, if you know React it might hurt. Let me know you like it. This video has been on the YouTube channel for some time but I’m catching up on the transcoding and publishing here. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.| Underjord.io
A video explainer on what Phoenix LiveView is. Published late to this site, has been up on YouTube for some time. I’m catching up :) function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } Original 720 low Sorry, your browser does not support embedded videos.| Underjord.io
A video on why you should consider hosting your own services and data. Especially in the current EU legal landscape. Created in collaboration with GleSYS, a swedish data centre and cloud provider. This video lays the explanatory groundwork for a series of guides for setting up some self-hosted services. It went up on YouTube a while back, I’m catching up on the website publishing side :) function switch_video(element) { var src = element.| Underjord.io
Speculations and specifications. If you were a Winamp user back in the day, or curate an MP3 collection currently, you might recognize the humble ID3 tag. It is what the metadata in the MP3 file is made up of. First it was pretty limited in the version later dubbed ID3v1. Like any good 2.0 they added a ton more fields, features, removed character limits and it was suddenly ID3v2. The latest spec is ID3v2.| Underjord.io
I started writing this on the train home from Code BEAM. It’s an Erlang, Elixir (and BEAM in general) conference put on by Code Sync which is part of Erlang Solutions. It was a hybrid conference, I was there entirely in person. It was a very good time. “Isn’t Underjord Just You?” Having gone recently from being a single-person consulting and contracting shop to having a small team I took a rather different approach to this conference.| Underjord.io
I’ve played with Nerves for almost as long as I’ve been learning and using Elixir. Nerves is a fantastic way of working with hardware along with the BEAM virtual machine and it is great fun for hobbyist projects like Raspberry Pis. Phoenix LiveView is currently my favorite way of making full-stack web development cohesive and keeping the complexity as low as possible for it. I haven’t run into any short compelling demos of getting these started together.| Underjord.io
I’ve had Gerhard Lazu on my livestream once where he showed me a way of doing CI/CD with k3s and ArgoCD. The podcast Ship It! that he hosts on Changelog recently had Kelsey Hightower on. Kelsey is to many this guru of the cloud native and Kubernetes space. I’ve had good value from what I’ve heard him say in the past. In this episode he really spoke to me. So he essentially said, I’m interpreting here, that when it comes to deploying software to servers the documented manual steps for ...| Underjord.io
To alleviate any sense of clickbait. No, it is not overhyped as a technology, in my opinion. Let’s get into the nuances. In a recent tweet a while back a member of the Elixir community expressed some frustration with how everything is all about LiveView. It led to some interesting and useful discussion and as someone who writes a fair bit about Elixir, Phoenix and such I have thoughts. Following on that discussions other people expressed further concern about the unreserved enthusiasm with ...| Underjord.io
This is a labor of love where I just wanted the Nerves project to have a nice promo video. Frank and crew put a lot of work into making Nerves approachable while all their day-to-day use and needs is in the nitty-gritty industry side of it. So what does all that effort get them? Well, they’ve gotten it to the point where a complete step by step can be a one minute, 38 seconds long video.| Underjord.io
Trying to put words to the technology that has been most important to me for the last 4-5 years. Elixir. A language I picked up and now work almost exclusively with and specialize in. It is not the mainstream and I think that has serious advantages. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.pl...| Underjord.io
This one has been a while at the back of my mind. A lot of my readers have mentioned wanting to learn Linux and servers. This is an attempt at just unleashing you on the very first steps of your journey to do server work. It covers setting up a server with Linode (taken as an example) and then installing a webserver on it. I also cover a few bits about securing a server and potential next steps.| Underjord.io
A brief explanation of servers, the concept. Next step should be to show you good folks some stuff about how I set one up. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } Original 720 low Sorry, your browser does not support embedded videos.| Underjord.io
I’ve been using Elm since about one year back now. At the start of 2021 I began working with a client that had an existing Elm frontend code base and an early stage backend built in Elixir and Phoenix. This post will be about my experiences running face first into Elm. I’ll be vague on some details as I can’t share too much about the specific client and code base. I’ll be much less vague about Elm itself.| Underjord.io
My note-taking web app build in LiveView needed some fixing. Also updated it to use the new heex templates. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } 4K HD 720 low Sorry, your browser does not support embedded videos.| Underjord.io
Release day. Although the product team was used to a bit of a hustle to wrap up open features, perform final testing, and prepare for deployment, today presented some additional challenges. This morning Jerry, the team’s product manager, discovered that one of the major features slated for this release was implemented in a way that would cause problems for some key users on the platform. Jerry notified Mark, the backend engineer, who said he might be able to fix the issue by modifying the d...| Underjord.io
On a previous stream we tested out the library for RTMP in Membrane to achieve streaming on our own in Elixir. This time we make it more convenient, flexible and work our way towards using it. Being able to prepare and start livestreams, setting them up with LiveView, giving meaningful progress to users. Things are fun when you have near real-time events :) function switch_video(element) { var src = element.| Underjord.io
From Twitter I stumbled on this neat, still early, but working project for using the OpenCV library from Elixir. So I decided to give it a whirl! The project is called evision and I had a great time on stream screwing around with it :) function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return f...| Underjord.io
GenServer is the typical Actor abstraction in Erlang and Elixir. I’ve used one for talking to my Elgato Keylights in the lightswitch project. I made it sort of dumb. It was a quick job so I want to improve it in a few ways. Make it not need to pull the new state from lights before sending commands. Pull state in the background occasionally to keep relatively up-to-date. Always fetch status after sending commands.| Underjord.io
So Software Mansion, the makers of Membrane Framework, have kindly conspired with me to get RTMP ready for Membrane. RTMP is the protcol used when streaming from popular open source tool OBS. The RTMP module is currently at a technical preview level so be warned, might have some sharp edges. They made sure there was a chain of building blocks from RTMP to HLS (HTTP Live Streaming) and now I can actually set up a completely independent version of the Underjord livestreams.| Underjord.io
Just a brief note announcing the three winners of the giveaway that take home a copy of Elixir in Action by Saša Jurić. Thanks to Manning for providing those copies. If you want 35% off of their books you can use the discount code nlunderjord21 and you can find their collection via this link that definitely will track some statistics about click-through rates (you have been warned): Manning’s other books.| Underjord.io
Is your company actively trying to hire Elixir developers? Or should you be? I care about making good software happen. Even if I’m not writing it. And good software is formed from good teams. To help this happen I want to connect companies and developers in the Elixir space. I know and connect with plenty of both. This is the first time I mention this particular offer to the public. If the interest is at the level it seems this will also be the only chance to get in at the initial pricing.| Underjord.io
The discussion of Contexts in Phoenix and their general usefulness feels like a common point of disagreement in Elixir. I’ve gathered that the discussions went high and low as it was becoming a thing in mainline Phoenix. I don’t really care for controversy but what I see is a topic which gets confusing to wrangle with and which I never know quite how to explain. So this will be an attempt to explain what Contexts as provided are, cover some common concerns around this and two rather oppos...| Underjord.io
The book Elixir in Action by Saša Jurić is widely recognized as one of the best books on this language I favor. I’ve been meaning to run some giveaways and this book was always on the agenda. It shouldn’t be the only one but I think it makes a very appropriate starting point. Especially as the book has been such a starting point for many Elixirists through the years. Transparency note: This giveaway is supported by Manning, the publisher that published Elixir in Action.| Underjord.io
I became familiar with Marcin Kulik when I was brought in to work with a company called Vic.ai. A fintech startup. Marcin is the guy who started building their entire Elixir system and was the person to primarily onboard me to the work. When I was brought in they were a small team of 4 devs, looking to grow up to around 7 at the time. Special thanks to DockYard for supporting my work on this piece.| Underjord.io
How many Raspberry Pi do you have sitting in a drawer. I think I still have about 4? And at least 2 on a shelf. I may be over the average there but the story itself is common. “Oh! This is neat, I can automate X with this! And learn Y tech doing it!” And yet it never gets quite done. For reasons. No one needs to feel too bad about this.| Underjord.io
This livestream we tried to control my Elgato Keylights from a Nerves device. We really tried gang, come on. A good attempt. We ran into an issue with the expectations we had on what mDNS would give us. Those issues are still under investigation but they seem to be a change or regression in underlying parts of Nerves or Erlang. I’ve since gotten it to work by going back a few versions.| Underjord.io
Sitting down to show some of the work I’ve done with Nerves and Erlang Distribution for clustering Raspberry Pis. In this case automatically, via mDNS. This is what I do when I have a cold and am not streaming I guess. We also poke around with an HDMI screen on the Pi400. I want to run Scenic on that one. function switch_video(element) { var src = element.getAttribute("href"); var video = element.| Underjord.io
Cleaning up previous work and making the eInk display look fabulous by iterating in our LiveView-based simulator. We get this thing ready for small office production :) function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } 4K HD 720 low Sorry, your browser does not support embedded...| Underjord.io
I sat down with the stream and gently coaxed a couple of Raspberry Pi Zeros to cluster up with each other using the Nerves project. With recent support for Erlang distribution in MdnsLite we got the power to help nodes find each other via mDNS instead of some other method. So I wanted to give it a whirl, and I did :) Special thanks to Isaac for his help in the chat.| Underjord.io
I’ve been enjoying some Nerves recently which prompted me to finally order the Pi400 to play around with. In this stream I unpack it and get Nerves running on it without having tried it before or hearing that anyone had tried it. I just trusted the hard work of the Nerves team. Turns out that was a great call. It worked beautifully, almost confusingly well. Then we investigated some of the things we can do with a Pi with input devices but no output connected.| Underjord.io
The Inky eInk display was one of my first real things done with Elixir. And I’m apparently back on my bullshit. Because I just pulled that thing out and tried it with Nerves + Livebook. Had a really good time this stream and I think I want to do more things with hardware like this. Let me know if you’d be curious to see more of this. This triggered a not-yet-working Nerves device project I’m calling my calendar gadget which will be more documented at some point I’m sure.| Underjord.io
There are some very exciting updates in Phoenix 1.6 that just recently hit RC. We go through and try them out. It all seems to work great. I consider every bit of it an improvement. The official blog announcement for RC 0 has the details and I reference it through the video. I particularly tried out the LiveView Heex template changes which was great. This seems much more ergonomic and it wasn’t bad to begin with at eex/leex.| Underjord.io
As part of some foundational work on a CMS concept I’ve been building out this fairly dynamic Ecto-based way of dealing with content types and content (we call it entity types and entities) in a database. And I wanted this to be broadly compatible. That’s what most of this livestream ended up being about from what I remember. Trying things and swearing about internals. All in all a good time right?| Underjord.io
Me and an experienced programmer friend sit down and try to teach him Elixir using the Elixir School curriculum and materials. We are doing it in Livebook. This time, strings. You can find the livebooks of the modified lessons in my fork of ElixirSchool. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); vid...| Underjord.io
I’ve had a lot of thoughts and a few failed runs at creating a CMS in Elixir. This isn’t because Elixir is particular hard to do it in. Rather the opposite. The reason I’ve abandoned those efforts have to do with what exactly I want solved with a CMS. I’ve outlined some of that in The WordPress merging problem and WordPress & the gross inefficiencies. I’m trying to create a sound technical solution with a sound human solution on top of it.| Underjord.io
Me and an experienced programmer friend sit down and try to teach him Elixir using the Elixir School curriculum and materials. We are doing it in Livebook. This time, comprehensions, the most arcane. You can find the livebooks of the modified lessons in my fork of ElixirSchool. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src",...| Underjord.io
Getting deeper and farther into trying to do Operational Transformation with Erlang wxStyledTextCtrl, aka. Scintilla and TextDelta. I end up doing almost no TextDelta or Operational Transformation in this one as I try to pin down whether I can reliably insert and delete text from the different editor sessions without causing endless loops of updates. Turns out that there is no great facility for handling that. We learn quite a bit.| Underjord.io
Me and an experienced programmer friend sit down and try to teach him Elixir using the Elixir School curriculum and materials. We are doing it in Livebook. This time, sigils, the most arcane. You can find the livebooks of the modified lessons in my fork of ElixirSchool. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); v...| Underjord.io
In an act of hubris I try to tackle with wxStyledTextCtrl and Operational Transformation in an unholy alliance of native UI and offline-friendly collaboration. I get partway there but nothing actually works. Hopefully the flailing is interesting :) function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.pla...| Underjord.io
Me and an experienced programmer friend sit down and try to teach him Elixir using the Elixir School curriculum and materials. We are doing it in Livebook. This time we cover modules. You can find the livebooks of the modified lessons in my fork of ElixirSchool. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.loa...| Underjord.io
That’s right. It never has been. Before you read this post with your teeth clenched and ready for some hot takes, chill. This isn’t where I throw Elixir under the bus. Rather it is where I try to put my finger on the values that makes Elixir a good fit for me and a language I consistently recommend to people. So to summarize the values: Software should be efficient Software should be maintainable Software should be suitable for continuous development Developers should not burn out from th...| Underjord.io
In this stream of the PETAL Photo project we work on authentication. We build a way to log in with a magic link through email. function switch_video(element) { var src = element.getAttribute("href"); var video = element.parentElement.querySelector("video"); var sources = video.querySelector("source"); video.pause(); sources.setAttribute("src", src); video.load(); video.play(); return false; } 4K HD 720 low Sorry, your browser does not support embedded videos.| Underjord.io
It begins. For my vacation work-days, a concept to explain soon, I wanted to try to scratch an itch that I feel have product potential. So I decided to do parts of the work on the stream. This is the first part. To address the vacation work-days thing. I’m not being terrible at vacationing, or at least not as far as I can tell. We have a young child in the house, so some time on my own is quite nice and I have established some routines I really enjoy that I didn’t want a break from this s...| Underjord.io
It continues. After some off-stream work fixing the upload issues from last stream we are now mostly heading into making this visually sensible. We are using the PETAL stack and that means a lot of Tailwind CSS. This is the second installment, consider watching Part 1 before or after this. So if you enjoy watching people turn blank white nothing into something more visual, this might be for you, or if you want to see someone that is not a Tailwind expert wield it, also accurate.| Underjord.io
Getting a bit technical in this one we get into thumbnails and video transcoding in the middle of a heatwave. Watch me sweat .. the details with FFMPEG. This is the third installment Part 2 and Part 1. I don’t think they are necessary context but it probably helps. There has also been a few hours of work before each stream so the system moves forward off screen a bit.| Underjord.io
I don’t think I’ve ever had more distrust and as a consequence distate for software than in recent years. I don’t think its just me as a tech-nerd with artisanal tech-carpentry aspirations. I want people to build well, treat their users right and generally exercise some actual restraint. I see it very clearly and I react more viscerally than anyone non-technical in my surroundings. However, I see the frustrations and the consequences everywhere.| Underjord.io
I’m pretty skeptical of Kubernetes as a choice for small teams, small projects and any less complicated operation. Gerhard Lazu is quite enthusiastic about it on the other hand. After having me on his show Ship It!, a Changelog.com production, I expressed some curiosity about k3s, a lightweight variant of k8s. He offered to come on the livestream and show me how good life can be. Hope you enjoy the video.| Underjord.io
For this livestream I sat down with pen and (i)Pad and tried to hash out some of my design thinking for a product idea I’ve been turning over in my head. Let me know if this type of thinky-talky streams are of interest and I just might do some more of them. The video is also on the YouTube channel if you prefer. function switch_video(element) { var src = element.| Underjord.io
Me and an experienced programmer friend sit down and try to teach him Elixir using the Elixir School curriculum and materials. We are doing it in Livebook. This time we cover the pipe operator |>. You can find the very simplistic Livebook version of the Elixir school content on my forked Elixir School repo for now. The video is also available on YouTube. function switch_video(element) { var src = element.| Underjord.io
I’ve worked with a number of clients on Elixir projects and I’ve onboarded myself, I’ve been onboarded and I’ve onboarded others. And compared to my experiences with PHP/Python/Javascript and my limited experience with C#/.Net I have experienced quite a difference. Elixir projects tend to be very consistently laid out. Especially Phoenix-based web projects. The basic Phoenix generators provide a fair number of opinions on where things go. Even without that the general shape of an Elix...| Underjord.io
Me and an experienced programmer friend sit down and try to teach him Elixir using the Elixir School curriculum and materials. We are doing it in Livebook. This time we cover functions. You can find the very simplistic Livebook version of the Elixir school content on my forked Elixir School repo for now. The video is also available on YouTube. Sorry, your browser doesn't support embedded videos. If you enjoy this or have questions you can reach me via email as lars@underjord.| Underjord.io
Alex Koutmos, creator of the PromEx library and buddy from the radio show gave us some of his time to help set up Grafana and Prometheus metrics for our application Noted. This was an extremely tight path to a lot of observability. PromEx is very kind to you as a developer. Leveraging the common telemetry API to make something really compelling. And then Alex has spent the effort so you get a whole bunch of useful default dashboards rather than needing to decide up front what you want.| Underjord.io
Me and an experienced programmer friend sit down and try to teach him Elixir using the Elixir School curriculum and materials. We are doing it in Livebook. This time we cover control structures. You can find the very simplistic Livebook version of the Elixir school content on my forked Elixir School repo for now. The video is also available on YouTube. Sorry, your browser doesn't support embedded videos. If you enjoy this or have questions you can reach me via email as lars@underjord.| Underjord.io
A good jam session on improving the crawler. A bunch of basic ETS usage, some bug hunting and fixing and in the end I think it is better than it was :) The project repo I built up during the stream is on Github as lawik/caterpillar and the video is below. Also available on the YouTube channel. Sorry, your browser doesn't support embedded videos. Enjoy the things I do?| Underjord.io
As we are doing NervesCloud we are thinking a lot about adoption for Nerves. Our market is tightly bound to the number of folks doing IoT/embedded projects and choosing Nerves. The business can only thrive if Nerves thrives. Nerves can only thrive if Elixir thrives.| Underjord
Fly.io is a highly visible cloud provider in the Elixir ecosystem and they put forward an interesting promise. They don't deliver on that promise currently but I think it would be very compelling if they get there. Especially for Elixir. Let's dig in.| Underjord
I went to Chattanooga in Tennessee from Sweden to hang out with the Elixir community. I've been part of Elixir in various ways for 6-7 years now and this is the first time things have lined up and I could go to the US for a conference: I had a sponsor for the trip. I was offered to not just speak but keynote. The conference is put on by friends, Bruce and Maggie Tate, who've supported a lot of great stuff in the Elixir community for a long time. And Todd Resudek decided to do NervesConf in co...| Underjord
In this part of the series we dive into one of the frameworks and toolsets that really got me going with both Elixir as a hobby and the community as a space full of helpful people. This will be all about The Nerves Project, oh, and touch on some related stuff.| Underjord
The nine nines. 99.9999999% of uptime. Whether the AXD301 actually deserves to be held up as a system of nine nines seems debatable. I am not particularly interested in that debate. Erlang has a strong record for reliability and a design intended to help you as a developer and operator achieve your nines. Maybe just five of them. Up to you really.| Underjord
Elixir was built on Erlang. Erlang was built to provide "consistently low latency" and a few other audacious goals. Note, this is not a hard realtime constraint. It is soft, squishy and yet, important and real. It makes Erlang unusually suitable to systems where latency matters and where a near-realtime experience is necessary.| Underjord
Elixir is a language with syntactical roots in Ruby. It also carries the Erlang legacy. Legacy used here as in "a great legacy" and not as in "system you don't like anymore". Ruby is an object-oriented language. Elixir is functional language. The Erlang part has an impact as Elixir was designed to provide strong interoperability with Erlang. Like Ruby and Erlang, Elixir is a high-level of abstraction and very dynamic language. Overall I would say the Elixir syntax is pretty approachable and r...| Underjord