Hiltmon

On walkabout in life and technology

Add GA OS and Browser to Status Board

Google has finally deprecated their GAPI interface which this used to talk to Google Analytics, sorry folks, it will no longer work. See the New Google Analytics for Status Board Server Edition for an updated version.

Reader Brandon Cozart (@brandoncozart) asked if it were possible to add Browser and OS statistics to the Google Analytics for Status Board scripts. So I gave it a shot.

Update: Download again if you use these scripts, a null value bug and sorting bugs have been fixed.

Note: The installation instructions below assume you have already gotten one of my Google Analytics for Status Board scripts to install and work, so this only shows the changes that need to be made to setup these. If not, follow the instructions in Google Analytics for Status Board replacing the script and .plist files with these below.

All the source code for these scripts and launchd files is in the Github Repo at https://github.com/hiltmon/status-board-ga. I recommend cloning this repo and then copying the files to where you need them on your local system, or you can copy and paste the file contents directly from Github into your own editor. You need to modify these scripts and files to make them work for you.

Browsers

The big issue was that there are too many browsers that can be reported. So I picked a few, and lumped the remainder in an Other category. Also, some browsers have multiple names, so I merged those manually in the script.

The script to generate the browser file is at https://raw.github.com/hiltmon/status-board-ga/master/status_board_browsers.rb. Copy and paste it into your own status_board_browsers.rb file and chmod +x it to make it executable. file Then, edit the file to change the configuration, changing email, password, title, file_name and dropbox_path. Test run the script to see that it creates the JSON file you need. Then share it from Dropbox, email it to yourself, open the link and add it to Status Board as per previous scripts.

The .plist to make this run automatically is at https://raw.github.com/hiltmon/status-board-ga/master/com.hiltmon.status_board_browsers.plist. Copy, paste, edit it with the right path, and launchd load -w ... it.

Operating Systems

In this case I just picked the ones I was interested in and are popular on my site: Mac, iOS, Windows, Linux and Android. All others I ignore. You can, of course, edit the script to change the set I use, but make sure that they match exactly the names that get picked up in the the_os variable at line 61.

The script to generate the browser file is at https://raw.github.com/hiltmon/status-board-ga/master/status_board_os.rb. It’s matching .plist is at https://raw.github.com/hiltmon/status-board-ga/master/com.hiltmon.status_board_ga.plist.

Enjoy.

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Hourly Analytics for Status Board

Google has finally deprecated their GAPI interface which this used to talk to Google Analytics, sorry folks, it will no longer work. See the New Google Analytics for Status Board Server Edition for an updated version.

Following up last week’s Google Analytics for Status Board graph and Top Pages table on Status Board, a reader asked for hourly stats instead of daily, so I created it (see the bottom-right graph).

See also Top Pages in Status Board, Daily Stats and OS and Browser Stats.

The script creates a 24-hour rotating window of stats using your local time-zone for reference. Note that I have only tested this in US EST, but it should work elsewhere.

The steps are all the same as Google Analytics for Status Board, so follow along, only replace that script and the launcher files with these.

  • Install the json and gattica gems
  • Configure the script with your own parameters (and optionally change the Google Analytics account using the script at https://gist.github.com/hiltmon/5373934 to get the index and uncomment line 45 to set it).
  • Schedule the script to run by modifying the .plist file below to reflect your path to the script, then copying it to ~/Library/LaunchAgents and loading it with launchctl

The script code is in status_board_hourly.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env ruby

# status_board_hourly.rb
# Hilton Lipschitz 
# Twitter/ADN: @hiltmon 
# Web: https://hiltmon.com
# Use and modify freely, attribution appreciated
#
# Script to generate @panic status board files for Google Analytics web stats. This one generates a 
# line graph for a 24 hour window
#
# Run this regularly to update status board
#
# For how to set up, see https://hiltmon.com/blog/2013/04/10/google-analytics-for-status-board/

# Include the gems needed
require 'rubygems'
require 'gattica'
require 'date'
require 'json'

# Your Settings
google_email   = 'hiltmon@gmail.com'  # Your google login
google_pwd     = 'I_aint_sayin'   # Must be a single use password if 2 factor is set up
the_title      = "Hiltmon.Com Hourly" # The title of the Graph
file_name      = "hiltmonhourly"      # The file name to use (.CSV and .JSON)
dropbox_folder = "/Users/Hiltmon/Dropbox/Data" # The path to a folder on your local DropBox

# Configuration 
metrics = ['pageviews', 'visitors', 'newVisits']
colors = ['red', 'green', 'blue']
days_to_get = 7

# Login
ga = Gattica.new({
    :email => google_email,
    :password => google_pwd
})

# Get a list of accounts
accounts = ga.accounts

# Choose the first account
ga.profile_id = accounts.first.profile_id
# ga.profile_id = accounts[1].profile_id # OR second account

# Get the data
data = ga.get({
    :start_date   => (Date.today - 1).to_s.split('T')[0],
    :end_date     => Date.today.to_s.split('T')[0],
    :dimensions   => ['date', 'hour'],
    :metrics      => metrics,
})

# Make the JSON file
graph = Hash.new
graph[:title] = the_title
graph[:type] = 'line'
index = 0
graph[:datasequences] = Array.new

metrics.each do |element|
  sequence = Hash.new
  sequence[:title] = element
  sequence_data = Array.new
  data.to_h['points'].each do |point|
    the_date = Date.parse(point.to_h["dimensions"].first[:date]).to_s.split('T')[0]
    the_hour = point.to_h["dimensions"][1][:hour]
    the_window = DateTime.parse("#{the_date} #{the_hour}:00 #{DateTime.now.strftime("%z")}")
    next if the_window < (DateTime.now - 1)
    next if the_window > DateTime.now
    the_title = the_window.hour.to_s
    the_value = point.to_h["metrics"][index][element.to_sym]
    sequence_data << { :title => the_title, :value => the_value }
  end
  sequence[:datapoints] = sequence_data
  sequence[:color] = colors[index]
  index += 1
  graph[:datasequences] << sequence
end

File.open("#{dropbox_folder}/#{file_name}.json", "w") do |f|
  wrapper = Hash.new
  wrapper[:graph] = graph
  f.write wrapper.to_json
end

Once again, edit the script to change:

  • The email and password you use to access Google Analytics.
  • The title, file_name and dropbox_path to save the data on your computer and dropbox.

The launcher code is in com.hiltmon.status_board_hourly.plist:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.hiltmon.status_board_hourly</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Hiltmon/Dropbox/Scripts/status_board_hourly.rb</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
</dict>
</plist>

Update it too for your paths and names, the copy and load it.

Add it to Status Board

Follow the instructions in Graph Tutorial (PDF):

  • Share the JSON file on your DropBox
  • Mail that link to yourself
  • Tap the link in the email on your iPad to open it in Safari
  • Copy the link from Safari (minus the bit after the ?)
  • Add a new graph to your Status Board and paste in the link (it offers to do this by default).

Enjoy.

Update: All the scripts can be downloaded from Github at https://github.com/hiltmon/status-board-ga.

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Natsukashii - iPulse Sighting

Natsukashii (懐かしい) is a Japanese word for “feeling nostalgic” or “with fond memories”.

I happened to click on a Mike Zornek (@zorn) link today and noticed that he is still running iPulse on his desktop. I used to run it back in the early days of OS X on my Titanium Powerbook.

Back then, I had already returned to the Mac. But in 2003 or so, OS X was still very buggy and slow. I wanted to know where the bottleneck was, disk, network, CPU or RAM? Also, with PC hardware at the time, they still had the light that flashed when the disk was being accessed, the Mac did not have this.

I could have run top in a terminal shell. But top provides data, I wanted information.

So I purchased iPulse and it ran on the bottom right of my screen for years. At a glance I could see how my computer was performing, if the CPU was busy, disk accessed, network overloaded, etc. Whenever OS X Jaguar got slow, iPulse would tell me what was going on.

Just look at it, what a very clever design. CPU is the middle circle with a moving darker ring ring to show busyness. Memory capacity is shown in the upper half of the next ring, and disk capacity and access on the lower half. It has a clock on the outer ring that also contains memory swap rates, and lights for battery and network on the outside. And if you want to know more about a particular topic, just hover over the right spot to see a pop-up with the details. What a magnificent design and execution. Pure iconfactory magic.

But I stopped using it years ago and instead switched to BJango’s iStat Menus which I am still running today. Now I see the CPU, Memory, and Network (no disk since I have a SSD) in the OS X Menu bar. As with iPulse, the data is there at a glance, but this time out of the way instead of in a window when it may be covered by others or get in the way.

It is nice to see some of the old ways still in use.

Then again, I still use BBEdit every day.

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Top Pages in Status Board

Google has finally deprecated their GAPI interface which this used to talk to Google Analytics, sorry folks, it will no longer work. See the New Google Analytics for Status Board Server Edition for an updated version.

Following up this morning’s Google Analytics for Status Board graph on Status Board, I also wanted a top pages for today view for Hiltmon.com.

See also Hourly Stats and OS and Browser Stats.

The steps are all the same as Google Analytics for Status Board, so follow along, only replace those script and the launcher files with these.

The script code is in status_board_pages.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env ruby

# status_board_pages.rb
# Hilton Lipschitz
# Twitter/ADN: @hiltmon 
# Web: https://hiltmon.com
# Use and modify freely, attribution appreciated
#
# Script to generate @panic status board files for Google Analytics web stats
#
# Run this regularly to update status board
#
# For how to set up, see https://hiltmon.com/blog/2013/04/10/top-pages-in-status-board/

# Include the gem
require 'rubygems'
require 'gattica'
require 'date'
require 'json'

# Your Settings
google_email   = 'hiltmon@gmail.com'  # Your google login
google_pwd     = 'I_aint_sayin'   # Must be a single use password if 2 factor is set up
the_title      = "Hiltmon.Com Top Pages Today"
file_name      = "hiltmonpages"       # The file name to use (Assumes .CSV)
dropbox_folder = "/Users/Hiltmon/Dropbox/Data" # The path to a folder on your local DropBox

# Configuration
metrics = ['pageviews'] #, 'uniquePageviews', 'newVisits']
colors = ['red', 'green', 'blue']

# Login
ga = Gattica.new({
    :email => google_email,
    :password => google_pwd
})


# Get a list of accounts
accounts = ga.accounts

# Choose the first account
ga.profile_id = accounts.first.profile_id
# ga.profile_id = accounts[1].profile_id # OR second account

# Get the data
data = ga.get({
    :start_date   => Date.today.to_s.split('T')[0],
    :end_date     => Date.today.to_s.split('T')[0],
    :dimensions   => ['pageTitle'],
    :metrics      => metrics,
    :sort         => ['-pageviews']
})

# # Make the CSV file
File.open("#{dropbox_folder}/#{file_name}.csv", "w") do |f|
  f.write "15%, 85%\n"
  count = 0
  data.to_h['points'].each do |point|
    the_page = point.to_h["dimensions"].first[:pageTitle].gsub(',', '').gsub(' - The Hiltmon', '')
    the_data = point.to_h["metrics"].map { |e| e.values.first }
    f.write the_data.join(',') + "," + the_page + "\n"
    count += 1
    break if count >= 20
  end
end

Once again, edit the script to change:

  • The email and password you use to access Google Analytics.
  • The title, file_name and dropbox_path to save the data on your computer and dropbox.
  • The home title at line 60: replace - The Hiltmon with your own tagline.

The launcher code is in com.hiltmon.status_board_pages.plist:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.hiltmon.status_board_pages</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Hiltmon/Dropbox/Scripts/status_board_pages.rb</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
</dict>
</plist>

Update it too for your paths and names, the copy and load it.

Add it to Status Board

Follow the instructions in Table Tutorial (PDF):

  • Share the CSV file on your DropBox
  • Mail that link to yourself
  • Tap the link in the email on your iPad to open it in Safari
  • Copy the link from Safari (minus the bit after the ?)
  • Add a new table to your Status Board and paste in the link (it offers to do this by default).

Enjoy.

Update: All the scripts can be downloaded from Github at https://github.com/hiltmon/status-board-ga.

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Google Analytics for Status Board

Google has finally deprecated their GAPI interface which this used to talk to Google Analytics, sorry folks, it will no longer work. See the New Google Analytics for Status Board Server Edition for an updated version.

I wanted to see the 7-day Hiltmon.com web stats from Google Analytics on Panic’s new Status Board app. Here is how I got it to work.

Update: For a far simpler install that runs on your web server using PHP, see Google Analytics for Status Board Server Edition.

Update: Also added a script for Top Pages in Status Board, for Hourly Stats and for OS and Browser Stats.

Warning: Very geeky. Use at your own peril. Only tested in my environment.

Step 1: Install the Gems

In order to make this work, you need Ruby, the json gem and the gattica gem. I am running this using the default Ruby on OS X (1.8.7).

Installing the json gem is easy:

$ sudo gem install json

However the gattica gem requires a build because the posted one is too old:

$ git clone git://github.com/chrisle/gattica.git
$ cd gattica/
$ bundle install
$ gem build gattica.gemspec
$ sudo gem install gattica-0.6.2.gem

Update: Added the bundle install step to install dependencies. No need to install the old gem first as per old instructions and comments below. You may need to sudo bundle install on a production box.

Step 2: Configure the Script

Download the script from this gist or copy and paste it from here:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env ruby

# status_board_ga.rb
# Hilton Lipschitz 
# Twitter/ADN: @hiltmon 
# Web: https://hiltmon.com
# Use and modify freely, attribution appreciated
#
# Script to generate @panic status board files for Google Analytics web stats.
#
# Run this regularly to update status board
#
# For how to set up, see https://hiltmon.com/blog/2013/04/10/google-analytics-for-status-board/

# Include the gems needed
require 'rubygems'
require 'gattica'
require 'date'
require 'json'

# Your Settings
google_email   = 'hiltmon@gmail.com'  # Your google login
google_pwd     = 'I_aint_sayin'   # Must be a single use password if 2 factor is set up
the_title      = "Hiltmon.Com Stats"  # The title of the Graph
file_name      = "hiltmondotcom"      # The file name to use (.CSV and .JSON)
dropbox_folder = "/Users/Hiltmon/Dropbox/Data" # The path to a folder on your local DropBox

# Configuration 
metrics = ['pageviews', 'visitors', 'newVisits']
colors = ['red', 'green', 'blue']
days_to_get = 7

# Login
ga = Gattica.new({
    :email => google_email,
    :password => google_pwd
})

# Get a list of accounts
accounts = ga.accounts

# Choose the first account
ga.profile_id = accounts.first.profile_id
# ga.profile_id = accounts[1].profile_id # OR second account

# Get the data
data = ga.get({
    :start_date   => (Date.today - days_to_get).to_s.split('T')[0],
    :end_date     => Date.today.to_s.split('T')[0],
    :dimensions   => ['date'],
    :metrics      => metrics,
})

# Make the CSV file
File.open("#{dropbox_folder}/#{file_name}.csv", "w") do |f|
  f.write "#{the_title},#{metrics.join(',')}\n"
  data.to_h['points'].each do |point|
    the_date = Date.parse(point.to_h["dimensions"].first[:date]).to_s.split('T')[0]
    the_data = point.to_h["metrics"].map { |e| e.values.first }
    f.write the_date + "," + the_data.join(',') + "\n"
  end
end

# Make the JSON file
graph = Hash.new
graph[:title] = the_title
graph[:type] = 'bar'
index = 0
graph[:datasequences] = Array.new

metrics.each do |element|
  sequence = Hash.new
  sequence[:title] = element
  sequence_data = Array.new
  data.to_h['points'].each do |point|
    the_title = Date.parse(point.to_h["dimensions"].first[:date]).to_s.split('T')[0]
    the_value = point.to_h["metrics"][index][element.to_sym]
    sequence_data << { :title => the_title, :value => the_value }
  end
  sequence[:datapoints] = sequence_data
  sequence[:color] = colors[index]
  index += 1
  graph[:datasequences] << sequence
end

File.open("#{dropbox_folder}/#{file_name}.json", "w") do |f|
  wrapper = Hash.new
  wrapper[:graph] = graph
  f.write wrapper.to_json
end

Edit the script to change:

  • The email and password you use to access Google Analytics.
  • The title, file_name and dropbox_path to save the data on your computer and dropbox.

Note: This script uses the first account. If you want to use a different account, comment out line 43 and uncomment line 44, replacing the 1 with the index of the account you want to use. Download, modify and run the script from https://gist.github.com/hiltmon/5373934 to see what indexes are available.

Run the modified script to see if both the CSV and JSON get created in the required dropbox folder.

Step 3: Schedule it to Run

We’re going to run this script every 5 minutes. Note: These are the OS X instructions, use a crontab entry on Linux systems.

Create the following file com.hiltmon.status_board_ga.plist (modified for your path of course):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.hiltmon.status_board_ga</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Hiltmon/Dropbox/Scripts/status_board_ga.rb</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
</dict>
</plist>

Then copy it (you may need to create the folder) and start it:

$ cp com.hiltmon.status_board_ga.plist ~/Library/LaunchAgents
$ launchctl load -w ~/Library/LaunchAgents/com.hiltmon.status_board_ga.plist

Step 4: Add it to Status Board

Follow the instructions in Graph Tutorial (PDF):

  • Share the JSON file on your DropBox
  • Mail that link to yourself
  • Tap the link in the email on your iPad to open it in Safari
  • Copy the link from Safari (minus the bit after the ?)
  • Add a new graph to your Status Board and paste in the link (it offers to do this by default).

Enjoy.

Thanks to Panic for creating such a lovely tool.

Update: All the scripts can be downloaded from Github at https://github.com/hiltmon/status-board-ga.

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Google Already Is Big Brother

You can, and probably already do, most of these without paying any money (in no particular order):

  1. Use Google’s browser Chrome to visit web pages, which tell Google Analytics what you did
  2. Find information using Google Search, which tracks and saves your searches, search attempts and selections; with the results customized by Google’s model of you
  3. Jump to your favorite sites using a Google Toolbar extension or built-in search that checks each site you visit
  4. Send and receive all your personal email via Gmail (and probably work emails too), analyzed and filtered by Postini
  5. Find out whats going on (and should be going on) in your life and around you using Google Now
  6. Chat with others on Google Talk
  7. Schedule your life in Google Calendar
  8. Maintain your relationships and connections in Google Contacts
  9. Socialize via Google+ and participate in Google Groups
  10. Use Google Maps for locating yourself and getting around
  11. Check in with Google Latitude
  12. Use a Google phone (Android) for mobile calls, using a Motorola or Nexus handset
  13. Call internationally using Google Voice
  14. Read the news via Google News and get your feeds via Feedburner
  15. Watch TV and other Video on YouTube
  16. Read books from Google Books
  17. Listen to tunes from Google Play
  18. Find a restaurant using Zagat
  19. Plan you next vacation on Frommers
  20. Log in to other services using your Google ID and OAuth
  21. Save and share your personal photos on Picasa
  22. Purchase stuff via Google Shopper using Google Wallet
  23. Save your files on Google Drive
  24. Track your shares and investments on Google Finance
  25. Click on ads served by Google, DoubleClick, AdMob, AdMeld, Teracent, and AdScape
  26. Create, edit and collaborate using Google Apps
  27. Write your blog on Blogger
  28. Save your code on Google code
  29. Access the internet over Google fiber (OK, so this costs some money)
  30. And then there’s bookmarks, offers, iGoogle, translation, alerts and scholar.

Not sure? Click the above links and see how many redirect to a personalized view for you versus a public common page. I was surprised how many were personalized for me.

If you are mostly-in on Google, you have no secrets from Google. Your data is sold to nameless, faceless corporations who are Google’s true customers. Your access to information is screened and controlled by Google’s mysterious algorithms, filtering, service terms and whims which work for the greater good. Your screen is filled with targeted advertising based on Google’s knowledge of you and what they think people like you would or should like.

Clearly, Google is the Big Brother out of Orwell’s 1984 that we mindlessly volunteered our precious secrets to and blindly follow its recommendations. But it’s so easy and convenient and cheap and “I’ve got nothing to hide”.

Sigh!

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Is This the End?

The indie business is cyclical, a sin wave of quiet and busy times. The peaks are high and the troughs are low.

When an indie is busy, there is nothing better, no higher high. They are working with great clients, creating amazing products, solving the unsolvable, slaying dragons and earning enough money to pay the bills.

But when an indie is quiet, there is nothing worse, no lower low. No clients to please, no products to create, no problems to solve, no dragons to slay and no income coming in.

Sure, we choose our pricing to take these down times into account. We know we’re not going to be fully employed. But it’s a balance trying to predict just how under-employed we will be and how much we can charge. Some years we have little or no down time and do well; other years, we have too much down time and do badly.

These ups and downs are caused by a singular constraint, the indie themselves, the fact that they are a one person band. It’s hard to spend the time to market themselves and to create brilliant products for clients at the same time. So the marketing stops. As a result, when the products are shipped and the current clients satisfied, most indies have no next client or project to work on. They have had no time to market.

And the down-cycle begins.

Creating product is fun, it’s what we love to do. Finding new clients is not fun, it’s hard work, and most leads are dead ends. Finding clients takes time, the process slow. There’s the initial conversation, thinking time, more discussion, proposal, more conversation, iterations, and finally if and only if all these steps get completed, the signing of the contract and kickoff. While marketing, there’s no work to do, no income coming in, no nothing for an indie until the contract is signed and the retainer paid.

And the lows are not short lows, they always take too long, or certainly feel that way. One could argue that the indie gets to create a whole new indie business from scratch each cycle. Make new contacts, let people know they are available, and start following leads. And to make the lows lower, I believe a 90-10 rule applies to the marketing process. Only 10% of first conversations move on to a second conversations, 10% of those get to the proposal stage, 10% of those iterate and 10% of those generate a contract.

There are some famous indies out there who do not have this problem. Leads seek them out and leads are prepared to wait to get their slot to be served by those indies. Good for them. They have succeeded in building a brand as well as a sustainable business. As an indie, I am proud of their success and wish them the best. That is the business I and all other indies are striving to build too.

But the majority of indies do not have the brand recognition or the patient leads. If we are busy and a lead calls up, they do not wait for us to become available, they simply go elsewhere and we never hear from them again.

And when we’re quiet and leads are not calling in, or the first conversations are not going anywhere, or the pre-sales process is dragging on for far too long, we indies wonder why we do this. We wonder if we can get to the next contract before our emotions or businesses fail.

Each time we hit a low, we wonder: Is this the end?

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Sharing nvAlt Notes With Ulysses III

I’m testing out Ulysses III for writing and so far I am finding it postively interesting for a 1.0 rewrite. One thing I wanted to try was to use it for notes alongside nvAlt.

Here’s how to share notes between Ulysses III and nvAlt.

In Ulysses III, click the plus icon on the bottom left (1) and choose Add External Source... (2). Choose the folder in Dropbox where you store your nvAlt plain text notes, then click Open. Note that if you just drag and drop your nvAlt folder into Ulysses III, it will copy all the notes, not reference them.

In my case, I store my nvAlt notes as plain text files in my ~/Dropbox/Notational Data folder. As you can see, Ulysses III picks this as a Dropbox folder (with the cloud icon) and displays all your notes as sheets.

Ulysses III also displays (and sets) the file name in a special comment line at the top starting with @:. When you create a new Ulysses III sheet in this folder, you need to set the file name there (or use your TextExpander shortcuts).

More Tips:

  • Make sure that .md is a recognized extension in nvAlt / Preferences / Notes / Storage because that’s what Ulysses III uses.

  • In Ulysses III, right click on your notes folder and choose Edit.... Check Always assume Markdown syntax. That way, all your nvAlt notes will render and edit properly.

More on Ulysses III will follow as I continue to test out the product.

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.

Go Home

I was talking with a friend the other night about their number one concern with their new job, in that they expect to have to work until 11PM every night and would therefore give up yoga, movies and dating. I almost dropped my drink (which is a horrifying thought for an Aussie).

WTF! NO! Go Home! You work to live, not live to work.

I was that person, the one who worked all hours. During the 1990’s I worked 18 hour days, 7 days a week, for the whole decade. As a result, I was sickly, pale, miserable, lonely and not financially better off. In the noughts, I went home before 6PM every day, got healthy, got a social life, got married, crossed the planet, made an amazing career for myself and had an incredible amount of fun. All because I went home.

My mate is right, by working late she will be missing out on life, health, friends, love, and things that give her joy. She’ll become a monochromatic one-dimensional person, all work, with nothing else to talk about, no-one to talk to, a boring lonely soul.

On a professional level, working late is just as bad. Your productivity and work quality drops because you are tired all the time. Your relationships with colleagues deteriorate because you are in a bad mood all the time because they have fun stuff happening and you don’t. And because you are the one around, people give you more work to do so they can go home when you cannot even complete your current workload. You become the office hammer, a tool to be used, abused and discarded.

And you don’t get any thinking time. One of the best things about going home and doing other things is that it clears your mind and sets your subconscious free to muddle through work problems at its own pace. The best solutions to work problems I have come up with have all happened away from the desk. If you are struggling with something, go home, hang out, jog, watch a movie, and tackle it tomorrow with a fresh mind. That’s right, going home makes you better at work. Try it!

You don’t make money from spending time at your desk, or having “face time” with your colleagues. You don’t get promoted because of the hours you work, but because of the work you do and the kind of person you are.

You do become happier when surrounded by friends, you do become healthier when exercising, you do become a more well-rounded person when you take the time to practice hobbies, you do become more interesting when you have the time to follow your interests. You can only be a better parent of you see your kids, a better friend if you have “face time” with actual friends, a better spouse if you actually eat dinner together. That’s not going to happen if you are sitting at your desk.

So, set the precedent now and go home. If you stay late, people will expect you to stay late. If you leave at a regular time and have a life, your colleagues will expect that of you too. As long as you get your work done, go home!

Follow the author as @hiltmon on Twitter and @hiltmon on App.Net. Mute #xpost on one.