LaunchBar Delicious Search Template

I love LaunchBar. I’ll do a bigger, much longer post in the future. But I wanted to shoot out a small tip for those other LaunchBar users out there. if you’re familiar with Search Templates in LaunchBar, you know that by default it’s missing a Delicious Search Template to search your bookmarks. Well, it’s easy to add one.

  • Open LaunchBar and open up your LaunchBar index (Option-Apple-I).
  • Select ‘Search Templates (UTF-8)’ on the left.
  • In the resulting pane, click the ‘Add…’ button at the bottom.
  • Type ‘Delicious’ for the name and past this text:
    http://delicious.com/search?p=*&context=userposts%7CYOUR USERNAME%7C
    

    Obviously, replace ‘YOUR USERNAME’ with your Delicous user name.

Now, when you bring up LaunchBar, start typing ‘delicious’. When the current item changes to ‘delicious Search Template’, hit space. You can now type in a search term(s) and hit enter to bring up the Delicious search page for your bookmarks.

More on the Economics of Sports Stadiums

Over at the International Journal of Sports Fiance, they dug up this little gem:

Reports of financial problems in California appear to be greatly exaggerated. What else can explain the recent news out of California that The Governator signed legislation that will permit the construction of a new football stadium in City of Industry, an LA suburb. The stadium will cost an estimated $800 million (subject to the usual cost over-runs, so better make that a billion of so by the time it’s all said and done) and will be “green.” Of course it will.

It also appears that someone in the governors office has been drinking the economic impact cool aid. According to the press release put out by Governor Ah-nold, this new stadium will “generate 18,000 jobs and $760 million in annual revenue.” I think that the last thirty years of economic research showing no tangible economic benefits from professional sports stadiums has not yet reached California.

Splendid. I’m sure what’s good for NYC will be good for CA.

I’m not surprised that people still complain that losing the Olympics cost Chicago jobs by losing out on similar construction. Even though the people with the skills to building those venues are not sitting around unemployed and are usually not local.

Apps We Love: Things ( with Dropbox thrown in )

Things

Things from Cultured Code is an easy to use task management application built from the ground up for the Mac. While at first glance, it looks like just another GTD themed app, it’s actually very flexible and can conform to your specific workflow. I find it invaluable for keeping track of anything and everything in my life, from work to play. There’s also a iPhone version of Things. While being standalone, it syncs flawlessly with the desktop version for the ultimate in to-do management between devices and locations.

By far, my favorite feature is the Quick Entry dialog that you can invoke with a single keystroke. I have mine set to Option-Space. When you press those keys, up pops a simple dialog box where you can type in a task and optionally add tags, notes, a due date and file it into a project. New in the latest release is a ‘Show and autofill’ option. What this does is take whatever you have selected, for example a piece of text or an email, and places it into the notes section of the Quick Entry dialog. That way, you can quickly create todos from emails, web pages, calendar events and even other to-dos.

The one thing that it doesn’t do natively is sync between computers, using MobileMe or some other means. However, I actually have syncing working across machines using the awesome Dropbox. Here’s what I did:

  • Start Things so that is creates a local library.
  • Move the resulting ~/Library/Application Support/Cultured Code/Things directory to your drop box.
  • Open up a terminal window and cd to the ~/Library/Application Support/Cultured Code directory.
  • Create a symbolic link to your Dropbox Things directory: ln -s <Your Drobbox directory>/Things Things

That’s it. Things will now load up the Things database on your Dropbox and Dropbox will keep the database in sync to your other computers.

My Recent Twitter Failure Experience

On a whim, I recently decided to give twitter one last shot. I started to see several djs and music acts I like using it, so I thought it would be a good way to maybe get some new music.

Well, after a little under a week, I give up. I always suspected that Twitter would end up having high signal-to-noise ratio and that any useful nuggets I got from it would be the work of serendipity. This turned out to be exactly the case. I went one day, a Sunday no less, without checking my twitter client. When I fired it up on Monday morning, I had to scroll through about 50 tweets. I could either sift through the tweets or just skip them. I skipped them, reinforcing my idea that finding something useful on Twitter is random. If I’m skipping over the excess flow from a random winter Sunday, what happens at the end of a work day when I’m too tired to go through them? The real kicker? I was only following 4 people. FOUR. I can only imagine what people who follow hundreds or thousands of people go through.

To me, Twitter only seems useful if I’m a person or company peddling something and want to reach my audience directly. In this case, I can see some value, but on it’s own, it’s just not compelling. It seems I’m not alone. VentureBeat is reporting that at the latest Web 2.0 summit, someone asked a panel of teenagers their thoughts about Twitter. After basically saying that they didn’t get why anyone would use it, an audience member asked them this:

Later, one of the audience members asked if the teens might reconsider their position when they’re older and need to promote something (which, I might add, is a dispiriting way to think about Twitter’s purpose). They said they’d think about it, if they knew enough people using the service.

I have to concur with the authors note about the basis of the question being dispiriting.

Dependency Inversion & Reducing Expensive Variability

While working my way through Donald G. Reinertsens latest book, The Principles of Product Development Flow, I noticed that one of his principles for exploiting variability is “V14: Substitute cheap variability for expensive variability.” The basic idea is that during product development you should be aware when you can sacrifice variability with a low economic impact to reduce more expensive variation.

This reminded me of a more common principle in software development, the Dependency Inversion Principle (DIP). The DIP specifies that higher level modules should depend on lower level ones and that both should depend on abstractions, rather than specific implementation details. But why is this the case? What benefit does this bring?

Most experienced developers understand that one of the ways to make your code base as stable and as resistant to the effects of change as possible is to progressively stack your software into layers. Dependencies between the layers should flow from the higher layers to the lower layers. The lower the layer, the more stable and static the code in that layer should be. The opposite is true for code in the higher layer. Thus the higher layers contain the most dynamic code and the code most likely the change. Since the second part of the DIP specifies that you should depend on abstractions and not details, it follows that your lower layers should house your application abstractions and that those abstractions should remain fairly static.

Because of these dependencies, the economic cost in changing that code is inversely proportional to layer in which that code is found. The lower the layer, the higher the cost and vice versa. Using V14 above, you can make architectural decisions about where changes to your code base should happen if you can quantify the amount of variability the change is likely to introduce.

My Summer Experience

You never really appreciate what you have until you don't have it any more.

That's certainly very true of the ample time I had during the summer when I could work on 1530 Technologies projects.  It was awesome to constantly be fixing up code and implementing new features on the fly.  Throughout the course of the summer, it's really amazing to see your code evolve and see your projects grow into something wonderful.  Whether it was working on Amazon FPS integration or learning more about JQuery with Firebug, I always found something challenging to do.  It was a lot of fun and I'm proud of all the work I accomplished.  All in all it was a fascinating experience.

Alas, school has now started and I'm being inundated with classes and midterms, so I don't get to do as much stuff with 1530 anymore.  However, I'm still putting in all the work that I can, and I'm excited to continue working at 1530 Technologies!

Puppet Sex, Negotiations and Economic Incentives

There’s a movie from the creators of South Park called ‘Team America: World Police’. All of the “actors” are marionettes. I’m not going to get into the politics of the movie. I just wanted to talk about one scene. In this scene, the love story subplot of the movie comes to a head:

Lisa: Promise me you’ll never die.
Gary Johnston: You know I can’t promise that.
Lisa: If you did that, I would make love to you right now.
Gary Johnston: <awestruck> I promise I’ll never die.

That scene always cracks me up. Not only because of the marionettes, but because of the obvious incentive Gary has to simply tell Lisa what she wants to hear, regardless of the reality of the situation.

Now that I have your attention, I’d like to tell you about a similar situation I ran into last weekend. We were thinking about switching credit card processing providers for Awardable. Currently we use Amazon Flexible Payment Services, but I had heard very good things about Braintree. Navigating to their site, I couldn’t find a price list. Strange. So I filled out the ‘Contact Us’ link hoping to be emailed a price list.

A short time later, a representative from Braintree contacted me via email:

Hi Griffin,
Thank you for contacting us. Can you share some additional details about your business processing needs including what product/service you are selling and current or expected monthly processing volume?

I responded:

Hi,
Could you give me some more information about your pricing structure?

Which I thought was strange. Every other merchant solution we’ve investigated ( Authorize.Net, Google Checkout, Paypal, Amazon FPS, etc.. ) has their price list, by tiers, on their product website. Why would Braintree be different?

Hi Griffin,
Thank you for the quick response. I would be happy to send you pricing but I need you to answer the questions in my previous email before I send pricing. (Can you share some additional details about your business processing needs including what product/service you are selling and current or expected monthly processing volume?)

Hmm, strange response and not at all what I was expecting.

Hi,
Sorry, not sure why you need to know that. Every other credit card processing solution has their prices on their site, including pricing per tiers based on volume. I’m a little leery about a service that needs to be tailored per customer.

At this point, I’m not really interested in Braintree anymore. It seems like they’re either going to be too expensive for us or there’s going to be some other catch. Then comes this response:

Hi Griffin,
I am sorry to hear that. There are hundreds of different interchange rates that Visa/all other cards charge. So I don’t know what my cost is until I know what you sell, how you sell it, and your volumes. Volume is also important because I can give you lower pricing if your volume is higher. The other reason we ask for information is we need to know if you are even compatible with our company. There are industries like the adult industry that we simply can’t work with. I would like to know if we are compatible before we start sending pricing and other information so I don’t waste your time. I do need that information to proceed.

The part about adult services sounds plausible, but still, why not just put that on your site? It’s not like you’re going to be confused about if you sell porn.Also, the part about interchange rates seems a little off. Every other merchant has figured this out except for Braintree. Either they’re banking on screwing over the smaller volume clients or they just aren’t big enough to beat the other services I mentioned above.

Hi,
No problem. I just have a hunch that from your questions we wouldn’t have the volume to get your competitive rates. No matter, well stick with Amazon, Auth.net, google and the like.

He ends with this:

Hi Griffin,
Our rates are very competitive, and we do bring on many new merchants. I just need to understand what I am pricing before I price it. I will close things out on my end, but if you decide you would like to see what we offer please let me know.

What does this have to with incentives? Well, from my POV, the rep made two critical errors.

First, he’s made it pretty clear that their prices are based on volume. More volume == lower prices. But what about if you don’t know the volume? As a new merchant, I would have to guess. However, if they want a quote to base my rates off of, isn’t it in my best interest to be wildly optimistic about our expected volume in order to get the lowest quote? Since we’re so new, it’s just a guess anyway and if I’m guessing, why would I low ball my guess when it will result in higher rates from them? In this case, he created the incentive for me to tell him what he wanted to hear.

Second, he never explains why other companies can put list their prices up front but Braintree can’t. If he needs a expected volume guess and a services overview, I’m sure he’s just throwing those into a spreadsheet. He’s not going to treat me differently for any reason. If that’s the case, why not just formalize the spreadsheet and toss it online? What are they gaining by adding the bottleneck of a salesman? If we come in under the expected volume, I’m assuming there’s a penalty. If so, then they’re rates must be formalized, so why hide them?

Apps We Love: ClickToFlash

ClickToFlash

ClickToFlash is a simple app to block the automatic loading of flash content on web pages. It's similar to flashblock for Firefox, but with some additional features like automatically viewing HD videos in youtube. Any flash on a page is simply not loaded, but you can just click on a small icon that ClickToFlash puts in it's place. It works in Safari and on Tiger, Leopard and Snow Leopard. The bonus for me, personally, is that it also seems to work in NetNewsWire, my RSS reader. This vastly reduces the memory usage for the app and makes for a much improved reading experience.

Best of all, it's free.

Apps We Love

We’re going to be starting a new blog post series here at 1530, “Apps We Love”. When working on the mac, we come across a ton of different mac apps and we’d like to bring exposure to them, big and small. We don’t really have a set agenda for these posts. I may provide a brief summary of the app or I might go in depth and show you around. I’ll keep this page up to date with each new “Apps We Love” post we write.

NOTE: We’ve bought any of the paid apps you see here. We don’t accept free copies for review.

Below is the list, ordered by publish date:

Duplicate Logging in Python

Python has a pretty robust logging facility. We’ve been using some common logging code in several projects of our projects, including django-workspace. Up until now, we’ve been bothered by some duplicate log file entries. Using this code:

LOG_FILENAME = foo.log
logging.basicConfig(filename=LOG_FILENAME,
level=logging.DEBUG,
datefmt='%Y-%m-%d %H:%M:%S',
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
rotatingFileHandler = logging.handlers.TimedRotatingFileHandler(
filename=LOG_FILENAME,
when='midnight')
rotatingFileHandler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
rotatingFileHandler.setFormatter(formatter)
logging.getLogger('').addHandler(rotatingFileHandler)

We would get duplicate lines for every entry and we couldn’t figure out why

Well, it looks like if you supply a filename to the

basicConfig()

call, it will setup it’s own internal handler for you. So the

logging.getLogger('').addHandler(rotatingFileHandler)

call was actually adding a second handler, which is where the duplicate lines were coming from. Just a little tip for anyone else out there wrestling with this.