I wore out the keys on my old keyboard awhile back, and have been stuck using an extremely low end keyboard for a few months. Cheap keyboards have a bad habit of taking a moment to recognize a keystroke. This particular keyboard takes just a fraction of a second too long to recognize my shift key, so I end up trying over and over and over to type a capital letter. I finally had enough and invested in a new keyboard.

I had a few requirements:

It has to be USB. My keyboard lives at my desk, connected to a computer that is physically attached to my desk. I don’t have any need for a flaky wireless keyboard.

It has to have a volume control. I’ve been stuck relying on an AutoHotKey script to give me volume control because my cheap keyboard didn’t have it. I much prefer a dedicated control.

It has to have a number pad. For some reason most “programmer” keyboards are missing the number pad. I love my number pad. I use it all the time. I’m not willing to give it up.

It has to have mechanical keys. If you’ve never used a mechanical keyboard, you don’t know what you are missing. They feel wonderful. They sound wonderful. The keycaps can be replaced when they get worn out.

Sorry the photo is awful. The lighting in my office isn’t that great for photography, but is great for programming.

It uses Cherry MX Brown switches, which are a nice compromise between a gaming and a typist experience. The keys themselves feel great, with just a hint of texture. The placement of the keys is better than my cheap keyboard. My fingers can find all the function keys and numbers on their own.

There is a big volume knob on the right. There is a cutout along the right edge, so I can slide my hand along it to turn the volume up or down. It has a satisfying gentle click click click when the volume knob is turned. It has a sleep button that is flush with the keyboard. This is nice, because it is easy to quickly go to sleep, but difficult to hit on accident.

It is USB 3.0, with 2 additional USB 3.0 ports on the back right corner of it. I’m using one of the ports for my wireless mouse. It freed up a port on the back of my computer, eliminating my need for a USB hub, while solving the occasional signal strength issues I’ve had in the past.

The keyboard is HEAVY weighing in at 2.9 lbs. It is solidly built and should last pretty much forever, but I wouldn’t want to travel with it.

One other neat feature is n-key rollover. This means the keyboard will never drop a key, no matter how many you hit at once. I’m not sure how they accomplished this, as the USB protocol is limited to 10 simultaneous key presses at a time. I’ve been able to press 20 keys at once on the Das Keyboard without it dropping a single key, so they must have found a way around the protocol limitation. You can test your keyboard’s rollover here if you are interested.

The only thing I don’t like are the LEDs for the num lock, caps lock, and scroll lock indicators. They are ridiculously bright when viewed from certain angles. Like blindingly bright. I’ll probably end up putting a bit of tape or something over them to dim them.

I like to keep my servers up to date with the latest security patches, but I hate rebooting them unless I have to. So after doing apt-get update and apt-get upgrade, how do you know if your server should be rebooted?

The solution is the /var/run/reboot-required file. If the file is there, a reboot is required. If it isn’t, then you don’t need to reboot. Pretty simple.

You can do some neat things using bash. For example, you can reboot only if a reboot is required:

[ -f /var/run/reboot-required ] || shutdown -r now

This will check if the file exists, and if it doesn’t, it will reboot.

I recently had a dilemma: I want my Fake Name Generator visitors to have the option of using SSL, but a lot of the ads on that site only work on non-SSL pages. Giving away my services essentially for free wasn’t appealing, so instead of I created Fake Name Generator Premium.

For $1.99/year, paid in Bitcoin, my Premium subscribers get:

All ads removed from the Fake Name Generator.

They get to use the https URL to access the site. This helps get around filters and keeps browsing secure.

I remove the Google Analytics code from all pages and the sharing buttons. This makes the page faster and more private.

I double the names the visitor can order using the free bulk order tool.

I remove the captcha from the free bulk order tool, to make ordering easier and faster.

I’ve been debating adding some additional features, such as a free low volume API key.

I decided to go with Bitcoin because I don’t want to deal with chargebacks and returns. This site attracts a lot of unsavory and/or less-than-smart people that don’t really understand what my site does or what the fake credit card numbers on my site are meant for.

I’m using Coinbase to handle the payment process. It was incredibly easy to implement, and handles pretty much everything for me. It determines how much $1.99 is in Bitcoin, handles the payment, notifies my site of the payment, and optionally converts the Bitcoin into US dollars.

I was able to knock out this entire project in a single evening, mainly thanks to Coinbase. My site was already designed with an on/off switch for ads, so it was easy to add a few lines of code to turn off ads across the site for Premium subscribers.

I’m averaging one sale a day with almost no advertising. I’m planning on promoting it a bit, which will hopefully increase sales.

One of my ugliest sites has always been Baby’s First Domain. The background was a muddy greenish color. The blindingly bright orange from the logo wrapped the content of the page. Everything was unstyled and just bleh. To make matters worse, the backend was powered by an ancient version of CodeIgniter. And with 37% of this site’s visitors using a mobile device, the fixed width layout was unacceptable.

The site was originally intended to help you find a domain name for your child. You can then use that domain name for email, a photo gallery, a blog, a link to their wish list at Amazon, whatever. That part of the site has never really turned a profit, so at some point I added baby name meanings. This part of the site is surprisingly popular.

I hope to get the domain name selling portion of the site beefed up so it can take over as the main feature of the site. I think I need to add some instructional videos on how to buy a domain, what to do with it, how easy it is to set up a wish list or photo gallery, that sort of thing.

Before that can happen, I needed a new design for the site using a modern framework. I settled on Laravel for the backend because it has basically won the PHP framework wars. It is easy to use and works well with popular build tools. It uses Composer for package management, so it is easy to pull in useful third-party tools. And everybody uses it so it is easy to find examples for just about anything you could want to do.

For the frontend I went with Bootstrap. I’ve used it a bunch on other sites. It is easy to make responsive sites without monkeying with a bunch of CSS. Its build system makes it easy to customize without digging through thousands of lines of code.

I spent about 3 days working on the new site. I used a few new packages that had some large prerequisites and I’m on incredibly slow DSL, so most of the first day was spent getting my dev environment setup. Oh how I miss cable internet!

The logic for this site is pretty straightforward, and I was able to copy/paste a lot of it from the old site. I saved the logo from the old site for now. My wife is going to convert the baby in the logo into a vector, then I’ll use it and some CSS to make a more appealing logo that loads faster on all devices.

I also added a new search feature. You can type anything you want into the search box. The search page tries to find a baby name that matches what you searched for. If it is a name that works for both genders, it sends you to the most popular gender for that name. If the name isn’t found, it calculates the Levenshtein distance between your search term and all the names in our database, and directs you to the closest match. This makes it really easy to find the baby name meaning you are looking for.

I also use the Levenshtein distance on some of the 404 pages. For example, if someone tries to go the meaning page for Jaycob, the 404 page will suggest Jacob, Yaacob, or Kaylob.

Another new feature I added is a boys and girls name page. On the old site you had to pick the first letter of the baby’s name to get a listing of all names that begin with that letter. You can still do that on the new site, but it is a bit tedious. On the new boys/girls name pages, I display a handful of the most popular names for each letter, with a link to the full listing. This makes it much easier to find common names.

Laravel is an absolute joy to work with. In about 10 minutes I created a command line script that pulls names from the database to automatically create a sitemap. The sitemap is saved in both xml and gz formats. The script is automatically run once a week by Laravel’s scheduler.

There is a lot of room for expansion on this site. I could easily add a baby due date calculator, tie in to various baby name APIs for more data, and perhaps even add templates for baby websites (like an announcement site, photo gallery, etc).

Anyways, I’m pretty happy with it. Only time will tell if the redesign actually increases my revenue or retains visitors better, but I’m optimistic.

A ccTLD is a top-level domain that uses a two letter country code. These domains are often reserved for residents and businesses in the country they serve. For example, you can’t get a .br domain unless you live in or have a business in Brazil.

But what if your company is based in the United States and you want to target residents of another country? Or what if you want a vanity domain that uses a restricted ccTLD?

The solution is to use a trustee service. The trustee maintains a legal presence in the ccTLD’s country, and registers the domain on your behalf. Your contract with the trustee maintains your legal rights to the domain even though the whois will show the trustee as the registrant. This allows you to fulfill the requirements of the ccTLD local presence rules.

I use 101domain. There website is awful but they have just about any ccTLD you could possibly want.

tl;dr – If you hit CTRL+S in PuTTY, your screen will freeze. Anything you type will still be sent to the server. Press CTRL+Q to unfreeze your screen.

Imagine you are an old laser printer. You have something like 128 KB of memory. You print a max of 8 pages per minute. Someone decides to print the man page for gcc.

You are doing the best you can, cranking out pages and pages of obscure options and arguments. Your 128 KB of memory is quickly filling up. What do you do? You use flow control to send an XOFF to the computer. This message tells the computer that, for whatever reason, you need it to stop sending data. You print a few pages, you free up some memory, so you send XON to the computer. This message tells the computer that you are ready for it to start sending data again. This cycle repeats itself until you’ve received the full document from the computer.

These XOFF and XON controls are built-in to PuTTY, too. And they can be super useful. Imagine you are tailing a log file, and you catch a glimpse of an error message. Hit CTRL+S to send XOFF and the screen will freeze for you. When you are done, hit CTRL+Q to send XON and the screen will unfreeze. Yay!

It is important to keep in mind that XOFF only stops transmissions coming FROM the server. If you hit CTRL+S and start bashing the keyboard, all those keystrokes are going to make it to the server.

Another caveat is that you’ll lose any screen updates between hitting CTRL+S and CTRL+Q. This isn’t a DVR. You can’t go forward and backward. Hitting CTRL+Q goes back to “live TV” so to speak.

If you don’t care for this feature, you can easily disable it. Simply add the following to ~/.bashrc:

stty ixany
stty ixoff -ixon

The first line will let any character restart output, just in case the server receives an XOFF somehow. The second line enables the sending of start and stop characters, but disables XON/XOFF flow control. Realistically stty -ixon should be good enough, but the other bits provide some extra safety against unexpected screen freezes.