[{"content":" ","date":null,"permalink":"/projects/","section":"Software and hardware projects","summary":"","title":"Software and hardware projects"},{"content":" Finishing Elytra gave me some confidence when it comes to designing and working with PCBs. This is why I didn\u0026rsquo;t shy away when the idea for Spiracle came to mind: A 4 channel, fully analog audio mixer. The idea spawned from necessity; I have a bunch of hardware instruments, but my audio interface only has 1 input. My brain kicked into the same thought process it did for Elytra: Why buy when you can DIY.\nI started by learning a bit more about opamps. I did some research when I started work on synth0, but I didn\u0026rsquo;t get deep enough to be able to design my own mixer.\nI did still have some opamps left over from synth0, so with the help of my scope and function generator I started testing my design on a breadboard. I started small by just testing a follower like in the picture and built from there.\nOnce I was happy with the circuit design, I started designing the PCB. Just like with Elytra, I went with the curved tracks:\nBut as you may have noticed, I added teardrops on the holes and pads for extra roundness. And that\u0026rsquo;s right! Pads! I dared to do SMD work for the first time.\nMy local electronics store sells 1206 SMD components. Since they\u0026rsquo;re quite big, I was able to solder them by hand, using an iron. Not the cleanest job, but as I have learned, using lead free solder is quite a bit more difficult than leaded.\nMy hopes were that I would solder it all up and it would just work. But that was not the case. When I first tried it, all it did was nothing but heat up quickly. It took a few hours of debugging to figure out what was wrong: I soldered the battery leads backwards. And I will not admit fault. I will blame KiCad. The battery header footprint in KiCad is what confused me.\nTurns out, the pin which is filled in black in the silkscreen, is marked with a triangle and uses a square pad is in fact the + voltage pin, and not ground. I\u0026rsquo;ve grown to learn that the square (as opposed to round) pad represents ground, and every other clue was pointing me in that direction too. But no, it was backwards, so I was feeding the opamps reverse voltage.\nThankfully, no opamps died from that, or so I thought. The right channel of the master bus didn\u0026rsquo;t work. Which is really weird, because the left channel was perfectly working. I couldn\u0026rsquo;t have half-killed the chip could I?\nAfter many more hours of debugging it was left as my only option. Fixing it would involve buying a new NE5532 chip, desoldering the old one and putting in a new one. Which is easier said than done.\nDuring summer break, I stayed with my parents, which don\u0026rsquo;t have any electronics stores nearby. This meant I had to wait until I moved back to the city where I go to university until I could get a new chip.\nCleanly desoldering an 8 legged chip soldered with lead free solder is also not super easy with my little plastic solder pump.\nThis year I became an intern at my uni\u0026rsquo;s IT services, which is next to the lab technicians\u0026rsquo; office/workshop. Since there\u0026rsquo;s good vibes between our two departments, I asked to use their desoldering gun, and they kindly let me.\nThis made the job a breeze. Hold the tip over the pad, press the button that engages the pump, and the pin is free.\nI tried running audio through the board after replacing the chip it and\u0026hellip; It worked. Turns out the chip was half broken, which to me is super weird. If one opamp got cooked, shouldn\u0026rsquo;t the other one have gotten cooked too? They\u0026rsquo;re on the same die!\nNow that it was fully working I could print the fader caps (is that their name?) and the power button cap, as well as attach the battery holders to the back.\nAnd about the back! I have to give a special thanks to arf20. They provided the faders, which are really great quality faders used in professional mixers. This saved me quite a bit of cost, since they\u0026rsquo;re quite pricey. This is why I added a little \u0026ldquo;sponsored by arfnet\u0026rdquo; badge on the silkscreen:\nAnd yes, that\u0026rsquo;s a caterpillar. Just like with Elytra, I wanted to have a big artwork on the silkscreen. This time I asked my friend flow to make something for me. I wanted it to be bug inspired again, so I asked for a caterpillar. flow took it quite literally.\nOverall I\u0026rsquo;m happy with how it turned out. It sounds crystal clear, and If you overdrive it, it responds non-linearly, which adds some nice warm saturation. Here\u0026rsquo;s a lazy little demo I made for this article:\nI also made a case out of laser-cut plywood and 3D printed parts using the laser cutter at uni:\nI designed it so it\u0026rsquo;s the minimum volume possible: And the 3D printed bottom pieces are printed flat and then folded: Sorry, no source! I usually make all my projects public, but since this one contains artwork that\u0026rsquo;s quite personal, I decided to not publish the source. 🕳️\n","date":null,"permalink":"/projects/spiracle/","section":"Software and hardware projects","summary":"4 channel, fully analog audio mixer","title":"Spiracle"},{"content":" As a side-quest, the computer architecture professor challenged us to \u0026ldquo;make something related to parallelism on the GPU\u0026rdquo;. It was a completely open ended challenge, so I decided to take it and make something fun.\nI had a couple inspirations / driving factors:\nLast semester, on the parallelism and concurrency subject (which I know is taught by the same professor), they made a program to calculate images of the Mandelbrot set using parallelism on the CPU. This semester I was also doing a graphics programming subject, so I was getting familiar with shaders I wanted to try making something with WGPU+Rust So I landed on making lookaround. A real time, interactive render of the Julia set, which is the Mandelbrot\u0026rsquo;s \u0026ldquo;sister\u0026rdquo;. From what I\u0026rsquo;ve gathered, on the parallelism and concurrency subject, they only generated PNG files of the whole shape, so this is quite a step up.\nInitially, I wanted to do this using compute shaders, but it got really annoying to work with really fast. I fell back to using a fragment shader, which is the easy option, but since it was a side quest I ran with it. Especially since I was quite overwhelmed with other uni tasks.\nWorking with wgsl was a bit more \u0026ldquo;enjoyable\u0026rdquo; than the glsl I learnt in class, since it has a more Rust-like syntax. Although I wish it had 64 bit floats, since that would have allowed me to zoom in further before hitting the precision limit. The correct way would have been to implement an arbitrary precision decimal to make zoom infinite, but oh well, it was a quick side-quest after all.\nDespite the fact that I couldn\u0026rsquo;t figure out how to make it work on wasm without having to completely rewrite it, I\u0026rsquo;m happy with how it turned out. It\u0026rsquo;s got great performance and it\u0026rsquo;s fun to play with.\nI wrote a little IEEE journal-style paper on it and I ended up getting a 10/10, so that was a whole bonus point on my total grade :D\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/lookaround 🕳️\n","date":null,"permalink":"/projects/lookaround/","section":"Software and hardware projects","summary":"Look around the Julia set with an interactive application","title":"lookaround"},{"content":" I finally, after years of having this idea, went ahead and made my own custom keyboard. Specifically, it\u0026rsquo;s a split, vertically staggered 40% mechanical keyboard.\nBut you\u0026rsquo;ve seen these before a million times. I made this as my birthday present, specifically to save money on it (it\u0026rsquo;s been significantly cheaper than buying an existing model). Despite this, I took the opportunity to make it as \u0026ldquo;my own\u0026rdquo; as I possibly could.\nI wanted it to make it pretty. One of the things I did was thick, rounded tracks:\nI think they look reeeally nice, and like they give it a special character and attention to detail most PCBs don\u0026rsquo;t get. Another thing I did is make some silkscreen art. Since I thought the PCB outline looked like a pair of wings, I decided to name it Elytra, and theme it around that. This is the drawing I made, some beetle wings:\nNotice how I left the back exposed. The initial idea was to get a backplate laser cut out of acrylic, but there weren\u0026rsquo;t any good options near me. So what I did was 3D print some \u0026ldquo;rims\u0026rdquo; so the diodes and switch pins don\u0026rsquo;t touch the table leaving the back completely exposed to be seen.\nAnd you may be thinking having the back exposed like that might be a bit dangerous. But my amazing sister has got me covered. She made this custom carrying pouch just for me:\nSeparate compartments for each half, another compartment for the cables, and all sealed with zippers. She even got cute fabric for me!\nOne of the goals was also to make it as thin as possible without using low profile switches, so the exposed back saves on a little bit of space. That\u0026rsquo;s also why it doesn\u0026rsquo;t have hotswap sockets or any fancy features. This is made by me, for me, as a fun (practically) art project, so it\u0026rsquo;s made to fit exactly what I want right now. This is why I use a pair of Seeedstudio XIAO RP2040: Because they have the exact IO I needed. 6 GPIO pins for the columns, 4 for the rows, 1 for UART between the halves, power and ground. It also has the tessellated sides, so it can be soldered right on the board, keeping it low profile. It also has an RGB LED, which I could program to do stuff.\nSpecial thanks to my friend arf20 for getting these cool transparent TRS connectors for me!\nAlso, of course I had to add some easter eggs in it. I\u0026rsquo;ll show you this one, which is so obvious it\u0026rsquo;s barely even an easter egg:\nA terraria-like item hover stat list. I had to be silly with it :3\nOverall I\u0026rsquo;m super happy with how it turned out. It\u0026rsquo;s thin like I wanted, it\u0026rsquo;s silent how I wanted (I got silent switches), and it\u0026rsquo;s very me.\nFor that reason, I\u0026rsquo;m not making it open source (sorry.) It\u0026rsquo;s an expression of me, as I said, and I\u0026rsquo;d like to keep it to myself.\nBesides, if you want a similar open source design, there\u0026rsquo;s hundreds of better ones on the internet! I will however keep the fork I had to make of QMK open.\nQMK fork with my keyboard here: https://git.sr.ht/~slushee/qmk-firmware 🕳️\n","date":null,"permalink":"/projects/elytra/","section":"Software and hardware projects","summary":"My custom split keyboard","title":"Elytra"},{"content":" Continuing the current theme of the indie web, I built statusbox, which is the little string of text you see below my name on the homepage. This project was also inspired by something I found while browsing the indie web. While what I saw was a bit more polished and \u0026ldquo;established\u0026rdquo; (it was a whole platform anyone could sign up to), I wanted something of my own. Something I could host myself. The project seemed rather small, and I had lately been using axum and diesel, so I decided to build it myself. In fact, I thought I could build it in a single bus ride. (It actually took three.)\nStatusbox is really small. It has only four paths you can call and it\u0026rsquo;s extremely bare-bones. You can only:\nRetrieve the latest status Post a new status Create a new author Create a new author token As I said, extremely bare-bones. No deleting of statuses or users, (which might be against GDPR? but I don\u0026rsquo;t think my friends will sue me) and you can only ever get the latest status.\nAnd that\u0026rsquo;s on purpose. This is meant to be a place for me (and my friends) to share the thoughts we have at the moment. Thoughts that may be irrelevant in couple days, or things that may not represent who we are on the future. This is one of the things I don\u0026rsquo;t like about social media. People can just dig up stuff you said years ago that no longer represents you. This is meant to give me that space to share my thoughts without the burden of comments or permanence.\nWorking on this was great for learning about dealing with users, keeping their passwords safe and such. I also got to learn about how to use sqlite, which will definitely be useful at some point, since sqlite is everywhere.\nAnd yeah! I used sqlite. As I already said, statusbox is tiny, and 99% of the time the only operation done will be reading the latest status. Since I\u0026rsquo;ve deployed this on docker, using any other database would have been overkill. I would have needed a stack with a database container and all the works. With sqlite I can just attach a volume where the db file is.\nOverall, this was a nice project to work on. It allowed me to take a break from what I usually do, learn a bit about backend servers and about the web. I might come back on the future to add some polish and new features, just like I\u0026rsquo;ve been doing with this website.\nUpdate: #Polish added! After I switched this website\u0026rsquo;s hosting to sourcehut, which adds a content security policy header that prevents statusbox from worked, I saw myself forced to update it. I took the opportunity to do a major refactor and clean it up a lot.\nThe main goal of the update was to make it serve HTML though. The Statusbox server used to send JSON, and the website would display it using javascript. But the new content security policy disallows scripts from fetching data from other domains. What still works? \u0026lt;iframe\u0026gt;s. So I got the idea to make statusbox return HTML so it could be rendered inside an HTML \u0026lt;iframe\u0026gt; tag.\nHaving heard about maud not too long ago, I thought it would be interesting to use it. And it\u0026rsquo;s pretty cool! Really impressive what you can pull off with rust macros.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/Statusbox 🕳️\n","date":null,"permalink":"/projects/statusbox/","section":"Software and hardware projects","summary":"The little text string you see below my name on the homepage","title":"Statusbox"},{"content":" I love the indie web. It\u0026rsquo;s so colorful, creative, unique and fun to explore. During a late night exploring session, I stumbled across the perfect mix of things:\nA personal website with some little low poly games you could play A different personal website with a drawing of their room, with different things labeled. This made me put two and two together and come up with the idea to make a 3D interactive room. Why? Because it\u0026rsquo;s fun, it\u0026rsquo;s different from anything in any of the boring corporate sites, and it gets visitors to know me on a different level.\nHow did I make it? #Using Godot. Godot has a web export feature that turns your game into a pck file, two js files and a wasm file. All you have to do is provide it an HTML canvas for everything to render in.\nWhy Godot? #I\u0026rsquo;ve never used Godot. In fact, I\u0026rsquo;ve never really used a game engine. I picked Godot for three reasons:\nIt seemed like by far the easiest (and fastest) way to make a room and put it on the web It\u0026rsquo;s open source My friend flow is already familiar with it Godot is unlike any software development tool I\u0026rsquo;ve ever used before. The editor makes everything very intuitive, and while it seemed a bit rigid at first, it\u0026rsquo;s way more flexible than what I imagined. The documentation is really good, and gdscript didn\u0026rsquo;t feel super duper alien to use. I couldn\u0026rsquo;t have done this without flow though. They built the core functionality of the project, kind of like a foundation to build on top of and tweak to my needs. So massive thank you to them for making this possible. They also mostly modeled the chair, as well as some other small assets :)\nHacking the web export #The Godot web export has three different options for how the project is supposed to run: fullscreen, fixed size canvas, resizeable canvas.\nI wanted to embed the 3D viewer in a regular page on my website, so fullscreen is obviously out of the question. And fixed size means devices with small or really big screens will either have a canvas bigger than their screen can display in it\u0026rsquo;s entirety, or a canvas that\u0026rsquo;s way too small to see.\nSo dynamic size it is. But if you thought it would just grab the size of the div it\u0026rsquo;s in, you\u0026rsquo;re as mistaken as I was. The web export does two things: It makes the canvas\u0026rsquo; position absolute, and it makes the canvas have the same size as the DOM.\nThe first one is a problem because the position being absolute means everything else on the page gets covered by the canvas.\nAnd the second one is an issue because once the position of the canvas is relative, the right and bottom sides of the canvas overflow off the page.\nSo I had to figure something out. Using Firefox\u0026rsquo;s inspect element, I saw position=absolute being added to the style tag of the canvas by one of the JS files Godot spews out. It\u0026rsquo;s a massive file, and it\u0026rsquo;s completely unreadable, so I had to resort to searching with nvim.\nSearching for absolute led me to this, where I changed it to relative, and it worked:\nChanging the canvas size wasn\u0026rsquo;t as straight forward. The script actively changes the canvas size to be that of the DOM size. I had to try several things, search for different keywords, and try to read all that JS to find a solution. And it\u0026rsquo;s what\u0026rsquo;s highlighted on the image. I had to backtrack through several variables and functions until I found that. csw and csh are the variables that are later used after several steps to set the size of the canvas. My goal was to make the canvas fit within the screen, so I divided everything by 1.5, achieving the result I wanted.\nYou can go ahead and try it for yourself at https://slushee.dev/my_room if you want! It takes a while to load, and it\u0026rsquo;s a bit choppy at first. But honestly, I think it\u0026rsquo;s perfectly fine. The goal isn\u0026rsquo;t performance, it\u0026rsquo;s to have something that\u0026rsquo;s fun to play with, and I think it achieves that.\nAnd yes. webrooming is a reference to webfishing, even though I\u0026rsquo;ve never played the game.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/Webrooming 🕳️\n","date":null,"permalink":"/projects/webrooming/","section":"Software and hardware projects","summary":"An interactive 3D viewer of my room, built for the web","title":"Webrooming"},{"content":" AI Crawler bots are disallowed by this site\u0026rsquo;s configuration. If they decide to ignore it, they will find this page, where they\u0026rsquo;ll waste the company\u0026rsquo;s resources and time. They\u0026rsquo;ll also get fed garbage which worsens the model\u0026rsquo;s training.\nNot a single line of text or code, not a single image or sound have been generated by AI on this website. It is made by a human for humans. Not for companies to train their useless slop machines.\nThis page leads to a black hole for AI crawler bots. Please, do not click the robot button if you\u0026rsquo;re not one. To understand how it works, visit the following site: https://zadzmo.org/code/nepenthes/ Take me to the robot realm! 🤖 ","date":null,"permalink":"/black_hole/","section":"","summary":"","title":"Black hole"},{"content":" If you\u0026rsquo;re a human, you can contact me by sending an email at: webmaster \u0026lt;at\u0026gt; \u0026lt;this domain\u0026gt;\nYou can also download my public key ⬇️ if you wish to encrypt your message.\nIf you\u0026rsquo;re a robot, you can contact me by clicking this button: 🤖 If you use the robot email, your mail server will reach a tarpit and it\u0026rsquo;s performance will get impacted. Do NOT use if you\u0026rsquo;re a human. 🕳️\n","date":null,"permalink":"/email/","section":"","summary":"","title":"Email"},{"content":" I am trying to learn to produce music, here\u0026rsquo;s some songs I\u0026rsquo;ve made:\nkalithecatgirl - INSERTION ASSERTION (my remix) # kalithecatgirl turned a bytebeat into a whole song, and giving it a listen I felt inspired to make a remix. I wanted to layer on top of it, to give it a little extra spice on top of the chip sounds, making this the first song where I don\u0026rsquo;t use just pure waveforms. I used a up/down compressed piano as you can hear, and there\u0026rsquo;s even real guitar being played by my friend arf20. I also used my voice, although heavily processed.\nLast stop # Last stop intends to tell a story we\u0026rsquo;ve all experienced. That last bit of time you get to hang out with someone before you have to leave.\nI paint the picture of a train ride, one where you\u0026rsquo;re alongside that someone playing a game with the gameboy game link. It starts out a bit sad, not wanting to say goodbye, as you realize this is your last stop. But as you play a couple matches, you get caught in the fun and just feel happy you got to hang out. At the end, it all fades away as you walk home. Replaying in your head with mixed feelings that melody from the game.\nThe single cover is the visual version of the song: The memory sketched on the train ticket, to keep as a memento.\nTo make this song, I evolved my technique from last time. While I again only used basic waves, I allowed myself to use effects which affect their shape this time. I also sampled some of the chiptune drums from my PO-20, and I attempted to master the song for youtube, so hopefully this time there aren\u0026rsquo;t any artifacts on the youtube upload.\nTime without reference # This track comes from pure uninterrupted creative flow. I limited myself to use only basic waves and leave them intact. Sine, Square, Sawtooth and noise, no reverb or any other effects that could affect the shape of the waves. This is what came out of it. \u0026ldquo;time without reference\u0026rdquo; describes a feeling in sounds I can\u0026rsquo;t describe in words. A kind of negative feeling I get when I\u0026rsquo;m having fun, when I\u0026rsquo;m doing something I enjoy and I want it to last forever. It stems from preoccupations of the million things happening out of the bubble of fun. It reminds me it\u0026rsquo;s only going to last so long, and what\u0026rsquo;s coming after is going to suck.\n🕳️\n","date":null,"permalink":"/my_music/","section":"","summary":"","title":"My Music"},{"content":" Click on any object to get a closer look at it. A description will appear at the bottom and a back button at the top left. WebGL must be enabled for this to work. If you have resistfingerpringing enabled on your browser, some lighting effects are not rendered, and performance is slightly degraded. 🕳️ ","date":null,"permalink":"/my_room/","section":"","summary":"","title":"My Room"},{"content":" Based on the Raspberry Pi Pico, it uses 6 of it\u0026rsquo;s PIO state machines to create pulse density modulated waves. Work with PIO is something I\u0026rsquo;ve wanted to do for quite a while. It\u0026rsquo;s always seemed scary complex, but it truly is not that bad. It does take a bit to get used to PIO assembly, but when it clicks the instructions aren\u0026rsquo;t that complicated.\nI used PIO to shift bits out really really quickly so I could use a digital modulation to make an analog wave. The wave itself is hardcoded. The rp2040 is set up to send the modulated wave from double-buffered DMA to the PIO state machine FIFO. This allows me to continuously emit the wave without any interruptions.\nAs the wave modulation is hardcoded, in order to achieve different frequencies, I change the state machine\u0026rsquo;s frequency on the fly:\nCalculating the state machine's frequency as keys are pressed in order to make the correct audible tone. I could have used a lookup table, after all there aren't that many notes. But the rp2040 proved plenty fast enough to do the calculations, despite it having no FPU. // f = 440 * 2^((n - 69) / 12) // Where n is the midi note number and f is the audible frequency, // assuming A4 = 440Hz // // There are 128 bits per wave, and the PIO state machine takes 2 clock cycles to get each bit out #[inline(always)] fn note_to_pio_div(note: u8, clock: u32) -\u0026gt; f32 { let freq = 440.0 * exp2f((f32::from(note) - 69.0) / 12.0) * 128.0 * 2.0; clock as f32 / freq } It\u0026rsquo;s neat that there\u0026rsquo;s a proportional relation between the MIDI spec note number and the audible frequency of a note.\nI calculate the modulation with a python script. Here\u0026rsquo;s what they look like: (Red: Original wave, Blue: Modulated wave)\nSine # Sawtooth # Rhodes / Electronic organ-like #(with a lot of imagination) Rhodes and Electronic organs\u0026rsquo; sound is mostly a sum of three or four harmonic sines.\nAnd you can imagine what the square wave looks like.\nThe modulated waves consist of 128 bits, so when low-passed it all blends together: The synth connects to a MIDI controller through an old school DIN-5 MIDI port. Implementing USB MIDI was out of the scope of the project. The old school port is just UART, and it was fun to implement. Here\u0026rsquo;s a video from when I got it working:\nHere\u0026rsquo;s how some basic waves sound on it:\nSine # Square # Sawtooth # \u0026ldquo;Rhodes\u0026rdquo; # As you can see, it\u0026rsquo;s got a terrible noise floor and some constant peeks above 7kHz. That\u0026rsquo;s an artifact of my computer\u0026rsquo;s power supply and the pico\u0026rsquo;s voltage regulator, as it happens with any firmware. It sounds quite awful, but you can tell the wave it\u0026rsquo;s trying to play, which is enough for me. The goal was learning and not a musical instrument after all.\nThe clips above do use some after processing. I attenuated those peaks and added a gate so you don\u0026rsquo;t constantly hear the noise floor. The Rhodes-like clip has added chorus and reverb, to make it a bit closer to the sound it\u0026rsquo;s trying to imitate.\nUpdate! I got an audio interface with a nice pre-amp and I powered the synth with a cleaner power supply. While there\u0026rsquo;s some 50Hz hum, the signal is now clean of all of those high frequency spikes! Here I re-recorded some of the songs I had played above:\nAnd here\u0026rsquo;s a little bass jam, since I think the bass tones it makes, while a bit harsh, sound cool.\nBig thanks to Stephen with the counseling (and emotional support) on electronics, this wouldn\u0026rsquo;t have been possible without them.\nAs always, here\u0026rsquo;s the firmware: https://git.sr.ht/~slushee/synth0 🕳️\n","date":null,"permalink":"/projects/synth0/","section":"Software and hardware projects","summary":"An experimental six voice synthesizer I made as a learning project","title":"synth0"},{"content":" Miika, Justus, Valentin and I built RackRanger as a challenge project for HackUPC 2024, participating on the Grafana challenge. As you might now, I use Grafana, so I was quite eagered to see them when the sponsors were announced. First thing I did before the hackathon even started was visiting their booth. They were super friendly, and they had lots of hardware on the booth! Multimeter, scope, pinecil and a bunch of other cool stuff which got me hyped.\nGrafana asked us for an IoT observability project, and they even provided some hardware: an ESP32, a breadboard, jumpers, LEDs and a bunch of sensors. On top of that, apart from the European space agency\u0026rsquo;s challenge (which btw, my friend arf won!! I\u0026rsquo;m so proud of him!!), all the others involved AI, which none of us really wanted to work with. The whole team was quite decided on Grafana, so we jumped in.\nWe started brainstorming instantly, coming up with ideas, debating them and refining them. I\u0026rsquo;ve got to mention, Justus is super experienced and his goal was to win. So it was quite different from my last experience. Last time I was with a bunch of friends whose goal was to have as much fun as possible. We found an idea that seemed fun and doable enough so we didn\u0026rsquo;t think any further. This year, we really put in a lot of effort on the ideation phase. We wanted something unique, useful and impressive. We settled on server rack environment monitoring - Observing simple stuff like the temperature inside the rack but also more interesting metrics like noise levels, which could help detect drive or fan failures as soon as possible. We also added tamper detection, which you can see a video demonstration of here:\nYeah, Justus built an awesome rack mock-up with cardboard x3. I had to go to an office supply store to get tape, a marker and some scissors for it. But anyway - as you can see, not only we\u0026rsquo;re graphing all those metrics with Grafana, but we have alert logs with Loki and notifications on chat services with Grafana alerts. Just as an extra, we added infrared level monitoring (maybe to detect fires early) and humidity, just because the temperature sensor included it. We did what we could with the sensors Grafana gave us! But other sensors could also be added to monitor stuff like power consumption or vibration of the rack. Here\u0026rsquo;s a picture of the project homepage with the Grafana dashboard:\nNot much, but for the hardware we had and for demo purposes, it\u0026rsquo;s fair enough.\nYou may have noticed - There\u0026rsquo;s more than one ESP32 here. And that\u0026rsquo;s right, I took advantage of the trip to the office supply store to pass by the train station where my flatmate brought me a box with some of my hardware. By building more \u0026quot; monitors\u0026quot;, we could show the judges how easy it is to scale. We could add as many \u0026ldquo;monitors\u0026rdquo; to the Prometheus job as we wanted and the Grafana dashboard would automatically split the panels to show the data from all the monitors.\nThe firmware, Miika and I ended up making with PlatformIO. The idea was to make it with Rust and Embassy, but I just couldn\u0026rsquo;t get it to work. Compiling for xtensa (the ESP32\u0026rsquo;s architecture) was an absolute pain in the bum, and after hours and hours of fighting and fighting with cross-compilation, the mentors told me to cut my losses and try something else. While I was the one who built most of the firmware, I\u0026rsquo;ve really got to thank Miika. When I was exhausted from working on the firmware and just really really didn\u0026rsquo;t feel like implementing alert pushes to Loki, he went ahead and never really having worked with microcontrollers, he implemented it himself. Meanwhile, i took a break from code and did some small things here and there, like this graphic for the website:\nAs you can tell, it\u0026rsquo;s a diagram explaining how all the components integrate.\nWe have many \u0026ldquo;monitors\u0026rdquo; (microcontrollers, MCUs) on each datacenter that all get scraped by a single lightweight linux server (like a Single Board Computer) running Prometheus. That keeps the MCU - Database communication confined to within the network, so we didn\u0026rsquo;t have to worry about making the MCUs super secure. Then, Miika set up communication from the databases to a remote server running grafana with a tunnel/reverse proxy, keeping the communication secure. He also made everything super easy to deploy by writing an Ansible rulebook that defines the whole docker stack.\nThe hardest lesson I learnt was knowing when to swallow your pride, cut your losses and start over. It was thanks to the mentors that I realized I was digging myself in a hole and that I had to try something else.\nOne thing that had me bummed is coming out close second. The winner of the Grafana project wasn\u0026rsquo;t on the devpost, and we were pretty sure we were going to win. But we weren\u0026rsquo;t called to the stage. A way less complex but more creative project won. The people judging for Grafana contacted us and told us we were neck and neck, and that they really liked our project. I\u0026rsquo;d almost rather not have known. I think knowing we were thaaat close made me more bummed out. But oh well, it\u0026rsquo;s over now.\nCheck out the website: https://hackupc.co/ Check out the project on devpost: https://devpost.com/software/serfana 🕳️\n","date":null,"permalink":"/projects/rackranger/","section":"Software and hardware projects","summary":"Server Rack Monitoring with microcontrollers","title":"RackRanger"},{"content":" Here\u0026rsquo;s some software I\u0026rsquo;ve used you may find useful. Most of these are open source, and some of them are even made in rust :)\nI am not associated with any organizations or companies responsible for or related to any of this software. This is purely software I use often. OS # NixOS lets you declare the exact state of your system. It's kinda like having dotfiles, but for absolutely everything in your computer. It also has by far the most packages out of any distro, and it's very robust. This is what I'm currently using.\nAudio # Bitwig is not open source, but in my opinion it's the only DAW that works on linux that's worth using. It for sure is expensive, although you can get by with demo mode or even with an 8-track license obtained from some audio magazine, which tend to be cheap, or free. It has lots of devices and I like the workflow.\nBrowser # Librewolf is firefox with some hardening by default. In fact, on NixOS it's just firefox with a patch stage on the package. Handy if you're lazy and don't want to change the defaults.\nCreative # Blender has a decent video editor. I don't like how the compositing and the editing workflow is completely separate, but it's still more pleasant to use than kdenlive, and actually works, unlike Davinci Resolve.\nDesign automation # KiCad is absolutely essential if you plan to get any PCBs manufactured.\nExtra #Terminal # Alacritty is a clean, minimal, fast terminal. It doesn\u0026rsquo;t have any fancy features like kitty does, but it does everything I need. bat is a more readable cat. You can also have it print out the text without any borders by using -p, so it\u0026rsquo;s a no-brainer. bottom is a more readable top. Although I wish it was a bit more powerful at times. Good enough for monitoring and killing processes though. eza , the successor to exa, which is a prettier ls. It\u0026rsquo;s eye candy, but I feel like it helps me identify what is what quicker. fd is a super duper fast and easy way to find any file on my computer. Comes in handy every once and a while. Nushell isn\u0026rsquo;t your regular shell, and it isn\u0026rsquo;t stable as of writing this. But it\u0026rsquo;s modern and it does things differently in a way I\u0026rsquo;ve learnt to love. It also has lots of native features a POSIX shell could only dream of, and I use very often. Honestly I don\u0026rsquo;t think I can go back to any other shell, at least not a POSIX one. ripgrep If you don\u0026rsquo;t know where a file is but you know a string it contains, ripgrep will find it for you. Super useful, especially if you\u0026rsquo;re disorganized. Zoxide is the most convenient thing in the world. While the nu cd can understand abbreviations (like D/c/r for Documents/code/rust), being able to type just a part of the destination is super convenient. cd ru - And you\u0026rsquo;re now in ~/Documents/code/rust. Sync # KDE Connect is a super convenient way to share files between devices without having to use any cables. On top of that, it can do many things like remote input, clipboard sharing, media control for other devices, work as a slide presentation remote\u0026hellip; Syncthing has a very specific use case for me. It\u0026rsquo;s original use is just to make directories of your choice have the exact same state across devices. And I mean, I use it for just that, but for two specific reasons: I don\u0026rsquo;t want to rely on any cloud service and I want to be able to access my stuff offline. \u0026ldquo;Stuff\u0026rdquo; in this case means my music library and all the notes I take with logseq. With syncthing, any music I download is immediately sent to all my devices. So when I\u0026rsquo;m going through a tunnel on the train (no cell service) I can keep listening to music on my phone, because there\u0026rsquo;s a local copy. Or when I take notes on my laptop in class, the notes will automatically be transferred over to my computer when I get home. It also gives me peace of mind knowing my files are safe and completely under my control while also not having to pay any subscription. Text # Neovide is a graphical frontend for neovim with a nice cursor, ligatures, smooth scrolling and some other niceties. Typst is what I use to write any documents that need to be exported as PDF or printed. It\u0026rsquo;s like LaTeX, but without being a pain in the bum. The nvim setup is super straight forward. 🕳️\n","date":null,"permalink":"/software/","section":"","summary":"","title":"Cool software I like"},{"content":" This driver is the most complex thing I\u0026rsquo;ve written to date.\nWhy? #Long story short: Helping someone who reached out to me through this website led things to me getting the same device as them, the Picoboy. I ended up wanting to make a BSP to make working with the Picoboy easier, and in the process I found out that there isn\u0026rsquo;t a crate for the accelerometer it uses. So what other option did I have other than to make one myself?\nHow #I started by implementing the traits from the accelerometer crate, just reading the registers where the acceleration is and doing the math needed to get a g value. I would have stopped there, but I saw that other crates that implemented accelerometer\u0026rsquo;s trait had extra functionality. Mostly methods to configure and tweak the registers on the accelerometers. I figured I\u0026rsquo;d do the same, and what a rabbithole.\nI started by manually implementing a method for each function of the accelerometer. For context, the accelerometer has 31 registers, and many of those have various separate functions. I quickly realized this wouldn\u0026rsquo;t be sustainable. Lots and lots of work to implement every single function for every single register. At the same time, I noticed a pattern in the methods that wrote bit flags to the registers.\nSo I decided to try generics. Sure, I had written some generic code before - but it wasn\u0026rsquo;t without hand holding. embedded_hal makes it easy and even gives you examples on how to use it\u0026rsquo;s generic types. But I was on my own on this one. I also had been reading Rust for Rustaceans (by Jon Gjengset), which at the point I was, generics had been talked about a bit already. And I did it, on my own I made a generic function to read flags from registers.\nBut it required a lot of impl From\u0026lt;BITFLAGS_STRUCT\u0026gt; for Register, which ends up causing the same problem: Code repetition an lots of work. After seeing what I had done though, I couldn\u0026rsquo;t help but feel like I could go further. That I could Really get out of my comfort zone with this one. And I did: I wrote a macro. My first macro! Here it is:\nmacro_rules! reg_from_flags { ($f:ident) =\u0026gt; { impl From\u0026lt;$f\u0026gt; for Register { fn from(_value: $f) -\u0026gt; Self { Self::$f } } }; } Honestly, I couldn\u0026rsquo;t believe it. I know it\u0026rsquo;s a really simple macro, and that just using ident is not the right way to do it. But I made a macro! This feels like an achievement for me. I really didn\u0026rsquo;t think I was capable of doing something I consider so complex.\nSo if I wrote a macro, what\u0026rsquo;s stopping me from trying to make everything generic? Nothing. Not only I made the setting of flags generic, but also the reading of \u0026ldquo;modes\u0026rdquo;, which consist of several bits and are therefore represented as enums.\nI know this crate is not the best, that it has a lot that can be improved, but I\u0026rsquo;m really proud of it. I feel like I\u0026rsquo;ve really got out of my comfort zone with it and learnt a lot making it. It\u0026rsquo;s missing unit tests, which is something I\u0026rsquo;ve never done yet either. But for now, I\u0026rsquo;m done working on it. I might add them some time later.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/stk8ba58 🕳️\n","date":null,"permalink":"/projects/stk8ba58/","section":"Software and hardware projects","summary":"Driver crate for the STK8BA58 accelerometer","title":"STK8BA58 Embedded Driver"},{"content":" First project of the year, and it\u0026rsquo;s hardware! I want 2024 to be the year of hardware.\nThis one is a remote plant monitor. I made a proof of concept of this project using PlatformIO a long time ago, and I decided to revisit it. This time using rust and Embassy. It has a bunch of sensors that collect useful data when it comes to monitoring the state of a plant. The sensors I included for this version are:\nHTU21D Relative (ambient) humidity Temperature Dew point temperature Capacitive soil humidity sensor Photoresistor (light level) And it\u0026rsquo;s all put into my first ever custom PCB!\nYou might be thinking: \u0026ldquo;\u0026hellip;What happened to the copper layer?\u0026rdquo; And you\u0026rsquo;d be absolutely correct, I completely forgot I had to do that. I won\u0026rsquo;t forget next time though! (I fixed it on the repo) I also learnt that the default through-hole dimensions on KiCad aren\u0026rsquo;t ideal for header pins and for soldering. I\u0026rsquo;ll make sure to make the holes and pads bigger next time too. There also was some confusion picking the resistor footprint, so it\u0026rsquo;s in the wrong orientation (It\u0026rsquo;s standing up). I\u0026rsquo;ll take more care next time. Despite everything, I\u0026rsquo;m super proud with my first PCB to the point that I want to frame it.\nI\u0026rsquo;m proud of the software side too. It\u0026rsquo;s quite a bit more technically complex than what I usually make, and it even has server side stuff, which is way out of my comfort zone.\nFor the microcontroller, I used the ESP32-C3 (on a Seeedstudio XIAO formfactor). The C3 is riscV, which means it has official rustc support. I usually use an RP2040 for everything, but esp-rs has way more mature wifi and internet support than the pico W does. Despite this, the docs can be lacking or sometimes completely inexistent (looking at you, esp-wifi), and the fact that they use Nightly means things break. I had put the firmware on pause to work on the hardware, and when I went back to finish the firmware, it was broken. After going through a dependency hell and then fighting with the compiler, I got it to work. It\u0026rsquo;s not ideal that it\u0026rsquo;s fixed to a specific rustc version, but the ecosystem is constantly changing and I can\u0026rsquo;t be bothered to propperly fix it now when it\u0026rsquo;s going to break again. I might revisit it once all these crates reach stability and make something robust, but who knows.\nWorking on this firmware was quite a stretch for me. Making DNS queries and POST requests! Who would think I\u0026rsquo;d ever do that. Even though it\u0026rsquo;s not the best written, fast or robust firmware, I\u0026rsquo;m happy with what I made.\nAnd finally the server stack. I didn\u0026rsquo;t have access to my server while making it, so I used DigitalOcean. And I must say, it was an absolute pleasure to use! Really made the job easy. After some fighting with docker, I came out successful with a stack yml file. It uses grafana for the graphing (obviously xP), prometheus for the database as is usual, and prometheus\u0026rsquo; pushgateway. I decided to use pushgateway because the plant and the server are on different locations (and therefore networks), and the network the plant is on is closed so it can\u0026rsquo;t be scraped.\nGetting the firmware to make the correct request for it to be propperly pushed to prometheus was a fight. But I couldn\u0026rsquo;t be happier when I saw the following:\nPlant Monitor request #POST /metrics/job/plant_monitor HTTP/1.1 HOST: 164.90.166.27:9091 Content-Length: 15 Content-Type: application/x-www-form-urlencoded dewt 11.279297 Server reply #HTTP/1.1 200 OK Date: Fri, 05 Jan 2024 18:50:38 CMT Content-Length: 0 This meant I got it all to finally work, and that the project was finally done and fully working! The only thing left to do was deploy the server stack once I got access to my server some days after.\nAnd here it is, the grafana dashboard:\nI\u0026rsquo;m really happy with how this project turned out and looking forward to a year of more hardware and more complex projects.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/plant-monitor 🕳️\n","date":null,"permalink":"/projects/plant-monitor/","section":"Software and hardware projects","summary":"Monitor your plant remotely with Grafana","title":"Plant Monitor"},{"content":" Here are some tracks I like. This is not representative of everything I listen to, but you can get an idea. To be honest, it\u0026rsquo;s hard to keep this page well organized and up to date. :P I have chosen not to include videogame OSTs and music that would be conventionally considered \u0026ldquo;commercial\u0026rdquo;.\nMark as read Teminite #Well known composer\nGenre: EDM\nTeminite \u0026amp; Skybreak - Accelerate #Accelerate by Teminite \u0026amp; Skybreak Inspired by Mario Kart, energetic but fun. Has a a great jazzy segment as to be expected with Teminite. Teminite \u0026amp; MDK - Space invaders #Teminite \u0026amp; MDK - Space Invaders by MDK (Morgan David King) MDK and Teminite make such a great combo. They have similar styles but different enough that they can be told apart. Jazzy segment, of course, but with that MDK influence, which makes it extra-special. Teminite - State of mind #Uprising by Teminite As with all the other albums, really hard to pick one to stand out because you should really listen to the whole thing. But this one is special *to me.* It's the song I re-discovered and made me get back to listening to Teminite. I owe it to this one. Teminite - Unstoppable #Unstoppable EP by Teminite The first song on the Unstoppable EP. The whole EP is super energetic, capturing a feeling of courage and determination that no other album i've listened to manages to capture. If I had to summarize Teminite's music in 4 songs, I'd pick the 4 songs on this EP. It's got the solos, the live sax, the jazzyness, the power... it's got everything that defines Teminite for me. I **highly** recommend you listen to the whole EP, especially if you've liked this one. Teminite - Evolution #Firepower by Teminite Definitely gives those old Teminite vibes. It's from an old, unknown EP with three tracks called Energize. Teminite - Night Drive #Inception by Teminite It's really hard to pick one from this album (Inception) to put here. Especially since I'm really fond of this album. I'd say my favorite is `Every time I Look Into The Sky` because it's so different and catchy, but I won't use that one here since I don't think you're in the Teminite section for that. `Earthquake` is probably the most popular, and between `Spider VIP` and `Night Drive`, I feel like this one has more \"bang for the buck\" Teminite, Chime and Pixel Terror - Sleepless #Sleepless by Pixel Terror, Chime \u0026amp; Teminite Monstercat song of the year 2021 and for good reason. An amazing fusion of 4 artists turning out something truly outstanding. Teminite - Sail Away #Raise The Black Flag by Teminite I think this album is an absolute masterpiece. It's really difficult to pick a track to put here because every single one is so good and special. Teminite - Sesh The Seven Seas (ft. Jonah Hitchens) #Raise The Black Flag by Teminite This track is so fun I **HAD** to include it. Jonah playing a pirate is hilarious. Love it Chime #Inventor of colorbass\nGenre: Melodic Dubstep, Riddim, Colorbass\nChime - Different #Chime · Chime - Different I love how chime uses melodies in the dubstep context. It adds a bit of depth that really enhances the emotion in a way many songs can't even come close to achieving. Chime - Here We Go #Chime · Chime - Here We Go Elaborating on what I previously said: It lets them make songs like this one, which I don't have the words to describe. Sort of like that saying that goes \"a picture is worth a thousand words\" Chime - Starstorm #Chime · Chime - Starstorm The first Chime song I ever got recommended, and possibly the first one I heard with just them on it. Although embedded is a new VIP, which I'm still not sure how I feel about. Chime - Wait For Me #Chime · Chime - Wait For Me I think it's the most popular one. It was the subject of a remix contest, so if you like what you hear check out the remixes too. Chime - Potions #Disciple ♛ ♜ ♞ · Chime - Potions Quite a different vibe on this one. I like how it's a bit silly in a fun way. Chime also has quite a few of these, which I enjoy. Chime (ft. Sekai) - From Atoms To Pixels #Chime · Chime - From Atoms To Pixels (ft. Sekai) The amount of emotion packed into this LP is honestly unparalleled. It tells a really interesting story in a really heartfelt way, which makes it a really beautiful piece of art in my opinion meganeko # meganeko \u0026amp; FantomenK - Crystal Tokyo #Crystal Tokyo by meganeko \u0026amp; FantomenK My gateway drug into meganeko. Both FantomenK and meganeko do this thing where they mix drastically different styles and manage to make something cohesive. I love this about them, it makes their songs really fun all along since they can't let it get stale. meganeko - Moonflowers #Moonflowers by meganeko I don't even know how to begin to describe it. It's got those retro futuristic 80's sounds but with an incredibly punchy and original spin on it. I love it how that main phrase gets HAMMERED into your brain with how powerful it is. I love the tasteful melodies on the bass synth, how the vocals are processed and how bouncy the piano is. It's also got the mix of different \"blocks\" that are drastically different from each other. This always makes meganeko songs harder to get into than a \"regular\" song. But it really really pays off when you do. meganeko - Daydreamer #Sequence Break by meganeko This song feels like a fresh summer day where you're having a blast with friends. Going with where the flow takes you, being goofy, laughing, playing, and wishing it'd never end as you keep going into the night. Listening to this one will always lighten up your mood. At least a little bit. The whole album is really really awesome too. If you like what you hear, I strongly recommend listening to the whole album. Tokyo Machine #Japanese producer and DJ\nGenre: Electro House, Bass House, Chiptune, Electro\nTokyo Machine - LOCK N LOAD #FACTORY RESET by Tokyo Machine As of writing this, I'm not entirely convinced on this EP. And yes, you read that right. EP. EP! The first Tokyo Machine EP! My heart jumped when I saw it. This is why I had to add a song from it here. I'm sure I'll fall in love with it in no time. Tokyo Machine - HOT SHOT #HOT SHOT by Tokyo Machine I think this one shows the new, heavier direction Tokyo Machine is taking. At first I didn't really get it, but when Tokyo released a video of themselves dancing to it, it clicked. Tokyo Machine - FAR OUT (VIP) #FAR OUT (VIP) by Tokyo Machine The mix of crazy bass licks, sick pad chords, breakbeats and the typical bass house goodness makes this VIP one of my favorite songs from them Tokyo Machine - GALACTICAL #GALACTICAL by Tokyo Machine Very heavy one, but it gets you moving nonetheless. I also like the theme and Tokyo recording themselves for this track. Tokyo Machine - PARTY #PARTY by Tokyo Machine Tokyo Machine debuted with this song, showing off to the world their upbeat fun bouncy style. Tokyo Machine - BUBBLES #Monstercat Uncaged Vol. 3 by Tokyo Machine I love this track. It's so simple and laid back but it works so well! Tokyo Machine - TURBO #TURBO by Tokyo Machine Careful with this one because the lyrics will get totally stuck on your mind for hours. And the melody doesn't help, it's so catchy! Tokyo Machine \u0026amp; Guy Arthur - GET UP #Guy Arthur · Tokyo Machine \u0026amp; Guy Arthur - GET UP Awesome combo of artists on this one! Guy Arthur'r powerful sound and Tokyo Machine's cheery style mix perfectly to make a super fun track that makes you want to jump along Exyl #Independent artist\nGenre: Complextro\nExyl - Ping! 2 #Ping! 2 by Exyl Ping! 2, better than the original. It's a very powerful song, and it obviously has the classing Exyl flute. Exyl - Cosmic War #Save This World EP by Exyl I don't listen to a lot of complextro, but Exyl's got something going with the Save This World EP. It's just 4 songs, go listen to it. Eliminate #DJ and music producer\nGenre: Brostep, Cyber trap, Jhonsoncore\nEliminate - Crystallize #NIGHTMODE · Eliminate - Crystallize Ft. Leah Culver This song blew me away the first time I listened to it. Eliminate is not quite my cup of tea when it comes to his signature weird sound design. But the first drop on this song is absolute wild. The dead simple pluck pairs really really well with the very complex \"hits\" and the reversed reverb blends it all together so nicely. It's really something special. Eliminate \u0026amp; Flux Pavilion - Dawn (Feat. meesh) #Eliminate* · Dawn w/ Flux Pavilion (Feat. meesh) I'm usually not a big fan of Flux Pavilion, but this track is so fun, bouncy and packed with emotion that it has become one of my favorites from the Get Off The Internet album. I love the singing and the simple, catchy melody, it really sticks with you. Eliminate - Playing with fire #Eliminate* · Playing With Fire Another one from the Get Off The Internet album with excellent singing. It tells a whole story with a lot of emotion, a story I think we all can relate to, which brings it really close home and touches you. I think this makes it really beautiful. Sunnexo #Independent artist\nGenre: Complextro, Chiptune, Digital fusion\nSunnexo \u0026amp; EX-LYD - Hyper Link #Hyper Link by EX-LYD \u0026amp; Sunnexo I know Sunnexo makes complextro, but holy wow this was really unexpected. The insane rhythm game tier intro had me hooked from second 1. Working with EX-LYD brought Sunnexo to another level, with more elaborate, complex, tasteful melodies and progressions that makes this a standout among their discography. Sunnexo - Disk Failure #Disk Failure by Sunnexo Managed to turn a negative experience - a disk failure - into a positive thing. Cool track! Sunnexo - Retro Complex #Retro Complex by Sunnexo Made only using Gameboy sounds, still turned out amazing and very dynamic. Sunnexo - Please Wait #Please Wait by Sunnexo I love the sound of a compressed, release-cut, compressed piano. Sunnexo makes it gel together so well with other elements on this fun track it's impossible not to love it. nightmargin - on little cat feet (Sunnexo remix) # Makes on little cat feet from the `Oneshot` OST into a chill and pleasant track. dark cat #Independent artist\nGenre: Kawaii future bass, bubblegum bass\ndark cat - Banana Street #dark cat finite EP by dark cat Chill track which sets the theme to the finite EP. dark cat's style stands out as unique within the sphere. Tracks styled like this are usually brighter and higher energy, so I really love this more laid back approach this EP has. dark cat (feat. juu \u0026amp; cinders) - BUBBLE TEA #BUBBLE TEA (feat. juu \u0026amp; cinders) by dark cat, juunana, cinders The union between the small bright melody and the bouncy bass makes this song an instant banger Kero Kero Bonito #British band\nGenre: Indie pop\nKero Kero Bonito - Well Rested #Civilisation by Kero Kero Bonito Absolutey insane album. Truly something captivating, I'm completely speechless with this one. All I can say is listen to it. Wow. ari melody #**Genre: **\nari melody - FTL (Faster Than Light) #free2play by ari melody I was searching for copper and found gold with this one. Outstanding vocals I haven't heard anywhere else, fun, happy, great to sing along with. TheFatRat #Experienced producer\nGenre: EDM, Glitch Hop, Future bass, Dubstep\u0026hellip;\nTheFatRat \u0026amp; Sprites - Ray Tracer # TheFatRat goes back to the sounds that made him famous with this gorgeous track. It low-key makes me teary eyed, every time. It's like a fusion of everything that made TheFatRat great for me. I'm so glad people pushed him to work on this once scrapped project. And the singing is heart melting. His daughter's voice works so so well with the song, and it adds another dimension and layer of love to it, which makes it really really special for me. The melody is also insanely catchy, so be warned, it will get stuck on your brain for hours and hours. TheFatRat \u0026amp; Cecilia Gault - Escaping Gravity # A modern TheFatRat track that brings back that classic TheFatRat style present in tracks like Monody. TheFatRat \u0026amp; Shiah Maisel - Out Of The Rain # TheFatRat never ceases to amaze me. Completely different style than anything he's done before and it's a banger! Shiah's voice hitting those highs is amazing too. TheFatRat - Monkeys (TheFatRat remix) # I have to admit, Monkeys is not one of my favorites. But I had to mention the remix. The madlad goes ahead and remixes his own song! I love it. (Also I think it's better than the original :P Sorry, TheFatRat) Oh! and Monkeys is the only song he has sung in since No No No! (which was his first time) TheFatRat \u0026amp; NEFFEX - Back One day # This is sort of another remix of his own song, but I'd say it's more of a \"revitalization\". Back One Day brings a new light to Xeogenesis (which I'm fond of for a very specific reason, too long to explain here :P) and brings it much closer to what TheFatRat initially envisioned for Xeogenesis. Love the track. Doing this to an old classic and not making it worse than the original is very difficult. Well done, TheFatRat. TheFatRat \u0026amp; RIELL - Hiding In The Blue # I picked this one because it's the first one of the Parallax album. The album has more great songs I'd wish to highlight, but this list would end up being too long. TheFatRat \u0026amp; Maisy Kay - The Storm # I remember there was hype around the release of this one. I also remember putting it on a minecraft disk and playing it on my server. We would try to sing along to the lyrics (which are in the `Na'vi` language) TheFatRat \u0026amp; Slaydit - Solitude # Reminds me of old school TheFatRat, I like it. TheFatRat \u0026amp; Laura Brehm - MAYDAY # There was some reeeal hype around the release of this one, and for good reason. There even was some sort of weird encrypted messages around youtube channels that gave clues to it. Love this one. TheFatRat \u0026amp; Laura Brehm - Monody # Another one with Laura Brehm. Those two go way back! My family and I took an iconic picture while dancing to this song, so me and my sister have good memories of it. TheFatRat also explained that this song was quite the undertaking! Lots of live instrument samples, getting the vocals, three different tempos! TheFatRat - Unity #TheFatRat · Unity I'm using the soundcloud embed for this one because the youtube version has the outdated lyrics. Unity, along with Timelapse are the TheFatRat classics everyone knows. Foster The People - Don\u0026rsquo;t Stop (TheFatRat Remix) # I could put so many more TheFatRat songs on this section, but it would end up too long. These are the highlights of the highlights! But I can't leave this remix out of the list C418 #Professional composer and producer\nGenre: Electronic, Ambient, House\nC418 - Litter Jitter #Wanderstop FM by C418 First C418 release in a long long time. Lots of people, including me, got really excited about getting a new release. Apparently this album consists of songs that play in some videogame's radio. And as always, C418 completely over-delivered. It's an absolutely magical collection of songs with beautiful sounds with that C418 signature, but evolved. Honestly, I feel like C418 took the opportunity and freedom of this being for just a radio to pour a lot of his heart and soul into this set of songs. They just feel so expressive and heartfelt. C418 - Thunderbird #Excursions by C418 Thunderbird is really something different. I had never heard anything like it before. It has unique electronic melodies but also beautiful orchestral segments. C418 - The President is dead #Excursions by C418 My absolute favorite from Excursions. It's also the first one I listened to from this album so I might be biased, but it's absolutely gorgeous. It gives me goosesteps. C418 - Semantic Satiation #148 by C418 It sets the theme of the 148 album. \"Highly energetic, loud mouthed\" C418 - Friend #148 by C418 My favorite from 148. The melody is so unique and catchy that it gets stuck on my head and it doesn't let me sleep. C418 and Laura Shigihara - Tsuki No Koibumi 2 #148 by C418 and Laura Shigihara Beautiful sung track that breaks from the strong-worded nature of the previous ones in the album. It's the sequel to Tsuki No Koibumi from the One album. Making a VIP live up to the original is very difficult, but C418 crushed it with this one. LÜNE #Independent artist\nGenre: Synthwave\nLÜNE - Cerise de L\u0026rsquo;espace #Rêve Lucide by LÜNE Meaning \"Space cherry\". It really does sound like you're in space on this one. I'm mentioning Cerise de L'espace because it's the first one from the Rêve Lucide album I heard, but the whole album is excellent, check it out. LÜNE - Minimonde #Minimonde by LÜNE This is the first one from from LÜNE I ever heard, and what made me check out his music further. It's synthwave, but it's unlike anything I had heard before, so it deserves a mention. LÜNE, Veyko - Fleur Solitaire #Fleur Solitaire (ft. Veyko) by LÜNE Calm track as is usual with LÜNE. Lovely track. LÜNE - Bisou sur la joue #Bisou sur la joue by LÜNE Bisou sur la joue means \"Kiss on the cheek\" in French, and it's a nice name to go with a nice track :) LÜNE - Petit Nuage #Souvenirs by LÜNE Again, I pick a single track but you should really listen to the whole EP. I think it's a really really beautiful and emotional EP, specially with the intent behind it. LÜNE - Promenade #Promenade // MÖÖN by LÜNE That intro is SO good. And the whole EP... Woah. It's got that LÜNE signature without his classic pinch of regret and nostalgia, which makes for something very special coming from them. Euan Ellis #Electronic music producer\nGenre: Chillsynth\nEuan Ellis - Exploration #Exploration by Euan Ellis My favorite one from the Exploration album. It's quite different from the chillsynth I'm used to listening to, which makes it stand out. Euan Ellis - The Light #Luminescence by Euan Ellis The lyrics might be a but cheesy, but I still prefer it over the instrumental version. They make it more unique, special and in my opinion, more beautiful too. Euan Ellis - Prophets #Luminescence by Euan Ellis It's the one that captured my interest and drove me to listen to the whole album. I don't know how he does it, but somehow he manages to make the most unique, tightest beats I've ever heard on a song of this style, and it works really well. Euan Ellis - Cruising #In Motion by Euan Ellis It feels like when someone you trust and love, with a slight smile, tells you everything will be alright. InsaneInTheRain #Professional videogame music composer\nGenre: Jazz-like\nLena Raine - Quiet and Falling (IITR\u0026rsquo;s jazz arrangement of 2Mello\u0026rsquo;s remix) # Yes, remix on top of a remix. But it's glorious. 2Mello's remix of Quiet and Falling is my favorite song out of all the Celeste A and B sides. InsaneInTheRain takes that up a notch. I really love this one. Lena Raine - Pigstep (IIRT jazz arrangement) # Another Lena Raine remix. And she even plays on this one! Toby Fox - Rude Buster (IITR jazz arrangement) # He even plays the bass on this one! Toby Fox - BIG SHOT (IITR jazz arrangement) # Toby Fox again, I know. But I really had to mention this one. The sax solo is incredible! Pokémon Diamond/Pearl - Eterna forest (IITR jazz arrangement) # The original song has a really unique motif that doesn't even get close to anything I've ever heard before, it makes it really interesting and it gets stuck in your head. Insane In The Rain takes that, and with the help of acoustic instruments makes a beautiful arrangement out of it. Terraria Calamity mod #Tracks made for the Calamity mod that just went above and beyond\nGenre: I don\u0026rsquo;t even know, EDM\nDM DOKURO - The Devourer of Gods (Nonstop mix) # A wild mix of styles. Orchestral, Metal, Chiptune... Just incredibly epic, it's addicting. It's 13 minutes long, but don't be discouraged by that because every single second is worth listening to. 1NF3S+@+!0N - Theme of crabulon # A videogame theme for a goofy looking mushroom crab didn't need to go this seriously hard, but it does. And the beast even used oscilloscope images of a mushroom in the song! The Arcadium #TheFatRat\u0026rsquo;s music label\nGenre: EDM\nRolipso - Delight #Rolipso · Delight Really powerful track about an artist I had't heard before. Geoplex - Imperium #Geoplex · Imperium Really cool one by Geoplex! I remember a friend of mine really liking this one, so we put it on a music disc on our private minecraft server. Jack Shore \u0026amp; Pyro X - Ball Bounce #Jack Shore · Ball Bounce I REEEALLY liked this one when it came out. It just sounds so happy and energetic! Jack Shore - To Be # Apparently this song is based on a really popular sample pack, so you might have heard this singing before. It's interesting to see how different artists use the same sample. Not done including everything! Nostalgia #Some songs I used to listen to as a kid, when I had just discovered the internet. Sure, I used to listen to a lot more, but just as with the rest, these are some highlights. I would never finish writing this article if I had to include all of them. I\u0026rsquo;m not including all the highlights I could either, and I don\u0026rsquo;t even remember the names of some I wanted to include.\nGenre: Dubstep, EDM, DnB, Electro\nSkrillex - Scary Monsters And Nice Sprites # Very out of fashion, cringe, whatever... But it's a true classic. Benny Benassi - Cinema (Skrillex remix) # Another Skrillex classic. Kill The Noise - Saturn # Found this song as a kid on an old Spanish YouTube skit. Used to love this song. I'm still fond of it. Virtual Riot - Energy Drink # I used to thing this song was very cool. I mean, it still kinda is! I just see it differently now. Pegboard Nerds - Disconnected # Used to listen to and hum along this one with my sister. Brings back fond memories. Teminite \u0026amp; Panda Eyes - Highschore # Although it's Teminite, I feel it belongs here more than on the Teminite section. It's the song all those obnoxious 3D text intros the 9 year olds loved back in the day used. Obnoxious itself, but great song after all. Cash Cash - Overtime # This one is pretty popular Tristam \u0026amp; Braken - Frame of mind # This one just makes me emotional Rogue - Adventure Time # One of my favorite cartoons - Although this song isn't from the cartoon :P It's just a good song. Zelda - Song of Storms (Deon Custom remix) # I don't know why, but this song always brings me one memory: Sitting in my cousin's house back entrance waiting for him to wake up so we could play. I wonder how my cousins are doing nowadays. Shawn Wasabi - Mac n\u0026rsquo; Cheese # An amalgamation of samples from 134 different popular songs. I remember I used to listen to Shawn Wasabi a lot back in the day. Caramella girls - Caramelldansen # Good old Swedish classic DJ Striden - Level One # I remember really liking this song during early high school. Meg \u0026amp; Dia - Monster (DotEXE Dubstep Remix) # Had to look for so long to find this one. I didn't remember the name! I remember this track to be a lot less bland than it seems to be now, but I remember this being an iconic song during my childhood. Feint - We Won\u0026rsquo;t Be Alone # Had this one in a playlist I used to listen to a lot Au5 - Snowblind # I hadn't listened to this one in a loooong time. My sister showed me this one, she really liked it and so did I. This is a really nostalgic one. Hinkik - Time Leaper # Everyone knew this song, it's a classic. Vicetone - Nevada # Used to listen to this one pretty often. Deservedly, it's on the Monstercat top of all time. Feint - Face Down # I hadn't listened to this one in a looong time until I rediscovered it yesterday. I love it like the first day. Hyper Potions \u0026amp; Nitro Fun - Checkpoint # Used to listen to Hyper Potions a lot! I completely forgot about them until a friend of mine showed me that they're still crushing it to this day. I'm glad they're doing great. Fox Stevenson - Sandblast # My sister reminded of the existence of this song! I completely forgot about it. What! a! banger! I still remember part of the lyrics, which feels great. Elektronomia - Sparks # Everyone has heard at least one song from them somewhere. I of course know the big classics, but I used to listen to this one, so i'm putting it here on the nostalgia section. Cartoon - On \u0026amp; On # Extremely, extremely popular one. But I really loved it, and I still do. It evokes a special feeling... which I don't know how to describe. Pegboard Nerds - Here It Comes #Here It Comes by Pegboard Nerds I rediscovered this song and I couldn't believe I found it. Me and my sister LOOOVED this song. That melody feels really nostalgic for me. Stonebank - The Pressure #The Pressure by Stonebank Completely forgot about stonebank. A huge wave of nostalgia hit me when a friend played this song. Just like the previous one, the melody is incredibly nostalgic. Stonebank - Stronger (feat. EMEL) #Stronger (feat. EMEL) by Stonebank As one of the bandcamp supporter messages says, \"certified hood classic\". Can't believe I hadn't heard this song in so long. Au5 - Follow You (VIP Mix) #Follow You (feat. Danyka Nadeau) (The Remixes) by Au5 When I rediscovered Snowblind I looked for this song, but I didn't know what to search for. Listening to one of Teminite's live kitchen mixes, he sneaked it in and I instantly went **OH MY GOD.** I remember this being my sister's favorite and listening to it with her. It makes me feel warm, fuzzy, and happy I got to experience that. 🕳️\n","date":null,"permalink":"/music/","section":"","summary":"","title":"Some of the music I listen to"},{"content":" I made this crate because I got a sensor for an upcoming project and didn\u0026rsquo;t find any crate for it. Turns out there is a crate, but oh well. It\u0026rsquo;s still been a learning experience.\nIt\u0026rsquo;s been my first time working with I²C directly, and implementing this crate from the datasheet was quite a bit more complex than the the 3642bs one. Just like that crate, this one is also compatible with all embedded_hal-based HALs and probably Embassy.\nFor now, the crate includes these functions:\n.temperature() does what you\u0026rsquo;d expect. It sends a request to read the temperature, waits for the sensor to take the measurement and then reads the I²C bus for the reply. It puts together the bits of the answer and does the required math from the datasheet. .humidity() is the same story as the previous, but it returns the relative humidity instead. .dew_point_temp() calculates the dew point temperature, which is the temperature to which the air would have to be cooled to become saturated with water. This is the first thing I made after finishing the rust book and ruslings exercises, so I\u0026rsquo;ve made use of generics a bit more consistently with this one. It\u0026rsquo;s still far off from perfect. I\u0026rsquo;ve still had to fight with the compiler and ended up with not exactly what I wanted. Because of how the generics work, I couldn\u0026rsquo;t unwrap, debug print or impl From the errors. Despite this I haven\u0026rsquo;t insisted on fighting with it, because I needed this ready to be used ASAP. I wanted it to build a project with the ESP32-C3, but turns out the I²C on it is broken, so that sucks.\nI don\u0026rsquo;t have much else to say about it, so I\u0026rsquo;ll leave it here.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/gy-21 🕳️\n","date":null,"permalink":"/projects/gy-21/","section":"Software and hardware projects","summary":"Driver crate for the HTU21D temperature and relative humidity sensor","title":"GY-21"},{"content":" What a wild ride this program has been. It\u0026rsquo;s been my first time ever making a GUI. First with EGUI and then with Tauri.\nIt\u0026rsquo;s a rust rewrite of Colin\u0026rsquo;s ADAP. ADAP was very slow and buggy, and he always said he should rewrite it in rust, although he never did. That\u0026rsquo;s why I took into my own hands to rewrite the program.\nMy first prototype was already massively faster than the python version: It went from a couple of minutes to a few seconds. DAQinator also quickly became much more robust than it\u0026rsquo;s predecessor. It\u0026rsquo;s basically impossible to make it behave like it\u0026rsquo;s not supposed to, and it uses a much better system for graphing templates.\nGraphing templates use TOML instead of CSV, and they\u0026rsquo;re much easier to create thanks to serde. It also fixes some really goofy mistakes Colin made: To convert from column number to the letters spreadsheets use, he manually wrote a dictionary! That should be a crime! I did it procedural instead:\nfn num_to_col(number: usize) -\u0026gt; String { let mut result = String::new(); let mut num = number + 2; while num \u0026gt; 0 { let rem = (num - 1) % 26; let ch = (rem as u8 + b\u0026#39;A\u0026#39;) as char; result.insert(0, ch); num = (num - 1) / 26; } result } There are 26 letters in the English Alphabet, so what I made is a base 10 to base 26 converter, where the first number in the base 26 system is \u0026lsquo;A\u0026rsquo; and the 26th is \u0026lsquo;Z\u0026rsquo;.\nI also tried to document my rewrite extensively so it can be maintained by anyone later on.\nEarlier I mentioned EGUI and Tauri. I started making the program with EGUI, the premise being it was just a temporary UI for development, and that Colin would make a proper UI later on. \u0026hellip;But he never did, for various reasons I can\u0026rsquo;t blame him for. (And he also went on a rant on why he would never deploy my program while using my EGUI UI) So recently having decorated my website, and with a little bit of HTML and CSS knowledge, I decided trying out Tauri was a good idea.\nThanks to Tauri (and Colin\u0026rsquo;s help) i\u0026rsquo;ve been able to make a GUI which is much more intuitive and, to put it lightly, easier on the eyes. I bet even my grandma could use it without any instructions.\nCheck out the project on gitlab: https://gitlab.com/ColinLeftwich/DAQinator 🕳️\n","date":null,"permalink":"/projects/daqinator/","section":"Software and hardware projects","summary":"Makes DAQ data readable","title":"DAQinator"},{"content":" Visit the page 🕳️\n","date":null,"permalink":"/grafana/","section":"","summary":"","title":"My Grafana instance"},{"content":" I got into 3D printers a long time ago. I learnt the ins and outs of them, modding mine in the process. I also learnt to use various CAD programs. Nowadays I don\u0026rsquo;t have the passion I used to for them, but I\u0026rsquo;m still left with an incredibly useful machine and the skillset to use it.\nMe and my family have tons of 3D printed doohickeys I made to solve our very specific situational problems. I initially got the printer to build my maker projects, but it\u0026rsquo;s now almost exclusively used to print random doodads for us. And it\u0026rsquo;s almost taken for granted now, we\u0026rsquo;re really used to being able to make specific solutions for specific problems. It\u0026rsquo;s turned from a novelty into a get-stuff-done machine, and while that removes the excitement for it, it gives it a really important purpose.\nHere\u0026rsquo;s some models I published to the public domain:\nGridfinity # Ender 3 add-ons # Other # The mods #Here are some of the mods I\u0026rsquo;ve made over the years. The picture is outdated so the list is outdated, and I may even have missed some when making the list :P So here\u0026rsquo;s some.\nAll metal hotend Hotend Noctua fan Custom dual quiet fan gantry carriage (not visible on this picture, it\u0026rsquo;s outdated. This one has a custom fan duct instead) Direct drive extruder and metal feeder Silent motherboard Motherboard noctua fan Glass bed Hard rubber tensioning springs Smaller, lighter tensioning knobs (outdated picture again) Belt tensioners PSU noctua fan Filadrier holder (stock roll holder replacement) USB and spatula holder Z axis screw knob Filament guide Feet extensions LCD knob LCD cover LCD cable cover V-slot cover 🕳️\n","date":null,"permalink":"/3dprinting/","section":"","summary":"","title":"3D printing"},{"content":" Click on the fellas riding blåhajs to visit their website!\nWant to be featured here? Shoot me a message!\n🕳️\n","date":null,"permalink":"/blahaj/","section":"","summary":"","title":"Blåhaj Zone"},{"content":" I enjoy cooking, so here\u0026rsquo;s some of the meals I like to cook and eat. They\u0026rsquo;re either vegan or easy to adapt. So if you want to give cooking vegan a try, scroll through the pictures and try to make whatever catches your attention!\nRice #Thai fried rice » is made with a bunch of leftovers, so it helps you clear out your fridge. Risotto » is my favorite Italian rice dish. Chickpea lemon pilaf » is one my mom really likes. I usually cook it with red rice, so it\u0026rsquo;s super duper packed with nutrients. Onigirazu » is when sushi met sandwiches. Weird concept but it\u0026rsquo;s pretty nice Poke Bowl » is just a random assortment of veggies and fruits with rice as a base and some sauce for extra flavor. I like to make mine with nuts, edamame, lentils and smoked tofu and a drizzle of teriyaki sauce. Teriyaki tofu rice bowl » is an easy way to add tons of flavor to a plain bowl of white rice. Katsu curry » is a comfort food of mine. I love the flavor japanese curry, I love rice and I love the crispy katsu on top. It also looks very pro and yummy without putting a lot of effort in. Switch the chicken+egg for vegan katsu and the recipe is now vegan. Noodles #Yaki udon » is probably one of my mom\u0026rsquo;s favorites. I also really like it too. Garlic sesame noodles » are a bit similar in taste to the Yaki Udon, but that means they\u0026rsquo;re also very nice. Hosin tofu noodle stir fry » is spicy, and I love tasteful spicy food. Miso soba » First tried this on a restaurant and it was pretty good! So I decided to try and make it myself. Peanut butter noodles » Are super quick and easy to make and super tasty! I highly recommend this one. Lo mein noodles » bring that characteristic flavor of takeout to your home. Obviously I don\u0026rsquo;t use egg noodles, I use ribbon pasta like they do here instead. Nice thing is you can really switch up the ingredients: I use edamame instead of snow peas, different types of mushrooms and so on. Pasta #Cheesy pasta » Or well, the author called it Carbonara. But this thing isn\u0026rsquo;t even remotely similar to carbonara. It\u0026rsquo;s a lot closer to Mac and Cheese. Despite the weird naming, it tastes good! Lemon tahini pasta » is not something I had heard of before before trying this recipe. But it\u0026rsquo;s nice! Alfredo » is quick and easy to make, for when you don\u0026rsquo;t feel like cooking. Hummus pasta » sounds like the weirdest combo but it\u0026rsquo;s amazing! Tofu #Spicy garlic tofu » Garlic bread? Garlic tofu! Teriyaki tofu » makes a great combo with sushi. Crispy baked tofu nuggets » are a different, healthy take on nuggets. Other #Couscous » everyone has had it. And if you haven\u0026rsquo;t: What are you waiting for! Turkish lentil balls » are really filling, really nutritive, and really tasty! Swedish Meatballs » are delicious. I get mine from IKEA because they\u0026rsquo;re the best I\u0026rsquo;ve found to date. I like to serve them with mashed potatoes and a little bit of lingonberry jelly as well. Has to be one of the dishes I currently like the most. 🕳️\n","date":null,"permalink":"/recipes/","section":"","summary":"","title":"Recipes"},{"content":" I like collecting stickers on my laptop, I feel like it gives it a bit of uniqueness or personality, like it makes it more me.\nHover your mouse over the stickers to see information about them. You can also zoom in and pan around! ","date":null,"permalink":"/stickers/","section":"","summary":"","title":"Stickers"},{"content":" Peipr, Yazide and I built this project as a hackathon challenge. The challenge, proposed by an airline, was to build something that allows passengers to interact and collaborate with each other, all without the need for internet access. We got bonus points if we added extra features and if that collaborative app had something to do with the destination. For that reason, we decided to make a trivia game about the destination where players stand on one side or the other of the screen to make a decision. The twist - You can see how players move across the screen in real time. It was partially inspired by this minigame, but without the confusing questions:\nThis was built as a web-app, so Yazide worked on the user interface, optimizing it for small touchscreens. He also made the video/movie player and some extra features for the bonus points. Peipr worked on the trivia game itself. She used JavaScript for the mechanics and HTML5 canvas to render the players.\nI worked on the backend - a local REST API built with Rust. In order for all the players to be able to join a game, we needed a fast and robust backend. This wasn\u0026rsquo;t my very first time working on a REST API, but it certainly was a learning experience. All I had previously done are some simple ones for Embedded, nothing of quite that magnitude.\nI used the actix_web crate even though I was recommended to use axum instead. It seemend like building a REST API with actix was a bit more straight forward, which is definitely needed on the hackathon time crunch. Despite that, I lost quite a few hours figuring out and trying different ways to do things. Sending things to the handler services between threads was no easy challenge. It forced me to finally learn about Mutex (which I had been avoiding for a long time) and how to propperly deal with it. (It was constantly getting poisoned!)\nAt the end of the hackathon, we reached a state with FlightSpace where it was functional enough to do a demo, but not as polished as we have hoped. It was still much more than what we thought we were capable of doing, so we\u0026rsquo;re proud of that. Overall, it was a good challenge for all of us and a lot of fun to work on together.\nCheck out the documentation: https://docs.flightspace.tech/ Check out the project on devpost: https://devpost.com/software/flightspace 🕳️\n","date":null,"permalink":"/projects/flightspace/","section":"Software and hardware projects","summary":"FlightSpace is a plane infotainment system with a twist - Passengers can interact with each other.","title":"FlightSpace"},{"content":" Yet another TUI pomodoro timer app. But why? Same reason all the others give: it doesn\u0026rsquo;t meet my needs.\nWe all know what this is and how it works, so here are the extra features I added that most others don\u0026rsquo;t have:\nA config file. I want to be able to just run tomaquet and have it set to my preferred intervals without having to input them on the command line. Unlimited cycles. Most I tried stop after three or five cycles. For one of the uses I\u0026rsquo;ll give it, I need it to be able to run forever. Customization. I want it to match my rice! I can\u0026rsquo;t have it sticking out with another color! Responsiveness. Most aren\u0026rsquo;t responsive or have a minimum size. I want to be able to put this thing anywhere, like on the top of my desktop: Notifications. Not always though, sometimes it will be on another virtual desktop, so I need it to notify me when a cycle ends. Alarm sound. What if I\u0026rsquo;m not playing attention to the computer screen? I didn\u0026rsquo;t entirely create it just because I didn\u0026rsquo;t quite like the others though. I also wanted some more practice with the tui library and to try programming something time-based. I have never needed to keep track of time on a desktop application, so I didn\u0026rsquo;t really know what I was getting into. What I found is that it\u0026rsquo;s relatively similar to working with an RTC on an embedded platform.\nThe most challenging part was definitely figuring out how to pause the timer without sleeping the thread - But I ended up making it with some simple math. For the alarm sound I used the rodio crate, and it was a lot more straight forward than what I expected. I even composed an alarm sound myself! It\u0026rsquo;s on the resources folder on the repository.\nOverall, it was a simple little project I used to spend my free time on and take a bit of a mental break from university.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/tomaquet 🕳️\n","date":null,"permalink":"/projects/tomaquet/","section":"Software and hardware projects","summary":"TUI Pomodoro timer","title":"Tomaquet"},{"content":" Inspired by a silly meme, I made my own from scraps and scratch.\nThe scraps I used are a dense neopixel strip I had laying around, an old buck converter and a power supply from an old stereo. I do have dev board scraps laying around, but I wanted to use a RPi Pico for this, so it isn\u0026rsquo;t entirely scraps. It isn\u0026rsquo;t entirely from scratch either, I did use some crates to make my life easier.\nI originally intended to make the firmware entirely from scratch, but I had trouble finding how to communicate with ws2812b LEDs. They communicate through SPI like this: $$ [MCU]\\xrightarrow{MoSi}\\ \\rightarrow\\ \\xrightarrow{MiSo}[LED]\\xrightarrow{MoSi}\\ \\rightarrow\\ \\xrightarrow{MiSo} [LED]\\xrightarrow{MoSi}\\ \\cdots $$\nBut I didn\u0026rsquo;t know exactly what I had to send. Since I was rushing to complete the project because I had coming exams, I just used a crate.\nInstead of taking the easy path, I ended up wiring the strip like this to save on wire, so I had to correct for the zig-zagging strip on firmware:\nfor (rownum, row) in matrix.iter().enumerate() { for (pixelnum, pixel) in row.iter().enumerate() { let (r, g, b) = pixel; if rownum % 2 == 0 { // If the row is even, calculate the position on the strip strip[X_PIXELS * rownum + pixelnum] = RGB::new(*r, *g, *b); } else { // If the row is odd, calculate the mirrored version of it on the strip strip[X_PIXELS * (rownum + 1) - (pixelnum + 1)] = RGB::new(*r, *g, *b); } } } Writing manually the RGB values for every pixel on the display is difficult and tedious, so I made a TUI app that makes the process easy:\nYou can move around with the arrow keys or the vim h j k l keys. There\u0026rsquo;s a shortcut guide in the bottom nano style, so you don\u0026rsquo;t need any previous knowledge on how to use the app. Since I was rushing to complete it, I didn\u0026rsquo;t implement a proper color picker. Instead there\u0026rsquo;s a hex input field where you can type (or paste) in the color code:\nHaving to use the input field every time you want to change the color sucks, so I implemented an eyedropper tool to pick existing colors. Most importantly though, you can save your drawings into a rust file that contains the drawing in a format the firmware can understand\nOverall, I wish I had more time to work on this project. But it\u0026rsquo;s what being a student has. I could pick up the project at a later date to improve it, but it\u0026rsquo;s just a silly idea and some scraps, so I don\u0026rsquo;t think I will.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/led-matrix-display 🕳️\n","date":null,"permalink":"/projects/led-matrix-display/","section":"Software and hardware projects","summary":"\u003cdiv style=\"height: 10px;\"\u003e\u003c/div\u003eHomemade LED matrix display with a personality","title":"LED Matrix Display"},{"content":" Ben the dog is a silly discord bot I made for fun using discord.py. I hadn\u0026rsquo;t used python in a while, so I wanted to make something with python. The first thing that came to mind was a discord bot, so I checked out discord.py. Turns out it\u0026rsquo;s really simple to use.\nDefining the bot itself is just a single line:\nbot = commands.Bot(command_prefix=\u0026#34;?\u0026#34;, intents=discord.Intents.all(), case_insensitive=True) And then to define the events the bot should act on, a decorator is used on one of the possible functions. In my case, I wanted the bot to reply when a message contains the keywords ben and ?, so I used on_message instead of a regular bot command:\n@bot.event async def on_message(message): The bot is meant to behave like Ben from the mobile app Talking Ben, so what the bot does when triggered is pick one of the four options at random:\nfrom random import choice options = [\u0026#34;Yes\u0026#34;, \u0026#34;No\u0026#34;, \u0026#34;Hohoho!\u0026#34;, \u0026#34;Eugh!\u0026#34;] ben_choice = choice(options) And for the reply to be prettier, it replies with an embed:\nembed=discord.Embed(title=f\u0026#34;Yes\u0026#34;, description=f\u0026#34;🐶\u0026#34;) embed.set_thumbnail(url=\u0026#34;https://example.com/image.png\u0026#34;) await message.channel.send(embed=embed) Here are the 4 possible replies:\nThis project was nothing more than a silly gimmick, but it had ran for continuously for a few months on my server before I shut it down. It was fun to use and had lead to some funny situations. Since it wasn\u0026rsquo;t anything permanent, I ran on on a tmux instance I installed discord.py on. If I wanted to make something more permanent, I would have made it run on a docker container, just like I did with my discord music bot. But I\u0026rsquo;ve decided to stop using discord in favor of matrix, so I don\u0026rsquo;t think I\u0026rsquo;ll be playing with discord bots again.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/ben-bot 🕳️\n","date":null,"permalink":"/projects/ben-bot/","section":"Software and hardware projects","summary":"Discord bot that imitates Talking Ben","title":"Ben Bot"},{"content":" The 3642BS is a 4 digit, 7 segment display with a common anode configuration. Since it shares the segment pins between all the digits, they have to be time-division multiplexed. This has to be done really fast for persistence of vision to fill in the gaps, so the speed of the library matters.\nFor now, the library includes these functions:\n.clear(), Which pulls down all the common anodes, essentially turning off the display. .custom(), Which takes an array with 4 8-bit unsigned integers (each corresponding to a digit) where every bit corresponds to a segment on the digits. .number(), Which prints an integer from -1999 to 9999 on the display. It basically translates the number you feed it to the [u8; 4] the .custom() function requires and calls it. .hex() Which does the same thing as the previous one, but it prints a number from -0x1FFF to 0xFFFF .time() Which does the same as .numbers() but it also blinks the two dots every second .custom() Allows you to print anything you want to the display, and it does so by using bit arithmetic:\n// Constants with the bit corresponding to the segment turned on pub const SEG_A: u8 = 0b01000000; pub const SEG_B: u8 = 0b00100000; pub const SEG_C: u8 = 0b00010000; ... if segments \u0026amp; SEG_A == SEG_A { self.seg_a.set_low()?; } else { self.seg_a.set_high()?; } if segments \u0026amp; SEG_B == SEG_B { self.seg_b.set_low()?; } else { self.seg_b.set_high()?; } ... The arithmetic is quite simple, what it does first is an and operation. An and operation will only result in the bits both variables share. So for example if segments is the binary number 11001100, an and operation with the value 01100110 would look like this:\n1 1 0 0 1 1 0 0 \u0026amp; \u0026amp; \u0026amp; \u0026amp; \u0026amp; \u0026amp; \u0026amp; \u0026amp; 0 1 1 0 0 1 1 0 = = = = = = = = 0 1 0 0 0 1 0 0 The resulting value being 01000100. If this is done with a variable like SEG_A, the resulting value will only have a 1 in it if segments had the bit corresponding to the A segment turned on. To determine if it should turn on the segment or not, it just checks if the result of the and operation is the same as the segment we\u0026rsquo;re checking for. These two operations can be done really fast by any processor, since the silicon in them is explicitly designed to do them. This contributes significantly to the speed of the library, but it also makes it too fast.\nIn order for the display to show a coherent output, the pins on the microcontroller and the LEDs on the display need to have time to turn on and off. For that reason, after .custom() is done executing, there is a 1 millisecond delay:\nself.delay.delay_ms(1); Making your own custom characters is easy, you just need to do a bitwise or operation with the segments that should turn on:\n// ===A=== // Make your own custom characters: // ‖ ‖ let letter_c = SEG_A | SEG_F | SEG_E | SEG_D; // F B let letter_o = SEG_G | SEG_E | SEG_C | SEG_D; // ‖ ‖ let letter_l = SEG_F | SEG_E | SEG_D; // ===G=== let text_cool = [letter_c, letter_o, letter_o, letter_l]; // ‖ ‖ // E C display.custom(text_cool).unwrap() // ‖ ‖ // ===D=== The crate has been published on Crates.io, and the documentation is available at Docs.rs. It is compatible with any HAL based on the generic embedded_hal and with embassy.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/3642bs 🕳️\n","date":null,"permalink":"/projects/sevseg-3642bs/","section":"Software and hardware projects","summary":"Embedded rust driver for the 3642BS seven segment display","title":"3642BS Embedded Driver"},{"content":" Vimouse controls your vim cursor with a joystick. Yes, it\u0026rsquo;s the same picture as the Awful Mouse, because I re-used the circuit. I made this project as a joke, \u0026ldquo;A mouse for nano users\u0026rdquo; but also to dig around the documentation. On the Awful Mouse project I mostly just copied from the examples, not really understanding what stuff does. With this one, I challenged myself to not look at any examples (they where removed from the rp-hal repo anyways) and try instead to do it all on my own. I also used an embedded debugger for the first time, which was an awesome experience.\nThe first thing that had me digging through documentation were the imports. Most of the stuff was easy enough, it was documentation on the rp_pico docs. But one import was especially confusing, and it isn\u0026rsquo;t even about the HID part, it\u0026rsquo;s about reading the analog pins:\n// adds .read() to adc pins use embedded_hal::adc::OneShot; It\u0026rsquo;s just confusing how a method from the generic embedded HAL is being used on a struct from the rp2040_hal which is being imported second hand by the rp_pico crate. If you couldn\u0026rsquo;t read that sentence, don\u0026rsquo;t worry, I can\u0026rsquo;t wrap my head around it either.\nI don\u0026rsquo;t fully understand the USB interrupts and device drivers, and most of the usb stuff is done trough unsafe too. But USB is a massive rabbit hole I\u0026rsquo;m not willing to go into yet. The USB HID documentation is 432 pages alone, so I can\u0026rsquo;t begin to imagine how extensive the whole usb device spec is. Talking about the USB HID docs, I had to do some digging there. Since the usbd_hid crate is the same as the last time, it uses a really similar structure as the MouseReport:\nKeyboardReport { modifier: u8, reserved: u8, leds: u8, keycodes: [u8; 6], }; And the codes for the keycodes array are documented on the HID Usage Tables for USB (page 88) Interesting how it holds only 6 values, I know that\u0026rsquo;s how USB keyboards are supposed to work, but it got me wondering about how n-key rollover is supposed to work. I also had to look for the device class codes:\nusb_dev = UsbDeviceBuilder::new(bus_ref, UsbVidPid(0x16c0, 0x27da)) .manufacturer(\u0026#34;Slushee\u0026#34;) .product(\u0026#34;Vimouse\u0026#34;) .serial_number(\u0026#34;1.0.0\u0026#34;) .device_class(0x03) .build(); Which I got from here: https://www.usb.org/defined-class-codes\nWhat was an absolute joy was working with the debugger. I had never worked with a debug probe for embedded devices, and it left me so amazed. I know these have existed for a long time, but I still couldn\u0026rsquo;t contain my excitement when working with one. Getting information from a microcontroller is always annoying, You have to open a serial port or get some kind of external display\u0026hellip; It always adds extra annoying code. But with a debug probe it\u0026rsquo;s just\ninfo!(\u0026#34;Joystick reading: X = {}, Y = {}\u0026#34;, x, y); No need to open any serial port. No need for any extra code. Just use the macro provided by defmt::info. The output on the terminal looks like this:\n**(HOST) INFO** flashing program (6 pages / 24.00 KiB) **(HOST) INFO** success! ──────────────────────────────────────────────── **INFO** Joystick reading: X = 2048, Y = 2048 └─ vimmouse::__cortex_m_rt_main @ src/main.rs:110 It also reports on any crashes, panics, errors, connection issues\u0026hellip; Having this kind of information is incredible for me, because I\u0026rsquo;m used to working with a \u0026lsquo;black box\u0026rsquo;.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/vimouse 🕳️\n","date":null,"permalink":"/projects/vimouse/","section":"Software and hardware projects","summary":"Awful Mouse recycled to move your cursor in vim","title":"Vimouse"},{"content":" I made this awful mouse to try out the pico\u0026rsquo;s HID capabilities and the rust HAL for it. It\u0026rsquo;s called \u0026ldquo;Awful mouse\u0026rdquo; because it\u0026rsquo;s hard to control and it lacks the right click and scroll wheel.\nI made it with a potentiometer based joystick with a press button, so there\u0026rsquo;s only a left click. If the joystick was bigger, it would have potential as an alternative game controller. I could see it being used to aim and shoot in games like Enter The Gungeon. Other than that, it\u0026rsquo;s just a little project.\nI liked working with the usb_device library, I think using a struct to manage all the HID data is really neat. It is also really simple to use:\nlet report = MouseReport { x: u8, y: u8, buttons: u8, wheel: u8, pan: u8, }; push_mouse_movement(report).ok().unwrap_or(0); It is as simple as feeding the struct the XY coordinates, the state of the buttons and the speed of the scrollwheel, and sending it with the push_mouse_movement function. The push_mouse_movement function is an abstraction for a bit of unsafe code though:\ncortex_m::interrupt::free(|_| unsafe {USB_HID.as_mut().map(|hid| hid.push_input(\u0026amp;report))}).unwrap() I also found it neat that you can define some of the USB info:\nlet usb_dev = UsbDeviceBuilder::new(bus_ref, UsbVidPid(0x16c0, 0x27da)) .manufacturer(\u0026#34;All of this\u0026#34;) .product(\u0026#34;can be changed\u0026#34;) .serial_number(\u0026#34;to whatever you want\u0026#34;) .device_class(0) .build(); So if you are building something like a custom keyboard, you can have it seem more professional or hide a fun little easter egg for those who like to look.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/awful-mouse 🕳️\n","date":null,"permalink":"/projects/awful-mouse/","section":"Software and hardware projects","summary":"A mouse made with a joystick and a Raspberry Pi Pico","title":"AwfulMouse"},{"content":" µtop (Micro top) is top but micro. It runs as a bash script and displays the stats on a display inside your computer case. For now, it displays CPU and GPU temperature (in ºC) as well as memory usage (in MiB). There\u0026rsquo;s also a \u0026ldquo;Progress bar\u0026rdquo; that shows visually how full your memory is.\nTo gather the needed info, it makes use of the sensors and free commands. It sends the data over a USB serial port to a microcontroller, and the microcontroller drives the display. The most updated version uses a 16*2 alphanumerical LCD, but previous versions worked with a 7 segment LED display. The shell script will run on anything capable of running linux, and the microcontroller code will run on most Arduino development boards.\nThe data is gathered with slices, so you\u0026rsquo;ll need to modify the script for the slices to match with the temperatures. The bar on the display is calculated on the microcontroller, so unless you have 16GB of ram, you\u0026rsquo;ll need to modify that too.\nµtop barely uses any CPU power, and it\u0026rsquo;s a neat and flashy way to display useful system info. By far, the memory bar is what I look the most at. Just to make things a bit neater, I 3D printed a little shroud that covers the electronics and blends in with the rest of my case.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/utop 🕳️\n","date":null,"permalink":"/projects/%C2%B5top/","section":"Software and hardware projects","summary":"A hardware stat monitor","title":"µtop"},{"content":" I made this template to save time when creating embedded rust projects. It comes with everything needed to get started: The libraries, the cargo config and the build instructions. On top of that, the readme includes the commands you\u0026rsquo;ll need to run if you\u0026rsquo;ve never done embedded before.\nTo use the template, you just have to pass it to cargo generate:\ncargo generate gl:slusheea/rp2040-template cargo-generate will walk you through creating a project for your specific development board and your preferred tools.\nThe current supported configurations are\nRP Pico with USB flashing and rp_hal RP Pico with probe flashing and rp_hal RP Pico with probe flashing and embassy XIAO RP2040 with USB flashing and rp2040_hal Depending on what configuration you use, the commands you\u0026rsquo;ll need to run to build and flash your code are different. That\u0026rsquo;s why i would recommend using the included justfile. It includes build, flash, debug and clippy.\nI created the rp2040-hal templates before the rp-rs team created an official one. But now that there\u0026rsquo;s an official one, I still use mine. The official one has support for many other rp2040 dev boards, so it needs some pre-configuring to make it work with the pi pico. So I\u0026rsquo;ve updated mine to use their template with some preconfigured options.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/rp2040-rust-template 🕳️\n","date":null,"permalink":"/projects/rp2040-rust-template/","section":"Software and hardware projects","summary":"A cargo-generate template for all your Raspberry Pi Pico needs","title":"RP2040 Rust template"},{"content":" Jector is a command line tool that creates project file-structures for you. I made it to speed up my workflow: I don\u0026rsquo;t have to copy and rename directories with the help of jector. It can also run scripts in several different contexts, so it can create a venv upon project creation (for example)\nI made jector work with local directories and remote repos, so you can use both private templates as well as pre-made ones from the internet. Since the templates and scripts aren\u0026rsquo;t baked in, they\u0026rsquo;re completely customizable. With the simple syntax on the jector.toml file, you can create the perfect template for your needs.\n[[template]] name = \u0026#34;picorust\u0026#34; git = \u0026#34;https://git.sr.ht/~slushee/rp2040-rust-template\u0026#34; [[template]] name = \u0026#34;python\u0026#34; dir = \u0026#34;/home/user/Documents/Code/Templates/Python\u0026#34; scripts = [\u0026#34;mkvenv\u0026#34;, \u0026#34;git_init\u0026#34;] # Adds a predefined script [[script]] name = \u0026#34;mkvenv\u0026#34; run = \u0026#34;/home/user/Documents/Code/Scripts/venv_creator.sh\u0026#34; [[script]] name = \u0026#34;git_init\u0026#34; run = \u0026#34;/home/user/Documents/Code/Scripts/git_initter.sh\u0026#34; For this example config, I can run jector picorust robot_arm and jector will create a directory called robot_arm with all the contents needed to start programming the rpi pico. As you can see, it does it by cloning the provided git repository. By running jector python oxygen_sensor, jector copies the local template directory, renames it to oxygen_sensor and creates a venv on the directory. As you can see it uses an array of scripts to run, so it also runs the git_initter.sh script.\nJector doesn\u0026rsquo;t have the best code, clippy complains every time that the main function is too long. But I don\u0026rsquo;t think I\u0026rsquo;m going to be refactoring in the near future, I\u0026rsquo;m currently invested on a 5 DoF robot arm powered by the rp pico and rust. If you think jector can be useful for you, give it a try! I use it constantly.\nOh, and just as a fun fact, I came up with the name with this process: project -\u0026gt; projector but this program is the furthest thing from pro, so just jector.\nCheck out the project on sourcehut: https://git.sr.ht/~slushee/Jector 🕳️\n","date":null,"permalink":"/projects/jector/","section":"Software and hardware projects","summary":"Simple template-based project creator","title":"Jector"},{"content":" 🕳️\n","date":null,"permalink":"/","section":"","summary":"","title":""},{"content":"","date":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories"},{"content":"","date":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags"}]