Mapping Firefox & Thunderbird Behaviors to Preference Settings

Thunderbird settings

Individual in the Enterprise

Firefox, Thunderbird have full-fledged graphical settings editors.  It is easy for a user to change the behavior of his or her web browser with a few mouse clicks.  While this approach is sensible for the home user, GUIs hamper software configuration in the corporate enterprise.  Although Mozilla products textually represent preferences in a flat file, discovering the right text and value is not always simple.  I will outline some techniques I use to determine preference strings for a given behavior.

Preferences in Mission Control Desktop

Mozilla MCD autoconfig is an invaluable tool to the software administrator.  It runs at browser startup setting preferences according to corporate policy.  After starting, Firefox saves all settings to the user’s local prefs.js file.  The autoconfig API and user  prefs.js work with text preferences.  When you decide to change the application’s behavior your prefs.js is a good place to look.

Start clean

Quit Firefox.  Backup then remove your Firefox profile directory. On linux it is in $HOME/.mozilla/firefox. Then launch the browser starting with a good autoconfigured profile.

Compare

Take a backup of your user prefs.js from Firefox”s profile directory. ($HOME/.mozilla/firefox//prefs.js)  Make the behavior change and apply.  Use diff to compare the preference files.

An example

Suppose your company decides that Firefox should only keep third-party cookies for the lifetime of the browser.  Once the user closes Firefox, it will delete all third-party cookies.  Make the change (for version 3.6.3) in Settings –> Privacy –> Check Accept cookies from sites, then check Accept third-party cookies and change the dropdown to Keep until: I close Firefox.

Your preferences should look something like this:

0 apollo firefox/kzssiknu.default % diff -u prefs.js.pre prefs.js
--- prefs.js.pre    2010-04-22 12:57:30.000000000 -0500
+++ prefs.js        2010-04-22 12:57:39.000000000 -0500
@@ -230,6 +230,7 @@
 user_pref("lightweightThemes.persisted.footerURL", true);
 user_pref("lightweightThemes.persisted.headerURL", true);
 user_pref("metrics.upload.enable", false);
+user_pref("network.cookie.lifetimePolicy", 2);
 user_pref("network.cookie.prefsMigrated", true);
 user_pref("nglayout.debug.disable_xul_cache", true);
 user_pref("nglayout.debug.disable_xul_fastload", true);

See that a new preference called network.cookie.lifetimePolicy was inserted with value 2.  Use these in autoconfig, calling

// Remember third-party cookies until the browser closes
lockPref("network.cookie.lifetimePolicy", 2);

Sometimes it’s not that easy

The above method does not work all the time.  For example, Thunderbird’s password settings are not so obvious.  My company does not allow password storage so I needed to lock out that behavior.
Save Passwords

Inspecting the preferences GUI leads nowhere.  My first resource in these cases is the About:config_entries page on MozillaZine.  It’s a wild wiki page containing mostly-complete setting documentation for all the Mozilla products.  There you will find a table with the right information.

Name Type Meaning of Values
signon. rememberSignons Boolean True: (default): Enable the Password Manager
False Opposite of the above

The About:config_entries page also has pointers to the wiki’s Category:Preferences and The Preferential Project.  Each page has something the others lack.  When these resources fail, I sign on to irc.mozilla.org (as OccamRazor, old-school IRC etiquette rules apply.) or as a last resort, hit a search engine.

Document it

When you find the right text to twiddle document the behavior in your autoconfig as I did for the cookie lifetime above.

LDAP Queries in Mission Control Desktop

Previously, we saw that Mozilla MCD can inspect a user’s environment using getEnv().  It can also retrieve information from an LDAP directory.  I use this feature to inform Firefox and Thunderbird of the user in detail.  The corporate directory knows the user’s full name, mail server and authentication credentials.  autoconfig takes this and, among other useful things, constructs an email account for Thunderbird without user intervention.

The javascript API to deal with LDAP is a bit hackish, however it is all we have.  The first task is to define a function called processLDAPValues() which accepts a queryResults string as its only argument.  Inside processLDAPValues you extract return data from queryResults.

Instead of invoking processLDAPValues() directly, you call getLDAPAttributes() which in turn gets you to your function.  To illustrate, here is the code I use to query the corporate directory server and save the values for later use.

var userInfo = new Object();  // This will hold LDAP results
 
userInfo.envUser = getenv("LOGNAME");   // Unix UID
userInfo.envHome = getenv("HOME");      // User home directory
 
var ldapHost = "ldap.example.com";
var ldapBase = "dc=example,dc=com";
 
if( userInfo.envUser )
{  var ldapFilter = "uid=" + userInfo.envUser;  }
else
{  throw("Couldn't get UID from the environment");  }
 
// LDAP attributes to retrieve from the server
var ldapAttrs = new Array( "cn", "email", "employeenumber", "givenname", "mailhost", "sn", "uid" );
 
// Define how to process LDAP results before we make the call
function processLDAPValues(queryResults)
{  if( queryResults )
   {  // Build the userInfo object for later use
      for( var attr in ldapAttrs )
      {  userInfo[ ldapAttrs[attr] ] = getLDAPValue( queryResults, ldapAttrs[attr] );  }
   } else
   {  throw( "No LDAP results" );  }
}
 
// Call upon LDAP for the values in ldapAttrs array
// Uses the previous processLDAPValues()
getLDAPAttributes( ldapHost, ldapBase, ldapFilter, ldapAttrs.join(",") );

The first thing I do is create a userInfo object that will hold LDAP results for use later in the autoconfig.  To that object I add attributes for the user’s login name and home directory.

The next bit sets variables to contain the directory server’s hostname, base DN and the LDAP filter to use in the search. It’s a good idea to throw an error if there is no $LOGNAME.  (In a later post I will show how to enhance autoconfig error reporting.)

The ldapAttrs array names the attributes I want to return from LDAP.  Change this array to suit your environment.  The last line of code joins the array together with commas and feeds it to getLDAPAttributes along with the hostname, base DN and filter.  getLDAPAttributes is defined in MOZILLA_HOME/defaults/autoconfig/prefcalls.js and does the work to perform the query, then call your predefined processLDAPValues() function.

The example autoconfig script at developer.mozilla.org set preferences inside processLDAPValues, however this is a bad convention.  There are many preferences that require user information and separating pref() calls away from the main block of preference setting can be confusing.  As you can see here I simply run through the array of attributes I’m interested in and get the result from the LDAP query for that attribute, assigning it to the userInfo object.

Later on in the script I ask the userInfo object for those stored LDAP attributes. To set the hostname of the user’s mail server, for example, I call

// IMAP server name from corporate LDAP directory
defaultPref("mail.server.server1.hostname", userInfo.mailhost );

LDAP directories are a great resource. What attributes could you store in your corporate server?

Setting User Preferences with Mission Control Desktop

A challenge with software

Managing software for thousands of users presents a formidable challenge to the system administrator. Publishing corporate policy, using standard environments and providing clear end-user documentation helps. However, it doesn’t beat automatically doing it right.  This is the power of MCD autoconfig.

In an earlier post, I introduced MCD as a way to configure Mozilla products (Firefox, Thunderbird, Prism, etc) and provided background on building them with autoconfig support.  This post covers how to get started with the standard javascript API.  In forthcoming posts I’ll detail the useful enhancements I built using this API.

The environment

First, a quick rehash of my world.  I work in a Solaris shop with over 33,000 users.  Supported users log into a shared Sun Ray server or their personal workstation which mounts a shared NFS directory.  That directory houses the software I support along with about 700 other programs.

While this post is unix-centric, other operating environments that launch managed software can make use of MCD. See the introductory post for  a little more detail.

Mozilla Preference System

Firefox and Thunderbird use a simple preference tree to store all configuration options. Leaves of the tree are strings that store the option’s value.  For example, the preference browser.startup.homepage is a string containing the URL(s) of Firefox’s homepage.  mail.forward_message_mode contains an integer indicating how Thunderbird should forward email messages (inline or as an attachment).  You can find every available setting and their values in the config editor for Thunderbird and about:config in Firefox.

When a user changes his or her preferences the changed values are stored in a file called prefs.js in their home directory. On my MacOS laptop, this is $HOME/Library/Application Support/Firefox/Profiles/kzssiknu.default.

The Application Programming Interface

The autoconfig acts on preferences through a javascript API defined in the file MOZILLA_LIB_DIR/defaults/autoconfig/prefcalls.js.  I will talk about the most useful in this post and cover the LDAP parts of the API later.

// Used most often
function defaultPref(prefName, value);
function lockPref(prefName, value);
// Sometimes used
function displayError(funcname, message);
function getenv(name);

defaultPref() and lockPref()

These two functions perform the bulk of work in an autoconfig script.  A default preference setting may be overridden by the user, but a locked preference may not.

getenv() and displayError()

getenv() acts as you would expect from its name. This function returns the value of an environment variable.  I use it to get $USER and $HOME. displayError() pops up an error message.  It is useful for debugging, but a user should rarely see it.

Putting it all together

We now have some basic building blocks to configure thousands of users. Here is a look at a simple autoconfig.js file for Firefox.  These settings will apply to every user.

// Catch errors
try
{
   // Set  downloads directory to a folder on the user's desktop
   var download_dir = getenv("HOME") + "/Desktop/Downloads";
   defaultPref("browser.download.defaultFolder", download_dir);
   defaultPref("browser.download.dir", download_dir);
   defaultPref("browser.download.downloadDir", download_dir);
   defaultPref("browser.download.folderList", 2);kk
 
   // Length of Time to Remember Visited Pages For (Days) - 30
   defaultPref("browser.history_expire_days", 30);
 
   // Automatically Add 'www.' and '.com' to the Location if a Web Page is Not Found - Enabled
   defaultPref("browser.fixup.alternate.enabled", true);
 
   // Lock the cache size to 60MB for shared performance
   lockPref("browser.cache.memory.capacity", 60000);
   lockPref("browser.cache.disk.capacity", 60000);
 
   // fix memory usage with lots of tabs
   lockPref("browser.sessionhistory.max_total_viewers", 2);
 
   // Set animated images to loop once
   defaultPref("image.animation_mode", "once");
 
} catch(e)
{
   displayError("autoconfig.js failed", e);
}

Learning preference strings

Finding the right preference setting or combination of preferences that change the program’s behavior sometimes presents a challenge.  I use the About:config entries page on the Mozilla Zine knowledge base.  That page also has a pointer to three more resources.

Another technique is to watch your own prefs.js file for changes when you twiddle settings.  Save a copy of prefs.js before flipping a preference.  Immediately quit the application after the change and diff the two files.

[Edit: I wrote up an entire post on this subject.]

Using LDAP and more fun things to do

In following posts I will cover retrieving information from LDAP, better error reporting, reading local files like $HOME/.printers, and simplifying Thunderbird email account management. Stay tuned.

An Introduction To Mission Control Desktop

What is MCD?

MCD (aka AutoConfig) is a script used to programmatically configure Mozilla products such as Firefox and Thunderbird in the enterprise for multiple users.  Part of my job is to ensure 33,385 people have the right settings to check their email and browse the web.  Centralizing their set up with autoconfig removes the burden from the user.

Why write about it?

Documentation on MCD is old, but not exactly out of date.  The basics of autoconfig have not changed since the age of the Netscape browser.  From trolling newsgroups, IRC and Google, I know many people use MCD, but share little about the subject. (Some do.)  Over the course of my work I wrote object prototypes, extended error reporting and generally tried to make using this bit of javascript easier. I want to reach out to the community and give a little back.

A quick run-through

Most people think of javascript as a browser technology. But, MCD has access to XPCOM, a bridge between C++ libraries and javascript, which gives the developer power to poke at Mozilla internals.  When Thunderbird (Firefox, Seamonkey, etc) launches, it executes a javascript script that makes use of a configuration API.

The autoconfig sets preferences exactly as a user would using about:config. It can also render preferences immutable, locking them down according to corporate policy.  When I inherited the script it was  simply a long string of preference directives with a little LDAP voodoo.

defaultPref("news.server_change_xaction", 0 );
defaultPref("mail.migration.copyMailFiles", false);
defaultPref("network.cookie.disableCookieForMailNews", false);
   lockPref("mail.remember_password", false);
defaultPref("javascript.allow.mailnews", false);
defaultPref("mail.addr_book.lastnamefirst", 1);
defaultPref("mail.toolbars.showbutton.file", false);
defaultPref("mail.toolbars.showbutton.junk", true);
defaultPref("mail.forward_message_mode", 2);
defaultPref("mailnews.wraplength", 72);
defaultPref("mail.wrap_long_lines", true);
defaultPref("mail.collect_email_address_outgoing", true);
defaultPref("mail.collect_email_address_incoming", true);

Not the easiest thing to grok.

After Thunderbird executes the autoconfig it starts up normally, applying saved user preferences. defaultPref settings are overridden by user preferences, but lockPref are not.

If you want to turn on a proxy server and force SSL in Firefox for every user it becomes easy to do:

// Set http proxy to your.server.domain
lockPref("network.proxy.http", "your.server.domain");
// Require and lock SSL
lockPref("network.proxy.ssl", true);

Details, implementation details

There are a number of things required to get MCD working.

Build *zilla (Firefox, Thunderbird, etc) with support

Your Mozilla product needs to be built with pref extension support. Add this to your .mozconfig file:

ac_add_options --enable-extensions=pref

To utilize LDAP (you do want to use LDAP, don’t you?) check the configure script for:

MOZ_LDAP_XPCOM=1

You can check about:buildconfig in Firefox to see if your build is good to go. While MCD documentation is sparse, the Mozilla Developer’s Center has plenty of build instructions.

Software distribution

I work in a Solaris world. Servers and desktops mount a shared NFS directory from a network of servers housing some 735 programs, including Firefox & Thunderbird.  The directory is mounted read-only so average users are not tempted to twiddle with the software.  Although I wrote this paper from a unix perspective the implementation will work in a Linux, Windows, or MacOS environment.  Mounting a shared software repository makes the system robust, however MCD works in a network of stand-alone desktops.

Breaking .cfg “encryption”

*zilla products first read a javascript configuration file in the lib directory called, for example, firefox.cfg.  In the beginning-time, Mozilla developers chose to ROT-7 encode the file, obscuring its contents from users.  When Netscape 7 came out, they did away with ROT-7 in favor of ROT-13. Many Firefox and Thunderbird .cfg files are still encoded this way using moz_byteshift.pl.

The rotary encoding is controlled by a setting in $MOZ_LIB_DIR/greprefs/all.js. At packaging time I patch this file, setting encoding to 0.

// ROT-encoding is bad, mmmkay?
pref("general.config.obscure_value", 0);  // for MCD .cfg files

This tells *zilla not to ROT-decode the .cfg file.

This shadowy file mojo likely came from the day of stand-alone workstations where users had root access and the software maintainers wanted to have just a little control over Netscape preferences.  Hiding the configuration file’s location gives you the illusion of control.

Now, the .cfg file is on a read-only mounted partition and nobody on the system has super-user level access. There is little danger of a user skirting corporate policy by turning off autoconfig.

Pointing *zilla at the autoconfig

When Firefox starts up it checks for and executes javascript a .cfg file giving it the autoconfig script’s path.

// $MOZ_LIB_DIR/firefox.cfg
// the output from the obscuration is still more readable than MORK!
lockPref("autoadmin.global_config_url","file:///path/to/firefox,v3.0.17/share/autoconfig.js");
lockPref("autoadmin.offline_failover", true);
lockPref("autoadmin.refresh_interval", 60);

I left the MORK comment line in there to remind me how far we’ve come already.

These directives:

  • Set the autoconfig url
  • Tell *zilla to automatically fail over to offline mode if online browsing fails
  • Re-fetch the autoconfig file every 60 minutes

Any URL *zilla understands is a valid value for autoadmin.global_config_url meaning you could house the autoconfig script on a web server.

Away you go

Now your Mozilla product will read and execute the javascript autoconfig script you indicated.  There you can set or lock application preferences using a specialized XPCOM API.  I will cover the API in a following post.

Barrelling Day


All those fermenting vessels under the looming Merlot barrel contain Russian Imperial Stout. Yesterday the TAbc drained the beer into that barrel to condition over the summer. The first task of the day was to sanitize the barrel with 20 gallons of boiling water.






The barrel sits high on its rack making gravity transfer tricky. The duck-in cooler gave us the necessary height.


Surprisingly little beer spilled, but what did come out flew across the room, landing on Ruth.

After a long day of barreling, the beer came to rest in my cold room, where it will sit until we bottle it in October.


I bottled a 12-pack pre-barrel for comparison.

Alt Two

My second try at an Altbier turned out better than the first. Alt One got an infection from the MiniBrew plastic conicals I was using. A tragedy, because it tasted so good coming out of the kettle.

Alt Two is not my own recipe, but a concoction from Jamil Zainasheff’s Brewing Classic Styles. Scaled up to 10 gallons the recipe is:

Fermentables

  • 18 lbs Pilsner
  • 2 lbs Munich
  • 0.5 lbs Debittered Black malt
  • 0.5 lbs Caramunich 60L
  • 6 oz Pale Chocolate malt 200L

Mashed starting at 151º, falling to 145ºF over the course of 60 minutes. (Need winter insulation for my mash tun.) Mash out at 160ºF. Sparge. Collected 12.5 gallons 11% B sweet wort. Boil 90 minutes.

Hops

  • 2.5 oz 8.1% AA Perle 60 minutes

Fermentation

Pitch a 1600ml starter of WLP 029 German Ale yeast into 14.3% B original gravity wort.

Fermented two weeks between 58º & 66ºF. Lagered for 26 days.

Notes

  • 2010-02-15 9.6%B Vinous notes
  • 2010-03-13 8%B Vinous flavors reduced. Ready to package.

It pours a deep copper brown with no appreciable head. Carbonation has not quite developed and I expect to get a good stand of foam in a few more days under pressure. There is roastyness up front and that vinous flavor refuses to disappear completely. This Alt puckers the mouth just a little, a problem attribute to poor scaling of the recipe from 5 to 10 gallons. The percentage of dark roasted malts may be too high. Bitterness is present and polite as appropriate for this malt-centric beer.

For my third Altbier I will find a common ground between One and Two. Not so much roasted malt as #2 and not so much Munich or Vienna as #1.

Tasting & Bottling Something Else

It is 14.6° Plato and Something Else is three weeks old. Starting at 25.2º P, the big gravity beer weighs in at a small 6.2% ABV. Before putting it all away for conditioning a little evaluation is in order.

There is a little ester in the nose. No hop aroma. The uncarbonated beer is sweet, bitter, roasty, “stout-like”, and lacks much fermentation character. Tastes a little like an over-hopped milk stout might. It sticks to your mouth.

It is close enough to be a Russian Imperial Stout, but lacks nuance due to the simplistic grainbill.

I have about 80 fluid ounces to bottle. The small volume batch is a breeze to work with. Next time I will remember to add priming sugar. Not to worry, the gravity is still drifting downward.

The Domestic & Something Else

Read from the bottom up:

twitter feedToday I brewed The Domestic for a second time. It is a Classic American Pilsner, also called a Pre-Prohibition Lager. The recipe is from Jamil Zainasheff’s book Brewing Classic Styles.

  • 12.5º Plato OG
  • 80% German Pilsner
  • 20% Flaked Maize
  • Rest at 148ºF for 60 minutes
  • Mash out to 160ºF
  • Collect 11.5 gllons
  • 2 oz 8.1% AA Perle FWH
  • 0.5 oz 3.8% AA Czech Saaz 30 mins
  • 1 oz 3.8% Czech Saaz 10 mins

I recently started doing a mash-out and this is my second brew session doing so. Combined with a slow sparge, I saw improved efficiency the first time. Today I ran into problems.

My mash tun is direct-fired and I recirculate the wort to prevent scorching. During vorlauf today my flow rate slowed to a trickle. Most of the time the March pump loses prime and I goose it a little to get it going again. When that didn’t work I stirred the grainbed and restarted the vorlauf. None of the usual tricks got the wort flowing again. But this was no ordinary problem.


That piece of hose pokes through the mash tun’s false bottom, acting as the pick-up. Heat from the burner melted it partially closed. Wort in the bottom of my tun scorched from lack of movement.


The sparge marched onward and I collected 11.5 gallons of sweet wort. I measured the gravity at 9.6º Plato, or 1.038. At that strength my post-boil gravity comes out to 1.043; 7 points too low. Reducing the volume to hit the gravity posed two problems. First, the style demands a light-colored beer and a prolonged boil would darken it too much. Secondly, the first hops were in the kettle and would throw off the bitterness balance. I cursed a little, tweeted then pushed on.

Ninety minutes later the brew was boiled then chilled and in the fermenter. When I lowered it into the converted chest freezer the bulges of the keg would not fit. Previously, I had tried to put the keg in the freezer with the same result, so I should have known. I grumbled a little.


It is now in my ale fermentation cooler, turned up to full blast cooling. When it comes time to lager this baby, I’ll split it into two carboys and put them in the freezer. Notice I hit my target starting gravity of 12.5º B.

After collecting the desired pre-boil volume I became curious how much wort I had left in the mash. Opening the spigot on the tun I dumped 6 liters of 9.6º B pale sweet wort into a bucket. With everything that went wrong today I was not about to waste so much potential beer.

Looking at my grain store, I picked an additional 2 lbs Crystal 60ºL and one ounce of chocolate malt. Approximating the recipe gives this:

  • 2 lbs German Pilsner
  • 2 lbs Crystal 60º L
  • 1 oz Chocolate

Post-boil volume would be less than a gallon

  • 0.3 oz 9.1% AA Centennial 60 mins
  • 0.5 oz 9.1% AA Centennial 15 mins
  • 0.5 oz 4.5% AA Fuggles 10 mins
  • 0.5 oz 4.5 %AA Fuggles 1 min


The final gravity turned out to be 25.2º P (1.107). It will probably be an Imperial Stout-ish. The yeast is a German ale/kölsh strain coming right out of an Altbier I put into lager tonight. Hope it can handle high gravity.

As an aside, I am quite fond of the brew-in-a-bag method those Aussies invented. Tonight’s second brew session was essentially that.

Happy New Year. I wonder if I did anything?

Adrienne’s Life Goals (List started December, 1996 and updated each year since then) I’ve bolded the ones that I accomplished since I last updated the list last year.

1. Rollerblade in every major city in the world (Don’t know if I want to do this one any more or not. I’m really not all that into rollerblading. Biking might be a more feasible option).
2. Win a Nobel Prize
3. Study insects in the Australian Canopy (I used to get a magazine as a kid that advertised scientist-led trips in the back. One was a trip to the Australian Rainforest where you’d get to help survey the insects. They said you’d probably find several new species. I have to get there).
4. Become fluent in Spanish (took it in high school, remember little)
5. Be written about in some major tabloid
6. Make a major discovery in cancer research
7. Breed some sort of animal (I finished this one in 1998–I bred crane flies, beetles, crickets, and whatever else my boss brought in for a year)
8. Get married and raise a family (Part one–done 9/3/00! So that part two thing won’t work. Anyhow.)
9. Get a PhD in Entomology (Getting close now!)
10. Make a major entomological discovery (I’m really not sure what counts as “major.” I guess I’ll figure that out as I go along)
11. Become a college professor
12. Ear $20,000 a year with my harp (I think I will work on this in 2010)
13. Read the entire works of Shakespeare (did I mention I’m really into Shakespeare?)
14. Learn to ride a bike well (I’ve decided the tandem doesn’t count, but is a hell of a lot less scary than riding alone)
15. Study insects in Madagascar (the first day of my high school freshman geography class the teacher gave us the coordinates for Madagascar. I’ve wanted to go ever since)
16. Visit Kangaroo Island
17. Become the president of something major
18. Be able to give my Alma Mater something big, and have something on campus named after me
19. Rollerblade 10 miles (so, I didn’t have a bike as a kid. I taught myself to rollerblade instead. Don’t do it so much anymore, but for awhile there it was my only means of transportation)
20. Become fluent in sign language
21. Take a major biking or blading trip
22. Become very physically fit
23. Graduate from any higher education institution with a 3.0 or higher (I only got a 2.5 in undergraduate school…but I did have a 3.2 in my major courses. That counts, right? Finished my Master’s with a 3.46, currently have a 4.0)
24. Work at the Smithsonian
25. Lear how to spell “Smithsonian” (Done! 1996. Have I mentioned I’m dyslexic? Oh, man, in 5th grade we had spelling tests every week, and my teacher made anyone who failed go to detention after school on Fridays and copy the dictionary. I got through “C” by the end of the year. She was nice enough not to make me go right before Christmas break and the last week of school. After my year she stopped using that as a punishment for bad spelling. I am a liberator of 5th graders!)
26. Live to be 100 (This one will take me awhile)
27. Own a motorcycle (Done! 1999. It got stolen, but who’s counting?)
28. Fall in love (Done! Valentine’s Day, 1997. Can you guess who?)
29. Write a book (I’m writing a lab book now, so maybe this will be done by next year)
30. Visit Canada (Done! 2005. Our anniversary. We took a ferry from Washington)
31. Take a cruise (We will be doing this in August. Woo!)
32. Become the best in Entomology
33. Be rich enough to buy my parents a cabin or car (Part of this list was written when I was a starving student. I mean, really starving…like ducking the landlord, saving up for Taco Bell starving. I lived on popcorn and oatmeal for most of a year. I was super thin)
34. Own a home in Australia
35. Travel the world
36. Own a large house with my husband (I also wrote a good portion of this list right when I met Dean, so “husband” and “love” are mentioned a bunch) (Done! 7/2008:  4 bedrooms is large, right?)
37. Have a large wedding (Done! 9/3/00)
38. Tour Iceland
39. Visit Greenland (Notice I don’t want to tour Greenland)
40. Know a song on the harp by every major composer (As soon as I define what a “major” composer is, I’ll get started on this one)
41. Meet someone famous (so, who’s gonna be famous so I can check this off? I’ve met a bunch of famous forensic entomologists, but I’m not counting them for some reason.)
42. Begin an Art, science and cultural center
43. Weigh 120-135 as long as it’s healthy (it stopped being healthy a while ago–right around the infertility time)
44. Create a cross stitch tapestry (Working on it!)
45. Learn to draw (Done! Spring 2000. I’m no Ivan, but it’s good enough for government work)
46. Learn to tango (Done! Summer 2000. I hated it)
47. Get a degree in something totally unrelated (Done! June, 2007. I have a degree in Emergency Prehospital Care. If you’re dying, call me! I’ll tell you to go to the hospital)
48. Own a company (I’ve owned small things, but I’m not counting this until it becomes profitable)
49. Maintain a very large garden
50. Arrange a musical festival
51. Go on an African safari
52. Be someone’s inspiration
53. Stay in the best hotels in the world
54. Backpack across America
55. Sponsor a Shakespeare festival
56. Throw at least 1 major formal party
57. Tour England
58. Visit every major museum in the world
59. Love wine (Done! I have no idea when this happened exactly….)
60. Become adept at herbal studies
61. Study at least 3 religions other than Methodist (Done! Mormonism, Judaism and Jehovah’s Witness. I ended up with a boyfriend in each religion, which really made the study easy. Mormons wear sacred underwear. Don’t tell them you know!)
62. Watch or be in every Shakespeare play
63. Organize 5 missions (So I grew up in a Methodist church, and Methodists are really into volunteering. All through high school I went on youth missions organized by the church–I’ve been to Mexico 12 or 13 times to work on churches and houses, I went to Yuma, Arizona several times and worked on the Indian reservation there, and I helped organize a huge mission to Alaska, but I couldn’t go. This is the one thing I miss about not going to church anymore. My old church went to Mississippi last spring to rebuild houses destroyed in hurricane Katrina. I wish I could’ve gone)
64. Study scarab beetles (they’re shiny!)
65. Visit Egypt
66. Never have to worry about money (once again, I was a starving student at this point….)
67. Become adept at rock climbing
68. Visit every state in the union (I’m working on it!)
69. Visit Easter Island
70. Perform in a large theater (Done! Christmas 1997 and 1998. I was part of a Christmas show playing in LA. I played the harp–3500 seats in that theater)
71. Visit Morocco (Ah…here comes my travel list….)
72. Visit Sri Lanka
73. Visit the Philippines (Earl? When we going?)
74. Visit Norway
75. Study cancer (When I add to my list each year, I sometimes don’t go back and review everything first, so there are a few duplicates. Apparently I really want to do these things)
76. Visit France
77. Visit the Eiffel Tower (just in case I was gonna miss it while in France….)
78. Visit the Statue of Liberty again (I saw it when my class went there in Jr. High, but I was a bit boy crazy and didn’t really care about the big green woman)
79. Visit the Leaning Tower of Pisa
80. Stay in a small Russian town
81. Go to a health spa (Done! I now do this as regularly as possible)
82. Win a major contest
83. Become a photographer (I don’t think I have much of an eye, but I can try)
84. Visit Dublin
85. Become monetarily comfortable (still hungry!)
86. Own a store
87. Learn to fence (Done! 2004. Hated it!)
88. Learn a martial arts (Done! 2004, black belt in kenjo ki karate–better known as kickboxing)
89. Visit a homeless family
90. Learn massage
91. Write a major research paper (Done! June 2007. It’s going to publication this year W00t!!)
92. Work in a vineyard (Done! Spring 1997, Cal Poly SLO. 1 year. It was fun)
93. Witness a controlled burn (Done! Summer 1998. We had to do several controlled burns in the orchard that summer)
94. Save an insect species
95. Discover an insect species (I like me some insect species)
96. Biologically solve a pest problem (I haven’t decided if I want to do this on a grand scale or not…if not, then done! I’ll leave it unmarked for now, though)
97. Read Moby Dick, A Tale of Two Cities, Hunchback of Notre Dame, The Hans Christian Andersen series, The Metamorphasis, The Fountainhead, It, The Lord of the Rings, and a book by Chaucer. (Some of these are done. The hardest so far is The Lord of the Rings. How do people get through this?!?)
98. Fall asleep in a hammock overlooking a beautiful beach and sea under a full moon (Aw! Aren’t I romantic?)
99. Learn to horseback (Done! Did you know that Dean’s grandfather raises horses?)
100. Take a trip to the bottom of the Grand Canyon
101. Be interviewed by the press (Done! 2005 FFAS conference. CNN interviewed me about entomology)
102. Go to England to see the Shakespeare Festival
103. Help to solve a crime (Done! I’m a forensic entomologist!)
104. Learn to belly dance (I keep meaning to do this one. Someone help!)
105. Discover the purpose of an insect and use those facts to save it from extinction
106. Write out the entire rocky scrip, block it and use it to get a show started (This is half done–I have the script.)
107. Plan an orchard
108. Read the Bible (This may end up harder than finishing Lord of the Rings)
109. Read the Book of Mormon (And this will be harder than the Bible)
110. Read the entire works of Edgar Allen Poe
111. Build my own harp (You can get kits for not that much and build your own lap harp. Want!)
112. Visit all the National Parks
113. Live in France
114. Design and build a custom lab for my work (Kinda done! I designed the lab I’ll be working in this spring. Does that count? If so, Done!)
115. Have a maid or cleaning service (I don’t do windows! Or any other cleaning, for that matter)
116. Visit all the amusement parks in the U.S.
117. Design a set (Done! Fall 1997. I designed the sets for a performance of Hamlet)
118. Be a main part in a show
119. Picnic on top of a mountain (Wouldn’t this be fun? Hint!)
120. Ride the trolly in San Francisco (Done! Summer 1998)
121. Try Sushi (Done! And I never looked back)
122. See 100 Rocky Horror Picture Shows (I’m at 41)
123. Plan a very romantic trip somewhere and take it with someone I love (Done! We went to Costa Rica for our honeymoon)
124. Help someone in need (I don’t think I’ll ever mark this one off, no matter how many times I do it)
125. Buy my own car (We’ve been given our last several, so I haven’t really had the chance yet. Not that I’m complaining…we’ll happily take anyone’s car off their hands! It’s what we do!)
126. Visit Alaska (We’re going this summer!)
127. Be loved by someone I’m not related to (Done!)
128. Don’t die lonely
129. Retire
130. Fall asleep in someone’s arms (Done!)
131. Have my own CD
132. Pass Music Theory 1 (Done! I got a B! Stupid class)
133. Figure out how to raise Jerusalem Crickets (Done! Those bastards are a pain in the ass to raise. And they bite super hard!)
134. Finance my education (Done! That was hard, and now I’m in debt forever, but done!)
135. Create a large folder of research on raising insects
136. Have something published (Done! July 2008, my very first article. Ask me and I’ll let you read it!)
138. Turn my car into a work of art (Done! You should have seen it….)
139. Get an A in Beekeeping (Done! Easiest A ever. I like bees)
140. Manage my own beehive (Just might happen soon…I have plans)
141. Have a webpage (Done! Ah, remember the early days of the web when webpages were novel and only geeks had them?)
142. Get into grad school (Done! For years and years!)
143. Learn to sew (Done! July 2008. I learned, now I just have to get good at it)
144. Finish the Chaos book (It’s a book about Chaos theory. I really only started reading it because I was dating this super cute math major who told me it was good. It’s sitting on the shelf with a 10 year old bookmark in it. I’ll get back to it eventually. I’ll probably have to start from the beginning, though. That’s gonna suck)
145. Create at least one of my clothing designs (So I took this design class for my minor–I had to design clothes. I based all of them on insects)
146. Get an award from a scientific association
147. Get certified in some aspect of entomology
148. Present an original paper at a scientific meeting (Done! June 2008. Presented “Seasonal Distribution and Abundance of Forensically Important Flies in Santa Clara County. It was well received)
149. Get my masters (Done! June 2007)
150. Save 1 million dollars
151. Buy a house (Done! July 2008, and it’s beautiful. Come and visit! We have cookies)
152. Visit every state in the nation (See what I mean about duplicates?)
153. Start a consulting business (Plans, again. Plans.)
154. Read every book in the library (Wanna watch? Or help? Join me!)
155. Visit every country in the world
156. Learn to ride a motorcycle (Yep, this is gonna be done this year. Someone teach me, please!)
157. Climb a mountain
158. Start a journal (Done! 2006. I now have blogs instead)
159. Volunteer somewhere
160. Write a book (I must really want to write that damn book!)
161. Be on tv
163. Create an intricate treasure hunt
164. See a musical on Broadway
165. Be self employed with an actual income
166. Own a cabin
167. Plant 100 trees
168. Read 1000 books
169. See an iceberg
170. Get rid of that dead place inside of me (Done! 2007 or 2008. Ask me about it sometime, if you really want to know)
171. Ride a snowmobile
172. Take a speed reading course (Done! 2009. It was bullshit)
173. Learn to surf
174. Walk across a swingy suspension bridge
175. Arrange a harp song
176. Learn Latin
177. Visit Walden pond (Then talk about it all snooty like)
178. Create a hedge maze (How cool is my house gonna be?!?)
179. Be a groomsman (You see, I’ve been every part of a wedding–Bride, bridesmaid, acolyte, harpist, flower girl, officiant, guest on the bride’s side, guest on the groom’s side, but I’ve never been a groomsman. That would complete my takeover of all things wedding!)
180. Have a grand library (With a fireplace and leather chairs and a secret door) (I’m so close!)
181. Have a cabin on a lake
182. Take a gondola ride (Hey! Another great date idea!)
183. Hold a hawk
184. Rehabilitate a wild animal
185. Fire a sniper rifle
186. Fire an automatic weapon
187. Fly first class across the ocean
188. Go hot air ballooning
189. Stay on a houseboat
190. Go hang gliding (But not by myself–with a trained professional so I won’t die. I want to live to be 100, remember?)
191. Do that thing with the parachute hanging off a boat (Doesn’t that sound like fun!?!)
192. visit the Bermuda Triangle (And not get lost)
193. Put $500 a month in my IRA (Up to $350 a month, as of now. See…I’m well on my way to saving 1 million!)
194. Go see the Ice Hotel (I love the Discovery Channel)
195. See Grand Central Station
196. Drive across America, coast to coast
197. Climb the highest mountain in California
198. Renovate a house
199. Cross the Panama Canal
200. Finish the world’s largest crossword puzzle (Don’t really know if I want to do this one any more, but there you are)
201. Go a month without TV (Done! 2008. I was super busy, and TV is the first to go)
202. Buy some aboriginal art in Australia (I blame Chris and Yanira for this–stupid HDTV showing Australia and stuff!)
203. Be married for 60 years (at least!)
204. Make a quilt
205. Go white water rafting
206. Own a sports car (A green RX-7)
207. Buy a house in Costa Rica (Love it there!)
208. Bike 1000 miles in a year
209. Create the perfect, craveable Thanksgiving dinner (I think I’m close! I shall see)
210. Ride the orient express
211. Stay in a haunted hotel
212. Be under 30% body fat
213. Be nominated for a teaching award (Done! Fall, 2008, distinguished teaching award at Texas A&M)
214. Visit the poles (The South and North poles you dirty minded people!)
215. Go sailing
216. Go on an Alaskan cruise (Gonna do it!)
217. Attend a movie premiere
218. Spend over 2 weeks at a nice hotel just enjoying the grounds (I got this idea from reading The Shining. Maybe that’s where I got the haunted hotel idea, too)
219. Attend the Rockettes Christmas Show (I hear this is great!)
220. Celebrate Day of the Dead in Mexico (you know, after they figure out all the drug killings and kidnappings. Still wanna live to 100)
221. Adopt a toddler or baby (Decided this year we will not adopt. Gonna leave this one on the list just to remember, though)
222. Visit the Louvre (I wonder if that’s even close to how it’s spelled)
223. Kiss Dean in Paris
224. Do a food tour of the USA: Pizza in Chicago, Blue Crabs in Maryland, Cheese Steak in Philly, a(nd a bunch of other stuff I haven’t come up with yet)
225. Learn how to write my name in Japanese
226. Celebrate Christmas in New York and London
227. Air Boat the Everglades
228. Pay off my student loans ($32,000 and counting….)
229. Become known for great Thanksgivings
230. Have an art show (Maggot art, baby!)
231. Live in the mountains
232. Take a trip in a motor home
233. See the great barrier reef (But there’s no need to scuba dive…I’m morally against going anywhere I have to take my own oxygen. We need it to survive, people!)
234. Create a secret garden (I love that book! And play! And movie!)
235.Drink mint julep in the French Quarter (Done! June 2009. It was super fun. We bought art).
236.Enter a cooking contest
237. Have a pool
238. Put all my photos/mementos in scrapbooks (Working on it! It’s very well organized at the moment)
239. See all the movies on AFI’s top 100 list (30 down, 70 to go)
240. Visit Alcatraz
241. Try real absinthe (Done! 2007. It tastes like licorice, and has no hallucinogenic effects)
242. volunteer at a homeless shelter or food bank
243. Look good in a 2 piece
244. Have $100,000 in my IRA
245. Paint a really big painting
246. Get certified with a handgun
247.Ride all the rollercoasters in the US (30 down, 602 to go!)
248. Work at Quantico
249. Get 5 articles published
250. Go back to London, at least once
251. Have a real office that I don’t have to move out of every semester
252. Pass my quals (really nervous about these)
253. Write my lab manual
254. Own some art by someone famous
255. Become a consultant (a final duplicate!)
256: Win a teaching award (Done! December 2009. I won the Vice Chancellor’s award for graduate student teaching. Woo!)

Just a few done this year, but gearing up for another great 365 days. What are your goals?

–Adie

Things Adrienne & Dean Do, Think and Write