[{"content":"Introduction TL;DR: Skip to the forecast\nI don\u0026rsquo;t recall exactly how I ended up going down this rabbit hole, but I believe it started with trying to find forecast data for surfing. I had thought it would be interesting to draw a heat map showing areas with large swell, but light wind. I ended up abandoning this idea because there are already a ton of good forecasting tools for surfing, but in the process I stumbled across another, less well explored idea.\nOpen-Meteo provides a wealth of interesting forecast data ranging across a broad spectrum of different dimensions. In exploring what was available, I ran across a soil moisture measurement that piqued my interest. In the past, whenever I was trying to determine if a mountain bike trail was worth riding or not, I would have to go and look at the previous week\u0026rsquo;s rainfall totals and then try to guess if it was going to be muddy, or dry, or somewhere in between. What if you could use this soil moisture measurement instead? After all, I don\u0026rsquo;t care when or how much rain we got as long as the dirt is in prime shape for good riding.\nIf you don\u0026rsquo;t know what \u0026ldquo;hero dirt\u0026rdquo; is, you could define it as an annoying term describing the perfect conditions for whatever kind of riding you\u0026rsquo;re doing. If you\u0026rsquo;re trail riding, slightly soft, tacky dirt is great for cornering and braking performance. If you\u0026rsquo;re doing dirt jumps, you want it to be slightly drier and more hard packed for high speed runs. And if you\u0026rsquo;re bombing down steep inclines at a lift park, ideally there should be at least three inches of standing water in every mud hole and wet root tangle on the mountain for maximum enjoyment. But regardless of the specific conditions you\u0026rsquo;re looking for out of a trail, the dominant variable is water content, and I had a way to directly measure that for any point on the map.\nTechnical details (or not) I had planned on doing a little more research into the topic of soil science, but as I dug deeper, I uncovered a dizzying array of jargon and unfamiliar terminology that was daunting to say the least. Permanent wilting points, slope gradient averages, available water storage, fluvaquents and torrifluvents, temperature regimes, and so many more esoteric terms and vocabulary that I didn\u0026rsquo;t even know where to start. I am continuously amazed at the depth of knowledge surrounding even seemingly simple topics like \u0026ldquo;how dirt works\u0026rdquo;. Someone or more likely many someones, somewhere, have dedicated their entire lives to studying dirt in the piedmont region of North Carolina. I\u0026rsquo;m happy to leave them to it.\nInitially I had thought it would be interesting to use a soil survey map like this one from ArcGIS to construct a model for predicting what a good moisture content range would be. But as I tried to unravel the mystery that is soil science, I came to the conclusion that there are far too many variables to consider when trying to work out what the \u0026ldquo;capacity\u0026rdquo; would be for any location.\nFor example, we all know that the moisture in the soil comes from, you guessed it, rain. But do you know the four ways moisture can leave the soil? I didn\u0026rsquo;t when I started this project, but if you\u0026rsquo;ve made it this far, I assume you might want to know the answer. It\u0026rsquo;s runoff, drainage, evaporation, and transpiration. Runoff occurs when rain pools up on the surface and literally runs off the trail. This is the purpose of water bars and other features meant to control the flow of water over the surface of the trail. Drainage on the other hand is the process by which water is absorbed into the soil and through gravity works its way into the water table. Evaporation is, well when water evaporates; there\u0026rsquo;s no big mystery here. And finally transpiration is where water is removed from the soil by the foliage through their root systems and eventually through their leaves.\nOn top of all of these factors, you have to consider the direction of the trail slope (north gets less sun and remains wetter due to lack of evaporation and less transpiration), the overall grade of the trail, the texture type of the soil, the trail itself and how well built it is, etc. So rather than try to correlate all of these factors and build a reliable model, I decided the best path to victory would be to take direct observations of trail conditions and correlate those observations with soil moisture readings on those days. Over time this should give me a pretty good idea of what the ideal values would be for any given trail network. Over the past few days now I\u0026rsquo;ve been collecting information about the conditions on the ground at common trails I ride and making a simple range capturing the ideal moisture content for a given area. The Farm, for example, runs best at or below 0.300 water content by volume, and for a really fast day, you should have as low as 0.22 or less. Of course too dry and you end up with lots of dust and sandy patches, so the sweet spot is right at 0.25 or so, at least based on my most recent observations.\nI was about to put a wrap on my research phase and start writing the code for my website when the thought crossed my mind that I didn\u0026rsquo;t really know how these forecasts are done in the first place. Do soil scientists wake up every day, go outside with a little instrument and drive around the countryside taking readings? I couldn\u0026rsquo;t imagine this was the case. But if not that, how? Permanent base stations that take readings daily? Nope. Satellite imaging is the answer. It doesn\u0026rsquo;t seem possible to me that you could actually get reliable readings from space, but it is and the science behind it is fascinating.\nAnyway, at this point I\u0026rsquo;ve exhausted my interest in soil science and this post is already more in depth than I had ever actually intended it to be, so I\u0026rsquo;m going to end it here. If you want to see the code for the forecast, check it out in your browser\u0026rsquo;s developer tools. I didn\u0026rsquo;t write it all by hand, but the AI I did use to write it was limited to generating the boilerplate, so I\u0026rsquo;m going to take credit for this one. Thanks for reading!\nTrail Conditions 7 Day Forecast Select a Trail: -- Select a Trail -- ","date":"2025-10-09T00:00:00Z","image":"https://blog.gizmonicus.org/posts/farmcast/cover_hu_8e6123304d3844d6.jpg","permalink":"https://blog.gizmonicus.org/posts/farmcast/","title":"Soil Moisture Forecast and Hero Dirt"},{"content":"Despite this cover image being creepy (as fuck), it did make me chuckle. I would attribute it to the AI that generated it, but I\u0026rsquo;m not going to because fuck the AI. They don\u0026rsquo;t give credit where it\u0026rsquo;s due. Two can play at that game. It\u0026rsquo;s fAiR uSe, bitch. My prompt was: I\u0026rsquo;d like an obviously AI generated image exemplifying some of the classic stupid things AI has told people to do, such as put glue on pizza, eating rocks daily, etc.\nIf you\u0026rsquo;ve followed any of my posts or content lately, or you know me personally, you\u0026rsquo;re probably familiar with my rants on artificial intelligence and my simultaneous sense of awe and disgust over what it\u0026rsquo;s doing to our society and the broader impacts of AI for future generations. This past spring, I was invited to give my opinion on AI with the Wake Forest University Information Systems digital team. I\u0026rsquo;d love to take credit for being so well known and interesting that they felt compelled to track me down for this interview, but as it turns out, I work there so it wasn\u0026rsquo;t exactly a stretch for them to call me. I\u0026rsquo;ve known Ryan and Michael for a while now and I do like the direction they\u0026rsquo;re going with this podcast. Still, I was honored that they found my opinion interesting enough to include it in one of their episodes, so I accepted. Here\u0026rsquo;s the end result if you\u0026rsquo;d like to know what my voice sounds like. Give it a listen!\n","date":"2025-08-14T00:00:00Z","image":"https://blog.gizmonicus.org/posts/deacs-ai/cover_hu_b69b78ad9caa28d9.jpg","permalink":"https://blog.gizmonicus.org/posts/deacs-ai/","title":"Deacs.AI Podcast Episode: Glue on Pizza"},{"content":"Click here if you want to skip the intro and get to the good stuff.\nMy Case Against 3D Printing I\u0026rsquo;m becoming more aware of my stubbornness and resistance to new trends as I\u0026rsquo;ve gotten older. I don\u0026rsquo;t think it\u0026rsquo;s necessarily because I\u0026rsquo;m older, but maybe I\u0026rsquo;m wrong about that. Some might call me a Luddite, and there\u0026rsquo;s a grain of truth to that. But I don\u0026rsquo;t think it stems from a fear of new technology, or a resistance to change for the sake of resisting change. I think instead it\u0026rsquo;s born out of my past experience with hype cycles and the sheer number of them that I\u0026rsquo;ve witnessed come and go. How is this really different? Does this really benefit us, or is it just another scheme for extracting value from an already sucked dry industry? Is this really revolutionary or is it just a Reheated Idea™ from years ago that failed for all the same reasons this is doomed to fail?\n3D printing was one of those things that I just wasn\u0026rsquo;t quite sold on when they first started appearing in the consumer market. At the time, I remember hearing the buzz around Repraps and early 3D printers and I ultimately concluded that they were novelties, not useful for much of anything beyond printing poorly made keychains and toys. And if you look at some of the most popular sites for sharing 3D printed object files, like Thingiverse, or Thangs, or the 3D printing Sub-Reddit, you\u0026rsquo;ll see that there are quite a lot of exactly the kind of tripe I wasn\u0026rsquo;t interested in wasting money on. I don\u0026rsquo;t care about Sonic the Hedgehog game controller stands, gear shaped fidget spinners, or flexible print-in-place dragons. I\u0026rsquo;m not saying these aren\u0026rsquo;t perfectly good uses for a 3D printer, it\u0026rsquo;s just not for me. Why buy a whole 3D printing setup just to print off some bad decorative items, especially when you could get better injection molded versions of the same thing off Amazon for arguably less than it would cost to print?\nAnother problem I had with the idea of 3D printing, more of a misconception than an actual problem, was the commonly held belief that 3D prints are easy to break. I\u0026rsquo;d gleaned from Reddit posts and other discussions with people about 3D printing that they were objectively inferior to other manufacturing techniques because the end products are weak, and not useful for anything but prototypes. Why would I want something like this? I\u0026rsquo;m not going to do rapid prototyping in my home. I\u0026rsquo;m not trying to invent something to bring to market, so why bother with a 3D printer?\nOn top of the perceived lack of utility, I\u0026rsquo;ve also become more concerned lately with the environmental impact of our wanton use of plastic in everything from all manner of packaging, to medical devices, to single use coffee pods. Most of it is nearly unavoidable today; our entire modern world is practically wrapped in plastic. So why then would I want to buy a thing that will likely further contribute to this growing pile of plastic waste? Don\u0026rsquo;t we have enough? I\u0026rsquo;m not going to bury the lede entirely here; part of my change in opinion around 3D printing centers on my anecdotal experience that it can (maybe) reduce waste. I wasn\u0026rsquo;t convinced there was a need, especially considering I hadn\u0026rsquo;t quite grasped the actual benefit of having a cheap plastic manufacturing plant in my own home.\nWhat Changed My Mind Despite all of my reservations, I still kind of wanted one, just to see what it was about. Not enough that I would actually buy one for myself, but if my wife was looking for a fun toy to give me for Christmas or my birthday or something, I wouldn\u0026rsquo;t complain. So I added a very reasonably priced one to my Amazon wishlist and forgot about it for a few years. I remember being a bit disappointed she didn\u0026rsquo;t pick it out for me that first year, but I wasn\u0026rsquo;t too worried about it. After all I knew I wouldn\u0026rsquo;t really use it that much once the novelty wore off, right?\nThen, for my 40th birthday, my wife finally decided to grab that one thing off my wishlist that had been there longer than anything else: a Creality Ender 3 v3 SE. My first post on this website after almost 10 years of not writing was about making a table for said 3D printer. This was probably the first sign that I was more than a little excited to see what I could make with it. I don\u0026rsquo;t think I could have predicted how ridiculously useful a tool it actually is, especially with a little know-how and some 3D modelling software. After the obligatory first test prints, and naturally a Benchy as well as a Torture Toaster, I ended up thinking about different ways that I could use it for projects around the house. I started small, but quickly began to realize that I had truly underestimated what was possible with a FDM printer.\nFor one thing, the prints are surprisingly strong\u0026hellip; when you print them correctly. All the complaints I had heard over the years were likely from people who had experienced the striking difference in strength of 3D printed parts depending on the print orientation. 3D prints are weakest along their layer lines; if you print a vertical column, you can very easily snap it in the middle. The adhesion between these layers is much weaker than the continuously extruded filament that make them up. So if you flip the column on its side (maybe adding a flat spot on the bottom so it sticks to the print bed), you can orient the layer lines in a way that makes the end result significantly stronger. This property of 3D printed objects mirrors the same property in wood where strength varies greatly based on grain direction, so it wasn\u0026rsquo;t too hard to grasp, having had a background in woodworking. What this means is this: 3D printed objects are very strong in compression, but weak in tension when the force is applied perpendicular to the layer lines, and much stronger when force is applied parallel to the layer lines. Once you know this, and design your projects around this limitation, you can make incredibly strong parts for all manner of heavy duty applications.\nAnd on the topic of plastic waste, there is certainly something to be said about how much waste can be produced when using a 3D printer. Failed prints were more common in the beginning, which resulted in rather large piles of waste plastic that ended up getting thrown away, and this problem will never fully go away. Sometimes you end up with a spaghetti print despite your best efforts. But once you know how they work and what causes spaghettification in the first place, you can greatly reduce the likelihood. These days I almost never have failed prints. More importantly though, 3D printing gives you the tools you need to repair and reuse things that you may otherwise not have been able to before. How many times have you broken something in your home that required this one weird plastic bit that you can\u0026rsquo;t buy and so you either have to come up with some janky repair or throw the whole thing away and get a new one? A 3D printer can solve this problem. Remember the slogan people used before we decided not to give a shit about the environment anymore? Reduce, Reuse, Recycle? I\u0026rsquo;d add Repair to that list.\nThis intro is already sounding like the beginning of an online recipe so let\u0026rsquo;s move on and look at all the cool shit I\u0026rsquo;ve made with my 3D printer since I got it less than a year ago. I\u0026rsquo;ve printed quite a few things I\u0026rsquo;ve found on the internet, but for the purposes of this article, I\u0026rsquo;m only including things I designed myself. There is value in being able to take advantage of other prints that people have designed already, but the biggest strength of a 3D printer is its ability to make custom, one-off parts. Plus, showcasing other people\u0026rsquo;s designs seems wrong. I\u0026rsquo;m including all the object files (if applicable) and FreeCAD design files so you can use them yourself if you want. So without further ado, enjoy the prints.\nWoodworking Plane Storage I needed a place to store all my planes in the workshop. I had just been putting them down on my workbench, but they take up a ton of space. I had seen some designs for storing planes on an inclined board, but I hadn\u0026rsquo;t gotten around to implementing this design because I really didn\u0026rsquo;t want to put in all the work on the cleats. Making smaller parts like this can actually be more challenging than making the frame itself because it can be difficult to secure them in a vise in a way that allows you to work on them effectively. A 3D printer excels at making small, fiddly bits like this so I did the fun work of making a frame and offloaded the tedious cleat design to my 3D printer.\nDownload the 7z bundle containing FreeCAD design file.\nSharpening Station One of the first things I needed after a place to put my tools was a sharpening station to keep them in working order. I had just finished the table, so this was at the top of my mind. I had these diamond plates mounted to little blocks of wood, but I wasn\u0026rsquo;t super happy with the results so I designed a Lego-like mounting system and some flat blocks to mount them on. One big benefit of 3D printed parts is a fair degree of dimensional accuracy when you\u0026rsquo;ve dialed in the settings. These were nicely flat and square and I didn\u0026rsquo;t have to do much to achieve that.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nBench Hooks While we\u0026rsquo;re on the topic of woodworking, I made these bench hooks with PETG, and they\u0026rsquo;re quite nice. They are a bit slippery compared to wooden ones, but I think you might be able to address this with some spray glue and sandpaper on the hook face. This was also the first print that made me realize that the holes add time to the print, and in some cases can actually make the resulting part heavier. 3D printed parts can be made hollow with different levels of infill, so it\u0026rsquo;s often unnecessary to put holes in the part like you would need to for injection molded parts. In fact, there are a lot of design patterns you will see with traditionally manufactured parts that don\u0026rsquo;t need to be used when working with 3D printing. In this case they\u0026rsquo;re mostly decorative anyway, but I\u0026rsquo;ve been mindful of this fact with my later designs.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nDovetail Guides Continuing the woodworking tools theme, I made these quick dovetail guides for my table. It occurred to me that it would be easy to custom make guides for specific projects to save a ton of time and effort. This one paid off quite well as I had 8 dovetails to cut and I was able to simply line up the guides with the hollow triangle to the center of my board and strike a line without any additional measuring or guesswork.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nMarking pen This one had been bugging me for a while. My calipers had a spot in its case for what I assume was some kind of marking tool. However all I had was a hardened steel pin from an old combination square. It wasn\u0026rsquo;t exactly ergonomic to use and the pin rattled around in the caliper case, which was annoying. This \u0026ldquo;pen\u0026rdquo; was the fix for holding the \u0026ldquo;pin\u0026rdquo; and I really like how it came out.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nMounts, Brackets, and Repairs Drawer Fix My son, bless his heart, isn\u0026rsquo;t the most thoughtful person when it comes to cause and effect. For example, if you step on your drawer while it\u0026rsquo;s open, would it break? Only one way to find out, of course. I could make this part out of wood, however, that wouldn\u0026rsquo;t be a trivial fix and when you have a 3D printer\u0026hellip; why not, right? This was one of the first ones I took a stepwise approach to fixing. I needed to ensure the dovetail measurements were good before printing out the entire thing so I took a cross-section of a dovetail to test with. In the long run, this results in less waste. By printing a tiny piece to test fit first, you end up throwing away only a small number of test prints before the full-scale run. I\u0026rsquo;ve since incorporated this fully into my workflows for other parts. For added strength, I used a much heavier infill for this part too. It\u0026rsquo;s been months and it\u0026rsquo;s holding as strong as ever.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nHair Dryer Wall Mount My wife asked me to make a little mount for her hair dryer because it doesn\u0026rsquo;t fit the one we have already. So, I whipped this one together in about 2 hours. Most of that was doing the partial print test-fitting to make sure everything fit as expected. I\u0026rsquo;ve found that one of the most useful things about 3D printing is the ability to make custom-fit brackets and mounts for just about anything you can think of.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nEverything is Computer Computer Tower Parts I recently upgraded my computer, but I needed some parts to make it work how I wanted. For one thing, the feet were way too close to the ground so the front door to my case would drag on the carpet whenever you would open it. So I slapped some feet together in CAD in about 5 minutes and boom, now it has a solid 2\u0026quot; lift. Then I needed to fix my sagging graphics card. This one was a little harder to nail down, dimension-wise, but after one failed attempt, I managed to fabricate one that fit perfectly and will hold the GPU level. Not pictured (because I downloaded the design) is a tray I used for the SSD drives. These upgrades breathed new life into this old case.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nLaptop Mini-dock Mount This one was a simple fix. I had a little USB-C to HDMI dual-screen dongle hanging off the side of my desk. 5 minutes in CAD resulted in this little bracket. Easy! I think this was one of the first custom designs I came up with, if I remember correctly.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nUPS and Cable Cleanup I wanted to make the mess under my desk at least a little more reasonable. The UPS, for example, was on the floor and sticking out just a little too close to my feet for comfort, so I made these little brackets that fit on my desk rails. This way the UPS isn\u0026rsquo;t on the floor taking up room, and collecting dust from the carpet. The little cable clips weren\u0026rsquo;t as successful as I had hoped in cleaning up the cable routing mess behind my desk, but the do get the job done.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nKick-ass Laptop Mount OK, this one might be my all time favorite design. I came up with this idea as I was trying to use a laptop on my limited desk space while at the same time having room for my desktop keyboard and mouse. It was pretty terrible, honestly. There was no room for anything and the laptop was always in the way. Then it occurred to me that I could make a swiveling laptop mount that would sit just off the side of the desk, freeing up that precious real estate on the edge. Additionally, since it won\u0026rsquo;t be on the desk, I\u0026rsquo;ll have room underneath for smaller items that would otherwise be in the way. I spent a ton of time trying to figure out how this would work, but then I came up with the snap-fit swivel mechanism. It took a few tries, but the end result is very solid but rotates smoothly.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nPinewood Derby Wheel Lathe For this year\u0026rsquo;s Pinewood Derby, my son and I decided to pull out all the stops and use our 3D printer to great effect. I don\u0026rsquo;t want to spoil the surprise so you\u0026rsquo;ll have to scroll down to see how we did. First thing\u0026rsquo;s first, though, we need a lathe for our wheels. The rules state we can\u0026rsquo;t make the wheels thinner and the text must be readable on the inside as well as the outside of the wheels. However, it says nothing about trimming off material on the inside of the wheel as long as the rolling surface is untouched. So we designed this lathe using what I think was a motor from a toy helicopter.\nDownload the 7z bundle containing FreeCAD design file.\nThe Car Now that we\u0026rsquo;ve trimmed our wheels up, we need to put weight in the most advantageous position on our car. Ideally, you concentrate as much mass as possible into a point right in front of the rear axle. This gives you the most potential energy possible when you reach the flat section of the track. The Pinewood Derby is all about converting potential energy into kinetic energy as efficiently as possible. Because the track flattens out at the end of the race, the positioning of the weight in the car really matters. If it\u0026rsquo;s concentrated all in the front of the car, you start with less potential energy at the beginning and the race will be lost. Too far back and you will pop a wheelie on the transition and lose all your speed.\nOur design relied on trimming as much of the original body away as possible, replacing it with a very thin piece of 3D printed plastic that will serve as the carriage for the tungsten weights. This way we end up with lots of weight concentrated right where we want it, but still follow the rules of the event (you must use the wood provided and you must install the axles in the slots provided). Here\u0026rsquo;s what we came up with in the end.\nDownload the 7z bundle containing FreeCAD design file.\n3D Prints for the 3D Printer Filament Rack Naturally, one of the first things you will do with a 3D printer is print shit\u0026hellip; for your 3D printer. You run the risk of this hobby becoming an infinite loop of printing things to make printing better, completely neglecting the fact that you could be printing things that are actually useful for real-world applications. I started down this rabbit hole with a simple rack for my filament collection. This design is a rip-off of other very similar designs I\u0026rsquo;ve seen, but it is my original work so I\u0026rsquo;m including it here.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nSpooler This one is probably my second favorite original design after the laptop mount. My Creality bed slinger likes to shake and wobble, a lot. I overbuilt a big heavy table to help reduce this movement. Another culprit and something that\u0026rsquo;s always bugged me about the design is the fact that the filament spool sits on top of the gantry. The gantry, ideally, will not move at all relative to the bed surface of the printer. Any flex or movement can translate into wobbly lines on prints, and other errors. Having a spool flopping around on top of the gantry can\u0026rsquo;t possibly be a good thing, so why not move it? I\u0026rsquo;ve seen some designs where it\u0026rsquo;s attached to the body of the printer, but I don\u0026rsquo;t have a ton of room in my setup to do that. I also don\u0026rsquo;t want to tap holes in the frame of my printer (not for this anyway), so I decided to use a reverse bowden tube design with a wall-mounted spooler. Here is the result.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nDesiccant Container 3D printing filament acts like a sponge, which is weird to think about since I always just assumed plastic is completely impermeable to water. That\u0026rsquo;s not the case, though. In fact, some filaments like nylon and ABS are extremely hygroscopic and need to be kept in a dry box the entire time or they will bubble and sputter when being printed. This leads to terrible print quality in the end. PLA and PETG, what I use for all my prints, are much less hygroscopic, but still need to be kept dry. I decided to create some of these little dehydrator containers for the job. You can fill them with silica gel or DampRid and put them in the bag with your spools to keep the moisture content as low as possible.\nAlso, who here thinks the word desiccant should not be spelled this way? Since when do we duplicate \u0026lsquo;c\u0026rsquo;, but not \u0026rsquo;s\u0026rsquo;?\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nBike Stuff Camera Frame I\u0026rsquo;m including this one here because I almost exclusively use my action cameras when I\u0026rsquo;m biking. I wanted a way to hold my cameras steady for external shots (i.e. not P.O.V. helmet mounted), so I came up with this design. I really like the way this came out, although I did essentially have to completely redesign the GoPro \u0026ldquo;shoe\u0026rdquo; mounts to work with my print orientation, and by extension these pieces only work with my camera frame. You can use GoPro mounts with it, but they\u0026rsquo;re just a little too loose for my liking.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nSingle Speed Conversion I\u0026rsquo;ve always liked the simplicity of a single-speed bike, especially for things like lift-access and shuttle-access parks. There\u0026rsquo;s less that can go wrong, and you never have to worry about being in the wrong gear because you\u0026rsquo;re always in the wrong gear. But finding a good chain tensioner isn\u0026rsquo;t easy. Of the two I tried, the first one dropped the chain constantly and tried to kill me at least twice. The other one simply didn\u0026rsquo;t fit. To address this lack of good options, I made this little barrel adjuster that would allow me to use my existing derailleur with a short piece of cable housing. You can do this same thing without an adjustment knob, but getting the chain perfectly aligned is so much simpler this way.\nDownload the 7z bundle containing FreeCAD design files and STL objects.\nSo Long for Now I still have about half a dozen other 3D prints I\u0026rsquo;ve remembered as I was putting this article together but it\u0026rsquo;s already way too long for a single post so I\u0026rsquo;m going to stop it here for now. If you were like me, on the fence about the benefits of 3D printing, I can conclusively say that I\u0026rsquo;ve gotten my money\u0026rsquo;s worth and then some out of it already. If I was putting together a tier list for tools, my 3D printer sits at the coveted S-tier rank along side my collection of hand planes and my cordless drill. And that really is what I think changed my mindset the most: viewing a 3D printer as a tool, not just a toy. I hope you enjoyed reading and that you can make use of some of my designs.\n","date":"2025-07-21T00:00:00Z","image":"https://blog.gizmonicus.org/posts/3d-printing-for-fun-and-profit/plane-parts_hu_faaac7d00ef9489b.png","permalink":"https://blog.gizmonicus.org/posts/3d-printing-for-fun-and-profit/","title":"3D Printing for Fun and Profit"},{"content":"The first day Despite having been around now for almost a decade, I didn\u0026rsquo;t know anything about the Farm until about three years ago when Nathan brought it up one day at a trail ride. We had just recently met at MST and he and his friend Vinny whom I\u0026rsquo;d also just met were introducing me to the pirate trail network on the North side of Salem Lake. Nathan is tall, hawk eyed, physically imposing, and has the wingspan of a condor. He talks with a classic North Carolina southern drawl that begs the use of words like \u0026ldquo;tarnation\u0026rdquo; and turns of phrase like \u0026ldquo;bless your heart\u0026rdquo;. He\u0026rsquo;s also a top tier trail rider that will leave you in the dust on the descents and gasping for air on the climbs. Vinny on the other hand has this Pauly Shore vibe going on, more apt to answer \u0026ldquo;far out man\u0026rdquo; than calling on southern idioms to express himself. But behind that disarming, chilled out demeanor, he possesses a razor sharp wit that you could miss if you weren\u0026rsquo;t paying attention. He\u0026rsquo;s not as much of a dominating physical presence as Nate can be, but his skill on the bike is undeniable and has a penchant for grabbing air time.\nDuring one of our stops, Nathan showed me a grainy video on his phone of some jumps and what looked like a skinny made from cedar limbs. I was interested, but jumping wasn\u0026rsquo;t my thing and I couldn\u0026rsquo;t imagine myself really enjoying it, so I wrote it off as a \u0026ldquo;one day\u0026rdquo; thing. \u0026ldquo;You should check it out\u0026rdquo; he said. It wasn\u0026rsquo;t until a few months later that I received an official invite from JD. I had met JD at that same trail ride with Nathan. He\u0026rsquo;s the kind of person you know you could call on if you ever needed help and he would battle hell and high water to be there for you. He and I also share an appreciation for absurdist gallows humor, so we became fast friends. JD had been to the Farm once before and wanted to bring me in, but wasn\u0026rsquo;t sure what the etiquette was for recruiting new talent. I can remember early on that there was a good deal of hand wringing about bringing good beer and making sure not to be a freeloader. To that end we presented a case of beer to the regulars as a token of our obsequiousness, and asked for direction from whoever was giving it. Larry was quick to hand us both some watering cans and instructed us to water \u0026ldquo;lips and landers\u0026rdquo;. We did as we were told.\nIf you aren\u0026rsquo;t fully immersed in the world of dirt jumping (at the time I definitely wasn\u0026rsquo;t), we should take a moment here to explain. Dirt jumps are fickle creatures. Like an overly sensitive houseplant, they must be watered to allow the soil to compact and maintain a solid riding surface that\u0026rsquo;s fast and reliable, but not too much water or the dirt will erode, leaving rough channels and exposing rocks and other debris. You can\u0026rsquo;t ride them when they\u0026rsquo;re too wet, but they can also be dusty and slippery if they\u0026rsquo;re too dry. They\u0026rsquo;re forever imperceptibly crumbling and decomposing. Without a diligent caretaker, they will inevitably return to the earth from whence they came. Thus it is incumbent upon the riders to maintain them with fresh top coats of dirt, water, and periodic shaping and sculpting with shovels to keep an ideal trail surface and a buttery smooth feel. This constant upkeep is labor intensive and especially in cases like the Farm, entirely driven by the people who ride it. There are few rules regarding etiquette at the Farm, but one rule above all else demands obedience: no dig, no ride.\nLarry is the de-facto trail boss at the Farm, at least he has been for the last two years. You can rely on him to have a vision, but also the gumption to whip the greenhorns into shape as he does with the dirt. He\u0026rsquo;ll hand out shovels and rakes and watering cans and order up trail work like the executive chef at a Michelin star restaurant. Except instead of garnishing salmon fillets with capers and dill with a dollop of lemon béarnaise sauce, Larry has the line cooks garnishing tables with farm fresh dirt, a sprinkling of stagnant pond water out of a leaky watering can, and a couple good whacks with the back of a flat shovel for that delicious release angle. Chef\u0026rsquo;s kiss. As one of the old hats at the Farm, he has a sense of personal ownership, passion, and responsibility to the place that has played an pivotal role in keeping the community alive for all these years.\nWe had arrived a little early that day. People were still trickling in from around the state (some from as far away as an hour or more), tuning up bikes, packing dirt, raking, and gearing up for ride-thirty. I didn\u0026rsquo;t really know what to expect at this point. What was the vibe like? Who are these people? Am I in way over my head? I felt like it at the time. When finally it was time to go, the tools went away into the dilapidated shed that doubles as a snake habitat, and people started pushing their bikes up the roll in. As a first timer, I was bewildered at the criss-crossing lines and trail names: Hot Sauce, Tuesday Night, Clouds and Rain, K2, Slope, Main. Mercifully, Caroline was there to show me the ropes, \u0026ldquo;follow me\u0026rdquo; she said. So I did. Caroline quickly became one of my favorite people to be around. Her disarming personality, joyful love of riding, and this almost saintly aura of welcoming energy immediately put me at ease and made me feel at home. She doesn\u0026rsquo;t send it big, but it doesn\u0026rsquo;t seem to matter to her at all. She\u0026rsquo;s there to ride the bike for the sake of enjoying the sport and the camaraderie it cultivates. Riding like this can easily devolve into an ever escalating, never being satsified with where you are endeavor, and Caroline doesn\u0026rsquo;t really seem to buy into any of it. I like that about her.\nAs the day wore into the later hours of the evening and the fire ring started to fill up, helmets hanging on handlebars and beers in hand, people started exchanging stories and passing down legends of Farm past. I sat quietly, not sure yet of where my place was or when I could speak. I listened with rapt attention and tried to decipher the relationships and happenings that led to the point in time we occupied at that moment. I came to find out that Larry and Caroline were married. I also learned about a skinny bear in New Hampshire during a trip to Highland one year, a story that\u0026rsquo;s been told and retold so many times since that I can almost picture it myself despite it having taken place long before I ever met any of these people. The laughs came easy and the conversation never skipped a beat. Before showing up to the Farm, I didn\u0026rsquo;t realize how much I missed sharing a deep connection with a group of like-minded people like this. But I did.\nI don\u0026rsquo;t know why I had envisioned the Farm being this place of judgement, perhaps because of my own biases and self-critical doubt, but I can remember being worried that I wouldn\u0026rsquo;t \u0026ldquo;make the cut\u0026rdquo;. I wouldn\u0026rsquo;t be good enough to hack it and I wouldn\u0026rsquo;t be accepted into the inner circle. But that couldn\u0026rsquo;t be further from the truth. The range of skill level at the Farm is wide and doesn\u0026rsquo;t correlate at all with your place in the group. Sure, when Gledhill threw a 360 off the on-off on Slope, or when Daryl was backflipping the step up, there was this sort of unspoken respect and deference, but it didn\u0026rsquo;t make them somehow special or better than anyone else. They could do things on a bike I couldn\u0026rsquo;t imagine doing at the time, but sitting around the fire that evening, everyone was talking up each other\u0026rsquo;s accomplishments regardless of the magnitude. It didn\u0026rsquo;t matter if it was your first time clearing the smallest table at the Farm or throwing a tuck-no-hander off the step up, the stoke was the same and the best riders were always encouraging and pumping up the newbies that were just starting to spread their wings. I knew almost immediately that I wanted to be a part of it. This felt like a place I could make my home.\nThe first season The Farm occupies a relatively small plot of land, maybe 5 acres in total, on a gentle slope behind a handsome farmhouse. The soil is sandy and mostly inhabited by long leaf pines, with a few gum and other hardwoods peppering the northern corner. A spiderweb of different trails branch out from the roll-in at the western edge of the woods. Bisecting the property is a small unimproved dirt road running from east to west, serving as the main return path to the fire ring and the roll-in. Most of the jumps are dirt, but a good number of wooden features also can be seen rising out of the underbrush, ranging from knee high kickers to overlarge booters I could barely reach on my tip-toes. The crown jewel (to me at least, Larry certainly has a different opinion), the most eye catching thing at the Farm, is the on-off. A large wooden platform situated in the dead middle, towering the height of a building over everything else. The deck is wide with a concave shape to it that just begs you to ride a bike on it. Only the best of the best ever seemed to ride it and people stopped to watch when they did. I was transfixed by this magnificent piece of backyard engineering. I wanted to ride it. I knew I never would.\nThat first season forever changed my riding. For as long as I had been riding bikes, the pinnacle of the sport was early aught\u0026rsquo;s era North Shore skinnies. I was obsessed with Fox\u0026rsquo;s 16mm bike film \u0026ldquo;The Collective\u0026rdquo; and especially the elevated trail networks reminiscent of something you would see on the planet Endor. Everything I was riding at the time was slow, technical, skinny, and rarely involved my tires leaving the ground for anything but a drop. I could do jumps, but I was far from comfortable with them and I didn\u0026rsquo;t really think I would like jumping anyway. Not for me, I would say. That attitude quickly changed when I started to get a taste for real air time. The Farm is a great place for this type of progression. The wide range of features and the encouragement of fellow riders makes it easy to find your footing and take your next step. When I first arrived, I was enjoying Hot Sauce, the common denominator for everyone riding at the Farm. Its most notable features are a peaked out table called Headquarters and a shark-fin immediately afterwards that guides you either further down to lower Hot Sauce or if you\u0026rsquo;re brave enough, the direct line to drop into Main. But beyond this, there were only a handful of other trails I was comfortable with, and I was far from good at making clean landings on any of those lines.\nI don\u0026rsquo;t recall at this point what my first real breakthrough moment was, but if I had to guess it was probably Double Tap. This line is sort of the first stepping stone into some of the bigger jumps. It starts with the Hog\u0026rsquo;s Head drop (there\u0026rsquo;s a fake hog\u0026rsquo;s head hanging directly underneath), which on its own isn\u0026rsquo;t too difficult if you\u0026rsquo;re experienced with drops. But after that, things pick up rather quickly. The first jump is a set up for the main event. It\u0026rsquo;s a small double (i.e. the take-off and landing are separated by a gap instead of filled in with dirt like a table), so it wasn\u0026rsquo;t too difficult to get over this one for me. But the second tap goes considerably harder. It\u0026rsquo;s much, much steeper and the gap is bigger. This poses a problem for most beginner jumpers: getting bucked. This is the phenomenon that becomes especially pronounced on larger, steeper jumps where the bike tends to rotate forward, sending the rider into an inescapable head over heels, rider over handlebars death dive directly into the dirt. Anyone that\u0026rsquo;s been doing this long enough has experienced it at one time or another and I wasn\u0026rsquo;t too keen on having that experience ever again if I could help it. But I was even more keen to experience the euphoric sensation of stomping the bike down onto a lander after being launched unreasonably high into the air, so I persevered.\nI spent an entire Farm session running up to the jump with every intention of just letting go, but always backed out at the last moment. I tried over, and over, and over again to get up the nerve but it didn\u0026rsquo;t happen. I left at the end of the day feeling defeated, but I knew I would be back again the next week and I knew exactly what I was going to do. I was on a mission and nothing could stop me from completing it, even if it took all summer. That next week I warmed up on Hot Sauce and then immediately set my mind to the task at hand. I did a few run ups, and unlike the week before, I felt like I was on the verge of breaking through that mental barrier. So, sitting at the top of the roll in, and with Vinny\u0026rsquo;s enthusiastic prodding, I let my fingers off the brakes and accepted my fate. Consequences be damned I\u0026rsquo;m going over this fucking jump. Drop, rail the turn, hit the double, brace\u0026hellip;\nIt\u0026rsquo;s almost impossible to capture with words the feeling you get from suppressing your fears with sheer force of will. There\u0026rsquo;s a saying amongst the biking community: \u0026ldquo;commit, or eat shit\u0026rdquo;, and these are wise words. As you approach the jump and you cross over the point of no return, you suddenly feel this simultaneous sense of relief and excited anticipation. You know that whatever happens, you\u0026rsquo;re going over the edge and there\u0026rsquo;s no way to turn back now even if you wanted to. Grabbing the brakes would end in a guaranteed wreck and your only recourse is to just make it to the other side. This sensation takes on an almost physical form as it is so intense. Compression, extension, wheels leave the ground and yes, you know you have the right trajectory. The landing that was obscured by the face of the jump before is coming into view and you can tell in a split second that it\u0026rsquo;s right. You can relax now. You\u0026rsquo;re flying. This is what makes it all worth it, that less than a second mid air when you\u0026rsquo;re no longer tethered to the earth, when gravity has been vanquished and you have been crowned the victor.\nProgression Cleaning Double Tap for the first time was the moment when I realized this was what I wanted to do. Before that I enjoyed riding the Farm and slowly assimilating into the community but I wasn\u0026rsquo;t really thinking too much about what was next. Hot Sauce laps were starting to get repetitive and now that Double Tap was in the rotation, I had a reason to go off the Hog\u0026rsquo;s Head drop. This meant that every time I rode that direction, I was staring down the barrel of two of the biggest lines at the Farm: K2 and Slope. Slope was still something I considered to be far beyond my ability, but K2 was looking more and more like something I could do. K2 I assume was named after Kris with a K because he\u0026rsquo;s the one, as I understand it, who conceived of the whole thing. Which, now that I\u0026rsquo;ve met Kris and ridden with him a few places, that makes sense. Kris couldn\u0026rsquo;t be accused of riding slowly. It consists of 3 main jumps, followed by a few options to finish the run, either go straight over the long and low at mach-Jesus and pull hard into one of the step ups, or cut the berm to the right and cross the walk-up, also at mach-Jesus, and drop into lower Main. But let\u0026rsquo;s not put the cart before the horse here because jump #3 is the real deal, and there was only one way to get past it.\nK2 is a rather large jump, it\u0026rsquo;s over head height standing at the base, but it\u0026rsquo;s most endearing quality is the mellow release angle. In real terms this means it is far more forgiving than the steeper faced features at the Farm. Getting bucked is much less of a concern and one could almost make it to the other side by going fast enough and holding on tight. Although I wouldn\u0026rsquo;t recommend that as your approach. I started instead with the run in. It may not be obvious to an outsider, but the act of successfully completing a jump starts well before your tires ever actually touch the surface of the jump itself. What I mean is, you want your bike and your body positioning to be as settled as possible. Being too far forward or back, or just generally not being ready to respond to the acceleration as you change from a forward to an upward trajectory, can easily spell disaster. The third jump on K2 being significantly bigger than the first two meant that you really needed those first ones to go well before you make the decision to commit. So that\u0026rsquo;s what I did. I spent several weeks, probably far too long in hindsight, running through the first two jumps to make sure I was absolutely solid before taking the plunge.\nMy memory of this time is pretty hazy and I\u0026rsquo;m writing this piece extemporaneously so for the sake of good story telling I want to use this moment to introduce another of our cast of characters, Eric. Eric is tall, lanky and embeardened, and devilishly handsome. He\u0026rsquo;s also wickedly funny and cannot seem to resist the temptation to make light of just about any situation. But as quick as he is to make a joke, he cares deeply for all of us. I remember one time getting a text from Eric, days after a Farm session where he wanted to apologize for some offhand remark he had made that he thought might have upset me. I wasn\u0026rsquo;t upset, I didn\u0026rsquo;t even remember the event in question. Yet the mere fact that he was so torn up about it that he thought to reach out just to be sure I was OK, exemplifies the type of thoughtful and caring person he is. And that kindheartedness and care bleeds over into his riding as well. So as I was sitting at the top of the roll in, contemplating my hundredth unsuccessful run up to K2, Eric was quick to offer to tow me in. I was hesitant, after all I wasn\u0026rsquo;t sure if today would be the day, but he seemed determined to work right along side me to get me over the line. And he did exactly that. It took probably a half dozen more tries to break through, but Eric was all in on getting it done.\nI couldn\u0026rsquo;t tell you the date or the time, or even what year it was exactly when I first sent K2, but I\u0026rsquo;ll forever have that memory frozen in my mind of the moment I set my tires on the take off. It was truly terrifying. I was going so fast. Every piece of advice given to me by anyone who had ridden K2 before told me the same thing. Pedal until you think you have enough speed, and then throw in two more. I was expecting to get crushed by the overwhelming force of my rapid change in momentum, but instead felt this springboard-like lightness that propelled me higher and faster into the air than I had ever been before. And like my first time over Double Tap, I knew almost the moment I was airborne that the mission was going to be a success. It felt like an eternity, hanging at tree top height looking down on Eric as he stomped the landing in a cloud of dust. It\u0026rsquo;s almost impossible to have an experience like this and not let out some kind of primitive, guttural yell. And I did, of course. Eric didn\u0026rsquo;t miss an opportunity to share in that excitement and matched my energy in kind.\nThe road to 100% From this point forward, I kept trying to grow my list of trails every week. Sometimes progress was slow, other times I would make big leaps in progression and knock out an entire line in one go. I was also starting to become more and more tied into the Farm family. In the beginning I was showing up whenever I could make time, but by the end of my second season of Farm riding, I was making sure my schedule was clear for Wednesday. That\u0026rsquo;s because the other key ingredient in the longevity of the Farm is its scarcity. You can\u0026rsquo;t just come by and ride whenever you want. The Farm is open for business during daylight savings time on Wednesdays only. Why Wednesday is the day, I don\u0026rsquo;t know and it doesn\u0026rsquo;t really matter because that\u0026rsquo;s just what it is. I\u0026rsquo;ve heard tell that it used to be on Tuesdays, but that sounds like bullshit to me. It\u0026rsquo;s like a law of nature at this point: Water is wet, gravity makes things heavy, and Farm day is Wednesday. You might think this causes problems for people and reduces the number of folks who will show up, and I\u0026rsquo;m sure that\u0026rsquo;s true for some, but more importantly what it does is create a shared time and place for everyone who really wants to be involved. If you could show up any time you wanted, you wouldn\u0026rsquo;t have the same tight knit bond between people who went out of their way to make sure Wednesday evenings are clear. Instead you might end up with the Saturday crowd, or the Tuesday crowd, and some of them might not ever meet because of scheduling conflicts. Wednesdays give the Farm purpose and make attendance deliberate.\nGetting more familiar with the people and showing up on rainy days to dig meant that I started brushing up against the old guard riders that were sending Slope, Pickle Rick, and Main. I suppose that there\u0026rsquo;s always going to be some element of natural skepticism people have for newcomers to a place like this. Will they show up? Will they put in the work? Are they going to drive past the farmhouse blaring loud music and piss off Mr. Ward? You do not want to be that person, by the way. So it doesn\u0026rsquo;t surprise me that some of the top tier shredders like Caleb and Cajun kept their distance a bit in the beginning. Caleb was one of those people who would show up, seemingly out of nowhere, and would go hard on just about every feature out there. Caleb from what I understand also moonlights as a pretty phenomenal dirt bike rider, which comes across pretty clearly whenever you follow him on trail. Cajun also has some dirt-bike experience, but more than that he used to race downhill, which safe to say is the gnarliest of biking disciplines outside of pure freeriding. The stories shared around the campfire about Cajun\u0026rsquo;s exploits in the past are an integral part of the Farm\u0026rsquo;s mythmaking. So when I was sitting on the roll-in contemplating another run on K2, I was surprised when Cajun looked in my direction and offered one word: Slope? Caleb seemed to agree that was the direction we were about to go, as if I had any chance of following them into that line. I laughed it off like they were kidding but it became clear they were not. Caleb just casually said \u0026ldquo;you\u0026rsquo;ve got that, no problem\u0026rdquo; and as unbelievable as it might sound, it almost instantaneously erased all my doubt. I believed him. The line I had most coveted from that very first day at the Farm that I had thought was surely too much for my abilities was, with a single sentence, made a real possibility.\nSo began the mission to complete Slope. I didn\u0026rsquo;t get it that first day and I don\u0026rsquo;t think either of those two expected me to, but they believed I could and that was good enough for me. I set my sights on that very first jump, the daunting #1 after the canon. Riding into it you get the feeling that it\u0026rsquo;s not so much a jump, but a sheer wall. I know the release angle is nowhere near vertical, but it may as well have been. In my mind there was no way to make it to the other side, yet Cajun and Caleb would do it every Wednesday. Cajun warms up on Slope as the rest of us are still trying to remember how to pedal bikes on Hot Sauce, so I know it\u0026rsquo;s possible. But convincing myself it wasn\u0026rsquo;t going to end in disaster was another thing entirely.\nThis essay is getting a little long at this point so you\u0026rsquo;ll have to wait for the next part of the series to find out if I survived my attempts at Slope or if someone is writing this posthumously on my behalf.\n","date":"2025-06-28T00:00:00Z","image":"https://blog.gizmonicus.org/posts/the-farm-part-1/luao_hu_c911e8bef11394b4.jpg","permalink":"https://blog.gizmonicus.org/posts/the-farm-part-1/","title":"The Farm - Part 1: In the Beginning"},{"content":"Background I stayed at a hotel a while back and if you read my post about the Flipper Zero, you\u0026rsquo;ll recall that I managed to clone my hotel key. Big deal right? I couldn\u0026rsquo;t do anything useful with it. Any attempt to change the expiration date or what I could do with it immediately rendered the key useless. I had read about a vulnerability called Unsaflok that was pretty disturbing but to date they haven\u0026rsquo;t released the details so I marked that one down as \u0026ldquo;scary, but safe from your average Flipper Zero user\u0026rdquo;.\nHowever, a post on Reddit re-ignited my interest in the topic. On the surface, it seemed like a typical skid post from a user claiming they cloned their hotel key card and saying how terrible it was that you could clone cards like this. My initial reaction was incredulity. So what? I\u0026rsquo;ve cloned my hotel key and it didn\u0026rsquo;t help me with anything but getting in and out of my own room. But as I dug deeper into the post it became clear they did actually know what they were talking about. I was pretty oblivious about key cards and how they worked so I took some time to do a little research and the pieces started falling into place.\nMifare Classic 1k So I\u0026rsquo;m no expert as I hope you would understand by now. But I have managed to scratch the surface of the different types of digital key cards available and part of the problem with my hotel card in particular is that it uses an outdated format to secure the data it contains. The way I understand it, the Mifare Classic 1k card is a container for some number of bytes of data. It isn\u0026rsquo;t part of the access control system at all, other than it stores the data used by the access control system. If you were to design your own system, you could use QR codes, or mag stripe, whatever. The key card could be anything, it\u0026rsquo;s what you put on it that matters the most. That said, you still shouldn\u0026rsquo;t give up the data without proper access controls.\nWhat\u0026rsquo;s supposed to happen is the Mifare Classic 1k card won\u0026rsquo;t \u0026ldquo;release\u0026rdquo; the data stored unless presented with an appropriate key. The door reader has some key stored on it that is transmitted to the card, then the chip on the card verifies the key, and if it matches, the card returns the data. This should protect the card from being cloned, but as it turns out, many access control systems use the same keys. There are plenty of good resources out there that discuss the vulnerabilities that allow you to bypass this security feature so we\u0026rsquo;ll just gloss over it by saying the Flipper supports cloning these cards out of the box using a built in dictionary of keys as well as the ability to fetch keys from the card reader itself to make the process of recovering data even easier. Cool. But now what? I have the piece of code the card reader expects to see when I use the card to open a door. And that\u0026rsquo;s about it, right? I\u0026rsquo;ve not escalated my level of access and my card will stop working when I check out so this seems pretty useless on the surface.\nSaflok Enter Saflok. Saflok is an access control system used by literally millions of hotel doors around the world. You\u0026rsquo;ve almost certainly used one if you\u0026rsquo;ve stayed in a hotel before. Before NFC, they used those magstripe cards, but the operation of the locks and security features are the same. As I hinted earlier, there is a known vulnerability with Saflok, but the details aren\u0026rsquo;t public. But this got me thinking. What could you do with the Saflok data I have in my hands? What are all these numbers and what do they mean? And how is it exactly that the Flipper can read the data, but can\u0026rsquo;t change it?\nEarly attempts and naive approaches Maybe you can just, edit in place? The first thing I started doing was fiddle with the .nfc file the Flipper generates when it clones the key card. The Mifare Classic 1k card stores, you guessed it: 1kb of data. Good job, you\u0026rsquo;re really learning! It\u0026rsquo;s broken into 64 blocks with 16 bytes on each block. 4 blocks make up a sector and from the looks of it, only the first three blocks have actual interesting data in them; the fourth block is the key. So I started by searching for known pieces of data in the file. I knew, for example, that my key card had an ID of 0xf7. So I looked for any blocks containing that number. It wasn\u0026rsquo;t there. So I searched for a few other pieces of data like the property number, or the date, but none of it seemed to match up with what the flipper was showing on the info screen. So there was something more to it.\nFor fun I did change some of the bytes at random to see what would happen. I had a few interesting moments where the year changed from 2025 to 1997 and a few other odd changes here and there, but nothing predictable. And each time I did change anything, the checksum had a 50/50 shot of failing. This obviously wasn\u0026rsquo;t going to work. This was the point where I had previously decided not to bother with trying to modify the card because clearly something else was going on and I wasn\u0026rsquo;t sure what to do next.\nNarrowing in on saflok.c But then it occurred to me. The Flipper can read the card and display the information. On top of that, the Flipper source code was available online, which meant that I should be able to see exactly how the Flipper reads the data, which might then lead me to a way to write new data. So I fired up my laptop and started perusing the Momentum firmware GitHub repo. It actually didn\u0026rsquo;t take any time at all to find the file called saflok.c. Neat, I wonder what\u0026rsquo;s in that? I said to myself out loud. I had a peek and sure enough, the decryption function was right there. Aha! So the data is protected by another layer of encryption. Unfortunately, I couldn\u0026rsquo;t decipher the decrypt function myself and the encrypt function was not implemented so I had no way of making new keys; I could only view existing keys. Give up, right? Well, no. I had been changing one byte at a time to see what would happen using a very painfully slow process of edit/open/check/repeat. Each test took a minute or so and there is just no way to get anything reasonable done at that speed. But, what if I could program my computer to do that a hundred thousand times a second?\nChosen ciphertext attack Naturally, that\u0026rsquo;s exactly what I did. Thankfully. Mercifully, C and Python share the same logical operators and syntax for bit shifting operations so translating between the two was surprisingly very easy to do. It took almost no time at all to code up an equivalent function to decode existing card data and display it to the screen. And the checksum validation function would also allow me to check to see if any modifications were considered valid. Then it was a simple matter of jamming as much crap into the input as possible and see if anything useful fell out the other side. My first test was just changing between 1 and 4 random bytes of an original cloned card. I wanted to see if I could get a valid future date for my card without breaking the property number (i.e. what hotel it goes to) and the checksum. I didn\u0026rsquo;t expect it to work, but hey, it was worth a shot, right?\nSure enough, no more than a second or two after firing off my search, I ran across a valid guest key with an expiration date 4 years in the future. I believe I literally shouted with excitement when more valid keys just kept popping up over and over again. These couldn\u0026rsquo;t possibly work, could they? I tried adding more parameters and changed the type of keys to see if anything else would come up. This was when my excitement started to wane a little bit. As more parameters were added, the length of the search process increased dramatically. Worse, some parameters seemed to be nearly impossible to set without breaking others. This suggested some underlying relationship between these fields, either by way of the encryption algorithm, or shared data segments. My suspicion was that the cipher just happened to create a situation where some fields were closely linked, where other fields were completely independent of each other. I may be a crypto-zoologist in my spare time, but I\u0026rsquo;m not a cryptographer, so I\u0026rsquo;m just going to have to guess at this one.\nTesting 1, 2, 3 After generating a couple of promising card files (my program generated files that I could upload to my Flipper for use later, either by writing a new, blank card or by using the Flipper directly), I decided there was really only one way to find out if any of this would work. I went back to the hotel where I stayed a few weeks prior. With my Flipper in hand and trying desperately to look like I actually belonged there, I walked up to the side door with the key I assumed was most likely to work loaded up. I hit the emulate button and\u0026hellip; well, you can guess since I\u0026rsquo;m writing this article, it worked! I walked right in through the door with a very, VERY expired access card that should not have worked. I was so surprised by this immediate, and resounding success that I didn\u0026rsquo;t know exactly what to do with myself. I wandered up to the continental breakfast area hoping they had some leftover coffee I could avail myself of, but my attempt at petty theft was foiled by the fact that most sane people don\u0026rsquo;t drink coffee after 2 in the afternoon.\nSo, I walked right back out the way I came in. Having had no real expectation of the door actually opening using this ridiculous key cloning technique, my plan of action was pretty basic. Step 1: try the door. Step 2: ???? I didn\u0026rsquo;t end up with a cup of free coffee after all, but I did walk away with the knowledge that I was onto something. That it should be possible to create cards with whatever data I wanted, assuming I could reverse engineer the encryption algorithm. That was a big if, as you\u0026rsquo;ll recall my lack of expertise in the cryptography field. I wasn\u0026rsquo;t even sure it was mathematically possible to reverse such an encryption function. I spent a whole lot of time pondering this question before I decided to just take a swag at it.\nCracking down AI still isn\u0026rsquo;t that smart, y\u0026rsquo;all Of course, the easiest way to get this to work is just not do it at all. Get the AI to figure it out for me, right? I am happy to report that despite my best efforts, and multiple rounds of prompting with ChatGPT and Gemini, I could not get any serviceable code from the AI. As you\u0026rsquo;re probably well aware, my outlook on our AI future isn\u0026rsquo;t exactly rosy. But at least for now, I know I\u0026rsquo;m still smarter than either of these two bumbling idiots because I couldn\u0026rsquo;t even get code that would run cleanly without throwing errors, much less actually reverse the encryption algorithm. One of the more endearing things about the AI apocalypse is how confidently wrong AI is. \u0026ldquo;Oh, of course you are correct to point out that I didn\u0026rsquo;t initialize that variable before using it. Here\u0026rsquo;s the corrected version of that code that addresses this issue and will return the encrypted data.\u0026rdquo; It didn\u0026rsquo;t, and it doesn\u0026rsquo;t. We\u0026rsquo;re safe for now.\nActual Intelligence for the win So, fuck the AI. It can do the busy work crap I don\u0026rsquo;t want to bother with anymore like handling command line arguments, file reading and writing, and remembering what libraries I need to import. Meanwhile I was staring at the screen, talking to myself for the better part of an hour without so much as writing a single line of code. Maybe this isn\u0026rsquo;t possible? It\u0026rsquo;s true that not all encryption algorithms can be reversed. There is a whole branch of study called asymmetric key cryptography that uses pairs of keys: one for writing, one for reading. If you don\u0026rsquo;t have both, you\u0026rsquo;re shit out of luck. But I had a few hints that suggested this encryption scheme isn\u0026rsquo;t nearly as robust as anything like that. In fact, it was only 14 lines of code and an array of bytes that looked like some kind of glorified \u0026ldquo;Little Orphan Annie Decoder Ring\u0026rdquo; jawn. After a quick inspection of this array, it was clear it contained all 256 possible bytes from 0x00 to 0xff with no duplicates and in a randomized order. The actual name for this type of lookup table would probably be more like a Ceasar cipher. But that wasn\u0026rsquo;t the whole story, otherwise this would have been completely trivial to reverse. Here\u0026rsquo;s the function, in its entirety. c_aDecode is the substitution table.\nvoid DecryptCard( uint8_t strCard[BASIC_ACCESS_BYTE_NUM], int length, uint8_t decryptedCard[BASIC_ACCESS_BYTE_NUM]) { int i, num, num2, num3, num4, b = 0, b2 = 0; for(i = 0; i \u0026lt; length; i++) { num = c_aDecode[strCard[i]] - (i + 1); if(num \u0026lt; 0) num += 256; decryptedCard[i] = num; } if(length == 17) { b = decryptedCard[10]; b2 = b \u0026amp; 1; } for(num2 = length; num2 \u0026gt; 0; num2--) { b = decryptedCard[num2 - 1]; for(num3 = 8; num3 \u0026gt; 0; num3--) { num4 = num2 + num3; if(num4 \u0026gt; length) num4 -= length; int b3 = decryptedCard[num4 - 1]; int b4 = (b3 \u0026amp; 0x80) \u0026gt;\u0026gt; 7; b3 = ((b3 \u0026lt;\u0026lt; 1) \u0026amp; 0xFF) | b2; b2 = (b \u0026amp; 0x80) \u0026gt;\u0026gt; 7; b = ((b \u0026lt;\u0026lt; 1) \u0026amp; 0xFF) | b4; decryptedCard[num4 - 1] = b3; } decryptedCard[num2 - 1] = b; } } The first step was to make this whole thing easier to read. I don\u0026rsquo;t know how exactly this works, but I suppose human names are just that much more natural to use so I ditched numX variables in favor of simple human names. Now when reasoning about the core of the function, I\u0026rsquo;m not stuck trying to remember what bits were shifted from num3 to num2 and so on. This strategy worked surprisingly well. I also spread out the lines a bit to make it easier to see what was what. The end result was something like this (I didn\u0026rsquo;t save the actual code so you\u0026rsquo;ll have to forgive me for this crude re-enactment):\nfor(zeta = length; zeta \u0026gt; 0; zeta--) { bob = decryptedCard[zeta - 1]; for(xi = 8; xi \u0026gt; 0; xi--) { yip = zeta + xi; if(yip \u0026gt; length) yip -= length; int charlie = decryptedCard[yip - 1]; int alice = (charlie \u0026amp; 0x80) \u0026gt;\u0026gt; 7; charlie = ((charlie \u0026lt;\u0026lt; 1) \u0026amp; 0xFF) | david; david = (bob \u0026amp; 0x80) \u0026gt;\u0026gt; 7; bob = ((bob \u0026lt;\u0026lt; 1) \u0026amp; 0xFF) | alice; decryptedCard[yip - 1] = charlie; } decryptedCard[zeta - 1] = b; } Now that I had a way to create a narrative to describe the operations, it became much easier to implement the reverse. I won\u0026rsquo;t say it was easy, and there was some amount of guess and check going on, but in the end, I coded up this solution in python. I should add here that I was overjoyed when this code actually worked. My wife surely remembers me in a manic state, describing in detail all of the ins and outs of this hack at midnight, celebrating my graduation from skid to something one step above a skid. She probably just wanted to go to bed. I\u0026rsquo;m glad she listened anyway.\ndef encrypt_card(dcard_data): ec = [] length = 17 alice = 0 # ??? not sure how this would be set, it doesn\u0026#39;t seem to matter... for zeta in range(1, 18): bob = dcard_data[zeta - 1] for xi in range(1, 9): yip = zeta + xi if(yip \u0026gt; length): yip -= length charlie = dcard_data[yip - 1] # Retrieve charlie\u0026#39;s lsigdig aka david david = bob \u0026amp; 1 # Put bob back together bob = (bob \u0026gt;\u0026gt; 1) | (alice \u0026lt;\u0026lt; 7) # Get alice back alice = charlie \u0026amp; 1 # Put charlie back together charlie = (charlie \u0026gt;\u0026gt; 1) | (david \u0026lt;\u0026lt; 7) dcard_data[yip - 1] = charlie dcard_data[zeta - 1] = bob # This works. No need to do anything here for i in range(0, length): num = dcard_data[i] + (i + 1) if num \u0026gt;= 256: num -= 256 ec.append(DECODE_ARRAY.index(num)) return ec Forging ahead The moment of truth had arrived. I had a working encryption function, a working parser, and a some glue code to pull .nfc file data in from my Flipper to easily wrangle it on my desktop. Time to create some forged cards. My solution (which you can find here) has a few bells and whistles added to make cranking out forged cards much easier. Thanks to the ubiquitous argparse library, these are all neatly presented to you on the console. Sometimes I wonder what I would do without the people who maintain these libraries.\nusage: saflok.py [-h] [--key-level KEY_LEVEL] [--led-warning {0,1}] [--key-id KEY_ID] [--opening-key {0,1}] [--key-record KEY_RECORD] [--property-id PROPERTY_ID] [--override-deadbolt {0,1}] [--restricted-weekday RESTRICTED_WEEKDAY] [--interval-year INTERVAL_YEAR] [--interval-month INTERVAL_MONTH] [--interval-day INTERVAL_DAY] [--interval-hour INTERVAL_HOUR] [--interval-minute INTERVAL_MINUTE] [--creation-year CREATION_YEAR] [--creation-month CREATION_MONTH] [--creation-day CREATION_DAY] [--creation-hour CREATION_HOUR] [--creation-minute CREATION_MINUTE] [--sequence SEQUENCE] [--output OUTPUT] input_file Craft arbitrary Saflok cards using an existing NFC capture file from Flipper. Author: Gizmonicus positional arguments: input_file Path to the input NFC file. Defaults will be set using this file as the template. options: -h, --help show this help message and exit --key-level KEY_LEVEL Key level number (int) --led-warning {0,1} Enable LED warning (0|1) --key-id KEY_ID Key ID (1-byte hex) --opening-key {0,1} Opening key (0|1) --key-record KEY_RECORD Key record (1-byte hex) --property-id PROPERTY_ID Property ID (int) --override-deadbolt {0,1} Override deadbolt (0|1) --restricted-weekday RESTRICTED_WEEKDAY Restricted weekday (7 digit binary) --interval-year INTERVAL_YEAR Interval year (int) --interval-month INTERVAL_MONTH Interval month (int) --interval-day INTERVAL_DAY Interval day (int) --interval-hour INTERVAL_HOUR Interval hour (int) --interval-minute INTERVAL_MINUTE Interval minute (int) --creation-year CREATION_YEAR Creation year (int) --creation-month CREATION_MONTH Creation month (int) --creation-day CREATION_DAY Creation day (int) --creation-hour CREATION_HOUR Creation hour (int) --creation-minute CREATION_MINUTE Creation minute (int) --sequence SEQUENCE Sequence combination number (12-bit hex) --output OUTPUT Path to the output NFC file. If not specified, card data will be printed to stdout. So let\u0026rsquo;s say you have a room card and all you wanted to do was change the expiration date and give yourself the ability to override the deadbolt (yep, that\u0026rsquo;s electronic). Easy peasy. Clone the card with your Flipper, dump the .nfc file to your desktop and just set your desired expiration dates. I was lazy and didn\u0026rsquo;t code for any of the rollovers or leap years. You\u0026rsquo;re on you own with that. When I first wrote this script, it ran disappointingly quickly so I added an artificial 2 second delay just to make it feel like it was doing something, hence the \u0026ldquo;preheating the oven\u0026rdquo; message.\nFun fact: This actually is a common practice used in real user experience designs. My favorite anecdote is that of the Huston Airport baggage claim. A study concluded that people didn\u0026rsquo;t like the perception of waiting around, and that customer satisfaction could be improved by simply making the walk to the baggage claim area longer so the bags were ready by the time they arrived, even if the actual wait time was identical. Likewise I\u0026rsquo;ve noticed that if you\u0026rsquo;re stuck in traffic on the highway, you can reduce the perception of the amount of time you have to wait by taking surface streets, despite the fact that this frequently only adds to the travel time.\n./saflok.py BW_uni.nfc --interval-year 1 --override-deadbolt 1 Preheating the oven... \\ Saflok key fully baked. ###### Key Level: 1 # Key Desc: Guest Key # LED Warn: 0 # Key ID: 0xf7 ###### Opening Key: 1 Key Record: 0x0011 ## # Seq/Combo: 0xe34 # # # Property ID: 1142 # # # Override Deadbolt: 1 # ## Weekdays (mtwtfss): 0000000 Valid for: 01/00/01T13:00 # ### Created: 2025/02/01T20:13 # # # Checksum: 0xd4 # # Checksum Pass: True ###### Encoded Bytes: 0a c0 6f 56 11 69 20 db 8b 04 e9 32 bd 8a a4 7b 8a Back to the task at hand. Having this newly minted forgery is great and all, but what if you want to get into any room in the hotel? Is that possible? Can you grant yourself full access, including staff areas? Short answer: Yes, you definitely can. There are many different key levels, including floor keys, master keys, emergency keys, and so on. Some of those are all powerful; they can open any door in the hotel and override any privacy features enabled on the lock. But\u0026hellip; there\u0026rsquo;s a longer, less satisfying answer to follow.\nSequence and combination We need to talk about the sequence number. It\u0026rsquo;s the biggest gotcha with this whole process. When you get a key card for your hotel room, the system that generates them keeps track of a number that corresponds roughly to how many times the room has been rented out. In simple terms it works like this:\nYou rent the room. Your key card has a sequence number of 123. You open the lock with your key card. The lock checks to see if your sequence number is the next one it\u0026rsquo;s expecting to see. If it is, it increments its counter to 123 and lets you in the door, assuming your key is still valid. Saflok systems allow for some number of \u0026ldquo;skips\u0026rdquo;, meaning the sequence number can be a few numbers ahead and it will still work. The maximum, if I recall, is 15 skips. This is important because otherwise you could just pick a really high sequence number to bypass this restriction. Instead, you have to get very lucky and land in this 15 number window. When you check out and another guest is issued a key for the same room, they\u0026rsquo;ll get a new sequence number, most likely just incremented by one. In this case it would be 124. When the next guest uses their key card, their sequence number gets stored in the lock and your card will no longer work. Even if you have a valid expiration date. The moment a new card is used, yours becomes invalid. So you can see where this might be a problem. There are a large number of valid sequence numbers so guessing the right one would be all but impossible. Not only that, you can\u0026rsquo;t just try all of them because the lock isn\u0026rsquo;t that stupid and will go into lock down mode after 10 failed attempts. So you\u0026rsquo;re stuck. You need to resequence the lock somehow. There exists a way to do this. I know because the people who figured this out did a whole Defcon talk about it and disclosed that information to the vendor responsibly (as you would hope, given the magnitude of this vulnerability).\nThis, unfortunately, is where my story ends. At least for now. If you pay close enough attention to the encrypt/decrypt/parse functions in the source code, you\u0026rsquo;ll notice a few irregularities. It took printing out the binary code and a highlighter for me to finally narrow it down.\nYou can see that most of the bits are accounted for, but you\u0026rsquo;ll also see in my scribbling that there are several whole bytes that aren\u0026rsquo;t accounted for: The last 3 bits of the first byte, what I assume is the key record (is it really almost 2 whole bytes?), and the 5th plus half of the 6th byte. I don\u0026rsquo;t really know what they do. I suspect that these bytes are important for actually pulling off the full exploit. My guess is that you need to set one card up as a programming key card (key levels 15 or 16) so you can overwrite the sequence number of a door. Then have a second key set up as an emergency or similarly high level key with a new sequence number that matches. But to test this theory out would require a controlled environment that is just too expensive to justify. At a minimum I would need a lock from a hotel, a programming tool (both of these are in the hundreds of dollars on eBay, trust me I\u0026rsquo;ve looked), and possibly even the .dll files from the Saflok computer system itself. So while I would love to post a picture from inside some random guest room in a hotel I don\u0026rsquo;t actually have a key for, 1) I don\u0026rsquo;t want to go to jail, and 2) I don\u0026rsquo;t want that badly enough to spend hundreds of dollars on the off chance I can get lucky and figure it out myself.\nThe end? I think so. I don\u0026rsquo;t anticipate putting much more effort into this because I\u0026rsquo;ve already gotten something tremendously valuable out of the experience. Despite the fact that I was following in the footsteps of others who came before me, I still felt that sense of discovery that I\u0026rsquo;ve been chasing my whole life. Finding an interesting problem to solve, being inspired to create and discover new-to-me solutions, and being rewarded with that brief euphoric moment when the light flashes green and the lock gives way with a satisfying ker-chunk brings me joy I struggle to express with written word. Perhaps in the future I\u0026rsquo;ll find myself in the right place at the right time and I\u0026rsquo;ll have another chance at digging deeper into the Saflok mystery, but for now I think I\u0026rsquo;ll simply allow myself to be content with a small victory.\n","date":"2025-05-15T00:00:00Z","image":"https://blog.gizmonicus.org/posts/flipping-hotels/cover_hu_b367c08125df1fc1.jpg","permalink":"https://blog.gizmonicus.org/posts/flipping-hotels/","title":"Flipping Hotels"},{"content":"Growing up, when I found my first friend group that I felt like I really identified with, it was the skateboarders. I don\u0026rsquo;t remember exactly how I got involved with the crowd I was a part of, but it probably started with Alan. Alan lived right up the road from me in a nice neighborhood with the ideal driveway for all manner of \u0026ldquo;extreme sports\u0026rdquo; as they used to be called. These days it\u0026rsquo;s hard to find a sport you can call extreme; nearly every niche has a fully saturated media presence on Insta or YouTube. Alan\u0026rsquo;s driveway had a very wide, flat concrete pad at the top, with a nice slope towards a mostly empty street. The next door neighbors had an asphalt driveway if I remember correctly, that created this sort of shallow bowl that was perfect for launching off kickers into or practicing manuals.\nThis proximity along with the fact that his parents seemed to be very encouraging of his pursuit of skating, made Alan\u0026rsquo;s driveway the premier skate hangout spot for all the neighborhood kids. If you were into BMX or skateboarding, that was the place to be. Don\u0026rsquo;t bring those inline skates around though, that was absolutely unconscionable. Inline skates, often conflated with the brand name Rollerblade, had gone through a sort of moment in the late 80\u0026rsquo;s to early 90\u0026rsquo;s. Everyone wanted them. They hit a peak sometime around the same era as the Seattle Grunge movement and, as with seemingly all cool things, corporate America tried to capitalize on the craze and ended up completely ruining the cool factor. The once hot new thing had suddenly become synonymous with sanitized, corporate bullshit. They immediately became uncool to a degree that they\u0026rsquo;re only just now beginning to recover from. If you were a kid around this time, you might remember that \u0026ldquo;gay\u0026rdquo; was peak insult and we referred to inline skates as \u0026ldquo;fruit boots\u0026rdquo;. If you were LGBTQ growing up around this time, I\u0026rsquo;m sorry you had to deal with that shit, especially if you heard it from me; I\u0026rsquo;m glad that at least some of us have grown as people.\nSkateboarding just happened to be there at the right place and the right time to fill the void for young rebellious kids of the era. And when we talk about skateboarding, you should probably know that there are several flavors. The one I\u0026rsquo;m going to be discussing in this piece is street. Of course you had park, which was very rare on the east coast, or vert which was even harder to find. I\u0026rsquo;m sure longboarders were a thing, but they weren\u0026rsquo;t popular on the east coast either, especially inland from the surf breaks. You still had some leftover freestylers hanging around on their 80\u0026rsquo;s style boards but that era had long since given way to what you now probably think of when someone says skateboard: a board with a symmetric upturned nose/tail, usually with some scary graphics on the bottom to keep the Karens of the world on edge, small wheels, and stiff trucks.\nStreet skateboarding, if it isn\u0026rsquo;t obvious already, involves skating on obstacles you find \u0026ldquo;on the streets\u0026rdquo;. Handrails, ledges, benches, stair sets, anything that presented a challenge or unique opportunity to try something new. If you read my cyberdeck post, you might remember the quick aside where I talked about what it means to be a hacker. I think skaters and hackers are cut from the same cloth in some ways. There is an undercurrent of counter cultural, stick-it-to-the-man attitude that permeates both skate culture and hacker culture. Skaters and hackers both tend to enjoy going places they aren\u0026rsquo;t supposed to be, often just because they can. While hackers like to find new and creative ways to work with electronics, skate culture is also based heavily on creativity and a similar kind of out of the box thinking. I think this is part of the reason I was drawn to it in the first place.\nThings you would probably take for granted as a simple set of stairs, or a curb, or a planter, or a handrail, embody a myriad of different creative ways to express yourself as a skater. One of my favorite modern skaters, Andy Anderson, has such an imaginative style that even things skaters have written off as useless or uninteresting, become a piece of his performative art. His technical prowess is outmatched only by the surprising ways he uses his environment. In the linked video, he goes so far as to put yoga mats and tape on a rail to slow him down enough to skate something that, had you asked me, I would have said was completely unskatable. That\u0026rsquo;s the dictionary definition of a hack. And that video is chock full of these testaments to creative, non-linear thinking. As the credits roll, he uses the stump of a fallen tree and the broken pieces of sidewalk surrounding it to pull off a ridiculous front side tailslide. This is B-roll footage, and it\u0026rsquo;s genius. Andy isn\u0026rsquo;t the GOAT, that title probably will always belong to Rodney, but his contribution to the sport is significant.\nI\u0026rsquo;ve always loved this aspect of the sport. This out of the box, non-linear thinking appealed to me. Skate spots are puzzles to solve. How do you skate this rail that\u0026rsquo;s so close to the wall? How do you get the speed over this rough patch of concrete? What can you do with this little piece of broken concrete? But also, for a nerdy kid trying to find his place in the world, there was this other aspect of skate culture I didn\u0026rsquo;t have, but wanted to emulate: the tough as nails, don\u0026rsquo;t give a fuck, do what you want bravado portrayed by some of the big names of the sport at the time. It wasn\u0026rsquo;t just an act, either. These people, the professionals, my heroes growing up, were some of the toughest people I could imagine, willing to sacrifice their bodies, break bones and rupture organs, just to go a little bit bigger than ever before. Ryan Sheckler recently released a documentary, Rolling Away where Geoff Rowley, one of the OGs of the skating scene of the early aughts, had this to say:\nWhy would a professional skater want to continuously smash themselves to pieces to skate a bigger rail, or a bigger gap, bigger everything? Someone\u0026rsquo;s got to do it. Someone\u0026rsquo;s got to fuckin\u0026rsquo; do it. And the general mainstream sports out there are boring as fuck. \u0026ndash; Geoff Rowley\nThis quote stood out to me for a few reasons. For one, his take on mainstream sports speaks to me. I suppose I can understand why people obsess over teams and rivalries, but I just cannot put myself into that mindset. Nothing about any of the mainstream sports has any appeal. Being a CIS man, people regularly assume this is a safe area of small talk, but my brain immediately enters shutdown mode the moment sportsball comes up in conversation. But more than our shared sense of boredom over traditional sports, I also feel deep in my soul, his mentality that it just has to be done. I imagine George Mallory, stony eyed, staring off into the distance saying \u0026ldquo;because it\u0026rsquo;s there\u0026rdquo;. That\u0026rsquo;s as good a reason as any, I suppose. And I wanted that. I also wanted to feel invincible. That even if I was smashed to pieces, I was tough enough to get back up and do it again because it\u0026rsquo;s there, and it needs to be done. That someone was going to be me.\nAs a kid breaking into his teens, some of this desire I\u0026rsquo;m sure came from wanting to cut ties with the kid I was and become someone else. I wanted to embody what I thought at the time were quintessential masculine traits: toughness, independence, bravery, maybe a little rebellion. Skating, and skate culture were also edgy, possibly criminal if you got caught skating in the wrong spot. You didn\u0026rsquo;t conform to the social norms, because that\u0026rsquo;s not who you really want to be anyway, or maybe you just envy those people and don\u0026rsquo;t want to admit it. For me it was probably a little of both. It made you part of the in-crowd that was in only because they were out, and in this way it was even more exclusive. Fuck the man. Fuck school. And fuck your popped collar and boat shoes. We\u0026rsquo;re better than that. We skate. You couldn\u0026rsquo;t just be born into this clique, you had to prove yourself through dedication and fearlessness.\nAs I\u0026rsquo;ve gotten older, I\u0026rsquo;ve kept a small part of who I was back then. Gone are the days when I said I would never work a 9 to 5 in an office; the realities of actually wanting to have money and financial independence pretty quickly ruined that pipe dream for me. My worldview has gotten a lot more nuanced too. I still recoil at the idea of unassailable cultural norms and I loathe the times I\u0026rsquo;ve had to spend at stuffy, elitist events like the dreaded country club brunch. But I\u0026rsquo;ve also come to recognize that those things don\u0026rsquo;t define people in their entirety and that only the worst of the worst deservedly qualify for my lingering teenage angst. I\u0026rsquo;ve softened on my ideals for masculinity as I\u0026rsquo;ve become a father and especially as I\u0026rsquo;ve witnessed injustice in the world first hand. Yes, I still think of strength and grit as being foundational to what it is to be a man, but that can take many forms. It takes courage to express empathy and compassion. It takes real bravery to buck societal norms and stand up for who you are as a person regardless of how you know people will react. And while these forms of courage far exceed that which makes you want to get back up and skate it again, skating did imbue me with a sense that I can conquer my fears and that I could overcome almost anything through sheer will alone.\nYou might notice, if you know me personally, I\u0026rsquo;m not in any of these pictures. Partly this is because I was the one taking them. I had a Nikon FM10 SLR that I absolutely loved and was sure one day I would make a career out of being a photographer. All the photos in this post were shot on 35mm using this camera, hence the title. I\u0026rsquo;ve since realized that wasn\u0026rsquo;t my calling in life. But the other reason I\u0026rsquo;m not in any of these pictures is because I\u0026rsquo;ve been lying to you this whole time (well, not lying so much as omitting a very important detail). I don\u0026rsquo;t skate. Not like these guys did anyway. They were grinding handrails, kickflipping stair sets, and generally making me envious of their skating ability. That\u0026rsquo;s not to say I can\u0026rsquo;t skate. I can ollie, I learned to kickflip but I haven\u0026rsquo;t landed one in years. I had a longboard for quite some time that I would use to bomb hills at ludicrous speeds, but I don\u0026rsquo;t do that anymore. I mostly kept the wheels on the ground when it came to street skating. I had already chosen my direction in life with my BMX bike and there was no time for me to learn anything else. But I still gravitated towards this group of people because they embodied the type of \u0026ldquo;I don\u0026rsquo;t give a single fuck\u0026rdquo; person I wanted to be. They had broken free from the shackles of parental control. We were listening to Rage Against the Machine and Korn and unless your album had that Parental Advisory warning on it, we weren\u0026rsquo;t buying it.\nI love bikes and I\u0026rsquo;ve ridden them my whole life. In fact, I\u0026rsquo;d even say I\u0026rsquo;m better today than I\u0026rsquo;ve ever been on a bike skills wise and that\u0026rsquo;s a fact I\u0026rsquo;m quite proud of. I started my career on a flatland BMX bike, and although it wasn\u0026rsquo;t nearly as daring as Jaws on the Lyons 25, I was no stranger to stair sets and hard slams. When we would go out to skate, I would take pictures and document, but I wasn\u0026rsquo;t just sitting on the sidelines. My old stomping grounds have as many tire marks as chipped concrete and wax stains. These days I\u0026rsquo;m riding on bigger wheels with knobs and lots of cushy suspension, but deep down, I\u0026rsquo;ll always have this admiration for street skaters. I still own a board, two actually: a cruiser that I can still ollie and I\u0026rsquo;ve been trying for that kickflip again, and a surfskate I use to putz around the neighborhood on when I have a few minutes to spare. It still brings me the same joy I felt when I first learned to stand on a board decades ago. I\u0026rsquo;ve not spoken with anyone in these pictures for years now. The latest I heard Alan was having his first kid. I reached out to him a few years ago as I was going through my old photographs and he told me he and some of the old crew would get together and skate at the local park in K-vegas. We commiserated over old joints and the toll our respective sports have taken on our bodies as we try to stay sharp. I said we should get together again, maybe at the skate park for old time\u0026rsquo;s sake. But, it never happened.\n","date":"2025-04-27T00:00:00Z","image":"https://blog.gizmonicus.org/posts/reflecting-on-skating-in-35mm/cover_hu_fc6d92b24d5e8e83.jpg","permalink":"https://blog.gizmonicus.org/posts/reflecting-on-skating-in-35mm/","title":"Reflecting on skating in 35mm"},{"content":"Thanks for the feedback First of all, I appreciate all the feedback I\u0026rsquo;ve received on the AI essay. I know it was a long one, and the fact that anyone read the damn thing at all is flattering. Thank you, really. I\u0026rsquo;m going to try to make this short, well, shorter than the first one because I realize in all my rambling, I didn\u0026rsquo;t clearly make as succinct a point as I had hoped. So here\u0026rsquo;s the TL;DR version along with a few other points.\nTL;DR Let\u0026rsquo;s get straight to the point I was trying to make with my post.\nFor all the good that AI promises to deliver, for all of the miracles it is poised to perform, AI inevitably stands to serve its true masters at the very top above all else.\nI was rambling a bit, as I tend to do when I\u0026rsquo;m jamming out to music and committing thoughts to the page, so I think it\u0026rsquo;s worth circling back and putting a nice little bow on that idea. You see, I\u0026rsquo;m not necessarily against the use of AI. I have gripes. I don\u0026rsquo;t like this idea of filtering everything through AI tools, distilling the qualities I value the most in our interpersonal communications. But AI itself is more or less a good tool if used correctly.\nBut you know we never will.\nAnd don\u0026rsquo;t listen to me, I\u0026rsquo;m just some random person on the internet who happens to take an interest in writing and technology. You can read a far more eloquent and well researched paper by Erik Brynjolfsson. Who is that, you might be asking? He is the, and I\u0026rsquo;m quoting his bio here: \u0026ldquo;Senior Fellow at the Institute for Human-Centered AI and Director of the Digital Economy Lab at Stanford University\u0026rdquo;. But what does he know? Anyway, Erik writes:\nAs machines become better substitutes for human labor, workers lose economic and political bargaining power and become increasingly dependent on those who control the technology.\nI spent a few hundred words getting to this core idea. In his essay, he calls it the \u0026ldquo;Turing Trap\u0026rdquo;. My article refers to it as \u0026ldquo;The Torment Nexus\u0026rdquo; which I like a lot better, but let\u0026rsquo;s not judge. I would really encourage you to read the entire thing, it\u0026rsquo;s well worth the effort. Or if you\u0026rsquo;re into irony, get an LLM to read it for you.\nLessons never learned I think of AI as the computer science equivalent of nuclear fission. It is going to catapult us, whether we want it to or not, into a new world where the mere fact of its existence is a threat. Fission was discovered in 1938 and within 6 short years we built a fucking bomb with it and killed hundreds of thousands of Japanese civilians with the most terrifying weapon humanity has ever seen. We sparked an arms race and a cascade of proxy wars that has lasted, arguably, to this very day. We now possess the firepower to destroy all of human civilization and our mutually assured destruction is the only reason we haven\u0026rsquo;t used them in wartime since the bombings of Hiroshima and Nagasaki.\nWhat makes you think we\u0026rsquo;re going to be any more responsible when AGI arrives?\nThe answer, I think, is that we won\u0026rsquo;t. It\u0026rsquo;s just that simple. I do think that we are at an inflection point where, if we act now and we take steps to regulate this industry that we know is going to have a tremendous impact on the world we live in, we might stand a chance. But we also have arguably the worst political environment imaginable to enact the type of regulations we need right now. President Musk and angry Facebook Uncle, Trump, have absolutely no appetite for regulation. Worse, they stand only to gain from capitalizing on unregulated AI. World\u0026rsquo;s shittiest dad, and micro-penis enjoyer Elmo Skunk, has a vested interest in his own crappy AI: Grok. Which, by the way fuck you, Emo, for stealing that word. I liked that word.\nI\u0026rsquo;m exhausted This experience, having LLMs and GenAI foisted on me by tech companies has been truly exhausting. Fighting off the AI proponents with their rosy visions of a tech bro future where everyone rides in a self driving Tesla while enjoying the fabulous wealth they\u0026rsquo;ve accumulated through wise investments in Doge coin is just miserable. Every day I find myself wondering what the hell my kids are going to inherit when they try to enter the workforce. What future are we creating for them? I\u0026rsquo;m reminded of a Greek proverb that has always stood out as a kind of litmus test for whether or not we\u0026rsquo;re on the right track, as a civilization:\nA society grows great when old men plant trees whose shade they know they shall never sit in.\nWe aren\u0026rsquo;t planting trees here. We\u0026rsquo;re actively tearing them up and turning them into fuck, I dunno, sawdust for the sake of making sawdust. As long as the profits are good right!? And for what? Just ask yourself: is anything better now that we have these AIs? Has your life really materially improved as a result? I\u0026rsquo;d say it really hasn\u0026rsquo;t, and even if we do start reaping the benefits of these strong AIs, who is really going to see those benefits? I don\u0026rsquo;t think it\u0026rsquo;s going to be you and me.\nI\u0026rsquo;ll leave you with this absolute gem from ChatGPT:\n","date":"2025-03-16T00:00:00Z","image":"https://blog.gizmonicus.org/posts/ai-addendum-and-tldr/stupid-robot_hu_e90b7b54a92ceddb.jpg","permalink":"https://blog.gizmonicus.org/posts/ai-addendum-and-tldr/","title":"AI is amazing and I hate it -- TL;DR and addendum"},{"content":"Hey Google, I need a trite, crappy AI generated image for an article about AI that illustrates the worst of AI generated artwork.\nAI is amazing As one of the early users of ChatGPT, my first impression was that of literal shock and amazement. I\u0026rsquo;m not that old (40 as of this writing\u0026hellip; fuck), but I did grow up in the early days of AI where the best you could hope for was a somewhat challenging opponent in Half Life or getting your ass handed to you in chess. For the longest time, chat bots were laughably bad and the Turing test was an insurmountable challenge for AI; the moment you went off script, primitive AIs would lose their mind or refuse to answer with some canned \u0026ldquo;I can\u0026rsquo;t answer that\u0026rdquo; response. I vaguely remember the Gary Kasparov thing with Deep Blue and saw some neat one-off AI behaviors in games, but for the most part the \u0026ldquo;intelligence\u0026rdquo; felt very niche, specific, and inflexible.\nThings began to change for me in 2016 when AlphaGo defeated Lee Sedol in a game of Go. I\u0026rsquo;m sure the signs were there before if you were paying close enough attention, but that was really my first \u0026ldquo;oh, this is different\u0026rdquo; moment with AI. Go was long considered too complex for a computer to fully grasp. The best AIs could barely beat amateur players (I\u0026rsquo;ve beaten GNU Go many times and I\u0026rsquo;m far from a good player). Professional play was thought to be decades away. But then, in the blink of an eye, AlphaGo came along and trounced the best player in the world. Then, maybe a handful of months later, equally strong AIs began to pop up around the web. Leela, KataGo, ELF OpenGo, Fine Art, began to take the human Go world by storm. Everything changed. Anyone could get a review of their games from an incredibly strong player. It was amazing. It was cool, AI is awesome!\nI want to take a moment to put a finer point on this AI beating professional Go players. If you aren\u0026rsquo;t familiar with the game, it\u0026rsquo;s thought to be the oldest continually played board game in the world, and is well known for its deep, nuanced, and complex emergent strategies. It originated in ancient (not just hyperbole, I mean the actual definition of ancient) China, with some of the first written evidence of its existing cropping up around the time of Confucius. And for literal millennia, professional players have dedicated their entire lives to the game and the strategy behind it. Just take a moment to think about this. Really let that idea marinate. There are some sources that claim Go is as old as written history itself and in 2016 a computer not only beat the best player on earth, it won conclusively. Since then, the AI has managed to become even stronger without any input from human professional games at all. It\u0026rsquo;s rediscovered common strategies and patterns that humans have been playing for centuries, but it\u0026rsquo;s also uncovered new and unconventional moves that feel incredibly alien to a human professional. We\u0026rsquo;ve seen new technologies change the world, but this\u0026hellip; this feels different to me.\nAnd then it happened. ChatGPT launched and suddenly AI wasn\u0026rsquo;t just passing the Turing test, it was doing better than most humans at tasks I would have previously said were impossible for a computer. \u0026ldquo;Creative\u0026rdquo; writing, coding, answering emails, filling out performance appraisals (don\u0026rsquo;t lie, you know you did too)\u0026hellip; It was remarkable. Amazing. Truly, in the most literal sense: awesome. I had so much fun probing the depths of it\u0026rsquo;s seemingly unlimited \u0026ldquo;knowledge\u0026rdquo; with crazy prompts and novel, never before thought of ideas to see if I could coax it into acting like its predecessors: \u0026ldquo;I\u0026rsquo;m sorry, I just don\u0026rsquo;t know that\u0026rdquo;. There were cracks, places where the seams were showing, but often these imperfections and little hints at what was going on behind the curtain were imposed by the developers to prevent the AI from going full Tay from 2016.\nI had fun writing little fun bedtime stories from my kids with a few simple ideas. Or trolling my vegan friends with stories about vegans trying to convince a tribe of cannibals to adopt their plant based diet (this one was actually really funny: they ended up convincing them only because the cannibals thought they were so delicious they decided there must be something to this whole vegan thing after all). I had it summarizing emails, and replying quickly with perfectly written diplomatic replies in place of my usual \u0026ldquo;per my last email\u0026rdquo; snark. The possibilities were endless.\nI want to be very clear because I\u0026rsquo;m about to paint a very dark and disturbing picture of AI and its impact on our collective future. Generative AI is one of the most incredible, innovative, and truly remarkable creations humankind has ever witnessed. AI as we know it is going to profoundly change the world. The computer scientists, and engineers, and mathematicians who have contributed to this work have created something I never thought I would see in my lifetime, and they deserve recognition for that fact.\nBut\u0026hellip;\nMaybe we should pump the brakes AI has taken the world by storm and, at least within the orbit of information technology and related fields, it has become completely inescapable. Go to any tech conference in 2025 and see if you can make it out alive without the cursed two letter acronym being thrown at you from every conceivable angle. Every vendor is using AI and that\u0026rsquo;s all they want to talk about, no matter how inconsequential their use case is. \u0026ldquo;Our toothbrushes are AI powered now. It can detect if you\u0026rsquo;ve been brushing your teeth and will text you if you forgot this morning (and probably send data to your dental insurance provider so they can deny your claim, with their AI claim denial bot of course).\u0026rdquo; No shit, I just made that up as a silly example and it turns out Oral-B has actually made this ridiculous thing and slapped an outrageous price tag on it. It\u0026rsquo;s a toothbrush. How smart does a stick with bristles on it really need to be?\nI\u0026rsquo;ve seen some hype cycles in my life, Docker was one I happened to buy into pretty early on, micro-services, cloud\u0026hellip; but nothing like this. Not even close. Go outside of IT and ask about any one of those other things and most people will give you that look your dog makes when they heard you drop something but they\u0026rsquo;re not quite sure if it was edible or if you\u0026rsquo;re going to let them snap it up off the floor. This one though, it\u0026rsquo;s different. Everyone, and I mean everyone is talking about it. Artificial intelligence is dominating investing, news cycles, break room chit chat, politics\u0026hellip; The inescapable nature of AI has begun to weigh me down emotionally.\nIt has come to the point now where, in the words of computer scientist Jürgen Geuter: AI is one of the most aggressive examples of \u0026ldquo;technologies that are not done for us but to us.\u0026quot;1. This quote really resonates with me because AI might just be the biggest case of intellectual theft in human history and few of the champions of AI want to even acknowledge this; I even made the argument early on, before the shine began to wear off, that the people who created the AI are innovators that deserve credit for what is produced. But the more I understand about how AI is being trained, and the more time I\u0026rsquo;ve had to think about it, the more I feel like this is an incredible injustice towards creators. Artists, writers, computer programmers, even anonymous forum participants have had their work gobbled up by some of the world\u0026rsquo;s largest and most profitable tech companies, crunched for countless compute cycles while consuming vast quantities of power and water and then what? Sold back to us for $20 a month? And there\u0026rsquo;s pressure, real or imagined, from so many people that if you aren\u0026rsquo;t using AI, you and your entire industry are going to go extinct. We need to take a moment, collectively, to really evaluate what it is we want this technology to do for us, and probably more importantly, what we don\u0026rsquo;t want from AI. Pump the brakes.\nWhat\u0026rsquo;s your use case? As someone who works in this field, I\u0026rsquo;ve been asked numerous times about AI, and getting access to AI, and using AI for all manner of\u0026hellip; whatever, but most of these requests are very vague and light on the actual details. What, exactly, do you think this LLM will do for you? The answer is rarely clear or concise. Which I think offers a peek into this mentality of \u0026ldquo;we have to do AI somehow whatever the cost\u0026rdquo;. Many people, I would argue probably most people don\u0026rsquo;t really understand what AI is, what it can do, what it can\u0026rsquo;t do, and most importantly of all: they probably don\u0026rsquo;t need it. That\u0026rsquo;s not to say they wouldn\u0026rsquo;t benefit from it, but it\u0026rsquo;s not strictly necessary. By far, the most common use cases I\u0026rsquo;ve seen touted across the board are chat bots that can answer questions about documents or summarize emails and other forms of communication. And to a certain extent, this is quite useful. So let me get back out my rose colored glasses for a moment and look at the positives here.\nOne use case I\u0026rsquo;ve personally benefited from is being able to make sense of content that is outside of my normal domains of expertise. For example, a prospectus for a fund I\u0026rsquo;ve invested in for my retirement account. These documents are incredibly dense, dry, and incomprehensible to your average person who has to save for retirement (that\u0026rsquo;s you, make sure you\u0026rsquo;re doing this). Furthermore, I really, REALLY, don\u0026rsquo;t have the desire to read it, and I\u0026rsquo;m not even all that keen on understanding much of the technical details. I want a broad strokes executive summary, and I want to be able to ask follow up questions quickly, easily, and with reasonable accuracy on the responses. AI excels at this type of work. Google\u0026rsquo;s NotebookLM can even create a podcast for you to listen to. Although, the hosts are way too excited, often make call backs to things they never actually said, and enjoy using the phrase \u0026ldquo;deep dive\u0026rdquo; too much. It\u0026rsquo;s like listening to a real podcast except the hosts micro-dosed just a little too much that morning and are quick to lose the plot. But\u0026hellip; it\u0026rsquo;s actually good. I can understand something that otherwise I wouldn\u0026rsquo;t have bothered to look at in the first place.\nAnother use case that has been very useful to me is understanding complex research papers. I try, as much as possible, to go directly to the source material when researching a topic. Shortcutting the media hype and going straight to the published study is the ideal way to understand what\u0026rsquo;s happening in the world of science and technology. Except it\u0026rsquo;s not. Because the pace of discovery, and the esoteric nature of so many new studies and experiments is making it harder and harder to understand a single thing outside of the summary page. Even then, good luck. So you\u0026rsquo;re faced with a choice: read the dumbed down media release that distills the entire article into a bite sized chunk you can consume now that TikTok has destroyed your already microscopic attention span, or, forge ahead into page after page of Wikipedia rabbit holes until you\u0026rsquo;ve exhausted your browser\u0026rsquo;s memory, as well as your own. But there is that third option of getting the AI to break the article down into more understandable pieces. You can interrogate it for more context when you don\u0026rsquo;t understand something. You can ask for simpler explanations, or ask for deeper discussions. Put simply, it allows for a non technical person to have a realistic chance of understanding original research without it being heavily filtered or the meaning significantly altered.\nOr perhaps you need a computer program to do something for you. In the past I spent probably 1/3 of my time trying to remember syntax and function names and really trivial, not that important quirks of whatever language I\u0026rsquo;m using when what I should be working on is the actual problem I set out to solve in the first place. AI can step in and fill out those boilerplate, trivial parts of your code so you can focus more on what really needs to be done. And it\u0026rsquo;s really nice not to have to remember the exact syntax for opening a file in python in read/write mode and writing a series of lines to it in reverse order. Even good programmers can\u0026rsquo;t remember all the little ins and outs of a language and will benefit tremendously from not having to fight with the language itself and instead just work on the difficult parts where you need Actual Intelligence (not to be confused with AI). This has probably been one of the most useful things I\u0026rsquo;ve used AI for in my daily life.\nThere are lots of other use cases out there we could discuss, but this is just a snippet of what I\u0026rsquo;ve experienced personally and wanted to highlight as what feels like an unambiguously good use of the tool. But AI proponents are trying to find new and exciting ways to invent the Torment Nexus using AI with every \u0026ldquo;innovation\u0026rdquo; they keep pushing on us so let\u0026rsquo;s dive into some of those less than desirable cases where AI is making things worse. A lot worse.\nStop finishing my sentences One of the most egregious uses for AI lately, in my oh so humble opinion, is in our interpersonal communications. I\u0026rsquo;ve seen numerous demos and advertisements for these \u0026ldquo;make my shitty email look good\u0026rdquo; AI features, and none of them are landing with me. YouTuber Drew Gooden had an excellent, and hilarious take (actually several takes) on these braindead AI features, one of the worst offenders being Apple\u0026rsquo;s newest Genius ad series. You really should watch the video because his take is spot on, and I think it highlights some of the glaring issues with using AI in our interpersonal communication and relationships. It\u0026rsquo;s lazy, and fake, and uninspired and if you send me an email that sounds like AI wrote it, I\u0026rsquo;m going to be more pissed off about it than if you had just said \u0026ldquo;hey, please take care of that thing I asked about last week, asshole.\u0026rdquo;\nLet\u0026rsquo;s highlight the problem with a simple example. Let\u0026rsquo;s suppose I need to send a work email. I have a bullet list of about 10 things I need to get across, so I crack open my Gmail client, pop in those 10 half complete thoughts into my email, let Gemini formalize it and ship it off to the intended recipient. Then my recipient receives this long winded email they don\u0026rsquo;t want to bother reading, so instead they have their AI read it and summarize the key points. But ask yourself: what role did the AI serve in this interaction? Did it actually add any value to my email? I think not. On the contrary, it probably lost some of my original meaning, and almost as importantly, it lost my voice. When I write, I choose words, for better or for worse, because they suit my style of communication. And in written form, it\u0026rsquo;s difficult to convey meaning, so I\u0026rsquo;ll often be very deliberate about which words I choose. And lets not forget, for enterprise customers, these licenses for using such features are paid add ons. You don\u0026rsquo;t get this for free. So instead of just being direct, and sending an email summarizing what I want, to a person who doesn\u0026rsquo;t have time to read the bloated AI slop anyway, we both paid $20 per person per month for the privilege of having AI pretend we care.\nLet\u0026rsquo;s drop the facade, shall we? Why don\u0026rsquo;t we stop pretending we\u0026rsquo;re Civil War soldiers writing home to our beloved Beulah, who is with child of course, and just get to the fucking point. Unless you\u0026rsquo;re reading a blog by some nobody on the internet for the entertainment value of it all, we have things to do, and reading your unnecessarily bloated dissertation of an email ain\u0026rsquo;t one of them. You realize I\u0026rsquo;ll spend all of 15 seconds probably skimming it to see if I even need to reply. So why are we all wasting our time? It\u0026rsquo;s 2025. Email is an asynchronous communications protocol for getting work done efficiently across disparate groups of people who may or may not be in the same physical location. That\u0026rsquo;s it. You can drop the \u0026ldquo;dear sirs and or madams\u0026rdquo;, you can cut the introductions, you don\u0026rsquo;t need to ask if it\u0026rsquo;s OK to ask a question. Just fire away. Be blunt. Be polite, but be direct. Ask what you want to ask.\nI think this AI craze has brought into focus this phenomenon where we cultivate our digital lives and over analyze our communications because we can. It\u0026rsquo;s written. It\u0026rsquo;s asynchronous. And you can sit down and tweak, and fiddle with phrasing, and bust out the thesaurus and find a different word so you don\u0026rsquo;t use two of the same word in the same sentence because that really makes you sound like an idiot doesn\u0026rsquo;t it? Yet when we meet people in person, and talk to them face to face without any AI filter, we can communicate subtle meaning through body language, facial expressions, and other nuanced interaction that not only make the conversation less fraught with the potential for misunderstanding, it just feels normal and relaxed and personal. Because it\u0026rsquo;s human. It\u0026rsquo;s flawed, and imperfect and that\u0026rsquo;s OK. We not only can deal with those flaws and imperfections, they actually make the conversation better. We get more meaning across in fewer words, without all the added baggage of trying to sound professional.\nI don\u0026rsquo;t want AI stepping into my conversations, or polishing up my emails, or whatever else it\u0026rsquo;s offering to do. I hate it when people try to finish my sentences, so why the hell would I want AI to rephrase everything I just wrote? In fact, lately I\u0026rsquo;ve found myself being more intentional about not constantly workshopping my emails. I write what I need to write. I keep it short to be respectful of everyone\u0026rsquo;s time who I\u0026rsquo;m expecting to read it, and I send it. No filters, no AI polishing or formalizing bullshit. Just me saying what I needed to say in the most straightforward, imperfect, and human way possible. Because it\u0026rsquo;s OK to be exactly that. A fallible human.\nBefore I move on from this topic, I do want to acknowledge that this feature does have its potential upsides and I don\u0026rsquo;t want to fully ignore these. For example, not all people are prolific writers. I tend to be very verbose and I enjoy these exercises where I can dump the contents of my brain into a pile of words on a page, neatly organized in sentences and paragraphs. But that\u0026rsquo;s definitely not everyone\u0026rsquo;s experience or core competency. Some people really do struggle with organizing thoughts and in those cases I think AI really could help them clarify ideas in ways they\u0026rsquo;ve not been able to, giving a voice to someone who may have been marginalized in the past because they simply couldn\u0026rsquo;t clearly communicate. I would consider this a Good Thing (TM).\nThe biggest case of intellectual theft in human history To me, that last piece, being a fallible human, is what we\u0026rsquo;re losing with the rise of AI. The fact that we\u0026rsquo;re all somehow OK with profiting from, and benefiting from the massive scale of intellectual theft that\u0026rsquo;s being perpetrated on the part of these AI giants is disturbing to me. I love sharing my work, don\u0026rsquo;t get me wrong. Unless there\u0026rsquo;s a very specific reason I can\u0026rsquo;t share something I made, I\u0026rsquo;m going to share it. I\u0026rsquo;ve grown up as a long time user of open source software, and every piece of code I\u0026rsquo;ve written that I can contribute back to the community, I have. But I did all this in the spirit of sharing with a community; I want other humans to benefit from, and learn from, and hopefully share back their own derivative creative works as a result.\nWhat I didn\u0026rsquo;t do, and never intended to do, and am completely not OK with, is having AI companies with billions upon billions of dollars in revenue, further capitalize on and profit from the work that I\u0026rsquo;ve done. Not only are they consuming my work and using it to churn out sub-par imitations of it, they\u0026rsquo;re doing so at the expense of the environment, at the expense of people\u0026rsquo;s livelihoods, and they\u0026rsquo;re only getting richer as a result. Nvidia has skyrocketed nearly to the top spot as the one of the world\u0026rsquo;s most valuable companies, riding the coat-tails of the AI boom. But that value was derived entirely from the collective creative output of people just like you an me. And yet here we are being sold our own work back to us at a premium so we don\u0026rsquo;t get left behind, a sentiment that they are all too willing to cultivate. \u0026ldquo;Look what this brand is doing over here with AI\u0026rdquo; or \u0026ldquo;your competitors are already using AI, and we can help you\u0026rdquo; is an all too familiar marketing ploy I\u0026rsquo;ve heard in my countless chatbot demos with various vendors in the industry.\nBut where did that data come from? Us. It came from us. We\u0026rsquo;re being sold our own intellectual output back to us. You have a reason, you have a right to be outraged by this. I work at a higher educational institution where the spectre of AI looms over all of our heads and we\u0026rsquo;re pressured from all different angles to adopt. But it was our work that was consumed by these AIs in the first place. Every scientist, economist, artist, writer, all of us who wanted to share our work for the good of humanity, pro humanitate, has been commoditized by companies like Meta, OpenAI, Google, Amazon, and we\u0026rsquo;re the ones paying the price while they reap the benefits. We all suffer the consequences of their irresponsible and unethical consumption of our work with no regard for the impact it will have on our society.\nMisinformation superhighway Ah, yes, the impact on society. Let\u0026rsquo;s talk about that one for a minute shall we? We live in a time where misinformation is reaching a fever pitch across all manner of social media platforms. From YouTube to Facebook, Twitter (I will dead name this platform as long as that wretched scumbag Elmo is at the helm) to TikTok, we are being assaulted day in and day out by a quantity of false and misleading information that I can only assume outpaces the output of legitimate data by an entire order of magnitude. And that was a problem before AI came onto the scene in regular use. Today, the amount of AI slop leaking out of every corner of the internet is astounding. Bots responding to bots on posts created by bots, with the occasional oblivious Facebook Uncle wandering in to comment on this generation\u0026rsquo;s failings. Kids these days, am I right?\nNow that ChatGPT et. al. are on the scene, it\u0026rsquo;s absolutely trivial to generate mountains of seemingly real content to fit whatever agenda you have, and it\u0026rsquo;s becoming more and more difficult to discern what is and isn\u0026rsquo;t a trustworthy source of information. At this point, it\u0026rsquo;s pretty safe to assume the big social media platforms are all 100% untrustworthy garbage. But even formerly trustworthy news sources have to compete for our attention in this oversaturated market. Classical news outlets have to churn out articles and content to stay relevant, using misleading headlines to get just a little more of that sweet, sweet engagement. Meanwhile social media platforms and creators have already perfected the art of engagement farming by posting deliberately controversial and blatantly incorrect information, playing up Cunningham\u0026rsquo;s Law to great effect. AI only enables this content to be generated with less effort, and in greater quantity, further drowning out legitimate discourse and actual useful content.\nHow much of this is just some grifter in their basement trying to cash in on clicks and likes? How much of it is deliberate propaganda carefully crafted to manipulate public opinion to support some agenda or desired outcome? AI enables even relatively small groups to have a massive impact through the sheer quantity of content that can be created. Like spam emails, except there\u0026rsquo;s no spam filter on Facebook or YouTube. Worse, these posts and misinformation get amplified through algorithms that, let\u0026rsquo;s not forget are also AI and have been causing problems with social media long before most people knew what an LLM was.\nWhat\u0026rsquo;s the solution For the first time since I started writing this essay, I\u0026rsquo;m at a loss for words. I don\u0026rsquo;t know. The cat is out of the bag. Pandora\u0026rsquo;s box has been opened. The toothpaste is already out of the tube. We\u0026rsquo;re cooked. OK, maybe not totally cooked, but this isn\u0026rsquo;t going to be easy, whatever we do. This is going to take deliberate effort on all of our parts. It\u0026rsquo;s going to take political action. We need to impose regulations on this industry now, not tomorrow. Right now. In our current political climate, this sounds like an impossible task, and maybe it really is. And by the time we actually get a handle on it, it might just be too late. I don\u0026rsquo;t want to have this doom and gloom view of the future but I struggle to see how the ever increasing pace of AI development ends well for the average working class person. The idea of using machines to replace humans is not new, but AGI has the potential to do this at a scale we\u0026rsquo;ve never really seen before.\nThe first time I read Dune by Frank Herbert, I was puzzled by the idea of this future society where technology really didn\u0026rsquo;t factor in all that much to the narrative of the story. In the Dune universe, computers of all kinds, not necessarily just AI, were banned. I found this particularly strange coming from other visions of future societies where machines and thinking computers abound. But Dune, despite taking place tens of thousands of years in the future, had no such influence. But as I\u0026rsquo;ve struggled with the consequences AI will have on my own life, I\u0026rsquo;ve come to see how this vision of the future really might not be so bizarre after all.\n“Once men turned their thinking over to machines in the hope that this would set them free. But that only permitted other men with machines to enslave them.” \u0026ndash;Frank Herbert\nThe world of Dune is far from perfect, and it is science fiction after all, but the author made the deliberate choice to tell a human story. Computers were non existent, instead they were replaced by hyper intelligent people of an order called Mentats. Travelling interstellar space required the aid of guild navigators, people who lived so long in microgravity off-world that they no longer resemble human beings anymore. Dune is certainly not some utopian vision of the future, but I do think it offers a glimpse at a possible future where we as a society have agreed, collectively, that artificial intelligence is a net negative and made a deliberate choice not to use it. A world where we put people first, above all else.\nI\u0026rsquo;m not so naive as to think that we will actually ever be able to put the genie back in the bottle with AI. It\u0026rsquo;s here to stay, and we\u0026rsquo;re all going to have to live with that fact. But I do think there is power in how we choose to interact. There is power in our collective voice saying that we don\u0026rsquo;t want this. You shouldn\u0026rsquo;t feel like a Luddite for having very real and valid reservations about AI and choosing not to use it. That\u0026rsquo;s OK. We live in these ever more isolated bubbles of ours, working from home, ordering food via apps, shopping online, that I\u0026rsquo;m beginning to feel hungry for the opposite. I love these conveniences of modern life, yes, and I\u0026rsquo;ll continue to use them, but we no longer live in a world where having an app or an AI chatbot is a differentiator. It\u0026rsquo;s having a real person with a beating heart that has become a rarity.\nI work at what I consider to be a prestigious educational institution. I believe in the mission of empowering our future generations with knowledge. I see it as an investment in our collective future. They come here to learn and collaborate and be steeped in the experiences of people from different cultures and backgrounds. They come here to be inspired by passionate people who have dedicated their lives to their research and their intellectual output. I know from my own personal experiences at university almost 2 decades ago now, that the real value wasn\u0026rsquo;t necessarily the content of the classes, or the degree collecting dust somewhere in my closet. It was being exposed to truly extraordinary teachers, and thinkers, and profound ideas that forced me to look beyond the quaint, comfortable world I had previously been living in. It was the interpersonal relationships I developed with my peers. I was shaped by the experience in ways my GPA and my degree couldn\u0026rsquo;t begin to reflect. And those intangible qualities of being inducted into an educational institution that\u0026rsquo;s been around for over a century can\u0026rsquo;t be taught through an AI chat bot. That\u0026rsquo;s not what we want or need.\nConclusions Full disclosure, as soon as I finish this essay, I\u0026rsquo;m going to give it to an AI to have it argue against me so I can find holes in my logic or places where I\u0026rsquo;ve lost the plot. I\u0026rsquo;m not saying we can\u0026rsquo;t use these things. I\u0026rsquo;m not saying it\u0026rsquo;s all terrible, despite the multitude of paragraphs preceding this one where I did say exactly that. My intent for this article is for you, whoever you are, to read and try to think a little more about whether or not you should use AI for that even if you could. Is that really something that aligns with what you believe in, as a human being? Does it really benefit us? Is it worth the price we\u0026rsquo;re paying, both in real dollars as well as the cost to our wellbeing?\nIf there is a silver lining to all of this, I think it might just be that now that we are faced with the prospect of a dystopian AI future, we can\u0026rsquo;t just ignore these problems. We have to think about it. We have to be intentional about when we use or don\u0026rsquo;t use AI. I for one am committed to talking to humans, not machines. No, I will not use your AI chat bot. No, I will not order at the kiosk. No, self checkout is a pain in the ass and I\u0026rsquo;m going to use the regular checkout line where I can talk to someone, ask them about their day, and feel like I belong here in my community. I refuse to let AI write for me, even if it can do a better job, because that\u0026rsquo;s not my voice and AI does not represent me. I will support strong regulation for AI, and stronger protections for creators through more stringent copyright laws targeting big tech companies despite feeling like I\u0026rsquo;m fighting a losing battle. I will buy art from real people, not AI slop, even if it costs more. I will read your poorly worded email or blog post because at least I know it was you who wrote it. I will continue to be an AI skeptic and if I\u0026rsquo;m wrong, that\u0026rsquo;s OK, because I am a person with an opinion and I may not get it right every time, but at least I know better than to put glue on pizza.\n","date":"2025-03-14T00:00:00Z","image":"https://blog.gizmonicus.org/posts/ai-is-amazing-and-i-hate-it/cover_hu_1e15a07b5ef43afe.jpg","permalink":"https://blog.gizmonicus.org/posts/ai-is-amazing-and-i-hate-it/","title":"AI is amazing and I hate it"},{"content":"TL;DR Buy all this crap, print those two files, stick it all together with some screws and use your favorite GoPro mounting accessories to become an elite haxxor in just a few short steps.\nBuy this stuff\nRaspberry Pi 3 B v1.2 (or better) MakerHawk Raspberry Pi UPS Power Supply Literally any 18650 battery (x2) compatible with the above UPS Hosyond 3.5 Inch 480x320 Touch Screen TFT LCD SPI Display Panel Rii X8 Mini Keyboard or whatever you want to use, I don\u0026rsquo;t care. I\u0026rsquo;m not your boss. A USB wireless adapter compatable with monitor mode like this one Print/modify/download this stuff\nSTL file for the case and the screen bezel FreeCAD file if you want to modify my terrible design files. Don\u0026rsquo;t shame me. I am not an engineer. What is a cyberdeck? I do not like the name \u0026ldquo;cyberdeck\u0026rdquo;. I especially don\u0026rsquo;t like it after a certain electric vehicle inspired by a child\u0026rsquo;s pinewood derby car was launched because being even tangentially associated with walking prolapsed anus, Elon Musk, makes me physically ill. I feel it\u0026rsquo;s my duty to remind you that cyberpunk, the genre lending its name to all matter of cyber-stuff (including that hideous hulking low-poly anti-pedestrian \u0026ldquo;truck\u0026rdquo;), was intended as a warning. It\u0026rsquo;s been romanticized in popular fiction, but the origin of the cyber genre is very dark. The dystopian futures envisioned by authors of this subgenre of science fiction are especially appropriate today when we\u0026rsquo;re facing many of the realities presented in these fictional near-future settings. The rise of AI, rampant climate impacts from end stage capitalism, the consolidation of power into the hands of the hyper-wealthy, and the constantly accelerating pace of technology causing real harm to our daily lives.\nIn the before times, before the Trump regime that is, I probably would have let off the gas on my political opinion and just let things be, but fuck it. The MAGA crowd seems to have no trouble speaking their minds, even when it\u0026rsquo;s homophobic, transphobic, racist, misogynistic, xenophobic, antisemitic bullshit (and it is all bullshit, all the time), and taking the high road sure as shit didn\u0026rsquo;t work so instead it\u0026rsquo;s pedal to the metal baby. Full gas hot takes all the way. If this makes you uncomfortable, or you disagree with my opinion, you can alt-f4 right the fuck off my page. I do not give a shit about your stupid opinion (and it it stupid, trust me). This is my blog and you can go complain about it on the site formerly known as Twitter or TrUtH sOcIaL where all the other Nazi sympathizers, and crypto-bros, and Andrew Tate incel cucks hang out.\nNow, where were we?\nA cyberdeck, unlike a Cybertruck, is actually worth talking about, at least in my humble opinion. The term comes from a book from the \u0026rsquo;80s called Neuromancer by William Gibson, but in common use now it describes a portable computer built by a hacker. Hacker culture is a nuanced subject on its own, and it\u0026rsquo;s safe to say there are many different opinions on who is/isn\u0026rsquo;t a hacker and what it means to be a hacker. I think of a hacker as a person who is not satisfied simply using a device or piece of software, but must find out how it works, either by creating something new with it or breaking it in unique and interesting ways. Richard Stallman has a similar take on the term involving chopsticks and weird ways you can use them that violate the original intended use. The reason or motive is really irrelevant which I think is where the common use of the word hacker becomes contentious. I hack entirely to find out if I can, not to profit or exploit for personal gain, but the word has become synonymous with \u0026ldquo;bad guys trying to steal your identity\u0026rdquo;.\nAlright, enough setup. Let\u0026rsquo;s talk about the project.\nWhy build one? Don\u0026rsquo;t you have a laptop? Isn\u0026rsquo;t that, you know, easier to use, more powerful, less finicky, and generally better? Yep, it sure is. None of those are incorrect statements. I\u0026rsquo;ll refer you to the first section of this post where I said hackers want to find out how things work by creating or breaking things? This is both! Not only am I creating my own portable computer (which is fun on its own), but I also am installing Kali Linux on it so I can get up to all kinds of mischief after its been built. I call this a \u0026ldquo;win-win\u0026rdquo;. I imagine my actual use of this device will be pretty limited, but that\u0026rsquo;s not the point. I want to create something. I don\u0026rsquo;t want to follow a guide. I don\u0026rsquo;t want to download the print files and buy a list of components and assemble something. I want to take my vision and turn it into a physical, functional object using the tools I have at my disposal.\nThe build Starting with what I have If you\u0026rsquo;ve worked in any kind of electrical engineering, computer science related field long enough, you probably are well aware of the mountains of tech cruft that tends to build up in every corner of your home. Instead of cobwebs, I have routers, serial cables, LPT cables, graphics cards, wireless modules, and a wide assortment of broken or half functional e-garbage cluttering up my living space. Come to think of it, I also have cobwebs on some of this equipment.\nSo it will probably come as no surprise to find out that I had half the stuff I needed for this build before I even conceived of the idea. The base computer is a Raspberry Pi 3 B v1.2. I had one of these in my tech junk drawer.\nI also needed a keyboard, but I had plenty of those so the real question was which one? I settled on a portable wireless model because\u0026hellip; it\u0026rsquo;s portable. And wireless.\nIf you want to do any spelunking on wifi networks with Kali, you also need a compatible wireless adapter. My main inspiration for starting this project was the limitations of the ESP32 wifi dev board you can get for your Flipper. While it would be neat to have these capabilities on my Flipper, I would be limited to the 2.4Ghz band, which leaves half of the wireless spectrum completely inaccessible. That wouldn\u0026rsquo;t do, so I grabbed this little USB dongle from my, you guessed it, tech junk drawer.\nI also had an older Alfa wireless adapter with a high gain omni antenna and a flat panel directional that I could scavenge for a little extra range. Score! But that\u0026rsquo;s not enough for a cyberdeck build, so it was off to Amazon for some high quality garbage components.\nDirt cheap and barely functional Amazon add-ons For the low low price of $30 I was able to get a MakerHawk RPi UPS, which is literally just a battery pack that connects to the GPIO header on the RPi with a couple spring loaded pins, a.k.a. pogo pins, from under the board. I also needed a screen that was low profile and connected directly to the board. The last thing I wanted was an external monitor, or to have to manage an HDMI cable in my build somewhere. This is supposed to be small and portable after all. I found this top end Hosyond 3.5\u0026quot; 480x320 TFT display for $17 that consumes most of the GPIO headers and has at least a couple hundred pixels. Perfect. I also ordered some batteries, but shortly after I remembered that giant pile of tech garbage (you know the one) and of course I saved some old laptop batteries for reasons that before today were unclear. My hoarding has finally been justified, and will therefore continue in perpetuity.\nYou see, that\u0026rsquo;s because I\u0026rsquo;ve recently discovered that many larger devices all use the same battery package: 18650 lithium ion cells. These things are great. They\u0026rsquo;re rechargeable, put out between 3.7v and 4.2v, and they are in so many different things: from cordless drills to laptops to Ring camera battery packs (probably, I didn\u0026rsquo;t break it open to see but the size strongly suggests that\u0026rsquo;s what\u0026rsquo;s inside). So, out came the pliers and after cutting my finger open and bleeding all over myself, I ended up with a hefty pile of fire starters for all of my future project needs.\nThe red color indicates danger. Probably don\u0026rsquo;t do this. I was going to say \u0026ldquo;if you don\u0026rsquo;t know what you\u0026rsquo;re doing\u0026rdquo;, but I think just don\u0026rsquo;t is the best advice. However, I enjoy the adrenaline rush of leaving these babies on the charger and going to sleep wondering if they\u0026rsquo;ll spontaneously release their tremendous energy in a fiery explosion of molten lithium and caustic electrolytes, so I won\u0026rsquo;t be following the very good advice I just gave you.\nThe case will be easy, right? So all of the components have arrived and been stacked on top of each other. I fought a cadre of annoying bugs, getting bluetooth working (add dtoverlay=minuart-bt to /boot/config.txt), figuring out why the hell the 8211AU driver needed to be compiled from source if you want to actually use monitor mode, casting CLI spells to get the display to orient the right way for my use case (dtoverlay=tft35a:rotate=270, same place), and probably another dozen things I\u0026rsquo;ve forgotten at this point. Oh, right, trying and failing to get mouse input on a TTY. So now that the device functions, I need a case. The aesthetics of bare circuit boards don\u0026rsquo;t really bother me, and I\u0026rsquo;d be fine with that, except all of these parts are delicate and I plan on using this thing outside of my house occasionally so it\u0026rsquo;s time to put the 3D printer to work.\nDesign failures And so the fun began. I\u0026rsquo;m no stranger to CAD software. I\u0026rsquo;ve dabbled a little in many of the open source tools for quite some time now, but until I got the 3D printer, it was mostly just me trying to see if I could do it. The reality of CAD is much more frustrating. For one thing, it\u0026rsquo;s pretty easy to make simple stuff like hooks and mounting brackets, it\u0026rsquo;s an entirely new thing altogether to make a case around a piece of complex geometry with many, many important dimensions to consider. For example, the RPi has a micro-USB charging port, 4 regular USB-A ports, an RJ-45 port, two LED indicators, a bank of GPIO pins, an SD card slot, and a headphone jack. THEN you have to consider the UPS unit has its own micro-USB charging port, two regular USB-A charging ports (for external devices), and a USB-C charging port. Oh and 4 indicator lights. AND THEN AFTER THAT, you have to consider the TFT screen which, well, yeah that one was pretty much just a rectangle. But still!\nMy first attempt was essentially just a hollow box with a lid. And this, probably, maybe, would have worked with some finagling, but it had a lot of drawbacks. For one thing, the TFT screen is smaller than the profile of the rest of the devices, so how do you support it? Also, the power button on the UPS unit (I forgot to mention that one, yeah, it has a power button and it sticks wayyyy the hell out) needs to have clearance when installing it. And then there was the problem of the cutouts for ports. How do you locate those things? Measure in from the edge? Keep a spreadsheet with all the dimensions? I can say from experience the spreadsheet definitely didn\u0026rsquo;t work.\nIteration 2 was still the same box, but this time with some extra room poked for clearance, but still no clear idea how to do the cutouts. I made a lid with a little lip that would hook onto the screen, but it couldn\u0026rsquo;t be printed reasonably in any orientation so I had to add supports. This sucks. If you\u0026rsquo;re designing something to be printed, if at all possible, find any other solution than using supports.\nI kept scratching my head and wasn\u0026rsquo;t making much progress. My biggest problem was visualizing how all the pieces and parts would go together. I kept losing track of where ports would be, or the physical realities of how it would all be assembled. What to do?\nFinally, an idea that works Eventually I landed on the solution: get CAD models for all the parts and use them for reference. I\u0026rsquo;m sure all the seasoned engineers and CAD gurus are saying \u0026ldquo;duh, obviously\u0026rdquo; right about now, but I\u0026rsquo;m about as unseasoned as the chicken at a Live, Laugh, Love cooking convention, so give me a break. Up until this project, I had no need to model things I wasn\u0026rsquo;t planning on printing. But this project has a lot more going on that made it impossible to build without it.\nSo now that I have all the pieces and parts slapped together the way they will be in my case, the rest was, well, not that easy, but easier once I had a good set of reference geometry to build on. It turns out the power button location on my model, as well as the charging port location was off by a few millimeters so I needed to make some adjustments to my offsets to get that to work. I started by printing the lower half of the case just to make sure everything aligned, then made adjustments and did a larger print. I didn\u0026rsquo;t want to waste my filament, so printing small sections at a time to see if they would work was the best way to get the result I was looking for. But then I ran into the same snag from before. How to support the display?\nThen I had it! A stroke of genius isn\u0026rsquo;t the right turn of phrase, so let\u0026rsquo;s go with \u0026ldquo;above average inspiration\u0026rdquo;. Since I started 3D printing, I\u0026rsquo;ve wanted to try making some print in place mechanisms and this was the perfect opportunity. Rather than fit the guts in from above, I could instead add a hinge to the fat end of my contraption. This would solve two glaring issues with my design. First, the whole assembly problem would be solved immediately because I could add robust supports for the screen.\nPrint in place hinges are actually pretty simple to make as it turns out, assuming your printer is properly tuned. The only gotcha is 3D printers can\u0026rsquo;t do overhangs without support. So while it is possible to bridge across thin air, you have to be supported on both sides of the bridge or the filament will sag. With clearances of 0.2mm like in my hinge design, you\u0026rsquo;ll just end up fusing the parts together. So what\u0026rsquo;s the solution? Conical hinge pins. 3D printers can\u0026rsquo;t easily print overhangs at 90 degrees, but can quite happily print 45 degree overhangs without issue. So rather than making cylindrical hinge pins, you just make them conical.\nSo off to the printer I went. Most slicers conveniently allow you to cut a project with an arbitrary plane. This is good for tall models you intend to glue together later, or in this case, cutting most of the box apart so I could verify my design works. I did a test print and to my surprise, the hinge worked exactly as designed, first try. At this point the only thing left was to figure out how to mount the case to various surfaces. Sometimes I would want to use it while sitting on the couch, maybe other times I would want to be able to go wardriving, or maybe I wanted to connect a keyboard to it. Rather than reinvent the wheel, I used the ubiquitous GoPro mounting system. This design is dead simple to model, and can easily be used with all the accessories I already have for filming my mountain biking. As I\u0026rsquo;m writing this, I just realized I have a mounting point on all my helmets, which means I can ride my bike and collect wireless data at the same time. Fantastic. Is warbiking a thing? It should be. New plan for this weekend.\nOf course, the real test was actually assembling this thing. It looked like it would work, but would it actually work with my components as designed?\nDesigning clearances for various types of cable is actually quite difficult as it turns out. If you can\u0026rsquo;t get the ports to basically come in contact with the inside of the box, you\u0026rsquo;re going to have to make large relief holes for the different types of cables. This box ended up having big gaping holes for all the ports, but the plan was to protect the guts of the device and that was accomplished so I\u0026rsquo;ll call this a win. Let\u0026rsquo;s admire this creation for a moment.\nNow what? Kali Linux comes loaded with tools you can use to get into all kinds of nefarious things. They all fall into a series of categories from detecting and analyzing potential vulnerabilities, to scanning networks and capturing traffic and beyond. But, by far one of my favorite things to do is snoop on wireless signals. I actually happen to have a good deal of experience exploiting weak wireless access points and I\u0026rsquo;ve successfully pulled of attacks on WEP as well as WPA systems in the past. So\u0026hellip; wardriving it is!\nWardriving obviously Back in the hay day of wireless cracking, there used to be a lot of either fully unencrypted networks, or WEP networks. WEP was by far my favorite to attack because all you needed was enough traffic to decrypt. I don\u0026rsquo;t know much about the details of the actual attack, but essentially the workflow was like this: collect traffic until you have enough initialization vectors, run the capture file through aircrack-ng, wait a few minutes, profit! This meant that, for the most part, your network could be pwned no matter what you did to protect it. It also meant that driving around with a laptop collecting wireless signals could get you free wifi pretty much anywhere you went. Ah, the glory days!\nToday however, it\u0026rsquo;s way harder to do anything useful wardriving. You can collect the names of networks, and there are definitely some vulnerable ones out there still, but you are relegated to guessing the password using a dictionary attack. You also need to be listening at just the right moment to capture that delicious 4-way handshake when a new client connects to a wireless access point. This may take a really long time depending on whether or not clients are actively connecting to the network or not. But fear not! You can help the process along with my favorite way to be a pain in the ass: deauth!\nLike Oprah handing out free cars, I too can give everyone a gift they will wish I hadn\u0026rsquo;t. Deauth packets can easily be injected, forcing clients to disconnect and reconnect at will. If you send one or two deauth packets, the blip will barely be noticeable and you have a solid chance of capturing the handshake in return. If you spam deauth broadcasts to all clients, you can execute an annoying denial of service attack and everyone will think you\u0026rsquo;re just soooo clever.\nOnce you have a handshake, your fate is sealed. Or more accurately, you can turn off the wireless sniffer and use the captured traffic offline with a dictionary attack. It\u0026rsquo;s pretty easy to find decent password dictionaries online, and you can make your own with different tools that Kali ships with if you want to be extra ambitious. I took all the lists I could get my hands on, strapped them together with the linux cat tool, sorted and removed duplicates, and dropped any password shorter than 8 chars (minimum for WPA). My little device could barely crack 30 passwords per second on its own, and with 15 million passwords to try, the math wasn\u0026rsquo;t working in my favor at all. BUT, I also happen to know where I can find effectively unlimited power to make quick work of really long password lists.\nOn a fairly stock standard EC2 instance with 32 CPU cores (I haven\u0026rsquo;t even played with GPU yet), I could crush about 30,000 passwords per second. That\u0026rsquo;s more like it! I also built my own Kali Linux image with the wordlist I wanted to use baked in. This saves time uploading large files, and it comes with the software I want pre-installed so it\u0026rsquo;s literally as easy as launching the instance, copying over the handshake files, and telling it to run in the background and write any found passwords to a file. Just don\u0026rsquo;t forget to terminate the instance or you\u0026rsquo;ll be in for quite the shock with your next month\u0026rsquo;s AWS bill.\nFuture project ideas So far this is as much as I\u0026rsquo;ve had time to do. I\u0026rsquo;m forever cursed with ideas I want to implement and not nearly enough time to actually do any of it. But, if I had infinite time to play around with this thing, here\u0026rsquo;s a short list of things I want to try:\nAutomate the handshake capture and upload/crack process. Use the AWS API to make this fully automatic. Configure an evil portal to capture other credentials with a fake access point Use it as a reverse shell when connected to a network Connect it to my Flipper and see if they\u0026rsquo;re really the dream team haxxor crew I think they could be That\u0026rsquo;s it. I\u0026rsquo;m tired of writing and this list isn\u0026rsquo;t going to get done on its own so I\u0026rsquo;m ending it here for now. I\u0026rsquo;ll post an update if/when I manage to do anything new and interesting. Thanks for reading.\n","date":"2025-02-23T00:00:00Z","image":"https://blog.gizmonicus.org/posts/cyberdeck-v1/cover_hu_d3ce6368b96aa071.jpg","permalink":"https://blog.gizmonicus.org/posts/cyberdeck-v1/","title":"Cyberdeck v1"},{"content":"You mean that Dolphin from TV? Yeah, something like that. Except he\u0026rsquo;s a cyborg / anime character that lives on a little oddly shaped toy like a Tamogachi, but more devious. So what\u0026rsquo;s this thing about anyway? Well, I\u0026rsquo;ve had mine now for a few weeks and I can say it\u0026rsquo;s simultaneously a toy and a serious tool at the same time. Let\u0026rsquo;s take a dive into what I\u0026rsquo;ve figured out what to do with this thing so far.\nSub-GHz So by far the most compelling use case for this tool is the Sub-GHz antenna it ships with. If you\u0026rsquo;re not aware, the sub gigahertz frequency range is used for a whole host of remote control systems, and it\u0026rsquo;s one of the things you won\u0026rsquo;t get from other computing devices you might own like a laptop or phone. These devices typically have WiFi, Bluetooth, NFC, and cell antennas but nothing that can intercept and replay signals from things like\u0026hellip;\nGarage door openers Yes, your garage door might be vulnerable. Yes, the Flipper can copy and replay those signals quite easily. But don\u0026rsquo;t get too worried just yet. Most modern doors will use a set of pseudorandom numbers called rolling codes to control whether you can open the door. These rolling codes are synced between the remote and the opener and there\u0026rsquo;s no way (that I know of) to predict what the next code will be. This makes many modern devices immune to replay attacks. But\u0026hellip; not all garage doors are modern. Mine, for example, is definitely not.\nThe Flipper made short work of this device. Now I have both garage door codes captured and ready to replay any time I want. This attack did not require anything but brief access to the device in question. I didn\u0026rsquo;t need to know the dip switch positions so I\u0026rsquo;ll give this attack a 7/10: easy to pull off, requires some level of access to the device.\nThere are some other bruteforce scripts that ship with custom firmware for the Flipper that, on principle should work. So far I\u0026rsquo;ve not had luck, but I\u0026rsquo;m assuming this is mostly due to the fact that I don\u0026rsquo;t have the right hardware to bang my head against.\nOf course now I\u0026rsquo;m curious. I got it to work with my first remote. What else can I use it with?\nCar key fobs Nope. Sorry. This one has so far been a bust. I\u0026rsquo;ve tried, trust me. I\u0026rsquo;ve even tried going out of range of my car, pressing the button and capturing the signal in RAW mode, then trying to replay it next to my car when back in range. No luck. Also, if you do this wrong, you can break your remote and that might require reprogramming (or so goes the rumor, I\u0026rsquo;ve not confirmed this). Annoying and expensive. So your car is safe against your average script kiddie with a Flipper.\nI\u0026rsquo;ve not totally given up on this endeavor though. At some point I would like to see if I can program my car to legitimately respond to the Flipper. Even if I can\u0026rsquo;t use a replay attack against it, I think it would be useful. So far though, this is a 0/10: doesn\u0026rsquo;t really work except under special, very limited conditions, and even then I\u0026rsquo;ve not been successful.\nADA accessibility doors This one was fun. So apparently, those push button ADA door openers are sometimes not hardwired. I\u0026rsquo;m going to assume they do this for a few reasons, the main one being ease of installation. Also, I could see where someone with very limited mobility might benefit from being able to trigger those doors automatically without having to push the button, so maybe that\u0026rsquo;s another motivation? I couldn\u0026rsquo;t find a definitive answer on this.\nWhat I did discover though is you can easily capture and replay the signal. I had a ton of fun with this one. My kids also get a kick out of remotely triggering doors like high tech wizards. \u0026ldquo;Open sesame!\u0026rdquo;\nIt did occur to me that this might have some implications for accessing buildings if the interior button overrides the lock mechanism. Sure enough I found a situation where this exact thing can happen. One of the buildings where I work is locked after hours, but has ADA push button doors. Out of curiosity, I captured the signal from the interior push button and tested it against the door from the outside. And, yeah, it worked. You can effectively \u0026ldquo;push the door open from the inside\u0026rdquo; using the Flipper. This is one of the more interesting use cases as it would allow you to access a normally public building after hours in certain circumstances. I\u0026rsquo;ve not seen another example in the wild, but I\u0026rsquo;ll be on the lookout.\nThis one I would give a 5/10: super easy to pull off, but it doesn\u0026rsquo;t really grant you any additional access you wouldn\u0026rsquo;t already have except when improperly installed.\nTesla charging ports Another fun one. I found the sub files online that open many Tesla charging port doors. This would be more exciting if you could charge your own devices from the unlocked charging door, but as far as I know, this is just a silly prank. And not even that good of one either. I believe the doors close automatically after a few minutes, so it\u0026rsquo;s unlikely the owner would even notice. That hasn\u0026rsquo;t stopped me from prowling crowded parking lots in search of Teslas. Now if only I could figure out a way to control Tesla\u0026rsquo;s current owner with a Flipper\u0026hellip;\nI give this one a 4/10: you don\u0026rsquo;t even need to capture the signal yourself as they are all the same and published online, but otherwise just a fun little trick and not all that useful.\nCustomer needs assistance in the (??) department This one was, err, a little too effective. I found a .sub (this is the file extension for captured Sub-GHz signals) file online that was tantalizingly named \u0026ldquo;Walgreens Chaos\u0026rdquo;. That\u0026rsquo;s like labelling a big red button with the words \u0026ldquo;DO NOT PRESS\u0026rdquo;. I do not possess the capacity to fight those intrusive thoughts. So really, I can\u0026rsquo;t be held responsible for the inevitable chaos that ensued. And it did live up to its name.\nThe story as I choose to tell it goes a little like this: I walked into Walgreens, looking sketchy I\u0026rsquo;m sure. Browse the aisles for a moment, then open up Flipper \u0026ndash;\u0026gt; Emulate! Shortly after, the first \u0026ldquo;Customer needs assistance in the ??? aisle\u0026rdquo; alert chimes in over the intercom. I was pretty surprised at this point because none of the .sub files I\u0026rsquo;ve found online had worked before. Neat! But then, another chime. And another. And another\u0026hellip; The employees were getting flustered, talking about how \u0026ldquo;we don\u0026rsquo;t even have that section\u0026rdquo;. By this point, panic had set in so I cancelled the command. Phew!\nLittle did I know, the \u0026ldquo;chaos\u0026rdquo; command had literally fired off dozens of intercom requests and the intercom doesn\u0026rsquo;t want anyone\u0026rsquo;s request to go unanswered so it queued all of them up to play in sequence. One at a time. For several minutes straight. At this point it had become clear that this was NOT a good idea. Time to leave. I bought a pack of gum and made a direct line for the exit. Being one of maybe 2 other people in the store, it wouldn\u0026rsquo;t take a rocket surgeon to figure out I probably had something to do with the customer assistance button meltdown. Moral of the story: don\u0026rsquo;t do that.\nI\u0026rsquo;m conflicted about the rating I want to give this little exploit. On one hand, it was easy, and if I was trying to be a real pain in the ass, this is a quick and dirty way to do that. That said, I have the utmost respect for people who work in retail and deal with shitty customers day in and day out. I don\u0026rsquo;t want to be part of that problem so on principle, this one should get a 0/10 for screwing with people at work, but a 8/10 for being incredibly effective, disruptive, and easy to execute.\nSignal jamming I wouldn\u0026rsquo;t know anything about this because it\u0026rsquo;s ILLEGAL so I definitely didn\u0026rsquo;t try it. But if I did try it, in my own home, on my own devices, I would probably report that with the right .sub files, you could allegedly jam signals by spamming a bunch of noise on that frequency band. But since I don\u0026rsquo;t want a visit from the FCC, I did not do any of the things that I just described. The biggest benefit of this attack vs other attacks is jamming a signal is a physical process. No encryption scheme or rolling code can save you from just physically overwhelming the receiver with garbage. And because you could potentially block important signals like car key fobs lock signals or gate close signals, you could potentially use this to gain access to places you otherwise wouldn\u0026rsquo;t be able to go.\nI give this one a 5/10 assuming I had tried this attack, which I didn\u0026rsquo;t for the record, I probably would have found it to be very easy to execute, and in the right situation it could be very effective\nNFC and RFID OK, enough of that. Time for something a little less noisy. I was a little confused at first about the difference between RFID and NFC. As it turns out, NFC is a subset of RFID. It works at much shorter range and at the specific frequency 13.56MHz. RFID on the other hand is a more broad category that can operate at longer ranges and across a different spectrum of frequencies. For my purposes, they\u0026rsquo;re essentially interchangeable and I\u0026rsquo;m not going to differentiate.\nBadge cloning This was the first exploit that truly shocked me. Not only did it work, but it was fast. It was easy. It took very little actual effort on my part aside from a quick Google search to find out what app I needed (PicoPass if you\u0026rsquo;re wondering). Once I installed it, I tapped my badge and almost immediately it was stored on my Flipper\u0026rsquo;s SD card. My first thought was \u0026ldquo;no way that worked\u0026rdquo;, but come Monday morning, I was able to waltz right into my office with the Flipper, no problem.\nYikes.\nSo, I did what any responsible person would do and I immediately brought it to my head of security and demonstrated how disturbingly easy it was to just bump into someone and clone their badge. Thankfully our physical security people are aware of this issue and are actively working to replace readers with ones that support encrypted cards.\nI give this attack a 9/10: easy to do, limited knowledge required, and quick enough to use covertly with very low effort social engineering. I recently started carrying a man purse, or EDC bag (whichever you prefer), and it would be trivial to put my Flipper in an outside pocket and casually bump into someone in the hallway or in a crowded elevator. The Flipper conveniently can be controlled with Bluetooth so you can watch in real time to see if the badge was successfully cloned or if you need to try again. The only thing that would make this worse is if you could forge the contents of the card to elevate your access. For ethical reasons, and because I\u0026rsquo;ve not gotten approval from my security folks, I\u0026rsquo;m probably not going to try this one either. Probably.\nCredit cards?! No. You thought about it though, right? Yeah, same. You can read the card contents all you want, but you won\u0026rsquo;t be using it to make transactions. The card data you can read via NFC is pretty interesting in some cases though. You can capture the card number and expiration date as well as recent transactions (which was very unexpected). This is all well and good, but then what? You need the CVV and/or the zip code to do anything useful. Not that this isn\u0026rsquo;t a big concern, but it\u0026rsquo;s not exactly as easy as brushing past someone and stealing their credit card information. One other thing to note, even with direct, prolonged access to a wallet, if there\u0026rsquo;s more than 1 card with NFC, you can forget capturing data reliably.\nAnd any wallet that blocks RFID/NFC will pretty reliably keep your CC safe. 2/10: neat, but not very useful and the extremely limited range and reading ability would make just taking a picture of the card with your phone more reliable\nHotel keys Yes, you can. Although it took significantly longer than reading and cloning my badge, which was surprising. There are some interesting details on these cards though that give a tantalizing look into what could be possible with the right know-how. For example, did you know the deadbolt is controlled by a key card? I didn\u0026rsquo;t.\nAlso interesting with the cloning operation, you actually have to crack the encryption on the card. This process took close to 5 minutes on the Flipper, so you\u0026rsquo;re probably going to need more than a quick elevator bump to steal someone else\u0026rsquo;s card. Maybe a prolonged hug? Doubtful.\nSo I would just leave it here as a 6/10: possible to clone, but requires prolonged access and isn\u0026rsquo;t easily pulled off in the wild without direct access to a card. But then I found this article. The details of this attack are not public, but it has been proven that you can clone even an expired card from the express checkout box, rewrite the data to make a master key for the entire hotel, and use it to get anywhere you want with impunity. That\u0026rsquo;s a full blown 11/10 if you could ever figure out how to do it yourself (update from the future, this may not be as difficult as I thought). Fortunately for hotel goers, the people who discovered this vulnerability have responsibly disclosed it to the vendor and many hotels have begun patching their systems to address it.\nSo for now at least, the Flipper isn\u0026rsquo;t going to let your averange script kiddie like me into your room in the middle of the night. But maybe don\u0026rsquo;t just rely on the deadbolt to save you. And those little chains/bars have been shown to be trivial to override. Maybe a simple door stop or chair against the doorknob trick will do?\nUpdate from the future: I did manage to figure out how to modify the keycard data for Saflok systems, which is terrifying because I harbor no illusions about being some kind of brilliant hacker. So if I can make it as far as I did with a little head scratching and some python code\u0026hellip; that\u0026rsquo;s bad news for hotel security.\nAnimal tags Not much to say about this one. You can\u0026rsquo;t remote control your dog with it, but you can read their RFID tag. My dog was very suspicious of Flipper.\n1/10: my dog still shits on the floor even after being reprogrammed with Flipper.\nMisc Infrared Yes, the Flipper comes with an IR sensor and transmitter. You can use it like the ultimate universal remote. How useful is this? Well, you can cause low level mischief turning off menu boards at Popeye\u0026rsquo;s Chicken, or turning off those annoying infomercials and drug commercials on repeat in doctor/dentist\u0026rsquo;s offices. You can copy your own remotes too just by replaying the captured signals. Neat. But not that useful. I\u0026rsquo;ll give this one a 2/10: more convenient than carrying a full size universal remote in your pocket.\nU2F You can use your flipper as a hardware token for your second factor when logging into web apps. This is a nice feature, in my opinion. One of the selling points of the Flipper is that it\u0026rsquo;s a \u0026ldquo;multitool for geeks\u0026rdquo;, and being able to use it this way does add to the already good sized list of reasons to carry it around.\nGames Before you ask, yes, you can run Doom on it. You can buy a game module for it, but I can\u0026rsquo;t for the life of me figure out why you would waste you money on one. Woo hoo, I can play 2048 on a TV with an HDMI cable. Great. Save your money and buy literally anything else.\nWiFi dev board I thought about getting one of these, but I\u0026rsquo;ve come to the conclusion that it\u0026rsquo;s not worth the money either. First of all, it only works with 2.4ghz signals. There\u0026rsquo;s still plenty of them floating around, but that\u0026rsquo;s a big limitation. Not only that, but the toolset is very limited compared to something like Kali. And as it turns out, I have a Raspberry Pi 3B laying around, some high gain Alfa Networks USB wireless cards, and a handheld keyboard laying around that could easily be retrofitted into a frankenstein cyberdeck Kali setup. I also have an old Motorola G7 (I think?) that can be used as a Kali mobile device. Either way I think these are better options than strapping an ESP32 board to the GPIO pins of my Flipper. This cyberdeck deal I\u0026rsquo;m working on could easily interface with the Flipper via Bluetooth or directly via USB. With some 3D printed parts and a battery pack, I\u0026rsquo;ll have a ridiculous handheld haxxor device that will definitely not look suspicious at all at Starbucks. Look for a future article on this build. I\u0026rsquo;m sure it will be fun.\nConclusions I didn\u0026rsquo;t set out to write a review, but as I look back over this post, it reads that way so let\u0026rsquo;s lean into it.\nAfter a month of owning my Flipper, do I think it\u0026rsquo;s worth it? Yeah, I think in the end I\u0026rsquo;m happy with my decision to blow some of my hard earned cash on this thing. I would say that if you\u0026rsquo;re just buying it because you think it\u0026rsquo;s going to open doors at the push of a button and you\u0026rsquo;re going to strut into high security areas unimpeded, you\u0026rsquo;re going to be sorely disappointed. It is a tool, but it isn\u0026rsquo;t magic. And in a lot of the cases where you might be able to use the Flipper to gain elevated access, you could have just as easily used a much simpler technique.\nTake the badge cloning as an example. A ladder and a clipboard could get you through just as many doors if you\u0026rsquo;re personable enough. Most people don\u0026rsquo;t question your motives when you look like you belong, and people like to be helpful, including holding doors for encumbered strangers. At my office I realised the other day that the lock core in one of the exterior doors is missing, which means you can literally open it with a screwdriver. Technology is cool, but it\u0026rsquo;s not always the best solution. Deviant Ollam said in one of his talks that I\u0026rsquo;ll never forget \u0026ndash; \u0026ldquo;[lockpicking] is like the 9th thing on the list of stuff we try to get into buildings\u0026rdquo;. This is true of digital security as well. Yeah, patch your webservers, watch out for vulnerable applications, but don\u0026rsquo;t forget that it\u0026rsquo;s almost always easier to just ask the user for their password. The simplest, most straightforward way to get into something is just take advantage of the weakest link: people.\nI\u0026rsquo;ve had plenty of fun just tinkering and thinking about what I could try next. And that feeling of discovery when you do finally manage to get it working with some device or access system is really hard to beat. If you\u0026rsquo;re like me and you enjoy a little casual mischief and don\u0026rsquo;t mind shelling out a couple bucks to gain access to a hidden realm of mischief you may not have even known about before, it\u0026rsquo;s probably a good investment for you.\n","date":"2025-02-17T00:00:00Z","image":"https://blog.gizmonicus.org/posts/flip-the-world/cover_hu_312a83f9993c1af2.png","permalink":"https://blog.gizmonicus.org/posts/flip-the-world/","title":"Flip the World"},{"content":"Scope creep and dovetails When I started this project, the plan was simply to make a table for my 3D printer. But, inevitably, it ballooned into an increasingly complex and challenging build. What was once just a simple laminated top, turned into breadboard ends, and what was supposed to be a simple shelf turned into inlaid dovetails. I guess that\u0026rsquo;s what you call them, I don\u0026rsquo;t know exactly. All I know is it wasn\u0026rsquo;t part of the original design but once I had it in my head, I couldn\u0026rsquo;t not do it.\nSo, first thing\u0026rsquo;s first: I needed to rip my oak stock in half and lay them out. I just guessed a rough length that would fit and used my rip saw to go straight down the middle. Much like the other cuts I made, the specific dimensions weren\u0026rsquo;t as important as just making sure things were square.\nI decided to take advantage of my 3D printer during the build by making dovetail guides that were exactly the size I wanted instead of using a traditional guide and measuring layout lines. This took all of about 5 minutes to make in CAD and ended up being perfect for the task. Unfortunately I didn\u0026rsquo;t capture any photos of the chopping I was doing to cut out the dovetail sockets. Essentially you cut down to your mark and carefully chop out the middle with a chisel, much like the tenons.\nI decided to cut the tails to fit the sockets only on one side before the glue up. In the end I think this was a mistake, but my rationale was to ensure I wasn\u0026rsquo;t oversized or undersized once the table was fully assembled and glued. Ultimately it made truing the slats up with the stretchers more difficult, so if I were to do this again, I would just clamp the table up instead.\nAs I was working on the dovetails, I took a moment to finish the table with some boiled linseed oil. I knew I would want to start using it almost immediately after it dried, so getting a jump on the finish for the top was the best way to make sure I could do that. I used a combination of boiled linseed oil and a home made turpentine/beeswax/mineral oil top coat for this job. Mainly because I absolutley HATE doing any kind of finish work. It\u0026rsquo;s messy, annoying, and can easily ruin your whole project if you don\u0026rsquo;t do the prep work right. Boiled linseed oil and beeswax are way more idiot proof, at the expense of not being very durable. But it\u0026rsquo;s easy to just add more beeswax later so I really don\u0026rsquo;t see a reason for most cases where durability isn\u0026rsquo;t going to be a concern.\nThe Glue Up The only thing worse than applying a finish is the final glue up. I did my level best to make sure everything fit properly and was as square as I could get it before ruining my beautiful joinery with gobs of PVA glue. If you want to check for square, measure the diagonals. Even the slightest deviation will be readily apparent. I\u0026rsquo;m happy with 1/16\u0026quot; out of square on a diagonal. That\u0026rsquo;s beyond good enough and there\u0026rsquo;s no way you could see this without a measuring tape.\nThere was nothing left to do at this point but glue. With PVA glue you have around 30 minutes tops to get everything in place and clamped if you want the best possible bond, but with tight fitting joints, it can get hard to work with after as little as 5 minutes. I have everything laid out and ready to go so the moment I start clamping, I\u0026rsquo;m able to get it all done within a matter of a minute or two. I glued it in two stages, the front/back pieces, then as you can see in the image below, I glued the stretchers in place. Once it was all clamped up, I was ready to start cutting the other side of the slats.\nCutting the tails was really easy since the bottom face really didn\u0026rsquo;t need to be all that precise. I made them ever so slightly tapered so they would fit snugly in the socket, even if the socket and the tail wasn\u0026rsquo;t an exact match. I was happy with the results.\nA few of my cuts were deeper than they needed to be. No worries, I just grabbed a couple loose shavings and dumped a big gob of glue in the socket. Problem solved, and unless you\u0026rsquo;re crawling around on the floor underneath, you\u0026rsquo;ll never know there\u0026rsquo;s a gap.\nFinishing Touches Once everything was glued and set, all that was left was to drench it in boiled linseed oil and coat it in beeswax. This part was actually not too bad. I knew it was going to look good after putting the same finish on the top, and the hard part was done now that the glue was dry.\nI attached the top with some wood screws and 3D printed brackets. It seemed appropriate for this project, plus you need to allow for some movement so you can\u0026rsquo;t just glue down the top or it will break free when the humidity rises in the summer. I still worry about the breadboard ends, but we\u0026rsquo;ll cross that bridge if I ever come to it.\nI had to rearrange a few things in the office. I also made a little shelf to hold an old dome type security camera so I could keep tabs on my printer remotely. I might do another post later about how all that was set up, so check back later if you want to see. In keeping with the theme, I 3D printed some shelving brackets for spare filament and the cleats to hold the security camera shelf to the wall.\nNow all that\u0026rsquo;s left is print a calibration toaster (yes, that\u0026rsquo;s a thing to make sure the printer is finely tuned and ready to rock. Spoiler, it wasn\u0026rsquo;t by the way. I ended up having to shim the gantry because it was a few degrees out of plumb. I\u0026rsquo;ll probably do a whole deep dive later on how I got sucked into the 3D printing cult and what you can do to join. Anyway, I hope you enjoyed this series, and thanks for reading along.\n","date":"2025-01-27T00:00:00Z","image":"https://blog.gizmonicus.org/posts/making-a-new-table-pt3/cover_hu_35c314839b47e43e.jpg","permalink":"https://blog.gizmonicus.org/posts/making-a-new-table-pt3/","title":"Making a Table - Part 3: Finishing is the worst"},{"content":"Dimensioning the Legs Picking right up where we left off, while the glue on the top dries, I started dimensioning the legs. On this build I wasn\u0026rsquo;t too particular about getting all the pieces to be exactly the same size, which bit me a little bit in the end. I don\u0026rsquo;t think I saved much time and I ended up having to make lots of adjustments that otherwise would have been simpler if I had just taken the extra hour to get each leg to be as close as possible to the same size. Either way you at the very least need a solid set of reference faces, so I planed each piece flat and marked the reference faces and edges so I had consistent measurements all the way around.\nOf course, you might have square, flat looking boards, but still have a twist. To account for that, I made these winding sticks years ago to indicate if there was any twist in narrow boards. They simply exaggerate any twist to the point where it\u0026rsquo;s noticeable. From there I usually just plane a few strokes diagonally from high spot to high spot, then check for twist again.\nOnce the boards are all nice and flat-ish and square-ish, and about the same size-ish, I need to mark out the tenons. I could use my marking guage and painstakingly lay out two different marks and hope I didn\u0026rsquo;t miss any or that my guage moved ever so slightly out of alignment, or I can do the sane thing and make one of these handy little gadgets: a scratch stock. I don\u0026rsquo;t know if that\u0026rsquo;s actually the name for it, but it kind of fits.\nThe great thing about this little tool is it takes all of 5 minutes to slap together, but it doubles the speed of laying out mortises and tenons. Since I had 16 mortises and 16 tenons to cut, that\u0026rsquo;s a whole ton of time saved. Plus the accuracy is as good or better than using a marking guage. Here you can see how it leaves a nice line for cutting each piece of joinery.\nCutting the Joints For no particular reason at all I started with the top mortises. Since they were going straight up to the table top, and because I was not cutting shoulders all the way around my tenons, these ended up being really easy to make. They ended up looking like castle walls. To make these cuts I sawed down to the line on both sides, then chopped the waste with a chisel. Since I had access to the top face, it was really easy to clear the waste and get nice square cuts.\nFrom there it was a matter of cutting down the tenons to fit. As a beginner I would try to cut everything to fit exactly on my first try but lacked the skill to actually pull it off so I ended up with loose fitting joints. As I\u0026rsquo;ve improved, I\u0026rsquo;ve learned it\u0026rsquo;s better to cut the mortises as closely to the right dimension as possible, then deliberately cut the tenons a little fat. Once you\u0026rsquo;ve trimmed them down, you can test fit. Any tight spots will burnish the wood (make it shiny) and you can simply pare that down with a chisel until you get a nice snug fit.\nAs you can see in the above, I chose a mitred tenon. In the future I probably wouldn\u0026rsquo;t waste my time. No one but you and me know it\u0026rsquo;s there, and it was more trouble than it was worth getting the faces to match. Next time I\u0026rsquo;m either doing a half depth cut, or some other variation that doesn\u0026rsquo;t involve cutting 45 degree angles with any kind of precision. I ended up being rather liberal with the cutting by the end of the project so they wouldn\u0026rsquo;t interfere with final assembly.\nNext up was chopping the mortises for the lower legs. There were much more difficult because there was no access from the top so I couldn\u0026rsquo;t saw into the piece as a shortcut. You can see how being a little loose with the dimensioning step started to creep into the project. The mortise on the left was significantly taller than the one on the right. In the end, you won\u0026rsquo;t really notice.\nCutting the tenons for the lower legs went pretty much as well as the top. I was particularly proud of this one. Look at that beautiful joint! No gaps\u0026hellip; on this one. Until I glued it. But whatever. It looked great in this photo so enjoy!\nThroughout the project I did a number of test fits. I don\u0026rsquo;t know how valuable they were from a process standpoint, but it sure was fun sticking the pieces together and envisioning what the final product would look like.\nThings started looking really good once the lowers were fully cut and fit. I was regularly checking for square and making sure no twist was creeping in. Adjusting was a simple matter of shaving down the tenons on one side or the other to allow for the work piece to settle into a parallel configuration.\nOnce all the main joinery was finished, I mocked up the table with the top and legs all together. At this point I was starting to feel like the table was going to be successful. Even without the glue, you could sit on the table and it wouldn\u0026rsquo;t wrack back and forth. In the next part, I\u0026rsquo;ll be cutting the dovetails for the shelf slats and putting on the finishing touches.\n","date":"2025-01-21T00:00:00Z","image":"https://blog.gizmonicus.org/posts/making-a-new-table-pt2/cover_hu_d32212d4bfbb596f.jpg","permalink":"https://blog.gizmonicus.org/posts/making-a-new-table-pt2/","title":"Making a Table - Part 2: Joinery"},{"content":"The Problem The problem started when my wife gave me a 3D printer for my birthday. I could not contain my excitement. I may be 20 years behind the curve on getting one, but I\u0026rsquo;d say the technology is really mature at this point and the price is right. For just under $300 you can get a very capable printer and more filament than you will know what to do with (although I\u0026rsquo;m finding I might burn through this pretty fast anyway). However, there was a big problem: I had nowhere to put it.\nOf course, you can\u0026rsquo;t just slap a 3D printer down on a coffee table with wheels, held stable with dumbbells and powered by extension cords from the garage. Well, you can, and I did, but that\u0026rsquo;s not exactly the best idea. For one thing, my Creality Ender 3 v3 SE is what\u0026rsquo;s called a \u0026ldquo;bed slinger\u0026rdquo;, which means it throws the bed back and forth for the Y-axis movement, which creates a good deal of force. You clearly need something much more stable. Also, my dogs\u0026rsquo; tails were a hazard to any print. And of course my coffee table is right next to the basement door so any time someone went in/out, a nice cool draft would breeze by and curl the corners of whatever I was printing. No bueno.\nSo, I decided it was time for another side project. This time a super sturdy table for the printer, with some shelf space below it to store parts and tools. As much as I love high tech tools and gadgets, some of my hobbies are strictly analog. When I need a break from screens and keyboards, I really don\u0026rsquo;t want to have yet more screens and bluetooth pairing problems. All of my tools are hand operated, with the notable exception of my drill and impact driver. I\u0026rsquo;m a masochist, but even I have limits.\nThis project began with basically two measurements, width and length. I just needed a table top wide enough for the printer to sit. None of my wood working projects start with actual plans and measurements. I have plenty of time to mull things over while I\u0026rsquo;m dimensioning boards so there\u0026rsquo;s not much need for pre-planning except maybe a high level idea of what the end result should look like. This table was no exception. In fact, by the time I had the idea to even take pictures and write this blog post, I had already dimensioned most of the top of the table and was half way through making the breaboard ends.\nStarting with the top If you\u0026rsquo;re not familiar, a breadboard end is the little sideways piece of wood at the end of a table, named after a breadboard or cutting board which often will also have the same feature. They\u0026rsquo;re a nice aesthetic addition to a table, but they\u0026rsquo;re also functional. Because of the way wood changes over time due to moisture content, a plain table top can develop a bow, cupping, or twist over time, especially in laminated pieces like the one I\u0026rsquo;m making for this table. One solution would be to use quarter sawn lumber. This would be my first choice if it wasn\u0026rsquo;t for the fact that it\u0026rsquo;s absurdly expensive and I already had a big stack of oak just laying around waiting for a project. The other option is to use a breadboard end. This end cap prevents the warping behavior by aligning the grain perpendicularly; warping of the table is resisted by the two pieces of wood on each end holding them in alignment. The downside is that force has to go somewhere and if you\u0026rsquo;ve glued up the breadboard ends too tight, it will eventually break the glue joint.\nAnyway, we\u0026rsquo;ll worry about that in the summer time. For now, we need to cut a long groove in a piece of oak. Enter the Stanley 45 hand plane. Easily the most complicated, weird tool I have in my workshop.\nThis was my first actual use case for this plane, which as you can see has all kinds of knobs and adjustments to fiddle with. This was a rather simple case of setting a depth stop and using the fence to keep the plane from wandering. The most difficult part of this entire job was keeping the bottom of the groove flat and level. For this reason, I stayed just a little shy of my actual desired depth and finished planing without the fence so I could bring it as close to level as possible. I didn\u0026rsquo;t have to be super careful about making sure it was level all the way across. Just at the ends since you\u0026rsquo;ll see a gap if they don\u0026rsquo;t line up.\nWith hand tool woodworking, you can make very precise joints, but you must be willing to sacrifice precision of measurement or you\u0026rsquo;ll go crazy trying to get things exact. What I mean is, at least at my level, there\u0026rsquo;s almost no point in trying to make a groove that\u0026rsquo;s precisely 1.125\u0026quot; wide. No matter how hard you try, it\u0026rsquo;s going to vary somewhat across the length of the board. To that end, I almost never measure anything except the large scale dimensions. As long as your joints are the same relative size, it would be impossible for someone to notice the tiny variations in actual size. So don\u0026rsquo;t bother. Instead, cut the groove first since it\u0026rsquo;s harder to get a precise cut, then cut the tongues for the table top to fit.\nFor this piece, the most important part is making sure the breadboard end and the top of the table are tightly fitted, so I use a Paul Sellers technique called a \u0026ldquo;knife wall\u0026rdquo; to make sure my saw cut leaves a nice crisp line across the top of the board.\nBy slicing across the grain, then cutting a small notch for my saw, it\u0026rsquo;s really hard to make a bad cut. When cutting freehand, it\u0026rsquo;s difficult to get a perfectly square cut. You can see in the image below I\u0026rsquo;m a little under 90 degrees, but that\u0026rsquo;s OK. I always try to err on the side of needing to clean up the shoulders later. This may take a little extra work, but you don\u0026rsquo;t want to miss the mark the other way or you\u0026rsquo;ll end up with a piece that\u0026rsquo;s too short and you\u0026rsquo;ll have to cut the rest to match.\nSince each piece is cut to fit, you need to be very careful about your layout. I have a cheap, horrible set of gouges that are about as useful as a grapefruit spoon for their stated purpose, however I have repurposed them to mark pieces unambiguously for assembly later. Because they\u0026rsquo;re actual physical cuts, I don\u0026rsquo;t have to worry about the marks rubbing off when I\u0026rsquo;m working with the material. I actually like these marks being visible on the finished work piece because it clearly illustrates the hand made nature of the furniture. These \u0026ldquo;witness\u0026rdquo; marks are often left behind on antique furniture if you know where and what to look for.\nThe glue up Once everything has been cut to length and lined up as well as possible, it\u0026rsquo;s time to glue up the table top. Pro tip: to keep these pieces from sliding around when clamping, as they tend to do once you put a boat load of glue on them, you can scrape some pieces of sandpaper together and let the little bits of grit land in the wet glue before you clamp them together. The extra grit prevents the pieces from sliding around and won\u0026rsquo;t compromise the strength of the joint. Thanks to this guy for that little tidbit. Just don\u0026rsquo;t forget to put the breadboard ends on as a guide so all the boards are all aligned correctly! Ask me how I know.\nAfter the glue dries, it\u0026rsquo;s time to start the final fitting of the breadboard ends. I cut the tongues extra long so this step would be a breeze. Here you can see I have about 1/8\u0026quot; to go, but my jack plane will make quick work of this end grain. As long as you plane from the ends into the middle, you don\u0026rsquo;t have to worry about splitting. I only really cared that the two end pieces were squared and had no gaps. The middle pieces will be covered by the breadboard ends so I was a bit ham fisted about removing material there. Hooray for hidden features no one will ever see.\nOnce the tongue lengths are all good, the last step before final glue up is to hit the shoulders with one of these skew angle bois. This thing is a pain in the ass to use for anything except cleaning up shoulders. But for that, it\u0026rsquo;s great. My shoulders were all very close to lined up from the glue up so there wasn\u0026rsquo;t much to do here except trim the outliers. The skew angle iron on this thing was crucial to doing this without making a mess of it. Just make sure to plane from the right end of the board so the skewed iron pulls the plane into the cut.\nAfter the glue dries, the last step is to cut off the excess and plane it all smooth. I\u0026rsquo;m pretty happy with how tight the gaps are on this piece. It\u0026rsquo;s not perfect, but it will do.\nAfter the shoulder work with the skew plane and a little trimming with a chisel, the tongue and groove joint fits very well. I\u0026rsquo;m quite pleased with this result.\nIn part 2 we\u0026rsquo;ll start working on the frame of the table. I chose to use blind mortise and tennon joints for this project because they\u0026rsquo;re easier to get right. Of course I couldn\u0026rsquo;t make things too easy for myself, so I compromised by doing dovetails for the shelf slats.\n","date":"2025-01-09T00:00:00Z","image":"https://blog.gizmonicus.org/posts/making-a-new-table/cover_hu_d273a22d519887be.jpg","permalink":"https://blog.gizmonicus.org/posts/making-a-new-table/","title":"Making a Table - Part 1: Breadboard ends"},{"content":"2024-12-19: Some of the code in this article has been updated. Check the Git repository for the latest version.\nThe problem and the theory So I\u0026rsquo;ve been interested in a little game theory problem lately. With the holidays in full swing, the NC Education Lottery has been hitting the advertising trail pretty hard. It got me thinking though. Which lottery scratch offs are the best overall value? Which ones are the worst? Is it possible to win the lottery, on average, if you buy enough tickets? Spoiler alert, the answer to that last one is no. But the results were pretty fascinating anyway, and not all scratch offs are created the same.\nSo how do we figure out which ones are the best, and which ones are the worst? Well, in game theory there\u0026rsquo;s a surprisingly simple formula for solving this kind of problem called the \u0026ldquo;expected value\u0026rdquo;, often denoted E which represents, on average, how valuable something is based on the probability (p) of a particular outcome (x). In our case, the probability is given by the \u0026ldquo;odds in 1\u0026rdquo; and the outcome is the amount of money each prize is worth.\n\\[ E[x]=x_1p_1 + x_2p_2 + \u0026hellip; + x_np_n \\]\nSay you had a lottery where the top prize, or outcome, is $100 (\\(x_1\\)). There are 100 tickets in circulation, but only one of them has the $100 prize. The rest have no prize. This gives a probability (\\(p_1\\)) of \\(\\frac {1}{100}\\). The expected value in this case is the probability of winning a ticket multiplied by the value of that outcome: \\(E[x]=p_1x_1\\). So in this very simple case, each ticket\u0026rsquo;s expected value is $1. If you can buy a ticket for say, $2, you can expect to lose, on average $0.50 per dollar spent given by: \\(\\frac{cost}{value}\\). You can see how this works if you just imagine buying every single lottery ticket. Your total cost would be $200, and you would win $100 back. Obviously this isn\u0026rsquo;t a good deal.\nThe question I wanted to answer was if that ratio ever gets above 1 for any of our scratch off tickets as prizes are redeemed. The original published odds will always have an expected value ratio less than 1 because otherwise it wouldn\u0026rsquo;t be profitable. But if we could determine new probabilities based on estimates of remaining tickets and prizes, the expected value could change. As it turns out, the NC Education lottery shares not just the prizes, but also the total number of prizes as well as the number remaining and the odds on their website. Using this information, we could extrapolate the actual expected value of a ticket based on the value of all the prizes multiplied by how many prizes remain divided by our estimate of how many total tickets remain in the wild. We\u0026rsquo;ll get to that last bit, it\u0026rsquo;s by far the biggest unknown in our equation, but we can take a guess using the information we know.\nScraping HTML is painful The biggest, and most annoying part of this problem is digesting HTML. Not only is it messy, but it\u0026rsquo;s inherently fragile. If the developers of the Lottery site decide to use different class names, this all falls apart and we have to refactor the code. Fortunately, HTML also has the notion of tables, which means our friends over at BeautifulSoup and Pandas can at least take a stab at extracting the data cleanly. As with any web scraping task, I try not to abuse the webserver, so the first thing I did was grab the content and store it locally:\nwget https://nclottery.com/scratch-off-prizes-remaining -O lottery-main.html Now that we have a local copy of the HTML content, we can process it freely without worrying about latency or the admins blocking our connections. Pandas has some great tools for reading tables from HTML code, and on my first attempt, it did a pretty good job. What it didn\u0026rsquo;t do well though was extract elements from the page that weren\u0026rsquo;t part of a table. In our source data, the value of a ticket isn\u0026rsquo;t captured in the actual table, but instead it\u0026rsquo;s captured in one of the HTML classes, as well as the game name and number.\n\u0026lt;div class=\u0026#34;box cloudfx databox price_5\u0026#34;\u0026gt; \u0026lt;table class=\u0026#34;datatable\u0026#34;\u0026gt; \u0026lt;thead\u0026gt; \u0026lt;tr\u0026gt; \u0026lt;th colspan=\u0026#34;4\u0026#34; class=\u0026#34;ticketdetails\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;gamethumb\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;/Content/Images/Instant/nc916_sqr.png\u0026#34; class=\u0026#34;preview\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;/Content/Images/Instant/nc916_sqr.png\u0026#34; alt=\u0026#34;+\u0026#34; class=\u0026#34;autoresize\u0026#34; /\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;gamename\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;/scratch-off/916/money-bag\u0026#34;\u0026gt;Money Bag\u0026lt;/a\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;gamestats\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;gamenumber\u0026#34;\u0026gt;\u0026lt;b\u0026gt;Game Number:\u0026lt;/b\u0026gt;916\u0026lt;/span\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;gameflags\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;/th\u0026gt; \u0026lt;/tr\u0026gt; This code allows JavaScript on the page to filter by price. But for our purposes, it allows us to determine the ratio of expected value to actual value. This is important because the highest expected value doesn\u0026rsquo;t necessarily mean it\u0026rsquo;s the best overall ticket to buy. By looking at the ratio, you can determine which one is best per dollar spent, which is the gold standard for the value.\nTo get this data, we can use BeautifulSoup to pre-process the HTML before using Pandas to extract the tables themselves. We can also use this to extract the name of the game itself as well as its number since the name is not necessarily unique, which Pandas wasn\u0026rsquo;t great at doing (or at least, I wasn\u0026rsquo;t able to figure out what incantations to cast for it to properly extract the data I wanted).\nwith open(\u0026#34;lottery-main.html\u0026#34;, \u0026#34;r\u0026#34;) as f: html = f.read() soup = BeautifulSoup(html, \u0026#34;html.parser\u0026#34;) for game in soup.find_all(class_=re.compile(\u0026#34;box cloudfx databox price_.+\u0026#34;)): # Extract ticket value and game name val = int(game[\u0026#39;class\u0026#39;][3].split(\u0026#39;_\u0026#39;)[1]) name = game.find(class_=\u0026#34;gamename\u0026#34;).text number = game.find(class_=\u0026#34;gamenumber\u0026#34;).text.split(\u0026#39;:\u0026#39;)[1].lstrip() Now that we have each game table extracted in the game variable, we can read it with a Pandas Data Frame. We have a function that strips the $ and , characters so we can interpret the currency fields as floating point numbers instead of strings. The tables also have a row at the bottom that gets interpreted incorrectly, so we can drop that with the dropna() function\ndf = pd.read_html( StringIO(str(game)), header=1, converters={\u0026#39;Value\u0026#39;: convert_currency} )[0].dropna() From this Data Frame, we end up with a table that looks like this..\n**Game Name: 200X The Cash** === ========== =========== ========== ========= N Value Odds 1 in Total Remaining === ========== =========== ========== ========= 0 5000000.0 2917430.00 6.0 1.0 1 100000.0 972476.67 18.0 1.0 2 50000.0 729357.50 24.0 0.0 3 10000.0 583486.00 30.0 2.0 4 5000.0 112208.85 156.0 2.0 5 1000.0 6002.94 2916.0 101.0 6 500.0 399.52 43814.0 989.0 7 400.0 253.63 69017.0 1588.0 8 200.0 54.52 321044.0 7600.0 9 100.0 25.00 700211.0 17134.0 10 60.0 37.52 466541.0 13772.0 11 50.0 13.63 1284102.0 35575.0 12 40.0 12.50 1400364.0 44344.0 13 30.0 10.00 1750264.0 77117.0 === ========== =========== ========== ========= This data gives us a good deal of insight into the game. For example, they don\u0026rsquo;t publish the total number of tickets printed, but if you multiply the odds by the total, you\u0026rsquo;ll find that you always end up with the same number. In this case 17,504,580 total tickets have been printed. This is crucial information because we can use the following to estimate how many tickets remain in the wild. We could calculate a margin of error here, but in this specific case, because of the large sample size, I\u0026rsquo;m just going to ignore it.\n\\[ \\frac {remaining_{prize}}{total_{prize}} \\cdot total_{tickets} \\]\nCrunching the numbers Now that we have our data in a reasonable format, we can extract the expected values. We can do this with the original data first as this will give us which game has the highest inherent value. Based entirely on the original published odds, we can calculate this directly from our table by simply dividing the first column, the prize, by the second column, the odds of this outcome.\ndef calculate_expected_value(df): \u0026#34;\u0026#34;\u0026#34;Calculates the expected value from a DataFrame of lottery data.\u0026#34;\u0026#34;\u0026#34; ev = 0 for row in df.values: ev += row[0] / row[1] return ev This raw expected value only applies when the game is initially printed. Much more interesting would be to see how these odds, and thus the expected value change over time. We can do this by implementing our estimated ticket totals and computing the adjusted odds based on the remaining prizes.\ndef calculate_adjusted_expected_value(df, total_tickets): \u0026#34;\u0026#34;\u0026#34;Calculates the adjusted expected value based on remaining prizes.\u0026#34;\u0026#34;\u0026#34; # Initialize the adjusted expected value (aev) to 0 aev = 0 original_count = 0 current_count = 0 # original_count = how many prizes we started with, current_count = how many prizes remain for row in df.values: original_count += row[2] current_count += row[3] # This extrapolated total is calculated from the ratio of prizes collected vs. remaining extrapolated_total = total_tickets * (current_count / original_count) # Now that we know the denominator of our adjusted odds formula, we can estimate the current odds for row in df.values: aev += row[0] * (row[3] / extrapolated_total) return aev From here, it\u0026rsquo;s pretty trivial to calculate the different ratios for original and adjusted expected value. Once we\u0026rsquo;ve gathered all of this data, we can stuff it into a simple array and sort it by the various metrics we care about. The complete code can be found in my GitHub repo, but I\u0026rsquo;m sure by now you\u0026rsquo;re ready for the results, so without further ado\u0026hellip;\nThe results So now that we have the data, let\u0026rsquo;s look at the results. In the table below, the columns are labeled as follows:\nActual - Cost in dollars Expected - Expected value, raw, in dollars Ratio - The dollar for dollar expected value Adj. Expected - Adjusted expected value, in dollars Adj. Ratio - Adjusted dollar for dollare expected value % Chg. - Percentage of the original expected value with the adjusted odds Printed - How many ticets were printed originally % Left - Percentage of the original print estimated to be left in the wild Name - Game name (and number). Note that the name can be re-used. The number is unique. N Actual Expected Ratio Adj. Expected Adj. Ratio % Chg. Printed % Left Name 69 $30 $24.08 0.803 $28.41 0.947 118.0% 17,504,580 3% 200X The Cash (826) 47 $50 $41.72 0.834 $44.77 0.895 107.3% 16,277,910 29% $10 Million Spectacular (913) 36 $10 $7.57 0.757 $8.53 0.853 112.7% 4,899,780 20% $1,000,000 Loteria (924) 43 $20 $15.50 0.775 $16.80 0.840 108.4% 6,142,230 36% $2,000,000 Diamond Deluxe (917) 57 $30 $24.22 0.807 $24.96 0.832 103.1% 11,910,930 24% Black Titanium (892) 62 $20 $15.45 0.773 $16.61 0.831 107.5% 7,177,860 23% $2,000,000 Riches (884) 63 $30 $23.97 0.799 $24.87 0.829 103.8% 16,674,390 36% $5,000,000 Ultimate (876) 0 $50 $41.02 0.820 $41.17 0.823 100.4% 15,211,320 96% $8 Million Money Maker (972) 55 $20 $15.48 0.774 $16.40 0.820 106.0% 6,392,820 28% Big Cash Payout (896) 9 $30 $24.09 0.803 $24.38 0.813 101.2% 11,117,700 86% Millionaire Bucks (952) 35 $30 $24.04 0.801 $24.37 0.812 101.4% 14,818,230 66% 200X The Cash (925) 53 $10 $7.43 0.743 $8.06 0.806 108.4% 8,398,980 18% Red Hot Millions (900) 59 $10 $7.51 0.751 $8.03 0.803 106.9% 10,375,800 15% Jumbo Bucks (888) 71 $30 $24.52 0.817 $23.97 0.799 97.7% 21,581,880 10% Millionaire Maker (774) 20 $30 $24.11 0.804 $23.77 0.792 98.6% 9,049,980 62% Supreme 7s (940) 28 $20 $15.45 0.772 $15.79 0.789 102.2% 6,918,420 57% Instant Millions (932) 50 $20 $15.41 0.770 $15.72 0.786 102.0% 7,411,590 58% Power 20s (904) 68 $10 $7.24 0.724 $7.80 0.780 107.7% 12,231,000 13% Scorching Hot 7s (830) 65 $20 $15.40 0.770 $15.56 0.778 101.0% 14,828,928 20% 100X The Cash (868) 17 $10 $7.58 0.758 $7.77 0.777 102.6% 4,840,740 56% $1,000,000 Cashword (943) 10 $20 $15.44 0.772 $15.37 0.769 99.6% 5,187,780 70% Win Big (951) 13 $10 $7.53 0.753 $7.61 0.761 100.9% 11,186,190 66% JUMBO BUCKS (948) 16 $20 $14.98 0.749 $14.98 0.749 100.0% 5,560,110 67% $50,000 Payout (944) 3 $20 $14.99 0.750 $14.84 0.742 99.0% 1,851,120 47% Merry Multiplier (958) 64 $10 $7.49 0.749 $7.38 0.738 98.6% 8,151,570 44% VIP Platinum (875) 58 $10 $7.54 0.754 $7.38 0.738 97.9% 8,092,680 19% Multiplier Mania (891) 48 $5 $3.45 0.689 $3.67 0.734 106.6% 7,347,960 12% Emerald 8s (912) 31 $10 $7.54 0.754 $7.32 0.732 97.2% 8,063,250 42% Ultimate Dash (929) 38 $10 $7.45 0.745 $7.28 0.728 97.8% 11,609,760 21% 50X The Cash (922) 4 $10 $7.26 0.726 $7.26 0.726 100.0% 3,683,890 35% Holiday Cash Blowout (957) 21 $10 $7.25 0.725 $7.25 0.725 100.0% 11,494,741 65% $80 Million Cash Blowout (939) 56 $10 $7.25 0.725 $7.21 0.721 99.4% 11,494,872 6% $80,000,000 Cash Blowout (895) 24 $10 $7.25 0.725 $7.16 0.716 98.7% 6,056,798 28% $2,000 Loaded (936) 70 $25 $18.90 0.756 $17.72 0.709 93.8% 11,936,490 5% Spectacular Riches (805) 32 $5 $3.45 0.690 $3.54 0.708 102.7% 10,294,080 46% $400,000 Jackpot (928) 66 $10 $7.24 0.724 $7.04 0.704 97.2% 9,636,435 18% Triple 777 (864) 18 $5 $3.45 0.689 $3.51 0.701 101.8% 6,157,620 44% GAME OF THRONES™ (942) 72 $25 $18.82 0.753 $17.41 0.697 92.5% 18,158,850 3% Extreme Cash (718) 67 $20 $15.61 0.780 $13.93 0.697 89.3% 5,292,420 9% Platinum (846) 60 $5 $3.45 0.690 $3.45 0.690 100.0% 10,614,000 8% Mega Bucks (887) 23 $5 $3.45 0.690 $3.45 0.690 100.0% 7,288,080 49% Super Loteria (937) 11 $5 $3.45 0.689 $3.44 0.689 99.9% 6,654,060 63% Ca$h Plu$ (950) 14 $5 $3.45 0.689 $3.42 0.685 99.3% 11,111,220 66% MEGA BUCKS (947) 37 $5 $3.45 0.690 $3.43 0.685 99.3% 7,319,040 34% Bankroll (923) 1 $5 $3.45 0.689 $3.42 0.684 99.2% 6,665,580 83% Diamond 10X (971) 12 $5 $3.45 0.690 $3.41 0.682 98.9% 6,907,740 77% Xtreme Cashword (949) 25 $5 $3.45 0.690 $3.40 0.681 98.7% 12,215,832 48% $500 Loaded (935) 5 $5 $3.45 0.690 $3.40 0.680 98.6% 4,661,700 39% Holiday Cash 50X (956) 51 $5 $3.45 0.690 $3.40 0.679 98.5% 8,034,240 30% Power Cashword (903) 52 $5 $3.45 0.690 $3.39 0.678 98.3% 7,755,780 38% Power 5s (902) 29 $5 $3.45 0.690 $3.38 0.676 98.0% 7,308,300 45% Red Hot Slots (931) 39 $5 $3.45 0.689 $3.37 0.673 97.7% 13,359,420 21% 20X The Cash (921) 2 $3 $1.99 0.663 $1.99 0.663 100.0% 9,272,900 95% LOTERIA® (959) 30 $3 $1.99 0.663 $1.99 0.663 100.1% 5,113,600 36% SKEE-BALL® (930) 6 $3 $1.99 0.663 $1.98 0.660 99.6% 3,246,500 49% Holiday Cash 30X (955) 15 $2 $1.33 0.663 $1.31 0.656 99.0% 13,336,350 71% Junior BIG OL\u0026rsquo; BUCKS® (946) 49 $3 $1.99 0.662 $1.96 0.654 98.8% 9,871,600 28% Loteria (911) 41 $2 $1.33 0.663 $1.30 0.652 98.4% 12,154,800 29% 10X The Cash (919) 7 $2 $1.33 0.663 $1.30 0.648 97.7% 4,514,400 53% Holiday Cash 20X (954) 26 $2 $1.33 0.663 $1.28 0.641 96.7% 8,404,497 39% $100 Loaded (934) 33 $2 $1.33 0.663 $1.26 0.631 95.1% 7,211,100 32% Payday! (927) 61 $2 $1.33 0.664 $1.22 0.609 91.7% 14,442,000 18% Junior Big Ol\u0026rsquo; Bucks (885) 22 $5 $3.45 0.689 $3.04 0.608 88.3% 6,149,880 14% Triple Red 777\u0026rsquo;s (938) 40 $3 $1.99 0.663 $1.81 0.604 91.0% 7,213,600 18% 15X Cashword (920) 42 $1 $0.61 0.608 $0.60 0.604 99.3% 14,334,900 25% 5X The Cash (918) 19 $1 $0.60 0.605 $0.60 0.602 99.4% 8,606,100 53% Tic Tac Bonus (941) 46 $2 $1.33 0.663 $1.20 0.599 90.4% 6,661,050 10% Triple Winning 7s (914) 54 $3 $1.99 0.663 $1.78 0.594 89.6% 4,933,300 11% Lucky 7s Cashword (898) 8 $1 $0.60 0.605 $0.59 0.590 97.5% 6,346,800 60% Holiday Cash 10X (953) 44 $5 $3.45 0.689 $2.94 0.588 85.3% 4,938,360 7% Money Bag (916) 45 $5 $3.45 0.689 $2.89 0.578 83.9% 4,898,640 12% Pot of Gold (915) 27 $1 $0.60 0.605 $0.55 0.554 91.6% 8,939,374 27% $50 Loaded (933) 34 $1 $0.61 0.608 $0.54 0.536 88.1% 7,322,700 19% Lucky 7s (926) Conclusions In running these calculations, I\u0026rsquo;ve run across some really interesting features of these games.\nFirst of all (and most obviously I would hope), the expected value will always be less than the ticket initially. However, and this is another fascinating facet of this exercise, the vast majority of the value of these tickets does not come from the top prize. Instead, the lower tier prizes have the highest impact, proportionally, on the value of the ticket itself. Let\u0026rsquo;s look at our top performer at the moment, 200X The Cash (826).\n+---------------------------+ | 200X The Cash (826) - $30 | +---------------------------+ Original E[x] ------------- $5,000,000 (1:2,917,430) -\u0026gt; $1.71 $100,000 (1:972,477) -\u0026gt; $0.10 $50,000 (1:729,358) -\u0026gt; $0.07 $10,000 (1:583,486) -\u0026gt; $0.02 $5,000 (1:112,209) -\u0026gt; $0.04 $1,000 (1:6,003) -\u0026gt; $0.17 $500 (1:400) -\u0026gt; $1.25 $400 (1:254) -\u0026gt; $1.58 $200 (1:55) -\u0026gt; $3.67 $100 (1:25) -\u0026gt; $4.00 $60 (1:38) -\u0026gt; $1.60 $50 (1:14) -\u0026gt; $3.67 $40 (1:12) -\u0026gt; $3.20 $30 (1:10) -\u0026gt; $3.00 You can see that the biggest source of expected value is actually the $100 prize. I also find it interesting that the prizes from $1,000 to $100,000 add the least value to the ticket, leaving a trough of low value prizes near the top of the ticket. This bottom heavy distribution will help to even out the variation in expected value as the game goes on.\nI hypothesize that this is done in order to drive sales of lottery tickets. Put simply, you need people to win, otherwise people won\u0026rsquo;t buy. If you scaled the odds such that each prize contributed exactly the same value to the ticket as the top prize, you would have much longer odds for the low valued prizes. If people don\u0026rsquo;t win, they won\u0026rsquo;t play. So it is to the benefit of the game makers to make those low value prizes much more likely. If your neighbor, or someone in your family wins $200 playing 200X The Cash, you\u0026rsquo;re going to be more likely to buy one.\nAs the game goes on, however, the weight of each prize category does change, and can have an impact on the expected value of the ticket. Assuming a totally random distribution, it\u0026rsquo;s conceivable that the game value would increase and eventually exceed 1. The current best valued ticket is close to 1, mainly because the top prizes have begun to exceed their normal likelihood of occurring, and therefore are becoming one of the dominant factors in the expected value formula. The $5M prize started with very low odds of 1:2,917,430 and so the proportional value it lent to the ticket was low, $1.71. But, as you can see in the output below, the odds have greatly increased for the top prize as only about 3% (estimated) of the original games printed are left in the wild. Now the $5M grand prize is the dominant factor in the overall expected value at a whopping $8.81.\n+---------------------------+ | 200X The Cash (826) - $30 | +---------------------------+ Adjusted E[x] ------------- $5,000,000 (1:567,219) -\u0026gt; $8.81 $100,000 (1:567,219) -\u0026gt; $0.18 $50,000 (INF) -\u0026gt; $0.00 $10,000 (1:283,610) -\u0026gt; $0.04 $5,000 (1:283,610) -\u0026gt; $0.02 $1,000 (1:5,788) -\u0026gt; $0.17 $500 (1:584) -\u0026gt; $0.86 $400 (1:365) -\u0026gt; $1.10 $200 (1:76) -\u0026gt; $2.63 $100 (1:34) -\u0026gt; $2.97 $60 (1:42) -\u0026gt; $1.44 $50 (1:16) -\u0026gt; $3.09 $40 (1:13) -\u0026gt; $3.08 $30 (1:7) -\u0026gt; $4.04 You can see how, as the game gets closer to being sold out, it\u0026rsquo;s possible for the high value prizes to start dominating the equation and eventually could go over $1. If this happens, it would theoretically be in your best interest to buy out the rest of the game because you could expect on average to make your money back. Of course in practice, this would be a pretty terrible decision as it would necessitate you winning the only remaining $5M prize to even stand a chance of breaking even. At $30 per ticket, and some half a million tickets remaining, this is obviousy an enormous gamble.\nThis isn\u0026rsquo;t exactly ground breaking research here, but it was a fun excercise and bears out the wisdom that it really never will pay off to play the lottery. I hope you enjoyed this diversion as much as I did. If you want to see the full results without running my code, you can download the full text document here.\n","date":"2024-12-16T00:00:00Z","image":"https://blog.gizmonicus.org/posts/nc-education-lottery/cover_hu_2e4b3def2fb0ba59.png","permalink":"https://blog.gizmonicus.org/posts/nc-education-lottery/","title":"Applying Game Theory to Scratch Offs"},{"content":"I\u0026rsquo;ve not been heavily focused on my digital life lately. But with the season change, comes a shift in focus. The colder weather and disrupted work schedule leads me to spend more time at home in front of a the computer. While I\u0026rsquo;m still riding the bike (see my 360 project videos on my YouTube channel or Instagram), I\u0026rsquo;ve come to the conclusion that I should ditch the traditional forms of social media, for an even more traditional social platform: just having a website.\nWhile I really enjoy being spoonfed dopamine hits in the form of short, bite sized video clips and I fall victim regularly to flamewars in the comments section (and I really do enjoy the flamewars, especially against illiterate morons who can\u0026rsquo;t compete with actual sentences and salient points), it\u0026rsquo;s not good for my mental health. So while I\u0026rsquo;m not ditching algorithmic brain rot entirely, I\u0026rsquo;m cutting down on my Facebook/Insta/YouTube consumption to focus more on creative outlets.\nFirst thing\u0026rsquo;s first, though. I have a mountain of side projects, half finished code, abandoned git repositories, and computer parts laying around that need to be sifted through, organized, and probably most of it needs to be trashed.\nStarting off, clean up BitBucket repos. I have TONS of old repos laying around doing nothing. Time to let go.\nblog - This used to be a Jekyll site, but I have no love for Ruby. I\u0026rsquo;ve transplated the posts here. ansible - Too confusing. I have another one I use for work that I don\u0026rsquo;t want to mix up. I\u0026rsquo;ve moved it to the aptly named Gentoo repo. aur - I\u0026rsquo;ve ditched Archlinux (maybe one day I\u0026rsquo;ll get around to writing about it) so this one can go. It\u0026rsquo;s all old crap anyway. circuit - OK, this one can stay, but only because it was fun to write. This is a python script that generates a random circuit workout based on some parameters you pass via yaml file. I like it, but my workouts are a lot simpler and more effective these days. p3n15bot - I\u0026rsquo;m keeping this one for posterity too, lol. This was for an old Reddit gag where I wrote a bot that monitored the Cycling sub reddits and shitposted about my numb penis whenever someone mentioned the words \u0026ldquo;numb\u0026rdquo;, \u0026ldquo;penis\u0026rdquo;, \u0026ldquo;perineum\u0026rdquo;, or some other keywords. They really can\u0026rsquo;t shut up about their numb taints over there. gojo - Failed project where you could put together your own SGF files from your Go games for later evaluation. Too many things already do this. Also, I\u0026rsquo;m hopelessly lost trying to do GUI work. I\u0026rsquo;ll let the experts do this one. I did have some good ideas I would like to see implemented elsewhere, like \u0026ldquo;Game memorization (play out X moves, then have user repeat, increase X dynamically)\u0026rdquo;. I like this idea. ecr-proxy-node - I should save this one. I used this as a way to proxy connections to AWS ECR without using access keys. As it turns out, they support public repos now so this is obsolete. puppet - Eww, I hate Puppet. As far as configuration management goes, it\u0026rsquo;s really great, but way too complicated for the vast majority of users. I\u0026rsquo;d say unless you\u0026rsquo;re managing a fleet of thousands of machines, you can easily get away with Ansible for the majority of daily tasks at a tenth of the effort. rm -rf openshift-dev - Wow, I almost forgot about this one. Apparently a Vagrantfile that configured an OpenShift Origin cluster. What a nightmare that software is. Not that it isn\u0026rsquo;t good, but you have to be dedicated to maintaining it or you\u0026rsquo;ll get bitten for sure. Also, the Ansible playbooks used to install this software is scary to use. Keeping for the Vagrantfile code. fp101x - Keeping this one. At one point I took a MOOC on EDx about functional programming with Haskell. Highly recommend. I can\u0026rsquo;t write Haskell anymore, by the way, but it is a really neat language. scripts - Wow, I remember this one. I have since replaced it with \u0026ldquo;snippets\u0026rdquo; which more accurately describes the purpose. I\u0026rsquo;m looking at the shell script I used back in 2015 to check on the status of various services at work and report back. I think this from when we upgraded the core routers to the Nexus series. Lazy me didn\u0026rsquo;t want to do all of the verifications by hand, so I wrote a script. This one\u0026rsquo;s a keeper. computer_systems - This one went with a book I have collecting dust on my shelf. Maybe one day I\u0026rsquo;ll get to it, but it only has one bit of C code in it. Toss. ","date":"2024-12-13T00:00:00Z","image":"https://blog.gizmonicus.org/posts/digital-dust/cover_hu_b5fa8ef8713910c7.jpg","permalink":"https://blog.gizmonicus.org/posts/digital-dust/","title":"Digital Dust"},{"content":"Cover image courtesy of Andreas Lakso via Wikimedia Commons\nIn case you need a TL;DR from the first part of this story.\nLogs are life First, like any good sysadmin, I love logs. This was no exception. I installed adb on my laptop and dumped the logs like so:\nadb logcat | grep NfcService Now that we can see what\u0026rsquo;s really happening here, let\u0026rsquo;s find out what happens when we lock the screen\n02-24 23:13:24.636 9863 10145 D NfcService: applyRouting - enter force = false mScreenState = 1\n02-24 23:13:24.636 9863 10145 D NfcService: applyRouting\n02-24 23:13:24.637 9863 10145 D NfcService: setScreenState=OFF 0 02-24 23:13:24.655 9863 10145 D NfcService: computeEmulationParameters\n02-24 23:13:24.655 9863 10145 D NfcService: configure EE routing\n02-24 23:13:24.655 9863 10145 D NfcService: configure HCE routing\n02-24 23:13:24.655 9863 10145 D NfcService: NFC-HCE OFF\n02-24 23:13:24.678 9863 10145 D NfcService: configure routing table false\n02-24 23:13:24.678 9863 10145 D NfcService: computeDiscoveryParameters\n02-24 23:13:24.678 9863 10145 D NfcService: NFC-C OFF\nAs expected, the logs show that when the screen gets turned off, the NFC polling features also get turned off. NFC-C and NFC-HCE are both off now. So now let\u0026rsquo;s find out what happens when the screen is on, but locked.\n02-24 23:22:40.862 9863 16366 D NfcService: applyRouting - enter force = false mScreenState = 2\n02-24 23:22:40.862 9863 16366 D NfcService: applyRouting\n02-24 23:22:40.862 9863 16366 D NfcService: setScreenState=ON_LOCKED\n02-24 23:22:40.890 9863 16366 D NfcService: computeEmulationParameters\n02-24 23:22:40.890 9863 16366 D NfcService: configure EE routing\n02-24 23:22:40.890 9863 16366 D NfcService: configure HCE routing\n02-24 23:22:40.890 9863 16366 D NfcService: configure routing table false\n02-24 23:22:40.890 9863 16366 D NfcService: computeDiscoveryParameters\n02-24 23:22:40.890 9863 16366 D NfcService: Discovery configuration equal, not updating.\nInterestingly, we don\u0026rsquo;t see any indication that the NFC polling features are turned on. Also, the \u0026ldquo;Discovery configuration equal, not updating\u0026rdquo; message seems to indicate the polling state should remain the same. So finally, let\u0026rsquo;s see what happens when the screen is turned on.\n02-24 23:27:19.930 9863 9973 D NfcService: applyRouting - enter force = false mScreenState = 3\n02-24 23:27:19.930 9863 9973 D NfcService: applyRouting\n02-24 23:27:19.931 9863 9973 D NfcService: setScreenState=ON_UNLOCKED\n02-24 23:27:19.931 9863 9973 D NfcService: computeEmulationParameters\n02-24 23:27:19.931 9863 9973 D NfcService: configure EE routing\n02-24 23:27:19.931 9863 9973 D NfcService: configure HCE routing\n02-24 23:27:19.931 9863 9973 D NfcService: NFC-HCE ON\n02-24 23:27:20.003 9863 9973 D NfcService: configure routing table false\n02-24 23:27:20.003 9863 9973 D NfcService: lockscreen ON_UNLOCKED, force NFC enableDiscovery()\n02-24 23:27:20.003 9863 9973 D NfcService: computeDiscoveryParameters\n02-24 23:27:20.003 9863 9973 D NfcService: NFC-C ON, shouldRestart=false\nClearly, NFC is now on. What this tells me is that the smart lock feature would likely work, if only NFC polling were enabled when the screen is in a locked, but on state. There are some clues as to what methods and classes we need to look at here, so the next step is to track this down in the source code.\nSpelunking in Java code You could start by downloading the Android source tree, but that is a bit overkill for this fix. Instead, I found the source in a handy online browser here.\nThere are all kinds of methods you could use to track down a problem in a large code base, but I find the most reliable way is to locate the source of an error by grepping for the print statement that generates the debug messages we see above.\nThe Fix Update from 2024: At some point I must have stopped writing this blog or lost the rest of what I intended to write. Which is really too bad considering I did end up finding the source code for my fix, which did definitely work. Unfortunately, that was 7 years ago me and I remember nothing about that guy. And apparently he was some kind of savant because the code is completely incomprehensible. But in case you want to peruse it yourself, I published it on Bitbucket.\n","date":"2017-02-24T00:00:00Z","image":"https://blog.gizmonicus.org/posts/nfc-screen-lock-part2/nfc-tag_hu_4925d4b37e095b9d.jpg","permalink":"https://blog.gizmonicus.org/posts/nfc-screen-lock-part2/","title":"Android NFC Screen Lock (Part 2)"},{"content":"Cover image courtesy of VampishBowl via Wikimedia Commons\nThis post is more about the saga of my NFC screen lock problems. For the TL;DR version with technical details, check out this page instead.\nSo I had this idea the other day for unlocking my phone with an NFC token. I like to use strong passwords everywhere I can, and since my phone is no exception, I spend a lot of time typing out my password. Wouldn\u0026rsquo;t it be great if you could bypass that so long as you have a special key? I thought, surely this can\u0026rsquo;t be the first time someone thought about doing something like this. As it turns out, I was right. There is a neat feature with Android phones (kit-kat and later) called \u0026ldquo;Trusted Devices\u0026rdquo;. This is part of the Smart Lock feature that gives users the ability to unlock their phone with things like their face, or voice, or even when their phone is in a certain geographical location. NFC tags are really cheap, so I went ahead and bought a 10 pack of wristbands for $15. I chose the wristbands because I felt that it was unlikely I would lose my phone at the same time my wristband fell off my wrist spontaneously without my noticing it. Also, it is in a really convenient place for unlocking your phone.\nYou can imagine my frustration when I set up trusted devices with smart lock and\u0026hellip; nothing happened. It doesn\u0026rsquo;t work. At all. OK, no problem, I can fix this, right? I verified I had Google Play services set enabled as a trust agent. I made sure NFC was enabled (yes, it works with the screen on, so I know it and my tag both work together). I tried rebooting. I tried rebooting after turning NFC off and on. I tried rebooting after turning Smart Lock on and off. The list goes on. After several hours of dissilusionment, I got it into my head that I will make this work. As with many technical problems I have faced during my career, I would not let this simple thing defeat me. So with that resolution, I proceeded to bring out the big guns.\nStep one was to eliminate the custom ROM from Verizon/HTC that I really didn\u0026rsquo;t like anyway. I have long since tired of looking at the NFL app in my apps list, especially since I will never use it. Yet I can\u0026rsquo;t remove it. That and I absolutely hate the HTC contacts list, photo app, keyboard, pretty much everything about HTC Sense from the day I bought this phone and I cannot supplant it with the default Google apps that are much better anyway. My phone is S-ON, meaning I can\u0026rsquo;t flash the bootloader, so I needed to find a way to rid myself of this annoyance. Enter Sunshine. Sunshine is a paid app that does a surprisingly good job at jailbreaking your phone. I was wary about paying for this app, but at this point I was already invested so I pulled the trigger. Sure enough, it did exactly as advertised. Win!\nAs an aside here, it is worth noting that I have never actually been inclined to root my phone before this incident. I guess I didn\u0026rsquo;t like the prospect of bricking the phone and having to buy a new one, or maybe there just wasn\u0026rsquo;t enough of an incentive. Anyway, back to the story.\nNow what I asked myself? Well, first step is to install Team Win Recovery Project in the recovery partition on my phone. This would allow me to load custom ROMs, make backups of my existing OS, and so on. It is really a great tool and I am very happy that I have finally taken the plunge to modify my phone at this point. With TWRP happily installed on my recovery partition, I grabbed the latest version of the Google Play Edition ROM for my phone and installed it. The ROM I found had several options, stock with no root, rooted with traditional method, rooted with systemless method. At this point I thought the issue was with HTC\u0026rsquo;s nightmare customizations, so I didn\u0026rsquo;t root the phone. Eagerly I configured trusted devices and\u0026hellip; nothing, yet again.\nThis time I broke out ADB and decided to do some digging. Obviously something was wrong here. Running logcat, it became readily apparent what the problem was. On my phone, for some unknown reason, whenever the screen locked, but was still on, the NFC functionality was disabled; you can see the NFC radio being shut off in the log messages from logcat. So obviously it wasn\u0026rsquo;t going to work, even if trusted devices was working as expected. The problem is, I could not find any way to disable this behavior. To my knowledge, this is either a bug, or a poorly designed security feature. Either way, at this point I was in a borderline murderous rage at the amount of time I had already sunk into getting this simple feature working with absolutely no results and no idea where to go next.\nBack to TWRP I went, this time to root my phone for lack of a better option. I know almost almost as little about Android as your average consumer (a blindspot I was beginning to regret around this time) and I was hoping my linux knowledge plus root would bail me out. As I was rooting my phone, I noticed an option for installing the Xposed framework with a little blurb about modules and modifying core behavior, etc. \u0026ldquo;Hey, this might be the ticket\u0026rdquo; I thought, so I Googled it. Low and behold, not only is it this super cool framework for modding your phone, but someone had already written a module for fixing this exact problem! So away I went, installing the new OS with root and the Xposed framework, downloaded the module and rebooted my phone and\u0026hellip; of course it didn\u0026rsquo;t fucking work.\nI did some spelunking on the god-awful forums that comprise the online Android community. Seriously, they\u0026rsquo;re awful: 80/20 advertisements and bogged down with idiot consumers wanting to know how they can root their phone so they can be 1337 haxxors with modded phones, or something like that. Anyway, after some time I came across an updated version of the Xposed module I had found before from a developer named Nephiel. Don\u0026rsquo;t be surprised, this module also didn\u0026rsquo;t work either, BUT, it was updated enough that I thought I could use it as a starting point for the work I needed to do. So I had to learn yet another new technology, Android Studio.\nIn order to fix the code that was broken and make the changes I needed, I had to use Android studio to package up the application as an APK that could be installed on my phone. I haven\u0026rsquo;t used an IDE like Android Studio since college, which was the last time I touched Java too.\n","date":"2017-02-22T00:00:00Z","image":"https://blog.gizmonicus.org/posts/nfc-screen-lock-part1/android_hu_dc97e313eef7098a.jpg","permalink":"https://blog.gizmonicus.org/posts/nfc-screen-lock-part1/","title":"Android NFC Screen Lock (Part 1)"}]