Wednesday, January 28, 2009

Hey Merlin Mann, where's my digital Banker's Box?

I've been a 43folders fan for quite a while. In college the hipster pda rescued me from procrastination and made me a mean lean work machine. However, lately I've moved more into the GTD camp as I have the power of outlook available to me both at my desk and on my phone.

It may then come to no surprise to you that I was excited to hear Merlin Mann was giving a talk at MacWorld. Earlier today I watched his talk "Toward Patterns for Creativity" on youtube and while I didn't find it to have much content I wasn't already familiar with, one thing stood out: The Banker's Box.

The Banker's Box is a place where everything relating to a project (or context) goes. This way, while juggling several projects it's always possible to find the materials you need. A great idea in the physical world but I wish I had something which could meet that criteria in the virtual one. As it stands I'm using several different applications, each with a specific type of content.

For example, I've been using Evernote as a way to collect notes for a while now, but as an all encompassing "Banker's Box" solution, it's fallen short. The main issue seems to be that the ways I can manage content with Evernote are very limited. These limitations fall into a few categories and are shared by every single piece of software I use:

The first is grabbing content. While Evernote is fantastic at grabbing a chunk of a webpage, it is significantly less good at doing the same inside a PDF file. It can hold any kind of text and so it's entirely possible to put code into it, but it lacks any syntax highlighting and so the code becomes difficult to read. Also, it integrates with almost nothing and is very proprietary. C'mon already Evernote, throw us a bone here. If you were actually able to get a plugin system going and some content sharing standards in place, I'd be willing to actually give you money.

My ideal content collection application would be able to reach into any app I was using, grab my selected content and associate with it the name of the app and the file/location the content was from. I also want to be able to click on something in my content manager and have it take me directly to that data if it's available. While you are at it, also cache the full source of the content. Disk space is super cheap.

The second is management of content. Evernote has a terrible interface for managing a large number of notebooks. I'm only up to 8 and it's already gotten difficult to deal with. It also does not allow any kind of grouping of notebooks. What Evernote needs is contexts. You put notebooks into a context and when you change to that context, it's all right there for you. I also want it to be easy to change contexts on the fly without having to navigate a GUI. I rarely use Evernote's Firefox capture because I'm never sure exactly which notebook it will go into. This is easy to fix with contexts. First make it obvious which context I am in. Second, send to a incoming queue for that context so that I can easily sort it into a notebook at a later time.

The third is archival. In any kind of content management system it should be easy to archive sets of data that may no longer be in use but also may still be useful someday. Really, storage is so cheap and search so good that we should never throw anything away unless keeping it has some kind of associated negative. Yet, I don't want the ghosts of projects past always cluttering what I am working on now. Take a cue from gmail and let me archive things to keep them out of my way but leave them searchable.

The fourth is integration. In the end what I want is a set of tools that integrate my entire life. Why is it that the idea of linking information been so prominent on the web yet on the desktop it's in it's infancy? Every chunk of data in my life should have a unique ID and be able to be referenced from any other chunk of data. I should never have to see or type in this ID, the system should be both implicit in information capture and also intelligent in letting me select from content I would likely want to associate.

Microsoft Office is getting closer (kind of). However, it infuriates me that I need to attach a contact or email to a task or appointment like it's some kind of file. Even worse, if I update that contact's information in my address book the copied information isn't updated. Also, if Microsoft wants to be the one to provide me with my life management solution, it needs to get it's act together around search.

As a software engineer I know that this is all a tall order but I also know that this it is entirely possible. I fear that the only reason we don't already is due to consciously erected anti-competitive barriers. What do we need to make it happen?
  1. Well defined standards for chunking data, referencing data and interchange of data. If I could pick applications I knew could talk and place nice with each other I wouldn't use anything else. I suspect that in general it would be a fantastic competitive advantage for anyone who opted in.
  2. A unique id for every chunk of data. Given a unique ID, any chunk of data in existence could reference any other. Computers are fast and have tons of memory and so these IDs could be quite large. Part of this ID could easily be related to a person and machine. In this way it would be unnecessary to worry about collisions.
  3. Caching in the cloud. In this case, I can't help thinking a system like Freenet is the best direction to move in. Everyone would just cache each other's data altruistically, with heavy encryption of course. Even if that's not possible, we could store in the cloud and cache locally. I'm sure many businesses would be willing to perform this service for a nominal fee. At the very least the metadata for everything would be in the cloud. In this way even if you couldn't find the specific chunk, you might be able to find a superset, subset or copy with a different id via search.
And that's all. Those three conditions are sufficient for an all-encompassing, self-referencing, content management system to be built. I hope very much that this is where we are headed because, while my current system of Evernote-Outlook-Gmail works both on my desktop and on my Microsoft SmartPhone, it by no means meets the entirety of my needs.

Like anyone else, the less I need to worry about my systems the more I can focus on the content I am generating. I'm completely fed up with filling my life with the tons of little steps necessary to move data between applications which simply, just refuse to share data with each other easily because the people who made them want to lock you in. I'm completely willing to jump ship to any products that fulfill my need for open integration and many other feel the same I'm sure. The future is tight but open integration and the sooner it happens the better off we will all be.

Phew, that was quite a rant.

Wednesday, January 21, 2009

Setting Up The New EEE PC 1000

I just recently got an EEE PC1000. It's cool, it's tiny and it came with linux.

I really like Linux and use it at home on my file server, but it didn't take me long to realize that my career as a Software Engineer using Microsoft products just won't allow me to have a linux only laptop. So today I wiped off Xandros and installed a super slimmed down version of XP.

  1. I started with a heavily stripped down version of XP. I was especally merciless when it came to drivers and services I knew I wouldn't need. It's easy to do with NLite.
  2. Disabled Prefetching, System Restore, Page File, and The Indexing Service.
  3. Installed Evernote, Firefox and Open Office
  4. Installed a few Firefox plugins to make the most of my screen real estate.


Future Plans:

Tuesday, September 2, 2008

Always have a Plan B

It's really important to plan for the unexpected in life. Sometimes, when it is least expected, life can pull out the rug from underneath even the strongest and most prepared of us. However, with a little planning it is possible to be prepared for the unexpected and weather all but the worst of storms.


1) The Nestegg
The wisdom in having a bit of extra money tucked away should seem obvious. When you become ill, you can get treatment even if the insurance company gives you a hard time. When an unexpected opportunity knocks at your door you can afford to follow it even when it requires some start-up capital.

It's important to be able to weather a pretty serious economic crisis with your nestegg. I would think three months of pay would be the minimum reasonable size. Less than that and all you've got is a medium sized vacation fund.


2) Honing Your General-Purpose Knowledge
Everyone knows the importance of staying up to date in your field of work, especially in the world of Software Engineering. You must always be learning and growing your knowledge in order to be prepared for future opportunities and projects. However, it is unwise to focus your learning too narrowly. To quote one of my favorite movies: "It's simple. Overspecialize, and you breed in weakness. It's slow death."

Even if you are an expert on, for instance, Java. It's entirely possible that at some point in the not altogether too distant future the entire platform will be abandoned. If you don't have sharp general purpose skills you will be relegated to the job of maintenance programmer for older systems. You may say that, because Java is now open source, you don't need to worry about that happening. Well, that is both arguable and beside the point. Computing, like so many fields, is an ever-moving target. You have to keep both your specific and general skills sharp in order to be prepared for the future.


3) The Alternate Career Path
We are entering a time of potential serious economic crisis in the United States. Soon many of us could lose our jobs. Even those who are lucky enough to be able to keep employment in times of economic crisis may find themselves at the mercy of a financially stressed employer who in order to stay in business must demand long hours for crummy pay. This is why it's important to have an escape route planned.

For some this escape route may be a quick entrance into a graduate program facilitated by having low debt and already taken the GREs. For others, having some side work outside of your main job can help act as a parachute from a difficult situation or a cushion when things fall apart. In the worst case, a person should develop strong social bonds with people who can help you find alternative work and maybe even put you up for a little while if you run out of money. No man is an island.

Thursday, May 8, 2008

A Programmer's Personal Infrastructure

Programmers do it because they love it. A Software Engineer does it because it's their job (although, they might still love it).

At my job as a Software Engineer working on Atalasoft's .NET Imaging SDK, we have a fantastic continuous integration system. It takes much of the pain out of the day to day problems involved in software development. Unfortunately, this type of system is too expensive and difficult to maintain for a single programmer. Fortunately, there are some decent and mostly hassle free solutions available.

To enumerate what a programmer needs to be productive, in order of importance:

1) The Right Tools and Environment
Most hackers have this figured out already. Having your computer set up so you can jump right in and having a place to work where you can focus are equally important.

2) Offsite, Backed Up Source Control
How many times do you have to lose your work because you didn't back it up? Between hard disk failures, refactorings gone horribly wrong and malware munging my files... So many hours of lost work. With the advent of free public source control repositories and friendly gui tools there is no excuse for not taking advantage.

Some Free Options:
DevjaVu
Assembla
CodeSpaces

Here is an old (but good) blog post with a huge list of them.

3) Action/Planning System
One of the hardest things about getting going on a project is thinking about what to do next. I have found that by using an next action tracking system it's way easier to break my projects up into little bits and that makes it easier to get motivated ("I'll just do at least one thing a day").
I think bug tracking/ticket systems are a good fit for this because they are designed around priorities and projects. Thankfully most of these new, free, Source Control sites give you a free bug tracking system too. They can also be handy for, you know, tracking bugs.

Most free source control sites provide this service as well.

4) Some Way To Store Documentation or Ideas
I use a Hipster PDA for keeping track of ideas on the go (it works way better than my "smart" phone) but eventually physical things will get lost. That's why I think it's important to dump them to something digital with automatic backups asap. For this the best option is a semi-private wiki. They are fast for information entry and formatting and you can easily and cheaply get it web hosted at a place with automatic backups.

Some Free Options:
WikiDot
wikihost.org

WetPaint

There are tons of other options if you google for "free private wiki".

That's about sums up what I have in place. If you feel that I missed anything important please leave a comment.

Monday, April 21, 2008

Designing F# Programs

I've been working on a project in my spare time for a presentation I am going to give at Atalasoft this next friday. I am going to try to recreate Rich Hickey's Clojure ant colony simulation except in F#.

I have run into a number of issues along the way...

First of all, by default F# has no Software Transactional Memory. There is a non-integrated library for it, but i'm not sure I want to step outside of normal F# territory for this demonstration. I think I may just lock on the map nodes while an ant is moving or getting food instead. Although this may not demonstrate highly concurrent functional programming as well.

Secondly, at this point I think I have a good feeling for how to write small code blocks in F#. What I am struggling most with is program structure and message passing. My UMass Scheme course didn't really educate beyond how to write scheme in scheme and none of my traditional object oriented techniques are in play here. The best I can do is try to mimic existing programs.

Third, I'm not very familiar with the windows drawing calls. I'm not too worried about this though, there are tons of examples out there. The hardest part will be shoe-horning them into F#'s functional style.

-Rick

Wednesday, March 26, 2008

I Haven't Been Posting Much Here...

I intend to post more on my personal blog, but for now I've been posting quite a bit on my Atalasoft blog. There will be more to come soon.

Wednesday, August 22, 2007

RE: Social Skydiving

On the 30sleeps blog there is a post I really like about meeting people spontaneously entitled "Social Skydiving". My roommate Evan pointed me to it.

http://30sleeps.com/blog/2007/08/01/social-skydiving-the-art-of-talking-to-strangers/

Although I had been building up this skill before I left for my backpacking trip across Europe I found that in Europe I really was forced to develop this skill.

I wanted to add a few things to this though:

1. Be entertaining.

If you know some funny jokes, can tell interesting stories or even know some magic tricks it can help a lot. These kinds of things soften people and make them relax thus making them more open to developing rapport.

2. Be interested in other people.

People love to talk about themselves. In fact when you talk about yourself, unless it is in the context of how it relates to the other person, you are probably boring that person. Ask questions and relate their answers to your own experience.

3. Be energetic.

As Brad said in his post, communication is all about the exchange of energy. The words themselves matter very little. If you are happy, positive and energetic, people will be attracted to you like a magnet. If you are having trouble with this (I am often tired after a long day of work and martial arts) I suggest energy drinks.