palermo4 posted on July 6, 2010 10:56

OmniFocus Inbox As a disciple of GTD (Getting Things Done™), I need to have a “system” for organizing my action items, projects, areas of focus, goals, reference materials, among other things.  In the years that I have implemented GTD methodologies, I have changed my “systems” frequently (which is a problem, and worthy of another blog post).  I have tried Outlook hacks, paper-based implementations, Toodledo, Things, Google Tasks, and other short-lived solutions.

Another application that many of my co-workers use is called OmniFocus by the OmniGroup.  I also used this application a while ago.  This is probably the best GTD application on the market.  Unfortunately, it is only available on Mac OS, and there is no web presence or service to access the data.  These factors have held me back from using the application despite its superiority in features.

Since I own both the iPhone and iPad, I have experimented with OmniFocus once again.  Recently, OmniFocus was updated to take advantage of iOS 4.0, and I have been happy with things so far.  I also own a MacBook Pro, but spend most of my time in BootCamp running Windows 7 (which rocks on a Mac by the way).  So while I am in Windows, I keep track of my projects and action items on my iPad (or iPhone if I am out and about).

I am still disappointed with the OmniGroup for not making my data available through a web UI (so I can manage from PC).  I am also frustrated that there has been no release specifically targeting the iPad.  I would even be happy if OmniGroup provided the data through a web service or OData.

So I have returned to OmniFocus because it is the best GTD so far.  Having said that, I believe in this saturated market there is still an opportunity for a better application to emerge.

Stay tuned…


Posted in: commentary  Tags:
palermo4 posted on May 16, 2010 11:47

desertcodecamp2010sign Thanks to all who attended my session(s) at Desert Code Camp this year!  Despite technical difficulties, I was happy to hear how many benefited from my Zero to Hero: Getting Started with jQuery session.  The website that contains the best tutorials I have seen for getting started is http://www.w3schools.com

With regard to my session on ASP.NET Web Forms MVP, please check out http://www.webformsmvp.com for more information.

Thanks Devry for letting us use their campus and  to Joseph Guadagno for his great leadership - and all the volunteers who made
Desert Code Camp 2010 a great success!


Posted in: commentary  Tags:
palermo4 posted on April 12, 2010 11:23

vs2008_logo I am writing this blog at the Bellagio in Las Vegas, NV just moments after the keynote at DevConnections.  The formal announcement has been made that Visual Studio 2010 has launched.

While this has been a long anticipated product release, I can’t help but wonder how long before the .NET community at large will actually embrace adoption.  As a trainer, I encounter many developers who never switched from Visual Studio 2005 to 2008.  A few number recently admitted using Visual Studio 2003.

With support for multi-monitors, code snippets in the web source view, UML diagrams auto-generated, framework enhancements and language features, improved deployment tools, and a fresh IDE – this is the one to switch to now for the developer who wants instant gratification and higher productivity.

Click on the new Visual Studio logo (above) for the cliff-notes on the features you want to know about – courtesy of Scott Hanselman.


Posted in: announcement  Tags:
palermo4 posted on April 2, 2010 19:22

I recently wrote a blog post demonstrating how to define a class that allows equality to be based on the definition provided by the developer, not the .NET Framework.

To my surprise, I received comments, twitters, facebook posts, and emails all challenging my code sample.  Some of the information I received caused me to (ahem) update my code sample (see below).  However, some of the feedback made me wonder if the purpose behind overriding Equals is understood by some developers.  Reading someone’s opinion in a book is one thing.  Actually (and successfully) implementing working solutions doing it is another.

To begin with, let me make clear that the default implementation for equality of two reference types is to see if they are the same reference in memory itself.  If overriding the Equals method off of Object was considered taboo, then it wouldn’t be a virtual method.  As a developer, I may want control over default and ad-hoc behaviors of my objects when sorted, compared, or otherwise.

Take for example the Distinct extension method in the Enumerable class.  This could easily be called in a Linq statement, and comparing references to one another may not solve my business problem.  If my business scenario mandates that two (or more) students object instances are the same if each have the same ID, then so be it.  Business rules drive code – code does not drive business rules.  Whether or not someone agrees with the business rules is another matter.

Having said that, I do agree that the instance level data being used in the hash algorithm should be based on immutable data, so I revised the sample from the previous blog post to demonstrate that specific implementation.

public class Student : IEquatable<Student>
{
    public readonly int Id;
    public string FullName { get; set; }

    public Student(int id)
    {
        this.Id = id;
    }// ctor

    public override string ToString()
    {
        return string.Format("{0}: {1}",
            Id, FullName);
    }// method

    public override int GetHashCode()
    {
        return Id;
    }// method

    public override bool Equals(object obj)
    {
        Student other = obj as Student;
        return ((IEquatable<Student>)this).Equals(other);
    }// method

    bool IEquatable<Student>.Equals(Student other)
    {
        if (object.Equals(other, null)) return false;
        return (GetHashCode() == other.GetHashCode());
    }// explicit interface implementation

    public static bool operator ==(Student s1, Student s2)
    {
        if (Object.Equals(s1,null))
            return (Object.Equals(s2,null));
            return ((IEquatable<Student>)s1).Equals(s2);
    }// operator overload

    public static bool operator !=(Student s1, Student s2)
    {
        return !(s1 == s2);
    }// operator overload

}// class

Posted in: code  Tags:
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010 J. Michael Palermo IV