Zig doesn't have a formal interface (java, c#) or trait (rust) construct. However, they're very important when a function needs to take one of multiple concrete types which have a certain behavior. There is still a way to do this in zig, and I've built a contrived example to share.
Throughout the process of working on a side project, I got interested in putting an ARM microcontroller into the deepest sleep for the best power savings. I believe this is how things like your TV remote can last for years on two AAs. I'm using rust right now for an embedded electronic project with the blue pill development board, and I got deep sleep (standby) working, so I trimmed the code and will paste it here.
Every once in a while my gaming group decides they want to sit back, relax, and chill on a little Minecraft. It's not often, so paying for a full time dedicated server doesn't make sense. And joining a local session can be tricky with routers, ISPs, firewalls, and VPNs. Why not try to make a dedicated server which only runs when people want it to?
Family photo and video memories are pretty priceless, and the only effort I had put into saving copies was copying them from SD cards to an old portable hard drive. While a good option to begin with, these hard drives can fail, and are pretty susceptible to damage from kiddos and house fires. So, to the cloud with them!
I was honored to be asked to build an urn for my Great Uncle Lewis, who everyone called Babe. The man was a smart guy, principled, and a woodworker himself. His wit would always catch me by surprise even in his later years. He told me often of stories about building his house by himself. You know, I wish more people were like Babe.
I started another web app side project which has been an exploration of both new and familiar frameworks. One of the new frameworks is warp which is a web framework for rust. I've used a few rust web frameworks before: namely iron, nickel, rocket and actix-web (the metal-like naming pattern made me chuckle). This time I was going to give it a go with warp.
Sometimes I go down these rabbit holes and get obsessed for a week or two. This time, I started making camp stoves out of pop cans! I don't intend this post to be a DIY instructional but instead I wanted to share my
Tonight I worked on getting an external interrupt (EXTI) on my blue pill working with the press of a button. I achieved this by looking at the source of many repos, Googling for examples without much luck, watching a YouTube video, and reading the 1100+ page datasheet on the STM32F103 microcontroller. I hope this blog post will help another dev skip some of these steps.
I had this goal of making a web app that was very fast, stable and easy to deploy. This is what I was hoping to accomplish: strongly typed server-side and client-side languages (Rust & Elm respectively), push-button deployments to the cloud with free hosting initially, and sub-second response times for API calls and page loads. With this setup, I think I'm well on my way to accomplishing each of these.
I just got an exciting new job where I'll be working from home 4 days a week. For the last 6 years, my home desk has been comprised of a half-size folding card table. It was pretty much the cheapest thing my recently-graduated self could find which could support a couple monitors and a keyboard. Now with a full time job working from home, I wanted to step it up in the home office department.
The Phoenix web framework by default ships with every page including one js file:
app.js. I am playing around with a web application which is more traditional in the sense that it's not a single page application. Beacuse of this, I didn't want a global js file, I thought the best way to go about it would be one global js file which everything requires, and then a few page-specific js files. This post explores how I went about it.
After attending a talk at That Conference about static sites, I decided to take the plunge and convert my personal website to a static website hosted in the cloud on a server I don't administrate or pay for.
Building and using the coffee table has been great, but there were still times when end tables next to the couch and love seat were needed. Drawers in these end tables would be especially nice to hide away TV remotes and game controllers. With these minimal specifications in mind, I decided to start building a set of two end tables.
I chose a big project to kick off 2017. A rocking cradle for our baby due Mar 28 of this year. I started in the beginning of January and finished half way through February. This was one of my more complicated builds, but it came out very well and will be a family heirloom for generations (hopefully!).
There was a bit of a void in our living room - a big open carpet with a couple small ottomans. When Kaytee and I bring food to the living room to eat, we're often balancing plates and glasses on cushions which is a recipe for disaster. The vital living room piece of furniture that was missing was a coffee table. A squatty and small table for holding food, drinks, books, puzzles, remotes and everything else. I believe adding one of these to our living room will make it much better for... living.
In May I was able to finish up the remaining three kitchen stools. The first blog post on the stools goes over the motivation, design, and build process. In this blog post I want to use pictures and words to explain the build process more in depth. I especially want to pay attention to the hand cut half lap dovetail joinery on the crossbars. I'll also touch on the jigs I used and made for this build.
The #GetWoodworking week was created a few years ago when trying to answer the question: "how can woodworking be saved?" Today, those of us who do woodworking are encouraged to blog, invite people to build things and help close the learning gap some when it comes to new woodworkers. I decided to blog on how I got started in the hobby.
Our kitchen island is lacking seating. With some stools it'd make a great breakfast area or anytime eating area. We did have one stool but a set of four matching stools would be great. I thought this would be a project that I could take on. I've been able to get a ton of walnut from my dad who had some sitting around in the shed between tractors. I thought walnut would make some beautiful stools and it matches the darker wood of our flooring.
I spent the last couple days trying to build a very minimal and simple grid in WPF. There was no style to it other than the headers were underlined text. No grid lines, no header background color, no hovering triggers. This proved to be a difficult task. Here was my end goal:
Throughout the process of building my woodworking workbench, I looked at quite a few quick release front vises before choosing one. I wanted a quick release vise so I wouldn't spend my afternoons turning the handle when switching from a wide piece of material to a thin one.
For fine woodworking, and especially working with hand tools, a heavy, flat workbench with abundant clamping facilities is crucial. All my projects until now have been built on a flimsy table saw outfeed table. If I'm chopping with a chisel or sawing with a hand saw, the table surface would flex and bounce. Any time I need to hold a piece of material still while sawing, I was using metal clamps - sometimes rigging up multiple clamps when the material needed to be vertical. So given the play of using multiple clamps plus a foundation which isn't even rigid, it leads to vibrating workpieces, rotating under clamps, and chisels which don't chop easily.
The second pieces of finished fancy furniture (after the nightstands for the house I'm planning are a set of four stools for our kitchen island. I designed these stools so they could be built without the use of any screws or nails. Just good joinery and glue. This uses the geometry and properties of the wood to strengthen the design and will hopefully make these pieces of furniture last a very long time. Half lap dovetail joints also add a certain beauty to the piece. Here is my initial design.
I was finally able to finish my first piece of furniture which will go inside the house and hopefully fit in without looking like an amateur DIY. I followed a plan from Black & Decker Easy Wood Furniture. This build involved a lot of gluing pine boards edge to edge. Many pieces are required to be 14" wide. I think the largest piece was the back at 14"x19". I bought two 1x10" and four 1x6" pine boards. The only other pieces were hardware: an outlet, extension cord, a drawer slide, and a drawer knob.
I thought "Firewood Holder" wasn't elegant enough, so I went with the above name. My new house has a beautiful patio with a fire pit. However there was no way to store firewood other than throwing it all on the ground around the pit. Another option would be bringing the appropriate amount of firewood from the garage every time we want to fire it up.
Table saw built!
Kaytee and I just moved into our new house. It's the first house/property that either of us have owned, and describing that process probably deserves a post by itself. However I'm not sure I'd love writing that though as it's been a multi-month process, and I'm sure I'd leave things out.
In January through April of 2015, I attempted to fill in a gap which I thought was missing in the area of digital note-taking. I have recipes I want to remember, general to-do lists, packing lists for camping and hunting which could come in handy in the future, a wish list, work notes, journals and more. Although there are several note-taking applications out there, I wanted something a little different than what they all offered. Here is my list of requirements:
note: Out of date. I'm now using cobalt, and that transition is outlined here
A few months ago, I wrote an end user application using rust which has a GUI (a console GUI!). The application does what many others have done before it, but it was a good learning process, and it ended up extremely fast and fairly easy to use. It simulates rolling die (randomly generating numbers) in a useful way for those playing table top games. I had a few goals at the beginning:
As of writing this, I'll be moving soon. In 1 month, Kaytee and I will be closing on a house. I've started to accumulate many small tools: files, rasps, wrenches, pliers, hand planes, squares, levels, boxes of screws and nails, etc. Too many small tools to fit into just one toolbox. I decided it was time to design and build a life-long lasting toolbox. It will be very valuable when moving all these miscellaneous tools and come in handy whenever I need to work on something away from my shop. My first toolbox was given to me by my Uncle Rick. For the first of my wood projects, I used software as the designing medium, specifically SketchUp.
I've been building a robot in my free time for some fun. Recently someone came to me and asked if I'd write up a parts list so others could create a similar robot of their own. Well this is a great idea. I should probably also open source/publicize the code, which has been written in python as of now. That will be step number two. So lets get onto the juicy parts:
Lately I've been exploring the language of rust. I've really been enjoying getting back to the lower level style of a systems programming language. Rust has a lot of unique advantages over its competitors like C/C++, Go, D, and others as you can read about in other blog posts after a couple Google searches. After doing the first ~30 Project Euler problems in rust (github repo), I started to get a decent handle on the language in its current state (the language is constantly evolving).
A side project I'm working on called for some form of authentication on top of a Play! Framework project. I've decided to use the securesocial library so I don't need to redesign the wheel. I'm using a MySQL database in the background, and securesocial needs some way to persist user data. The only data persistence code that comes along with it is an InMemoryUserService.scala. As the name suggests, all user info is just stored in memory with this method. I needed a way to persist it in MySQL, and after a bit of Googling, I couldn't find a database initialization script for the securesocial identity model. This is the main purpose of this post.
In case you're interested, here's Part 1. Project Completed! Since this wasn't the most complex project, it looks like I'm only going to have 2 parts. I was able to (with some assistance) solder all the components to the board, and the first time testing revealed that everything had been soldered correctly! Normally this doesn't happen and I'm left having to clean up some mistakes which isn't very easy when soldering is involved.
In case you're interested, here's Part 2. It's time for another project! This time I'm going to be installing an active heating system in my dog's house because there are many times where the passive system (straw bedding) doesn't quite do it for him when I'm off at work during the middle of a Wisconsin winter. I'm going to be using an infrared heat lamp as my heating source and an ATTiny44 which will act as a thermostat to turn on and off the lamp depending on temperature. This should maintain the temp pretty well on those cold days.
My friend Eric Johnson and I went on a short backpacking trip through the Chequmagon Nicolet National Forest Medford section this last weekend, and had a pretty good time. I took along a notebook and pen to write down some notes and also took my old Kodak camera to take some pictures. This post will try to merge the two and hopefully lead to an interesting read.
As if I didn't have enough hobbies, a new one has been added to my list this summer, and that is backpacking. I've never officially backpacked yet, however my friend Eric and I do have a plan to hike 15 miles over 2 days through the woods in the Chequamegon Nicolet National Forest. To be more specific, we'll be doing the southern section of the Ice Age Trail that runs through the Medford district of that forest. This is scheduled to happen 8/2/2013 - 8/4/2013 and will be a great way to test our equipment. Speaking of equipment, let me give you the rundown.
As a tech dude, I like having access to the wide world of information from right in my pocket. I've reinforced this fact about myself over the last month during which I've been using an old Sanyo SCP-3100. My last smart phone, the HTC Evo 3D died about a month before my 2 year contract with Sprint was up. I've been using Sprint's unlimited everything plan for the last two years, and it's been going fine except that it's slightly more than I'd prefer to pay. With a 20% discount from my employer, I was still paying ~$73/mo for this plan. After doing some research, I found Straight Talk which offers an unlimited talk/text/data plan for $45/mo. So this blog post expands on the details involving switching between these two providers.
Backpacking. Linux. Two things that one normally wouldn't read about in one blog post. And probably not even normally in two posts by one author. But get ready for some mind blowing content because I plan on talking about the great hobby of backpacking and Linux.
Have you heard of LINQPad? Have you used it? If not, its website defines it as
Over the last week I've been working on getting my Arch Linux installation finalized. One of the latest things I've been trying to do is get USB storage devices to auto-mount when they're plugged in the computer. This is useful for flash drives, removable hard drives and SD cards (through a USB reader). I posed a question on http://reddit.com/r/archlinux revolving around this subject and what services people use for this sort of thing. One user answered with a service called ldm (lightweight device mounter).
It's been a while since I've posted to my site. I thought it'd be a good idea to check in. Currently I'm still learning the Scala language with Programming in Scala (2nd Edition), and now I'm also taking a free online class through Coursera taught by the creator of the language: Martin Odersky. Along with learning through the book and the course, I really like to see the application side of the language. So when learning a new language, I'll tend to create some apps that don't really do much.
A coworker recently introduced me to a new programming language. My usage of the word introduced is a little off. He briefly mentioned the word "Scala" in passing saying that he was starting to move his personal Java applications to it. I take this guy as a pretty smart guy so I decided to look into it. Little did he know that this would become my obsession for the last 3 weeks and for however long.
It's been a great summer so far. I've been learning a ton at work and at home. At work we've managed to switch the system we're using as the front end of our huge project 2 times meaning we've started 3 times! The latest switch has been in the direction of native mobile development, which is exciting. �At home I've been straying away from the physical computing side and experimenting with java RESTful services. That's been an interesting journey. I've ended up using Eclipse as an IDE, Apache Tomcat 6 server for hosting, Jersey for the Java RESTful implementation, and the Jackson JSON converter for input/output. With all these technologies together, I've started to build a pretty decent service oriented web API.
This year I was lucky enough to get a tax refund and I've been wanting some tools for a while so I decided to splurge on some nice cordless power tools. I got a set of Milwaukee Lithium 18V tools that include a hammer drill, circular saw, sawzall, and flash light. You can buy additional tools/batteries for this set and they're supposed to last quite a while.
an easy way to see your busy week
Welcome to my new WordPress-based website! I'll be converting my old custom-built website (@ ethanfrei.com) to use this nice open source content manager. It's not only to make my life easier when �updating the site, but also to learn the inner workings of WordPress so that I can add this great piece of software to my tool box.