“Why’s it called a CharlieTicket?” I asked of the ticket I bought so that the troop could ride the “T” into Boston earlier this week, proving that while I may have grown up in Massachusetts, I am not a Bostonian.
It’s hard to believe that, back when I was in high school (though I know that really was a long time ago now), local television stations didn’t broadcast 24-hours a day. Here’s a nightly sign-off clip from WOKR (now 13-WHAM) in Rochester, recorded in 1992, that I stumbled upon on YouTube. The recognizable voice of Don Alhart provides the voiceover.
In Rochester we basically have two options when it comes to grocery shopping: the Buffalo-based Tops and the locally based, family-owned Wegmans. While Wegmans is a market leader in innovative convenience and prepared food items, for regular grocery items, the stores are pretty much the same. Tops often has some good “stock-up” deals like 10 jars of spaghetti sauce for $10 and, until recently, most Wegman’s stores have seemed cleaner and more modern, but dollar for dollar, it doesn’t seem to make much difference where I shop. So why, when I drive past a Tops store twice almost every day, do I often go out of my way to shop at Wegmans?
Today I ran into the Pittsford Wegmans store for a few things. As I was coming out, I made eye contact with on of the stores “Helping Hands” (the employees who fetch carts and help people load their cars) who looked like he may have been one of the Lost Boys. He was bundled up in a rain coat as he returned a bunch of carts to the store.
This employee could have just turned around and went back outside and I would have thought nothing of it. The store was packed, the line of available carts was about half of what it should have been, and he probably had several more trips to make. But he didn’t. Instead he stopped and said “have a nice day, sir.” Then, as he noticed me taking my bags out of the cart (I only had two, so it was easier to leave the cart in the store and carry the bags to my car), he walked over to me and said “let me get that for you,” taking the cart from me. “Thank you,” I said. “You’re welcome. Have a nice day,” he replied as I walked outside.
That’s when it hit me. The whole reason I go to Wegmans is for the people. I have, on occasion, shopped at Tops without anyone in the store saying a word to me, not even the cashier ringing me up. At Wegmans everyone is friendly and will go out of their way to help you.
Wegmans has consistently made the top ten of Fortune‘s “Best 100 Companies to Work For” list for many years, but they don’t need a prestigious award to show that they care for and about their employees. It is evident in the way that every employee treats every customer.
I’ve been playing a lot lately with AppleScript and the Mac Automater app, both of which can do some pretty cool stuff. This gave me an idea: wouldn’t it be great if I could close certain applications when my commuters go to sleep?
I have a handful of programs that I run on both my MacBook and Mac Pro desktop at work, using file syncing tools like Dropbox or BTSync to keep the data files up to date on both machines. This generally works great, except that I have to remember to close the programs when I switch machines, otherwise I sometimes end up with unexpected results like locked files or, in some cases, data loss. I’m not so good at this and Apple doesn’t appear to provide a way to do it for me.
It didn’t take long, however, to find a free third-party utility that does. Sleepwatcher is a small daemon process that monitors the sate of your system and kicks off a shell script when certain system events occur. It can monitor for events such as sleep and wake up, display sleep and dimming, and even system idle (a specified period with no keyboard or mouse activity) and power status (when a MacBook switches from AC to battery power and vice-versa). It can also prevent the machine from sleeping based on the result of a script or it can run a script when another process prevents the system from sleeping. Sleepwatcher can be run as a system process (always running in the background, even when no users are logged in), as a user process for individual logged-in users, or both.
Before we get too far along, it should be noted that this may not be the best approach for all applications. The method I’m about to describe works best with applications that save their data files automatically, and exit without user intervention. While the applications will be shut down in a clean manner, you may have unexpected results if the application prompts you to save or to confirm that you really want to quit.
It is also very important to note that you should be extremely careful when implementing these scripts. An improper configuration could render your machine unable to sleep, wakeup, or even boot, so be sure to carefully test your scripts before enabling them to run automatically.
Installing Sleepwatcher from the developer’s site is a bit tricky as it comes with no installer and assumes some knowledge of the Unix command line. A much easier way to install it is to use a package manager such as Homebrew (I believe MacPorts can also install Sleepwatcher, but I’ve only done it with Homebrew). If you aren’t familiar with Homebrew, it is definitely worth checking out.
Assuming that you have Homebrew installed and working correctly, installing Sleepwatcher is as easy as running the following command in a terminal window:
brew install sleepwatcher
Homebrew will download and install Sleepwatcher at /usr/local/sbin/sleepwatcher. Note the followup instructions that Homebrew provides after installation, as we’ll get to them in a moment. Once the installation is is done, I recommend reading the man page, as it is the best way to get to know everything Sleepwatcher can do:
Now it’s time to write a sleep script. As we’ll find out in a moment, Sleepwatcher looks for user scripts named
~/.wakeup and system scripts named
/etc/rc.wakeup. Since we want to close programs that are running under our own UID, let’s choose the local user option.
First, create a file named
.sleep in your home directory using your editor of choice (mine is vi for this kind of stuff):
Then add the following to the file (in this example, I’m going to close the program KeePassX, my password manager, using AppleScript):
osascript -e 'tell application "KeyPassX" to quit'
If you want to close additional applications, simply add another osascript command for each additional application.
Why use AppleScript instead of something more bash-like, such as kill? AppleScript works inside the application, telling it to do a clean exit, such as if I pressed Comand-Q to close it myself. This allows the program to make sure files are saved and everything is in order before the process ends. Kill simply aborts the running process, regardless of what’s happening, which could result in data loss and other instabilities, which we’re trying to prevent in the first place.
After the script is saved, you’ll need to give it execute premissions:
chmod 700 ~/.sleep
New we’re ready to test the script. Enter the following in a terminal window to start Sleepwatcher:
/usr/local/sbin/sleepwatcher --verbose --sleep ~/.sleep
You won’t see anything happen; in fact, it will look like the terminal is hanging. Make sure KeePassX (or whatever program you added to the
.sleep file) is running and then close the lid of your MacBook (or go to Apple Menu > Sleep if you aren’t on a MacBook). Wait until the computer’s power light starts to slowly blink on and off, and then wake it by opening the lid and/or pressing the power button. The computer should resume exactly as you left it except that your target application should no longer be running. If anything went wrong, check the terminal window where you ran Sleepwatcher, it should show any errors that occurred. Press Control-C to stop Sleepwatcher.
Now it is time to configure launchd to run Sleepwatcher at startup or login. To do this, we need to add a plist file to our user or system’s LaunchAgents directory. Sleepwatcher comes with sample plist files that handle the four use cases mentioned above: user sleep, user wakeup, system sleep, and system wakeup.
If you only need support for sleep and wakeup, you can simply symlink the sample files to the proper LauchAgents directories. For this activity we only need to set up the user LaunchAgent since we aren’t using any system scripts:
ln -sfv /usr/local/Cellar/sleepwatcher/2.2/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents/
Then we tell launchd to load the configuration:
launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist
Although not required in this example, to install the system agent, do the following:
sudo ln -sfv /usr/local/Cellar/sleepwatcher/2.2/de.bernhard-baehr.sleepwatcher-20compatibility.plist /Library/LaunchAgents/
sudo launchctl /Library/LaunchAgents/de.bernhard-baehr.sleepwatcher-20compatibility.plist
Note that you’ll need to be an administrator of the machine to install the system agent.
That’s about all there is to it! Sleepwatcher is now running in the background waiting for your computer to go to sleep. When they system does, Sleepwatcher will kick off your
.sleep script and, when the system resumes, Sleepwatcher will run your
.wakeup script (if you create one). And, since you also added the plist file to your LaunchAgents directory, launchd will find it and start Sleepwatcher every time your machine starts up or whenever you log in.
If you want to script other events, such as system idle or power status, you’ll need to make a copy of the sample plist file(s) and edit them by hand. Understanding the plist file format should be fairly straightforward if you compare the sample with the options described on the man page. Xcode features a graphical plist editor, but plists are simple XML files, so you can edit them in any text editor if you prefer.
Do you have a creative use for Sleepwatcher? Let me know about it in the comments.
“I should get a Raspberry Pi,” I said one night as we were watching TV.
“Well, if that’s what you really want, put it on the list and I’ll get one when I go to Wegmans,” Denise replied, thinking my comment to be a bit random.
I wasn’t talking about about desert, of course, but rather the tiny, TV-ready computer produced by the Raspberry PI Foundation. I’d been thinking about setting up a TV connected computer for a while, looking at several Micro-ITX form factor machines, but I couldn’t quite justify spending a few hundred dollars on what would basically become a video player.
TV watching is usually a background process for me—I’m usually doing something else while I watch, and that something else often includes my laptop. With more and more content available online these days, I find myself frequently streaming video, but it is sometimes frustrating because it prevents me from doing other things on the computer while my TV sits idle.
The Raspberry Pi seemed like the perfect solution…at $35 the Pi costs less than a streaming device like Roku or Apple TV, but also has the ability to do run lots of other software in addition to streaming. And since it runs off a 750 mA phone charger, the always-on Pi consumes hardly any energy.
A few weeks ago, Denise’s laptop’s hard drive started acting up, so I went online to find a replacement. Since I needed to place an order anyway, I though “why not get a Pi while I’m at it.” I got my Pi from an Amazon partner, not an official distributer, and I paid a bit more than the standard $35, but since it was shipped by Amazon I avoided shipping charges and it all evened out in the end.
In addition to the Pi I also ordered a Kootek case to keep the Pi’s circuit board protected and a Rosewill 5-port Ethernet switch. I was already using a HomePlug powerline Ethernet setup to connect my BlueRay player to my router, so I figured the switch, which cost about same as a decent WiFi adapter, the would let me connect both devices easily.
I had planned to use an existing Bluetooth keyboard with my Pi, paired to a $5.00 USB dongle I picked up somewhere a while back, but I quickly learned that Bluetooth can be a nightmare to configure on Linux, so after about a week of fighting, I picked up a Logitech K400r wireless keyboard a trackpad combo that works great. In all, I probably paid about $75-$80 to get the Pi up and running—not pocket change, but not an unreasonable investment, either.
It took a few false starts to get up and running, but I’ve now got the Pi working quite well. I decided to use the Raspberry Pi-optimized Debian Linux distro, Raspbian, for my OS because it offered the most flexibility. Using Michael Gorven’s packages and instructions, I was able to get XBMC, a great media player designed for the ten-foot user interface, loaded and running, which was the primary goal of my project. In addition to XBMC, I’ve managed to set up an OpenVPN server, giving me a private, remote gateway into my home network. I’m now starting to play with emulators and hope to have the Pi emulating my old Apple IIGS and Intellivision game console soon. I’ll be posting some tutorials and solutions to some of my stumbling blocks on here in the next few weeks.
Overall the Pi runs well. It can be a little sluggish when loading web content, but once the GPU kicks in, video performance is great. I’ve watched a number of videos from YouTube, TED Talks, and a handful of TV networks through XBMC and I don’t think its ever stopped to buffer (I wish I could say the same for my BlueRay player!).
I’m starting to dream up ideas for my next Pi (or Pis?)—I’m thinking about setting up a dedicated file and print server so that I can shut down my old desktop PC when I’m not using it. The Pi, from what I hear, can also be a great Wake-On-LAN server, so I could remotely boot the desktop from afar if I ever found that I did need something on it, too. I’m also thinking up home automation ideas for the Pi as well as some possible ideas for a “carputer” in my truck. Looking at some of the projects featured on sites like the Raspberry Pi blog, LifeHacker, and Hackaday.com, it’s clear that the sky’s the limit for this cheap, little computer.