Fun with Joe’s Goals

A friend was playing around on the Joe’s Goals website and sent me this screen shot:

Fun with Joe's Goals

It isn’t art but it is kind of funny.

Joe’s Goals Celebrates 1.5 Million Checks

PartyHatOne and a half million checks! Isn’t that amazing? Who would have thought Joe’s little goal tracker would make it so far?

Take a look at these stats as we voyage into the realm of endless goals and see just where all these checks were placed.

Most checked goals

These are the goals with the most users and the most checks. Joe’s Goals has an amazingly “long tail.” The top ten goals only make up around 10% of total checks. There are literally tens of thousands of goals that are unique and tracked by only one person. The top ten, however, show the habits the majority of users are working on.

Goal Users Checks
Exercise 3973 48112
Drink Water 529 17584
Eat Out 1201 14391
Brush Teeth 357 11814
Meditate 661 11026
Take Vitamins 367 10204
Floss 514 9502
Read 489 8573
Workout 637 7935
Eat Breakfast 401 7373

Beverage wars
Call it coke, pop, cola, or soda; there are sure a lot of people trying to break the habit. Here is a summary of the most popular terms people use on Joe’s Goals and how often they’re tracked:

Goal Users Checks
Soda 116 3322
Pop 37 1061
Dr Pepper 5 519
Diet Coke 7 503
Coke 14 289
Mountain Dew 7 183
Diet Pepsi 4 147
Cola 10 90
Pepsi 4 56

Minutes of productivity

If you were to quantify the minutes of productivity any tool adds to someone’s life, how would you do it? Well Joe’s Goals doesn’t necessarily add any time, but it does provide the inspiration and encouragement many people need to spend their time more wisely. Here are the most popular “minutes” goals users track.

Goal Users Checks  
Exercise 30 minutes 39 1281 That’s 640 hours!
Reading 30 minutes 40 1885 That’s 942 hours!
Walk 30 minutes 25 328 That’s 164 hours!
Freewrite 15 minutes 2 156 That’s 39 hours!
Do nothing for 15 minutes 2 116 That’s 29 hours!

A lot of people have a thing for Chocolate

However you track it, it is still delicious.

Goal Checks
Chocolate 1224
Ate Chocolate 90
Eat Chocolate 89
No Chocolate 88
Candy/Chocolate 44
Had Chocolate 24
Too much chocolate 22
Eat Chocolates 19
  and many more…

Face time above all

The goals that warm my heart the most are the family goals — family dinner time, date night, kid play dates, quality time, etc. It is necessary to human health and happiness that we have contact with other people. In this age of family decay it is wonderful to see people stepping up and making the extra effort to keep their family together. These folks have made that effort.

Goal Users Checks
Time with [Child’s Name] 8 1484
Time with kids 21 179
Time with family 9 157
Time with a friend 2 32

Some use Joe’s Goals to track their diet, stay on their meds, keep track of those days they just want to cry, track when they go to bed, when they get to work on time, finish their homework, or reach out to friends via an email or phone call.

I’ve resisted all pressure to try and force people to pick standard names for goals. Joe’s Goals really means Your Goals. People use it to track what is important to them. To break their bad habits. To track their desires, their efforts, their tears. If it helps just a little to call a goal something specific like “Play Frisbee with kids” then, by golly, it is worth it.

If, in all these checks and goals, just a handful of real people were given enough permission and enough encouragement to make a real difference in their own lives, then Joe’s Goals has been a success. A huge success. That has been my hope and prayer all along.

Thank you for using Joe’s Goals. I’m honored to be a part of your lives, and I hope you are as excited as I am to see what the future holds.

P.S. If you want to see even more data like this, check out the Get Inspired section on Joe’s Goals.

Enhanced Javascript Lazy Function Definition Pattern

Filed under tech bits

getting lazy in javascript The lazy function definition pattern is pretty simple at heart: you have a function which does some work, caches the results through a closure variable, and then overwrites itself with a new function that simply returns the closure variable. So the first time you run a function will be the only time the function does any work. Each subsequent call is “lazy” and just returns the results of that first call.

This is all fine and dandy, but what if you want to conditionally reset your lazy function?

Functions that work smarter, not harder

Consider this: you have a page with several related but independent widgets. The page is often redrawn as you work on the data, forms, maps, etc. You have to redraw the widgets often even if the state of a particular widget hasn’t changed. By using the lazy function pattern you can easily do this by having the function rendering the widget cache itself. But what happens when the widget’s state is changed? How do you easily reset it and rebuild from scratch?

Sending lazy functions back to work

Here is my test enhancement to make a reset possible:

var curState = "Washington";
var stateInfo = function ()
{
var reset = stateInfo;
var pState = curState;
var theInfo = "The state is " + curState + ".";
var showInfo = function ()
{
return (pState == curState) ? theInfo : reset();
};
stateInfo = showInfo;
return stateInfo();
};

Proof in the pudding

So the first time we call stateInfo() the function does a bunch of work, creates the results we want, and returns the following:

> The state is Washington.

The second time we call stateInfo() the function just does a variable check and then returns the cached copy of the initial results (as in the showInfo() function above):

> The state is Washington.

But what if we change the State?

curState = 'New York';

stateInfo();

> The state is New York.

On this call of stateInfo() the function ends up invoking reset() which is a copy of our original function. Thus it recreates itself and re-caches the new results. Cool eh?

But what if we go back to Washington?

curState = 'Washington';

stateInfo();

> The state is Washington.

What we have here is a ladder of cached results. The reset() function is called by our current stateInfo() function because the state is not New York. But reset is just a copy of the earlier stateInfo() which contains a cached copy of the results for Washington. So that is displayed. If we change the state to something new we will again climb the ladder until we reach the original copy of the reset() function which will produce our results for the new state.

curState = 'Montana';

stateInfo();

> The state is Montana.

How it works

Let’s walk through the code.

  1. We define curState as a global variable that holds the current US State.
  2. We define stateInfo() as a function to show information about the state.
  3. Inside stateInfo() is where things get interesting:
    1. We start by grabbing a copy of the current stateInfo() function and saving it as a private variable called reset(). Closure will hold onto this function from here on out. After the first run of the code, reset() always points to the previous instance of stateInfo() all the way up to the very first instance which has the logic to build the display again.
    2. Then we do our work (in this case just a string concatenation, but this could be an Ajax call, form validation, etc).
    3. Then we define the showInfo() function which will be our lazy function in just a half second.
    4. Inside the showInfo() function we do a ternary check to see if the pState variable is the same as the global curState variable. If so, we return our results. Otherwise we call reset().
    5. After this all happens we replace the global function stateInfo() with our new showInfo() function.
    6. Finally we call return the results of a call to stateInfo().

Encapsulation and a dirt simple API

This model allows you to easily expose an optimized and extremely simple API for your application. In one single function you roll the “work” your code needs to do, the logic to decide when to do your work, and a cache of the each instance of your rendered results. For your application logic you only ever have to call doSomething() and doSomething() will either find the cached copy or create a new set of results. But in either case it will always do the correct thing.

How to write for internet readers

In April 2007 Technorati reported that:

  • There are over 70 Million Weblogs.
  • Over 120,000 new Weblogs are created every day.
  • Over 1.4 million posts are published every day.
  • Nearly 3 million bloggers are taken advantage of tags to better categorize their content.

With all that writing, why is it that half the time I can’t figure out what any of these blogs are talking about?

Making writing easy, simple, and understandable is the goal of this article. I’m posting it here because I think the suggestions are reasonable, tested, and useful. I’ve even attempted to use them in this very post. I do hope that more of fellow internet bloggers will take note and clean up their posts.

What it means to master something

JuggleHave you ever truly mastered something? Sure you have. At some point in everyone’s life they master something, even if it is only tying their shoes or stacking the dishes “just so” on the rack.

More than nature

Mastering isn’t a survival instinct; it’s an urge to excel. Mastering is one of the experiences that delineates us from animals. It is striving to be more tomorrow than we are today; to perfectly pitch the ball over home plate; to craft the perfect sentence in an article; to open the oven and feel the warm, richly-scented cloud telling you dinner is going to be absolutely extraordinary. We humans crave perfection, to be masters of our domain, to distinguish ourselves by sheer skill and prowess.

Mastering is up to you

I routinely get emails from folks who credit Joe’s Goals with helping them master some aspect of their life. It may be getting in shape or breaking their addictions or practicing their piano consistently for the first time. But you know what? They did it on their own. All any tool can do is give you permission to complete your task. People use Joe’s Goals to carve out a box each day. A square holder containing time and a degree of commitment. And then THEY do it. With God’s help, they do it.

Know it, do it

Mastering is not about perfection. Far from it. Mastering isn’t doing everything perfectly. Rather, it is knowing in your soul that, when the chips are down, you can rise to the occasion. Mastering is the grace, the often unmerited favor, that lets you sink that shot at the buzzer, winning the game. It’s the click of the shutter capturing baby’s first smile. It’s leaping out of the helicopter at 5,000 feet into a field of snow. It’s being #1 in your department two quarters in a row. It’s the straight line, the perfect knot, the well-placed kick. It’s knowing what you are doing.

See mastering in action

Below are a series of videos I’ve been collecting over the last year that show what can happen when someone masters something. They are glimpse at the truly great. I hope you enjoy them and get as much inspiration out of them as I do.

The world has enough mediocrity. What have you mastered?

* Photo courtesy of cyancey.

Zeenami: your personal self-improvement center

ZeenamiWhat do you want to accomplish? Lose weight? Quit smoking? Exercise? Which of the thousands of products and plans out there are most likely to help you succeed? This is exactly the question Zeenami is trying to answer.

Zeenami is a new self-improvement portal that ties together your results from several personality and fulfillment quizzes to create a “success profile” just for you. This profile is used to rank and recommend products and services according to what works best for people like you. Based on the areas of your life you want to work on, you can use Zeenami’s detailed goal tracker (which yours truly helped them implement). You can also share goals and goal plans with other members of the community. There is also a directory for life coaches and other professionals in your area and a growing library of articles and media to encourage you in your quest for improvement.

Check it out, take the short (two page) life fulfillment quiz and be sure to leave the team some feedback.

How to quit drinking caffeine (comic)

Basic InstructionsBasic Instructions is a fun web comic authored by Scott Meyer and taken under the wing of Scott Adams (i.e. Dilbert). One recent comic gives you a quick/useless guide to quiting caffeine. It doesn’t mention Joe’s Goals but given that quiting soda and coffee are some of the more popular goals people track I figured it would be worth a post. Enjoy.

Ok, ok - I changed the way chains work for bad habits

Since rolling out chains I’ve received at least one email a day telling me that I should change the way they work for negative goals. To quote one example:

Please change the way the chain tracks for negative goals. If I have a negative goal called eat out I want to see the number of days since I last checked it. That is the chain and my goal is to make that number bigger and bigger.

When user feedback is that dramatic it is time to take action. I update the chain for negative goals so it is days since last check mark. Thanks for your feedback everyone!

Updated Quotes and Button in Get Inspired Section

HistoryJust a couple of quick Joe’s Goals updates. If you are logged in there is now a button in the Get Inspired section that lets you add a goal to your tracker right from there. Since there are hundreds of goals that you can check out in Get Inspired this should hopefully makes things easier and be an encoragment to track more personal goals.

Also, I updated the random quotes that go out with the email reminders each day. I found a bunch that I thought were powerful and meaningful and I hope you enjoy them.

24 Tips to become an early riser

Alarm ClockSleep related goals are some of the most popular on Joe’s Goals. Everyone needs help now and again getting out of bed and to help with that LifeRemix put together a list of 24 excellent tips and suggestions to help you be more consistent. Joe’s Goals doesn’t get mentioned until Tip #24 itself, but I consider that I place of honor.

For those needing that little extra push out of bed, a reader pointed out SleepTracker. This is a little tool that monitors your sleep and gentelly beeps you awake at the point in your sleep cycle that is least likely to leave you feeling groggy or tired.