blog

No Sweets November

originally shared here on

I'm 25 pounds heavier than I was this time last year.

I could blame it on a ton of things, including a lack of motivation to run after the ultramarathon, my knee surgery in June, and work-related stress.

Instead of playing the blame game though, I've decided I'm gonna do something about it.

After reading The 4 Hour Body earlier this year, I took a few big points away that I've been adopting in my life. One of those points is to find small changes you can make to your life that will yield big gains.

I think those of you who know me would say that one of my biggest vices in life are sweets. I'll easily pound a quart of ice cream in a single sitting if I can. At weddings, I'll grab two edge pieces (and hopefully, one of those is a corner piece). My wife's freshly-baked batch of three dozen cookies will not last a full week.

Another trait I know about myself is that I need to set audacious goals for myself, if for no other reason than to prove that I can do it.

With those points in mind, I've decided that November 2018 is going to be "No Sweets November" for me.

What are the rules, you ask? Here goes:

  • Sweets includes any food product with a ton of artificial sugar. For me, this would include ice cream, cookies, brownies, cake, candy, muffins, breath mints, and donuts.
  • Naturally-occurring sweets will not be eliminated, so I can still do things like apples and grapes.
  • From midnight on November 1st until 11:59pm on November 30th, I will not consume any sweet.

Some will say that this month is probably the worst month for doing this. After all, my birthday is on the last day of this challenge, not to mention Thanksgiving and two weddings.

I would argue that those reasons alone make it the perfect month to abstain from sweets. After all, the point of this self-imposed restriction is to lose weight. I'll be much happier with myself if I can end the month 3 pounds lighter than if I were the same weight and ate sweets all month.

I'm already off to a good start. While going for a walk this morning, I found a full sized, unopened bag of M&Ms laying on the sidewalk. I picked it up and thought about tearing right into it, but after remembering the challenge, I handed it to my friend instead.

See you in December!


The Startup Chat - Episode 350 - Who Am I?


🔗 a linked post to thestartupchat.com » — originally shared here on

Steli Efti: I do think that most people maybe haven’t answered the question truthfully and are suffering the consequences from it. That’s my instant and initial response when you say, how do you figure out who you are? My first thoughts are that you have to ask the question again and really make sure that you have answered it correctly versus just being attached and stuck in an answer that you might have picked out when you were really young a really long time ago.

This was exactly the podcast episode I needed this weekend, and I want to store it somewhere that I can come back to it in a few years.

If you're stuck in an endless loop of unhealthy and unproductive patterns, give this short episode a listen.

Continue to the full article


An Oral History of 'Goldeneye 007' on the N64


🔗 a linked post to melmagazine.com » — originally shared here on

Edmonds: Nintendo’s legal department also got worried about lawsuits from various gun manufacturers if we used real gun names. We had to change them to made up ones, which was disappointing.

Hilton: So the whole team just started making up names that sounded appropriate for the guns — except for the Klobb, which we named after Ken Lobb, who was one of the most senior guys at Nintendo at the time and was a big supporter of the game within Nintendo.

I mean, is there anyone my age who didn't grow up on this game? The story of how multiplayer came to exist is particularly interesting as someone who is used to working in an industry where the best ideas come late in the game.

Continue to the full article


The Joe Rogan Experience - Ted Nugent


🔗 a linked post to podcasts.joerogan.net » — originally shared here on

I consider myself to be a podcast enthusiast, but I will be the first to admit that I have not listened to many of the most popular podcasts.

I've been a fan of Joe Rogan ever since NewsRadio, and I've seen some clips here and there of The Joe Rogan Experience, but I've never sat down and listened to an entire episode of his podcast. I had a feeling that his political views were more libertarian, but beyond knowing that he's a proponent of weed, I didn't know much about him on a personal level.

With that in mind, I went through the most recent episodes of his podcast to see if there was an episode that would help me learn what he was all about.

I can't be the only one in the world who thinks the political scene in 2018 is incredibly draining and makes me feel ultimately powerless. As soon as I saw that Ted Nugent was on an episode, my initial reaction was, "ugh, why the hell would I listen to this crap and subject myself to more of that same feeling?"

Before listening to this episode, here was the sum total knowledge of facts that I knew about Ted Nugent:

  • He was a musician of some sort
  • He wasn't popular in my Twitter bubble
  • He tends to speak in brash, general, and oversimplified statements

In an effort to remove myself from my bubble, I thought, "you know what? A lot of folks seem to love Ted Nugent, so I'm gonna listen with an open mind and see what it's all about."

The episode was pretty long (over three hours), but if you've got the time, I highly encourage you to give it a listen. A few things I took away:

  • I didn't realize Ted was all about hunting, and I noticed myself nodding my head in agreement during the discussions around being responsible with nature and treating the circle of life with respect.
  • The discussion around the vegan lifestyle was also illuminating. I know a few folks who try to do the vegan thing, and it's interesting to look at it from the perspective of "look at the number of animals and plants you need to kill with pesticides in order to keep them off your land so your tofu can grow."
  • The first hour or so is mostly Ted and Joe talking about how misunderstood hunters are. Of primary note is a part where Ted says that people think hunters are all fat, sloppy rednecks who go out and hunt down hundreds of animals at a time. He says that if non-hunters would actually talk to a hunter and see the world from their perspective, it would really make things better. I thought this was a profound point, which was made completely ironic by the next observation:
  • No fewer than 50 times in this episode does Ted identify a group of people (liberals, politicians, the DNR, bureaucrats, anti-gun folks, illegal immigrants), caricaturize them, and berate them for their "ignorance."

Joe spent a lot of the episode silent, because Ted just would get on a rant and keep going. However, I think Joe did do a great job of holding Ted's feet to the fire a bit over some of his statements.

My favorite part of the episode was when Ted went to the bathroom, Joe monologued about how messed up the gun situation is in our country and that he doesn't have any answers for it. It was refreshing to hear that, since everyone seems to have an answer that wouldn't work in practice.

Like I said above, the episode was long, but I found it to be absolutely illuminating, and I will be seeking out more podcasts like this in order to make sure my perspective on life isn't being persuaded by only one type of voice.

If anything, the biggest takeaway from this episode for me was that what we need right now as a country is to find a way to come back to the table together. Social networks seem to thrive off of exploiting the worst in us as humans, and even though the first word in that phrase is "social", it has made us anything but.

Continue to the full article


Goals (Summer 2018 Edition)

originally shared here on

Back in 2011 when I started this blog, I wrote a post that outlined some short and long-term goals that I had for myself.

I came across that post while re-doing this blog, and I thought that establishing some new goals was a worthwhile task.

For the past few years, I've been using an analogy for setting goals that I like to call "the swimmer's approach", which I came up with while watching triathletes swim during a race.

When you're swimming a fairly long distance, there are times where you need to put your head down and swim hard, and there are times where you need to lift your head out of the water and make a plan to head in a certain direction.

The key here is to combine both as efficiently as possible. If you're just heads down swimming hard all the time, you'll likely start veering off course considerably. Conversely, if you are spending all your time looking off into the distance, you'll never get there.

So today, I'm focusing on getting some new goals. Here's what I've got:

Short Term Goals (by August 15)

  • Completely unplug for a week and enjoy time with my wife
  • Take Charlee to a place she's never been before (like a new splash pad or the science museum)
  • Come up with a sales strategy around our long-term support plan for JMG
  • Finish the Siri integration with my weight tracking app
  • Watch 3 movies on my Plex server
  • Walk around the block without crutches (0.5 miles)
  • Write another blog post for this site

Medium Term Goals (by December 31)

  • Set a budget for marketing at JMG and launch a campaign
  • Close a large sale
  • Merge Rob's project management app (Triangle) with my sales and marketing app (Gil) and give it an awful name (like Trian-Gil)
  • Get the average subscriber count for Constant Variables up to 100 per episode
  • Get version 1.1 of mncraft.beer released
  • Watch 30 movies on my Plex server
  • Go for a 1 mile run
  • Brew my first batch of beer

Long Term Goals (by July 1, 2023)

  • Run another marathon
  • Build up a 6 month emergency fund for the JMG
  • Move to Wisconsin
  • Have an event with one of our businesses
  • Have another kid
  • Finish watching all the movies on my Plex server (currently, I'm at 600+)

Now, it's time to start swimming.


timbornholdt.com Strikes Back

originally shared here on

A few weeks ago, I got an email from Google saying that I had an "unusual number of 404 errors" on my site. I looked into it, and a very helpful script kiddy exploited my Wordpress site and took over the admin account.

It didn't look like there was much in there in terms of damage done, but they basically changed my admin password, bricked my template, and moved on.

After years of neglecting this blog (yet again) and after years of dealing with an annoying CMS, I had the same thought that every web developer has: "Nuts to this, I'm just gonna build this site myself from scratch."

So here we are: timbornholdt.com version whatever!

After reading back from my old posts in 2012, I realized that I really should start blogging again. I really enjoy seeing how much has changed in the past 6 years, and I know that if I start blogging about my life now that I'll look back in another 6 years and have the same feelings.

So without further ado, welcome to the blog, and we'll see you in another 6 years!


How to detect and replace YouTube links by extending the Redcarpet gem

originally shared here on

As I'll explain in a future post, I had an old Wordpress blog that I got sick of maintaining and updating, so I did what any red-blooded developer would do: build my own blog engine.

In doing so, however, I needed to import all my old posts from Wordpress over to my own Rails form. This worked nearly flawlessly, with the exception of my YouTube videos, which looked something like this (without the space inside the tag):

[youtube]nFZZxOHHZlo[/youtube ]

Because I am using the Redcarpet gem, I thought I'd extend its parsing capabilities to detect anything like this and wrap it in a responsive frame.

Here's how I did it (with extreme thanks to this SO post):

Step 1: Create a folder called app/services, and then create a file called custom_markdown.rb:

class CustomMarkdown < Redcarpet::Render::HTML
  def preprocess(text)
    format_youtube(text)
  end

  def format_youtube(text)
    text.gsub! /\[youtube](.*?)\[\/youtube]/ do
      "<div class='embed-container'><iframe src='https://www.youtube.com/embed/#{$1}' frameborder='0' allowfullscreen></iframe></div>"
    end
    text
  end

end

This code will perform a regular expression to find anything wrapped in [youtube] tags and replace it with a <div> that we can now style with CSS.

Step 2: Add the following SCSS somewhere in your project where it makes sense:

.embed-container { 
  position: relative; 
  padding-bottom: 56.25%; 
  height: 0; 
  overflow: hidden; 
  max-width: 100%; 
  iframe, object, embed { 
    position: absolute; 
    top: 0; 
    left: 0; 
    width: 100%; 
    height: 100%; 
  }
} 

Step 3: Use the custom parser when including Redcarpet in your project:

require './app/services/custom_markdown.rb' # This was necessary for me, might not be necessary for you
@blogs = Blog.all.order("published_at desc")
renderer = CustomMarkdown.new()
@markdown = Redcarpet::Markdown.new(renderer, extensions = {})

Now, anywhere you use those [youtube] tags, you'll get this fancy rendering instead:


Proxy Issues with iPhone and Mac OS X

originally shared here on

Like all tried and true iOS developers, I love using the excellent Charles Proxy. However, I've been running into issues where the proxy is running while the iPhone is attached to my Mac.

Whenever I would have Charles closed and my phone plugged in, I was getting this helpful message:

Safari can't open the page https://facebook.com because Safari can't connect to the server https://facebook.com

Usually, you can fix this on Wi-Fi by going into Network > Wi-Fi > Advanced Settings > Proxies, and disabling Web Proxy (HTTP) and Secure Web Proxy (HTTPS).

Unhelpfully, however, you'll note that the iPhone USB network interface does not include an "Advanced Settings" button.

No problem! Head to your Terminal and type in the following two lines of code:

sudo networksetup -setsecurewebproxystate "iPhone USB" off
sudo networksetup -setwebproxystate "iPhone USB" off

This disables both the secure proxy and the unsecure proxy.


Recording Podcasts on the Run

originally shared here on

In 2017, the C Tolle Run team decided to switch over to an audio-only podcast format. Instead of doing a traditional interview-style show over Skype, we came up with the idea to record Carrie and a guest while they went for a run. As a runner myself, I know the kinds of crazy, deep, personal, and often crazy conversations that occur during the course of a 10 mile run.

As the guy responsible for capturing the audio on one of these runs, however, I was a little worried. Even if we were recording people walking, we'd have issues with wind. What are we supposed to do with people running? All of that movement is a recipe for poor audio quality.

Another issue we have is that we haven't quite hit the jackpot with sponsors yet, so I needed to find a suitable solution while running on a tight budget.

If you're reading this, you're probably looking for a good solution for a similar set of circumstances. Let me save you the time and show you what I came up with!


What didn't work

In order to get to a point where we were capturing usable audio, we experimented quite a bit. Here was our first setup: IMG_3561

Take 1 included our guests using a Sony lavalier microphone with a standard, flimsy wind guard attached to it.

We quickly discovered that the Auray Fuzzy Windbuster wind guards provided a night and day difference in ability to block out wind. However, the guards did not stay attached to the microphones all that well, which is obvious if you listen to our episode with Gabe Grunewald.

In addition, because of all the movement that occurs from running, we would frequently hear rhythmic bumping and rubbing due to the cords pulling in odd places on the runners.

What does work

Transmitting the signal

Our primary goal was to get the highest quality signal we can get with the most minimal amount of equipment possible. We figured that the easiest way to do that is to switch to headset microphones.

We now use the Sony ECM322BMP Professional Headset Microphone. In our most recent on the run episode with Kirk DeWindt, both Kirk and Carrie found the headsets to be relatively comfortable, and after a couple minutes, they didn't even notice they were wearing them.

One word of warning: make sure whatever headset mic you purchase is compatible with your wireless system. I can't give a direct Amazon link to our wireless system since we bought it 7 years ago, but the modern comparison would be the Sony UWPD11/30 Lavalier Microphone, Bodypack TX and Portable RX Wireless System. We went through 3 different headset mics before just giving in and dropping the money for the mic that was compatible with our "ancient" system.

Regardless of which headset mic you get, the key piece to cutting down on wind noise is the Auray Fuzzy Windbuster wind guards. Buy at least 6 of these little guys, they are worth every penny. (Pro tip: we went through 2 of these buggers before we got smart and put some gaffer's tape around the base of the wind guard to keep it attached to the neck of the mic.)

The position of the transmitter pack seems to not really be an issue for us, so long as:

  • The antenna has a good line of sight to the receiver
  • The cable connecting the headset and transmitter gets a little slack
  • They don't place the transmitter in the same pocket as a phone

We purchased wireless microphone belts to hold our packs, mostly so we didn't have to fuss with people wondering where the transmitter should go, but those are totally optional.

Receiving the signal

Ideally, we are working to get the receiving end down to a point where Carrie can strap it onto herself and record as she travels around the world.

Currently, the receiving rig is powered by yours truly, following the guests on a bike roughly 10-20 feet back The receivers for the wireless mics are plugged into a Zoom H4n recorder. All three components are strapped into a repurposed water bottle holder (pictured above, which doubles as a great indicator to my personal fashion sense).

Once I turn on the recorder, I immediately hit record and lock it before even plugging in the microphones. My biggest fear is losing audio, and since these things can record hundreds of hours at a time, I'd rather scrub through the audio in post than risk forgetting to hit "go" once the runners are ready.

Next Steps

Currently, our rig is limited to the two inputs of the H4n. The next two things I'd love to tackle are live streaming the audio to my phone so I can do a Facebook Live stream, and recording more than two people at once.

If you have any ideas how I can stream the audio off of a Zoom H4n into an iPhone, or how I can best record multiple people at once, let me know on Twitter and I'll give it a shot!

Also, I'll keep this blog post updated as we refine this system. If you have any suggestions on how I can improve it, give me a shout on Twitter.

One last note: those links above are Amazon Affiliate links. Feel free to strip that code off if you are offended by those types of things.


Saving images locally using the Paperclip gem on Linux

originally shared here on

Like most red-blooded Ruby on Rails developers, I make copious use of the Paperclip gem.

Paperclip (and basically, every developer on the internet) seems to encourage you to use a service like Amazon S3 or some other 3rd party service to store your files.

However, I find that for simple projects, I'm just fine storing the images locally on my Linux server and using good ol' Apache to serve them up.

By default, Paperclip saves these images in your public/system folder, and assigns the same permissions as your Rails app to those images.

The problem I run into is that frequently, it doesn't use the right permissions. I'd be able to upload and save the image, but when I'd load the image, I'd get a 403 error.

In order to solve that issue, you need to set the correct permissions for your public/system/[model] directory.

Here's how to quickly solve that:

1) SSH into your public/system/[model] directory 2) Run "umask 002". This will allow your Linux group to write into this directory. 3) Run "chgrp [your-systems-group] .". In my case, that's www-data. This will change the ownership of the folder to your group.

Now, all the files in your folders (and all subsequently created files) will belong to the correct group, and you won't see any more nasty 403 errors!