CRUMBS! Commandline navigation tool for Powershell

Penfold from Dangermouse and the word Crumbs!

I live on the commandline as much as possible (which is not nearly enough) and hence spend a lot of time navigating from one place to another. But, as much time as I spend navigating, I spend considerably more time thinking about ways to improve it.

One tool I've come up with is a set of functions that I call:

CRUMBS!*

* Pronounced "CRUMBS!" in the voice of Penfold from Dangermouse. (I realize that my American readers are probably unfamiliar with concepts like "Penfold" and "Dangermouse" so I'll give you a few minutes to look up those concepts, watch a few episodes on the YouTube, learn about The Goodies while you're there, etc.)


download crumbs.ps1 (dot it)


crumbs at github


To use it, download it, open powershell and 'dot' the file, i.e. execute: ". .\crumbs.ps1"

Crumbs consists of two functions: crumb and crumbs. It borrows a metaphor from the story of Hansel and Gretel. You may recall that they dropped breadcrumbs in order to find their way back. Although in this case the breadcrumbs are more like transwarp teleportation wormholes that let you zing across space and time. And there's no birds that eat the crumbs nor are there any gingerbread houses or cannibalistic witches. But I digress.

Here's how you use the two functions.

Let us say that you're in some deeply nested folder which you might want to get back to. Use the crumb command to drop a crumb:

PS C:\Work\Scratch\Pyjamas\Carousel Fandango\Rhubarb\> crumb

There. You dropped a crumb and now you'll be able to get back to that location. Let's go somewhere else...

PS C:\Work\Scratch\Pyjamas\Carousel Fandango\Rhubarb\> cd C:\Play\Games
PS C:\Play\Games> crumbs
0 -> C:\Work\Scratch\Pyjamas\Carousel Fandango\Rhubarb
PS C:\Play\Games> crumb
PS C:\Play\Games> crumbs
0 -> C:\Work\Scratch\Pyjamas\Carousel Fandango\Rhubarb
1 -> C:\Play\Games
 

Did you see that? When we called the crumbs command, it listed allllll of our crumbs... (we happened to only have one crumb) and it said that the id for that crumb was number zero. Then we added another crumb and saw it was number 1 in the list of crumbs.

Now if we type "crumb 0" we'll jump straight back to that location...

PS C:\Play\Games> crumb 0
PS C:\Work\Scratch\Pyjamas\Carousel Fandango\Rhubarb\> 

That's pretty much it. You can drop as many crumbs as you like... well up to int.max of them I guess. And you can remove them by "minusing" them away, like so:

PS C:\Play\Games> crumb -0

(Crumb 0 deleted)

Crumbs only live for the duration of your console session. I had an idea about making a 'bake' command that would make a crumb permanent (by turning it into a 'crouton') -- but either the metaphor was stretched too far or I got hungry and went off to eat. Whatever the cause, I never got as far as the bake command.

Included in the script above are aliases, that let you type 'cr' instead of 'crumb' and 'crs' instead of 'crumbs'.

And while you're at it, go buy a Penfold 'CRUMBS!' sticker, as seen above.

Navigation in Other Worlds

Meanwhile, in the bash world they have some very cool tools to make navigating easier. In particular several tools such as autojump, z, v and fasd use the concept of 'frecency' (the combination of frequency and recency) combined with auto-completion to let you find your most likely next location in as few keystrokes as possible. Are there equivalents in Powershell? Seen one? Got one? I've just found "Jump-location" and plan to give it a spin.

Also, in the last few days I came across an approach that is not too different to crumbs Mark and Jump. There was a lengthy related discussion at hacker news.

I've implemented my own version of this as well.


download markjump.ps1 (dot it)


markjump at github


In this case there are four functions: Mark, Jump, Unmark and Marks.

With 'mark' (unlike crumb) you specify a friendly name for the current location. Then with Jump {name} you go back to it. Use marks to list all the names and locations you've marked. And with unmark {name} you can remove one from the list. (Go read the readme if you really care.)

It includes aliases 'm' for mark, 'j' for jump, and um for unmark. You might want to comment those out if they collide with other aliases you use.

Crumbs is useful for adhoc navigation tasks. Marks is useful for links you use often. (It persists across your sessions). Both are useful. Both are a bit raw. Feedback welcome.

 

Little tool for making Amazon affiliate links

enter your affiliate id and a url at amazon, and get back an affiliated url for that product

This is a very very very very little tool. You give it your Amazon affiliate id, and any Amazon url for a product, and it gives you back a url for that product, with your affiliate id.


amazon affiliate link maker →


There used to be a lot of neat little tools like this around the place, in the days when people controlled the branding of their own blogs (one bazillion years ago), but I could no longer find one I liked, so I built this one. It uses code that is a part of You Must Get It. If you are signed in to You Must Get It, then it will enter your affiliate id for you.

There's also a version for bulk conversion of urls. Combine this with NimbleText and you have a way to turn plain lists of amazon urls into large swathes of affiliated html. If that's your thing.

 

Extracting a Trello board as markdown

(or "web scraping from the chrome console, with jquery")

Updated for 2020 😁

Assuming you use Trello and the Chrome browser, here's a technique for extracting a trello board onto your clipboard as plain text.

Navigate to the Trello board you want to grab, and bring up the chrome developer tools ([F12], or [Ctrl]+[Shift]+[I], or Tools → Developer Tools)

Go to the console (chrome console icon is a greater than followed by an equivalence indicator) -- and enter this piece of javascript. (Don't read it.... just enter it... trust me).

var s=[];s.push("# "+jQuery(".board-header").children()[0].innerText);jQuery(".list:has(.list-header-name)").each(function() {s.push("\n## "+jQuery(this).find(".list-header-name-assist")[0].innerText+"\n");jQuery(this).find(".list-card-title").each(function() {s.push("* "+this.innerText);});});copy(s.join("\n"));

Okay -- spaced out over a couple of lines it reads:


var s = [];
s.push("# " + jQuery(".board-header").children()[0].innerText);
jQuery(".list:has(.list-header-name)").each(function() {
    s.push("\n## " + jQuery(this).find(".list-header-name-assist")[0].innerText + "\n");
    jQuery(this).find(".list-card-title").each(function() {
        s.push("* " + this.innerText);
    });
});
copy(s.join("\n"));

The whole trello board will now be on your clipboard, in nature's favorite format: markdown.

Use the intrinsic 'copy' function to copy a value to the clipboard

One lesson I learnt while putting this together: you can use copy in the console to put a value onto the clipboard. This doesn't work in regular pages, for security reasons.

Inject jQuery into a page

If you want to use this kind of data-extraction technique on a page that doesn't have jQuery, then you'll want a simple technique for injecting jQuery into a page.

Just pop down to the console and paste this:

var script = document.createElement("script");
script.src = "http://code.jquery.com/jquery-latest.min.js";
document.body.appendChild(script);

jQuery will now be available on that page, and you can sizzle to your heart's content.

Caveats:

  1. You may first want to make sure jquery isn't already loaded.
  2. And you have to make sure the 'script' variable doesn't overwrite any existing variable of the same name.
  3. You may want a specific jQuery version.
  4. Use at your own risk, no warranty or replacement for lost limbs etc.
 

hgs: Manage Lots of Mercurial Projects Simultaneously

hgs is a simple set of powershell functions that let you find and manage multiple mercurial projects -- simultaneously.


install_hgs.ps1


Background

A friend of mine creates way too many mercurial repositories. Where other people would have multiple projects in one solution, he has numerous individual projects each in their own repository (which are sometimes shared back into each other via nuget packages).

The result is a very explicit separation of concerns, but also a *lot* of repositories. Just trying to get all of his changes involves pulling from many different repositories.

This gave me the motivation I need to come up with a simpler way to manage multiple repositories.

At first I decided to make a windows app that showed all your repositories at once, and let you select many of them to run a command against simultaneously. Here's the basic layout I was thinking of:

a window for entering commands, a checkedlist box for selecting repositories and a textbox for displaying results

The clever part is that the result of any command would be parsed by a series of regular expressions that are used for determining the status of each repository, relative to that command. Thus you can see each repo light up as green, when your multiple pulls succeed, or red when your multiple updates fail, etc. And a lot of effort would be spent on having first-class keyboard support, so your mouse is free to gather dust.

To get this working would've taken many bus-rides to do the way I wanted, and a lot longer to maintain and improve it.

Fuck that.

Instead I wrote a page of powershell, and got the same result.

Introducing hgs -- the plural of hg.


install_hgs.ps1


To get started, grab the .ps1 file above. Then, from powershell, dot-source the file to install the four functions. (Oh, read it first if you must.)

hgs is composed of four simple functions. Here it is in its entirety:

# function hgs_update  --  updates/refreshes "hgs.txt"
function hgs_update() 
{ 
  dir . .hg -recurse | 
  % { 
      $_.Parent.FullName 
  } >   $env:localappdata"\hgs.txt" 
}

# function hgs_ls      --  list the contents of hgs.txt 
function hgs_ls ()
{ 
 get-content $env:localappdata"\hgs.txt" 
}

#function hgs          --  runs hg commands against all folders in hgs
# usage: hgs {commands},  examples: hgs stat, hgs in, hgs fetch 
function hgs() 
{ 
  $a = $args; 
  $color = $host.UI.RawUI.ForegroundColor; 
  type $env:localappdata"\hgs.txt" | % { 
        pushd $_; 
        $host.UI.RawUI.ForegroundColor ="White"; 
        "Results for: " + $_ + ":"; 
        $host.UI.RawUI.ForegroundColor =$color ; 
        hg $a; 
        popd
      } 
}
#function hgs_measure  
# runs hg commands against all folders in hgs, return length of response (in rows)
# usage: hgs_measure {commands}
# examples: hgs_measure stat, hgs_measure in, hgs_measure fetch 
function hgs_measure() 
{
  $a = $args; 
  $color = $host.UI.RawUI.ForegroundColor; 
  type $env:localappdata"\hgs.txt" | % { 
        pushd $_; 
        $host.UI.RawUI.ForegroundColor ="Red"; 
        
        $output = hg $a | out-string; 
        
        $host.UI.RawUI.ForegroundColor ="White"; 
        
        "" + ($output.split("`n").length) + " lines: " +  $_ ;
        $host.UI.RawUI.ForegroundColor =$color ; 
        
        popd
      } 
}

All four functions are concerned with a file called 'hgs.txt' a file containing a list of all your mercurial repositories.

hgs_update

To update the hgs.txt file, call the function 'hgs_update'.

This function pipes the name of every folder which contains a folder named '.hg' into hgs.txt (in other words, it searches for all your mercurial repos).

hgs_ls

The second function, hgs_ls gives you a peak at the content of hgs.txt (i.e. it shows you all the mercurial repos that were found).

hgs

The third function, hgs lets you run a hg command against all the repositories at once.

For example you might try:

hgs stat    # check the status of all your repositories
hgs in      # show new changesets for all your repositories
hgs diff    # diff all your repositories
hgs pull -u # pull from all remote repositories and update if changes were found
hgs fetch   # pull changes from all remote repositories, merge new changes if needed. 
            # (requires the unloved  fetch extension)

I provide those examples because they are all things that you might do 'en masse'.

Other commands like revert, forget and definitely push should be done on a more careful case-by-case basis.

hgs_measure

Finally, hgs_measure, (like the hgs command), lets you run a hg command against all the repositories at once, but instead of showing you the results, it just tells you how many lines of text came back as a result. This is a way to get a quick overview of all your repositories without scrolling through screens and screens of information.

And powershell's wonderful code completion feature means that you only have to remember hgs (the plural of hg) and you can tab through all four functions.

Best of luck.

 

You Must Get It!








Note the website mentioned here, you must get, is no longer maintained.

It's been many months since I made my rash decision to purchase 'YouMustGet.com' and in that time I've worked tirelessly to establish the 'you must get' empire.

It's now ready for you to use and enjoy, at an even better url than before:


YouMustGet.It


You Must Get It is a place where you can show off the products you love, and see what other people are recommending.

Here's your six step plan to consumer bliss:

  1. Go here: YouMustGet.It
  2. Sign up!
  3. Follow some interesting users. Or follow me.
  4. Drag the 'favelet' into your bookmarks bar. (You may need to show your bookmarks bar first)
  5. Travel around the internet, finding all the products you love, and recommend them all, by clicking the 'must get' favelet
  6. Tell all your lucky lucky friends!

Get Rich By Being Greedy

Death to capitalist pigs, three cheers for Full Communism Now and all that -- but check out this feature that lets *you* rake in the affiliate dollars.

You can specify your Amazon affiliate ID in your user profile. Thereafter, any time you recommend a product at Amazon, we will use your affiliate ID. No matter what Amazon product link you provide we'll turn it into an affiliate link using your affilite ID.

At some sites (cough - pinterest - cough) they do something much nastier: they always use their affiliate ID for all Amazon links. In fact, even if you've already explicitly specified an affiliate ID they take your ID out and put theirs in! We don't do that.

Feeling Lazy?

And, there's one other feature that I quite like: the 'Feeling Lazy' button.

Too lazy to click around looking for things to buy? Click the Feeling Lazy button and you'll be taken to a new random product every 3 seconds.

(I also plan to add the 'Feeling Rich and Lazy' button, which will take you to random products, and randomly buy a few of them as it goes.)

So join you must get it today. Get involved. Be awesome.

Great products: Where are they?

Apart from scouring through every product at a site like Amazon, Ebay or Etsy, you can find some excellent curated lists at these sites:

Embed your own...

Also, you can embed a YouMustGetIt list of your own product recommendations by using these three lines of code:

<ul id="umg_list"></ul>
<script type="text/javascript" src="https://YouMustGet.It/scripts/embed.js"></script>
<script type="text/javascript" src="https://YouMustGet.It/API/said/secretGeek/10?callback=umg_callback"></script>

(Substitute your own username in, and how many posts you want to see, in place of 'secretGeek' and '10' respectively)

The embedded stuff is still a work in progress, but should improve in the next few days.

 

AddDays: A Very Simple Date Calculator

Add days windows app, specify date, number of days to add, and a format

To help my business manager (aka wife) with invoice preparation I wrote a very simple date addition calculator.

You can download it here.


AddDays.exe


Given a date, it adds a number of days to it, so you can calculate due dates for invoices.

When I told my colleagues about this they each had different but equally 'helpful' alternatives I could have used.

  1. Why not user powershell? (Get-Date).AddDays(50) | clip
  2. What about the built in "Date Calculation" mode in Calculator? (The templates feature of Windows 7 Calculator is pretty interesting by the way)
  3. Why not just use excel?
  4. Why not use the DATEADD function in SQL? Most people have SQL Management Studio open all the time, don't they?
  5. Why don't you use Invoice Place?

I like writing my own software, and the little details are the things I love the best. The moment you change the date, or change the number of days to add, or change the format, the result is immediately copied to the clipboard.

Anyway, if it helps you so be it. No support it offered, and of course I disclaim all responsibility to the best of my ability.

Writing your own solutions to your own problems is very satisfying.

Regarding the special features of 'calc.exe', here's a screenshot of calc in 'Date Calculation' mode (available in Windows 7 and above)

 

Google caught in a lie.

In the wake of the PRISM hacking scandal, we're all looking at the Big Cloud providers with a slightly more cynical eye than ever before.

So when I noticed a few pieces of intellectual dishonesty at Google Analytics I dug a little deeper than I normally would. And the deeper I dug, the worst things got. Hold on for a, well not a wild ride, more of a gentle somewhat nerdy ride, with a little trash-talking of Google+ along the way.

On the login page for Google analytics, they show you some enticing info-porn to get you excited before logging on.

Something fishy about this pie chart immediately caught my eye:

Look at the largest section of the pie, that blue section.

No way is that 34%! It's clearly just over 25% -- what kind of dumb mock up is this? Are they demonstrating their awesome analytic platform by showing us some faulty analysis?

But then I did a coffee spit.

The pie chart is suggesting that the two biggest contributors to your social traffic will be people 'plus-oneing' your content with Google+ (blue), and people re-sharing your content, with Google plus (light blue). In your dreams, Google! Your sad, sad, lonely, social-misfit dreams.

So, I crunched the numbers to see if the percentages of the labels had been tampered with, or the pie itself was altered. Here's the chart I produced, using the same raw numbers:

Some more bugs in their image. I'll do these quick fire in an ordered list:

  1. The table header says "1-7 of 7", when there are clearly only "5". Counting is hard, poor Google.
  2. Didn't 'Read it later' change its name to 'Pocket' about a million years ago in internet time?
  3. What is 'delicious'? Some ancient link-sharing site my grand-dad used on AOL from his fax machine?
  4. And are they incapable of recognising the possibility of traffic from twitter, or just incapable of saying the word?

So it's pretty obvious by now that the marketing image is very much a contrived image. But does it have any resemblance to the produce itself?

Here's a real pie chart from the dubious social network feature of Google Analytics: (I've removed my dismal figures)

As I suspected, and unlike the mockup, the portions are laid out clock-wise, descending, starting at the top. And the percentage's are drawn inside the pie, not outside of it.

And this time you can tell you're looking at a real Google Analytics pie chart, because Google+ contributes less than 1% of the social traffic.

 

NimbleText 2.0: More Than Twice The Price!

The latest release of NimbleText is a major milestone, took a lot of work, many bus trips.

As a user of the product, I feel it's good now. I don't want to say it's complete -- because I know how big the backlog still is -- but there's a sort of completeness to it. If no more features were added for a while, I think that would be okay.

I added custom sorting features, and auto preview, and more documentation, and a bunch of other stuff.

I even wrote one of those feature checklists you see in all the expensive professional software suites. --->

Now that's pretty bloody serious stuff.

But then I did something really serious:

I more than doubled the price.

Everywhere I looked, people were telling me to put up the price.

This article crossed my desk today: An eBook pricing model that resulted in $100,000 in sales and contains this quote:

I consulted Patrick McKenzie. Can you guess what he said?

"Charge more."

Of course Patrick would say that.

But when I stumbled onto this article, also just today, 'four pricing principles to never forget' -- the following ALL CAPS headline was like a slap across the face:

CHARGE MORE THAN YOU'RE COMFORTABLE WITH

That was it! Enough was enough. I shut the browser! Slam! Opened the html editor! Whoosh! A search, a replace-all, and it was done in less than a minute.

The price went from $9.95 to $19.95. Double! DOUBLE! Plus five cents!

And I don't regret it for a second. At $20 it's still a steal. I'm seriously thinking of going to $50. Who knows where this madness will end? $75? $78.50?

I have unleashed a pricing monster!


Further reading:

  1. Product Pricing Primer -- Eric Sink.
  2. Money Buys Happiness and You Can Never Have Too Much, New Research Says

Oh, and you'd be wise to get in on TimeSnapper before this pricing madness spreads.

 

A Computer Simulation of Creative Work, or 'How To Get Nothing Done'

Every year is getting shorter, never seem to find the time
Plans that either come to naught or half a page of scribbled lines

According to the available data, I'm a hard-working and creative person. Yet my productive output tends to hover just above nil. My feelings are generally in line with Roger Water's lyric, quoted above. Why? What causes the gap between work and productivity? But more importantly: can a computer simulation shed light on the underlying problem?

I set about modelling my personal productivity, with javascript and flot.

Here's how the model works:

Every bus trip I work and work and work, always on what is the most pertinent task for the project I am working on.

But as I work, I sometimes think of new projects. I immediately (and at no cost) add those projects to my backlog, then continue with my current task.

As soon as I finish a task, I look over my set of all next actions and choose whichever one feels most interesting at that point in time (modelled as a random selection)

You can play with this simulation yourself:


Creative Dilligence Simulator


The parameters are configurable. By default each project contains 10 tasks (these are mini-projects really). And each time I do a task there is a 25% chance I'll think of a new project.

The results of the simulation are woeful!

Here's an example:

After a year of bus trips, I've done enough hard work that I could've completed 20 projects. Instead I've finished only 2 (emphasized by the green arrow). Re-running it, I sometimes complete as many as 3 or as few as 0. Meanwhile my backlog of work has grown big enough to keep me busy for years to come.

As simplistic as the model is, it already makes me feel uncomfortable with its home truths. I know this feeling all too well. Hard work, but it's like spinning your wheels while stuck in mud. I know that my time is spent always on tasks I consider worthwhile, yet I'm still getting nothing done.

side projects

Here's the shocking thing. This low productivity is not caused by all the usual culprits we list when discussing 'procrastination'. This isn't because of low motivation or excessive distraction by non-productive items. This isn't because of fear (the alleged mind killer) -- it's not fear of shipping, fear of criticism, fear of success, or any other paralysing phobia.

Getting 'Things' Done versus Getting 'Projects' Done

This is the difference between utilization and productivity. High utilization can be just busy work.

This is purely organisational pathology, and 100% curable.

The immediate question is what to do about it? Now the modelling becomes fun.

If I can decrease my ability to think of new projects, down to around 10 percent (approximately 1 new project idea for 10 tasks done), then I manage to ship more projects.

At the end of the year I've now completed between 8 and 20 projects. Yay. But now a new problem arises: I frequently run out of work to do! Many bus trips I just sit there, twiddling my thumbs, staring out the window. For me, that's a terrifying prospect, a sort of waking death. But in any case, I think it's outside my control. This continual thinking up of new projects (albeit stupid STUPID projects) is just a fact of life. You might as well ask a cat to stop following a laser pointer.

The trick instead is to come up with a new strategy for picking tasks. When I finish one task and it's time to move onto another, I need to be far more careful about which task I work on next.

So I implemented a strategy called 'stick to a project'. In this strategy, I keep working on my current project until that project is done.

This is the same as Henry Miller's first resolution on his list of writing rules (more such rules here):

1. Work on one thing at a time until finished.

The results are much more satisfying. I still end up with a giant backlog of work -- but the amount of projects that I've shipped is now exactly in line with the effort I've put in.



That's all I needed to get out of the model -- and at this point I can stop modelling and return to doing.

But it's also just the tip of what the model shows you. Different people have different fears and different desires. Depending on your personal preferences different results are optimal. You might be driven by any of these:

  • Fear of drowning in work (minimize backlog)
  • Fear of running out of work (maximize backlog)
  • Love of a big backlog (maximize backlog)
  • Hate working on the same thing all the time (continual switching)
  • Fear of negative feedback after releasing work (minimize project completion)
  • Desire to release work constantly (maximize project completion)

Play with the numbers, you'll see how to get what you want. Or copy the code and change the model to reflect your own behaviour.

That link again:

Creative Dilligence Simulator


Models are not reality

In practice, things get a lot messier. Projects have variable sizes. Projects grow as you work on them. Some projects *should* be abandoned, not stuck to. (If a job's not worth doing, it's not worth doing properly).

The model is very simple but it was complex enough to demonstrate something useful to me, so I'm happy to publish this as is.

Now I must get back to the gormless and unstoppable implementation of whatever addle-brained scheme has floated to the top of my steaming heap of incomplete mini-projects. Wish me well.

Final thoughts from my spirit animal, the artillery man from Jeff Wayan's "War of the World's Musical" —

Journalist: [as narrator] In the cellar was a tunnel scarcely ten yards long, that had taken him a week to dig. I could have dug that much in a day, and I suddenly had my first inkling of the gulf between his dreams and his powers.

Artilleryman: It's doing the working and the thinking that wears a fellow out. I'm ready for a bit of a rest. How about a drink, eh? Nothing but champagne; now I'm the boss!

 

NimbleText 1.9 -- BoomTown!

I put out a new NimbleText a few days ago.

The release notes are here, but do you want the minutely-detailed and wildly self-indulgent story behind the release notes? Of course you do!

Along with a spattering of smaller improvements, the main innovation is that you can now expose your settings (and quickly change them) from the toolbar.

I wanted this for a while, but couldn't find the right way to let the user configure it. Finally, with inspiration from Windows 7, I came up with using a pin/unpin metaphor, inside the Options form, like so:

Coming up with this design was surprisingly difficult. Some of the designs I rejected were:

Some people asked for a "view" menu where you check or uncheck the options you want to have appear on the toolbar. Here's a quick mockup:

This concept was broken for two reasons.

First, it looks like you're turning the option itself on or off -- not turning on whether or not the option is shown in the toolbar.

Second, if you were to click one of those menu items, thus toggling its checked state, this would also have the undesirable side effect of closing the menu. So if you wanted to show or hide three settings you'd need to re-open the menu three times, for a total of six-clicks. Annoying behavior! (Incidentally my NextAction tool suffers this problem, embedding so many settings in deeply-nested context menus that collapse whenever you click them. Overriding this behaviour is problematic!)

So the new plan was to put checkboxes of some sort inside the Options form, adjacent to each option. But take a look at this mockup:

Again it's easy to think that clicking the new checkbox will cause the option to be turned on. I wasn't going to implement this or anything like it. Then I noticed the way application icon pinning works in Windows, from 7 onwards.

It's an elegant solution, maybe the nicest touch in Windows since they shot the dog.

So I had my big-chief-graphic-design-intern (i.e. Me) whip out a dodgy mockup, ran it over to my main opinion-deflection-test-subject (i.e. Rhys) and after a few short bursts of shouting the project was green-lighted and implementation began.

Here's the mockup with which I got approval from the board:

If it seems weird to agonize over a small feature like this, I could point out not only a long history of such behavior from myself, but also I can provide evidence that i'm a bit of a toolbar fetishist, having written 6 articles on the topic previously:

What UX have you agonised over lately?