3D Printing Plumbing Tools

published on 2018-02-17 in howto

This weekend, I was doing a little kitchen faucet replacement and ran into some trouble removing the old Moen hardware. Moen faucets come with this install tool that's similar to a thin-wall deep socket but longer, thinner, and completely hollow. And, I’ve learned if you don’t have the tool, it’s neary impossible to remove the faucet without damaging the sink. Especially when it's 20 years old and corroded like the one I'm removing. Earlier this week, I had tried in vain to remove it without the tool...and ended up at Home Depot advicing with the plumbing dude, who sold me a tool that would definitely do the trick. Fast forward to today, I have the sink tore apart, discovered the HD basin wrench is hopeless for the Moen faucet, and realized the only way to remove this thing is to buy a $17 plastic tool from Moen (part # 118305)...that I’ll never use again. It looks like one of these, my faucet probably came with top right:

This tool is not available anywhere locally. The fastest I could get it here is next week, which means I have to reassemble everything so the family can use the kitchen in the mean time. I confessed to my wife the situation I'd created, and was considering drastic measures aka. brute force, without the tool (miserable). She asked what the Moen tool looked like - when I told her it was a plastic tool, she said "Plastic? Why don't you just print one?" Damn, I wish I'd thought of that earlier! 😍

So, set to work immediatly to make my own. I did some measuring & designed one in OpenSCAD. Mine has a 1/2 socket in the bottom for a wrench and knobs to turn it by hand. It should slip right over the nut and twist it off...if it's strong enough. Here's what my Moen tool looks like:

Here it is ready for printing:

I printed it in black PLA, at 100% infill with a 0.35mm layer height...it took about an hour and cost me 65 cents in material. Here is a video of it printing, if you're so inclined. And here it is going to work:

At this point, I just assumed that the first twist would snap something. But instead...


I can't believe it worked...I had read about other folks actually breaking the plastic Moen tool so I was skeptical it would hold up to the stress of a corroded & rusted nut. How I was wrong...I squeezed the hell out of it with vice grips and torqued on it hard with a socket wrench. Right out of the gate I turned it the wrong direction a whole turn before I realized it - if it was ever gonna break, it would have broken then. It's got serious battle scars but performed flawlessly!

If you find this useful, I've uploaded the files here and also to Thingiverse. If you're searching the web for this exact problem and don't have a 3D printer, let me know and I'll mail you my used 3D-printed tool. It's still good! 😎

P.S. New Hotness:

Automating GMail

published on 2018-02-11 in computing

Automating GMail cleanup tasks turned out to be a great time saver for me. I get a lot of mail from automated processes I need to see, but don't need to keep for long. One example is monitoring alerts, another is admin/root type emails. Yet another is email notifications from servies like NextDoor, YouTube, Google Calendar, etc. I get a ton of these and I just don't need to reference them beyond a few days. Part of my weekly (sometimes daily) routine included cleaning these up. At best, a 30 second interruption. At worst, kill my email for half an hour with the dreaded "Temporary Error". So, I wrote a little script to do this for me automatically, based on labels. Now I just read & archive them (or whatever) and the script does the rest. No more cleanups and my mailbox is far more tolerable for searching.

My script is below. Follow the instructions on the GMail page here and paste the content of my script instead. Name it 'Email Cleanup' or something like that. You'll need to update the labels to match the labels you want to use to clean up.

var days31 = ["label1",
var days7 =  ["label4",

function auto_delete_mail(userLabel,days) {
  var label = GmailApp.getUserLabelByName(userLabel);
  if(label == null){
    var delayDays = days // Enter # of days before messages are moved to trash
    var maxDate = new Date();
    var threads = label.getThreads();
    for (var i = 0; i < threads.length; i++) {
      if (threads[i].getLastMessageDate()<maxDate){

days31.forEach( function(s) {
} );

days7.forEach( function(s) {
} );

I've also posted it on Github, if you see changes I should make, send me a pull request!

Set Vim as the default editor

published on 2017-01-28 in computing

It just kills me when I type git commit or some other such command on a newly configured machine and up comes nano or (worse!) pico. And, I so infrequently have to do this that I can never remember it - so, for posterity:

To set your default editor (to Vim) on Ubuntu:

update-alternatives --config editor


$ sudo update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
  0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
* 3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Press <enter> to keep the current choice[*], or type selection number: 3

Uncomplicated FireWall (UFW) on Ubuntu

published on 2017-01-16 in computing

UFW is a pretty simple to use firewall wrapper for Ubuntu. Recently, I have been using it to block spammers on a little service I run for the Nashville Tech community. I used to do this with iptables directly, but this is far simpler.

Here's a quick primer on firing it up and blocking a particular IP address. It's disabled by default so you need to allow your services and then turn it on:

ufw allow ssh/tcp
ufw allow 80/tcp
ufw logging on
ufw enable
ufw status

Order matters - once a rule is matched the others will not be evaluated. So, to block that IP, you need to insert it early:

ufw insert 1 deny from

Here's what these rules look like:

# ufw status
Status: active

To                         Action      From
--                         ------      ----
Anywhere                   DENY             
22/tcp                     ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             

And you can number the output to make it easy to clean up or delete your rules:

# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] Anywhere                   DENY IN             
[ 2] 22/tcp                     ALLOW IN    Anywhere                  
[ 3] 80/tcp                     ALLOW IN    Anywhere                  
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             

To delete one it'd be ex: ufw delete 1

2017 Resolutions

published on 2017-01-04 in uncategorized

I came up with a few new years resolutions. In no particular order:

  • write more (this website)
  • use a journal
  • organize my personal websites and their data. this is tricky, I have a few decades of web cruft.
  • organize photos as they are taken
  • spend a little time each day organizing my old photos. I also have a few decades of photos to organize.
  • find creative ways to spend time with my kids that expand their minds and keep me youthful.
  • go to bed earlier ; get up earlier. I'm a natural night-owl so this may be more of a short-lived experiment.

Happy Solstice!

published on 2016-12-21 in science

The image below is an example of solargraphy. A pinhole camera is used to take a picture over 6 months. This photography technique perfectly illustrates the position of the sun between the summer and winter solstice.

Skylight Simulation

published on 2016-05-07 in howto

Trying to decide where to place some skylights in my garage renovation project, I needed to simluate the look. I took pictures of the one installed skylight from the perspective of the camera if it was installed in 2 places, and splicing them into a 'blank' image. Result:


I decided to go with #2. Aside from the exposure and the skylight being open, very accurate!

Code & Pinot: UNIX!

published on 2015-04-23 in computing

I gave a presentation tonight at Nashville Girl Geek Dinner's Code & Pinot event. We went over some UNIX history and did a bit of command line intro. Action shot:

It was a great event! I had a lot of fun teaching something I'm passionate about (while de-rusting a bit on relating the basics!) and had some great conversation afterwards. I've given the history talk a number of times over the years, but the GGD Nashville crew got to experience my first test of this talk with slides! \o/ You can download my history presentation here. And here is the history of what I typed during the UNIX lesson.

Side note: We discussed the historically famous "Space Travel" game (look it up). But, all I knew was that it was a game...and I'm not a gamer. So, I had to look it up a bit more when I got home. Apparently it let you simulate travel between planets in our solar system and cost about $50-$75 in 1969 money to play a round on the GE 645 running MULTICS! Which is $320-$482 in 2015 money. No wonder re-writing the whole OS on cheaper hardware was worth it. :-P

If any of you were there and would like to know more, here are some good links that I used when re-acquainting myself with UNIX's colorful history and some beginner material:

More History of UNIX http://www.albion.com/security/intro-2.html http://web.mit.edu/saltzer/www/multics.html http://en.wikipedia.org/wiki/History_of_Unix http://en.wikipedia.org/wiki/Unix

Other Good Intros http://freeengineer.org/learnUNIXin10minutes.html http://cli.learncodethehardway.org/book/

Don’t have UNIX to play with? Get it in the browser with JS/UIX! http://www.masswerk.at/jsuix/

Cheat Sheets http://files.fosswire.com/2007/08/fwunixref.pdf http://sites.tufts.edu/cbi/files/2013/01/linux_cheat_sheet.pdf

Beers w/Trey

published on 2013-05-08 in nashville , timelapse

Trey came to town. So, we had beer. And I made picturefilms. Used a GoPro and the Radian, which had arrived a few days before. Still not great with it, but the results here were fun. Filmed at both Craft Brewed and M.L. Rose. Approximately 250X normal speed.

Thoughts on "negative-Kelvin"

published on 2013-01-05 in science

Nature: Quantum gas goes below absolute zero.

I thought I had a decent understanding of physics. But after reading this, someone should revoke my 'amateur scientist' card. This (from Wikipedia) helped me understand it:

Since we started with over half the atoms in the spin-down state, initially this drives the system towards a 50/50 mixture, so the entropy is increasing, corresponding to a positive temperature. However, at some point more than half of the spins are in the spin-up position. In this case, adding additional energy reduces the entropy, since it moves the system further from a 50/50 mixture. This reduction in entropy with the addition of energy corresponds to a negative temperature.

This is not about the common notions of hot and cold, this is thermodynamic temperature, which is about entropy and energy. OK, so to me, this amounts to a neat physics trick. The universe will not collapse and our understanding of physics hasn't changed. Hopefully, it'll inspire a few folks (like me) to understand it better. Doing more reading, it reads like this only works in a 'system' of atoms, not with a singular atom. If you can't make a single atom colder than 0.0 kelvin, then the fundamental physics models don't change. Somewhat frustratingly, I see no mentions of anti-gravity, which was the most radical thing said on the nature.com article. So, please erase that and any anti-gravity belt predictions from your memory banks.

Speaking of theoretical maximums, another fascinating one is the concept of "absolute hot", which is currently defined as the Planck temperature, (1.416785×10^32^ kelvin). All physics models break down, even things like gravity. And, theory says that the entire universe has already experienced this temperature, a fraction of a second after the big bang. Enjoy that thought.

Further reading: