Eric Roller's Development Blog

One sign to check whether the monthly scripts have been executed is to look at the log file in /var/log/monthly.out. If that file were missing of if it did not show results from regular monthly runs, then here's why:

The default setup is to execute the scripts on the first of every month at 5.30 a.m. To change that on Mac OS X, you will want to modify this file: /System/Library/LaunchDaemons/com.apple.periodic-monthly.plist

[Update: If the plist uses Interval and GracePeriod then don't change it; it is already solved].

This blocking effort appears to have started in the Windows world but it is applicable to all UNIX-based systems where a hosts file is used.

Basically, copy the contents of this example hosts file to the end of your /etc/hosts file (requires root access).


In /etc/hosts, make sure not to remove the pre-defined settings, but you may comment out the duplicate " localhost" line. It should look similar to this:

# Host Database
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##       localhost broadcasthost
::1             localhost
fe80::1%lo0     localhost

# Custom entries (not shown)

# This MVPS HOSTS file is a free download from:            #
# http://www.mvps.org/winhelp2002/                         #
#                                                          #
# Notes: the browser does not read this "#" symbol         #
# You can create your own notes, after the # symbol        #
# This *must* be the first line:     localhost   #
# *********************************************************#
# ---------------- Updated: Sept-02-2009 ------------------#
# *********************************************************#
#                                                          #
# Entries with comments are all searchable via Google.     #
#                                                          #
# Disclaimer: this file is free to use for personal use    #
# only. Furthermore it is NOT permitted to copy any of the #
# contents or host on any other site without permission or #
# meeting the full criteria of the below license terms.    #
#                                                          #
# This work is licensed under the Creative Commons         #
# Attribution-NonCommercial-ShareAlike License.            #
# http://creativecommons.org/licenses/by-nc-sa/3.0/        #

##  localhost

#start of lines added by WinHelp2002
# [Misc A - Z]  fr.a2dfp.net  m.fr.a2dfp.net  ad.a8.net

Finally, remember to check the example hosts file for updates; it is updated quite frequently.

To automate this process, I have created this script. You would need to execute it with "sudo" (or it could be placed into /etc/periodic/monthly ?).

# File: 900.host_db_update

echo "Started /etc/hosts update"

# Download the current version without progress info:
curl -so /tmp/hosts.zip https://winhelp2002.mvps.org/hosts.zip

if [[ -s /tmp/hosts.zip ]]; then
    # Unzip quietly and convert CRLF -> LF
    unzip -aoqq -d /tmp /tmp/hosts.zip HOSTS
    rm /tmp/hosts.zip

if [[ ! -fs /tmp/HOSTS ]]; then
    echo "Error: Download of hosts file failed."
    rm -f /tmp/HOSTS
    exit 1

tmpdate=$(grep -m 1 Updated: /tmp/HOSTS|awk '{print $4}')
etcdate=$(grep -m 1 Updated: /etc/hosts|awk '{print $4}')

if [[ "$tmpdate" == "$etcdate" ]]; then
    echo "Info: Hosts file is already up-to-date ($etcdate)"
    rm -f /tmp/HOSTS
    exit 0

# Remove the previous MVPS additions from /etc/hosts
sed '/^# This MVPS HOSTS/,$ d' /etc/hosts > /tmp/hosts.new

# Append the new settings
sed '/^[^#].* localhost$/ s/^/##/' /tmp/HOSTS >> /tmp/hosts.new
rm /tmp/HOSTS

# Make a backup and move the new file:
cp /etc/hosts{,~}
mv /tmp/hosts.new /etc/hosts

# Print a message:
echo "Updated /etc/hosts with settings from $tmpdate"
exit 0

Essential Mac Applications

- Posted in General by

When installing Snow Leopard, it occurred to me that there are a number of applications that I like and that I (almost) always use. They are, in alphabetical order:

Calico ($59 keskus.com)

An easy to use tool to stitch together multiple photos into panoramas.

Camino (open source, caminobrowser.org)

While I use Safari almost throughout, my bank is the only one that is deliberately refusing to support it. Firefox is good a good browser, but for my purposes it is too big. Camino, being specifically for the Mac, is just what I need for my bank.

Chicken of the VNC (open source, sourceforge.net)

A simple VNC client.

Cyberduck (donateware, cyberduck.ch)

An FTP client will all the bells and whistles to keep you happy (for those cases where "Conntect To Server" in the Finder is not sufficient to your needs).

DrawBerry (donateware, raphaelbost.free.fr)

A simple graphics app.

Fission ($32 rogueamoeba.com)

An easy to use audio editor with a nice waveform viewer (where Garageband is just overkill).

GraphicConverter ($35, lemkesoft.com)

I still use version 5.9.2 since it works fine for my needs.

HexEdit (open source, sourceforge.net)

For those rare cases where you like to dig in and see the guts of a file. Unless you are Japanese, you should stay away from the Japanese "J" version (look under Files for the one without the "J").

iLife ($79 or free with every new Mac, apple.com)

I mainly use iPhoto and iWeb. Most recently, I opted out of installing iMovie and GarageBand since I simply never use them.

iVolume ($30, mani.de)

Analyses and adjusts the loudness of your songs in iTunes.

iWork ($79, apple.com)

I mostly use Pages, but have also discovered that Keynote can be used as a vector-based drawing tool. The only problem is that every new major version cost again $79, which is why I feel inclined to skip one or two versions before upgrading.

Pixelmator ($59, pixelmator.com)

A photo editor. Not quite yet on the same level as Photoshop, but much more affordable and it keeps getting better and better.

TextWrangler (freeware, barebones.com)

Not quite willing to pay for the infamous BBEdit, I find that TextWrangler is an excellent alternative. I particularly like the graphical "diff" tool and that you can launch it from the Terminal (via custom edit and twdiff commands)

Tunnelblick (open source, code.google.com/p/tunnelblick/)

An OpenVPN client for the Mac. Only useful if you use OpenVPN.

An old trap that I keep to be falling into is this one:

> find . -name "Frameworks" -prune -or -name "Info.plist"

Notice how the Frameworks folder is also returned (since -prune defaults to true), but the intention was to exclude it! The solution is to add -print:

> find . -name "Frameworks" -prune -or -name "Info.plist" -print

On Mac OS X 10.5 (Leopard) it appears to work fine, but when I quit my app, on a machine running 10.4 (Tiger), these messages appear in the Console:

2009-03-03 21:49:10.680 MyApp[6793] *** Illegal NSTableView data source
    (). Must implement numberOfRowsInTableView: and
2009-03-03 21:49:23.139 MyApp[6793] *** -[NSCFString count]:
    selector not recognized [self = 0x1bc7f00]
2009-03-03 21:49:23.140 MyApp[6793] Exception raised during posting
    of notification.  Ignored.  exception: *** -[NSCFString count]:
    selector not recognized [self = 0x1bc7f00]

The interesting fact is that the MyApp class is the delegate of the NSTableView since it implements support for drag & drop. However, it is not designed to be the data source for the NSTableView. Instead, I use an NSArrayController through a binding in the NSTableView instance. This works fine until one quits.

What I suspect is happening (on Tiger) is that the NSArrayController is purged before the NSApp, which suddely remains as the only data source of the NSTableView, but without the access methods implemented.

The solution would be to implement dummy methods in the MyApp class for numberOfRowsInTableView: and tableView:objectValueForTableColumn:row: where one returns 0 and nil, respectively.

We can use iTunes to play music while we do circuit training, i.e. 40 seconds music while we work out, and 15 seconds pause while we rest or go to the next station:

  • save the following AppleScript in ~/Library/iTunes/Scripts; you will probably have to create the Scripts directory;
  • open iTunes with a suitable playlist; we recommend a good song and a Genius playlist;
  • select the first song;
  • launch the script from Scripts menu.

Note: There exists a newer version of this script!

(* AppleScript for circuit training with iTunes.
The default circuits are 40 seconds each, with pauses of 15 seconds.
At the beginning, the script asks for different times.

©2009, Eric Roller

-- begin by asking for the workout and delay times
set tWork to the text returned of ¬
    (display dialog "Set the Workout Time [s]" default answer "40")
set tPause to the text returned of ¬
    (display dialog "Set the Delay Time [s]" default answer "15")

-- whether to skip to the next song, but only every other time
set skip to false

-- enter the forever loop
    -- start playing the music
    set volume without output muted
    tell application "iTunes" to play

    -- delay for 40 seconds by means of a dialog
    set answer to display dialog tWork & " Seconds Workout" ¬
        buttons "Stop" with title "Circuits Loop" ¬
        giving up after tWork
    -- stop if requested
    if the button returned of the answer is "Stop" then exit repeat

    -- stop the music, actually just mute it
    set volume with output muted
    if skip is true then
        -- every other time, change the track
        tell application "iTunes" to next track
    end if
    set skip to not skip

    -- wait 15 seconds (playing the song muted)
    set answer to display dialog tPause & " Seconds Pause" ¬
        buttons "Stop" with title "Circuits Loop" ¬
        giving up after tPause
    if the button returned of the answer is "Stop" then exit repeat
end repeat

-- finish by unmuting the volume and pausing iTunes
tell application "iTunes" to pause
set volume without output muted

Note that we go to the next track after every other workout. Also, since the volume is muted, we skip the first 15 seconds of every song. This is deliberate!

Let's first take a look at how Apache is configured (for Mac OS X 10.5.6 Leopard). In the Terminal:

> httpd -V
Server version: Apache/2.2.9 (Unix)
Server built:   Sep 19 2008 10:58:54
Server's Module Magic Number: 20051115:15
Server loaded:  APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture:   32-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D HTTPD_ROOT="/usr"
 -D SUEXEC_BIN="/usr/bin/suexec"
 -D DEFAULT_PIDLOG="/private/var/run/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="/private/var/run/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/private/etc/apache2/mime.types"
 -D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf"

Notice where the configuration file is (see last line); this is the file we would use if we enabled the web server from the System Preferences : Sharing : Web Sharing. However, we much rather not change that configuration file; instead we shall simply supply a different one that we keep outside the /private/etc area.


Before we go ahead with our personal configuration file, it is a good idea to compare our settings to those provided by Apple; use a "diff" tool of your choice (I like twdiff that comes with BareBones' TextWrangler). Once our settings are complete, we shall begin with a syntax check:

> apachectl -f /path/to/conf/httpd-debug.conf -t
Syntax OK

To launch Apache with our own configuration, we run:

> sudo apachectl -f /path/to/conf/httpd-debug.conf -k start

To verify that it is running, we can issue this command (when o.k. we will get multiple lines for multiple httpd instances):

> ps -e | grep httpd | grep usr

Finally, to view the web site in Safari, we simply open the location: http://localhost/ .