Wednesday, December 30, 2009

Brief Review of Office Live's Web Site Tool

I've recently investigated Microsoft's Office Live service for Small Business as a possible resource for some of our lower-end customers. Office Live is more or less Microsoft's answer to Google Apps, providing a basic web site (a la Google Sites), online document sharing and collaboration (a la Google Docs), and email (using Hotmail instead of Gmail).

Here's a site I setup in about 20 minutes (it's a template, no design work):
http://meruscasesupport.web.officelive.com

Pros

  • The tools are simple, straightforward and intuitive. The user interface is obviously based on Microsoft's desktop applications, and it shows. Remember that the definition of "intuitive" is actually "familiar", so despite the lack of "new and different", this thing works very well for what it is designed to do. 
  • Dare I say it? It's easier to understand what is going on than in Google Sites.
  • The apps get a helping hand from the desktop versions of Microsoft Office. The experience, again, is better as a result.

Cons

  • It's not completely free. (Google lets you remove the branding; MS doesn't unless you pay.)
  • You'll never give up Windows and Office this way.
Other notes
  • You can't write html. I don't think you can with Google Sites either, but it's worth noting. No mootools, no custom JavaScript.
  • The WYSIWIG editor for web pages rocks. It's among the best I've seen -- think Frontpage without all the confusing tools that real engineers throw away anyway (If I'm writing JavaScript, give me a text editor, not a markup creator). And it's all on the web, although of course it works best in IE8.

Sunday, December 27, 2009

Eating Our Own Dog Food: Moving Everything to the Cloud

This post is an extension of internal Fuery Solutions dialog. It’s designed to be an exercise in “Thinking out loud”, here for enrichment, a bit of transparency, and, if nothing else, food for thought.
I recognize that some of the content that follows represents a change in tone of this blog. That’s ok; I think that the benefits of being more open and transparent are worth the possibility of some competitive disadvantage. We fashion ourselves to be a Generation-Y company, and our online presence should reflect that.

Preliminary Thinking: Tactical (Reactive) Use Cases

Over the past few days of relative idle time (hooray for the holidays), I’ve had some time to ponder some the details of our infrastructure. I started with some of the glaring omissions in our online presence, including, for instance:
  • Still no side-by-side comparison on MerusCase features with the competition (A1 Law, Abacus, Amicus, Tritek Legal, Med-Legal Perfect Filer, ARS CMPro, etc). We seriously kick all of their asses in our sleep at this point and we should sound that off on high from the heavens.
  • Still no serious effort into SEO stuff. We rock at this and just need to take the time to do it.
  • MerusCase vs MerusWare vs Fuery Solutions vs My Personal Blog. WTF? Excepting, of course, for likely irrelevant historical babble in my blog, we’re all basically the same and have only slightly divergent messages. Our online presence should echo that.
  • Fuery Solutions content is a far cry from our core expertise. Yes, it’s all true, but we have some serious in-house expertise on such a wide variety of competencies that the site feels a bit scattered and fails to cover any of them in the depth truly required to demonstrate expertise. For instance, our methodology surrounding JSON-everything, no HTML in an XHR, super-fast client rendering/sorting/drawing of tens of thousands of data points simultaneously is some enterprise-ready jaw dropping goodness. While the future is MerusCase and not growing the consulting business, we should nevertheless brag about this more. We’re doing brilliant stuff in MerusCase that Salesforce.com with its billion engineers isn’t doing.
  • A lot of this content is living on different servers. Good for PageRank, bad for centralized management. We also have quite a few client web sites floating around in the ether, some on shared hosting, some on dedicated EC2 boxes (that’s a server hosted in the Amazon cloud for you noobs), and some on our production MerusCase infrastructure (also in The Cloud). While this was convenient in our early days — we just installed another copy of whatever piece of infrastructure we needed in an on-demand fashion — it is confusing and represents a fair amount of infrastructure to maintain.
All of this actually boils down to the last point from a propeller-headed perspective. If we get our infrastructure straight, then the rest will fall into place with relative ease.

Infra-Who? Or, Why it Comes Down to Eating Your Own Dog Food

The promise of cloud computing is simple: All computing resources, including data storage, number crunching cycles, memory to handle said crunching of said data, and bandwidth to move it all around is gathered and used in an on-demand basis. You need to ramp up capacity for a couple of hours to run some insane computational task? Great, launch your own “sandboxed” resource and fire away.
In the last few months, the MerusCase infrastructure has moved from a “dedicated servers running in the cloud” model closer to true cloud computing. Data is no longer stored local to our web server and then backed up after the fact — now it gets moved to the cloud immediately when a user uploads it. Our apache server can literally be offline, crashed, burning from a nuclear holocaust and data files are still safe. Spin up a clone of our baseline web server AMI (Amazon Machine Instance), and voila, 5 minutes of downtime after said nuclear holocaust. Somehow I think we’ll be worried more about how we’re going to harvest enough bugs to eat, but hey, we sell to attorneys, and they are a detail-oriented bunch.
Our web properties, however, have remained in a state of flux. This is a conundrum every enterprise has had to face at some point in their evolution — the web is dynamic, needs to be fluid, should be updated minute-by-minute, needs to allow for user interaction, etc. Yet engineering teams historically are centrally managed institutions — and with good reason. You let a junior fellow who just joined the team release a piece of code without some verification processes in place and you just might have a broken application released to the wild on your hands. (Social-networking derived approaches like GitHub notwithstanding. Someone at some point with a high level of trust, be it a random fellow with a Lead Engineer title or Almighty Linus himself must “bless” software as it is developed.)
And henceforth came the myriad of Content Management packages. Wordpress, Drupal, Joomla round out the open source database-driven list used by the SMB market. Big commerical vendors also come to mind for the enterprise space, with names like Vignette StoryServer (are they still around?), Autonomy, and Oracle in on the action also. On the flip side, contenders like Google Sites and Microsoft Live Whatever-They-Renamed-It-To-This-Week round out the consumer-driven versions. In a sense, really, Facebook and Myspace are personal content management services; they allow users to post customized content about themselves, their interests, and their relationships. And let us not forget wiki — the open source software behind wikipedia has been downloaded millions of times and is in production on hundreds of thousands of web sites for help articles, topic-specific junior wikipedias, and even Collaborative Project Management.
The beauty of these systems is that non-geeks can post information and content in a safe, efficient, and de-centralized fashion. The downfall of managing many such sites like we do is that every instance essentially becomes yet another highly available, always on, mobile phone alerting, uptime requiring, bulletproof infrastructure needing pain in the neck. Even aside from client requirements (which we are presumably being paid sooner or later to worry about), our own content requires at least four databases at this point, not including any redundancy, development environments, or staging servers. For < 100 content pages and a few hundred blog posts? Really?
(True, I’m including the MerusCase infrastructure in that count, but really that’s just one database. And even though the uptime of our premiere SaaS product needs to be orders of magnitude higher than any of the blog posts, from an architectural perspective, the goal of simplifying the mess moves me to approach these as a singular problem first, then debate the intricacies later. Besides, even two approaches is better than the umpteen we actually have in production right now. Four is actually a gross understatement.)
Now then, we’ve based our business on cloud computing. We’re slowly moving our best customers to the cloud because it makes things easier for us to maintain, it often presents a cost savings for our consulting customers (all SMB), and it allows us to cheaply outsource tasks like backing up data (both files and databases) who have commoditized that very task on a global scale — a place where Amazon has taken a distinctive early lead that Microsoft and Google will have a difficulty overtaking. But that is another blog post for another day.
Put another way, our goal as a web software manufacturer is aligned with Google’s understated one — all your data, all the time, anywhere, on any device. We just happen to be doing it in a niche way for attorneys and our custom software clients.
And hosting a bunch of different wordpress blogs and other Content Management Systems (off the shelf or otherwise) all over the place is not aligned with that goal. We should not be monitoring backups and upgrading multiple installations of various packages.
So how do we fix it?

Possible Approaches to Centralizing Management of CMS (Dynamic) Content

  1. Multiple Databases be darned. Just put the whole lot into one instance of MySQL Server (Amazon RDS or otherwise) and call it a day. Host everything through one instance of apache. Use the Wordpress Amazon S3 plugin combined with a series of other standardized plugins (Akismet, Gallery, etc) and work out some magical process through a concerted trial-and-error dance that allows themes to be managed by source control, plugins to be managed by Wordpress Admin, and uploads to flow directly up to Amazon. Repeat this dance for other CMS systems (MediaWiki, etc) in our arsenal. Yeah, that sounds readily scalable and easily reproducible. Not.
  2. Move all content to hosted versions of the same. In essence, outsource to the cloud at an application/user level, not an infrastructure level. Using blogspot for MerusWare News, MerusCase Help, and the Fuery Solutions blog (this one) seems possible, but we’ll lose flexibility (categories and .htaccess redirects seem a likely sacrifice). We may also be unable to shield the hosted source completely (Blogger Profiles will probably be readily apparent, for instance). Wordpress.com is another possibility, but that will cost $15 a year per domain and we’ll encounter similar losses in flexibility.
  3. Host our own MMU (massive multi-user) version of whatever CMS systems we need and add to them as needed. WordPressMU could probably be extended to do whatever we need it to. Then we can scale it as needed. This doesn’t consolidate everything into one place, however, because of the MediaWiki installations floating around out there, not to mention Merus. It would help simplify and be a fun engineering exercise, but this seems like an awful lot of work considering the necessity to still maintain infrastructure for each CMS platform.
  4. Throw some stuff away and consolidate around one CMS. Do we really need all of those wiki installations? Ditto with Wordpress?
  5. #4 combined with #2. Consolidate AND switch to (free or mostly free) hosted services wherever possible.

My Initial Proposal

  1. Move my personal blog to blogspot. Redirect all incoming links to either articles moved to the fuerysolutions.com blog (historic tech articles) or reallysmartguy.com (new personal blog address). Care needs to be taken, because those incoming 2000+ links have a fair amount of value.
  2. Move the fuerysolutions.com blog to blogspot. Host as blog.fuery.com. It’s in our email addresses and has been for a long, long time. It should therefore be our primary domain. Create 301s as appropriate (need to verify this is possible on blogspot or come up with a viable workaround).
  3. Move the static fuerysolutions.com pages (now fuery.com) to source control and host on the MerusCase infrastructure. Change code accordingly to point to the new blog.fuery.com. While we’re at it, we should do a facelift and unify the MerusCase and FS brands a bit.
  4. Literally combine MerusWare News, MerusCase Help, and Fuery Solutions blogs into one content-wise. This is a pain, but the Help articles need editing anyway and it will help unify our message at a detailed level. Differentiate between the siloed content by using Labels (Blogger’s version of Wordpress Categories). Domains should redirect to the appropriate silos — help.meruscase.com, news.meruscase.com, blog.fuery.com (everything).
  5. Throw away merusware.com. All live content pages/links should have a home elsewhere now. (Again, 301′ing as appropriate for SEO love.)
  6. Ignore MediaWiki for now. It’s a big task; let’s come back to it.
Your Thoughts?

Wednesday, December 16, 2009

Cool Colors for Komodo Edit 5.2.4

The default font and color schemes for Komodo Edit were disgusting in my opinion.  So I made a scheme that looks like Zend/Eclipse or Mac Textmate.  I am using Windows 7 and this .ksf file goes into
C:\Users\Michael\AppData\Roaming\ActiveState\KomodoEdit\5.2\schemes
but for XP it’d probably be like
C:\Documents and Settings\Michael\Application Data\ActiveState\KomodoEdit\5.2\schemes
I installed these extensions and now it is my favorite code editor: ColorTab, JSTreeDrive, Mootools API Catalogs, SQLite Manager.
==============================
Version = 4
 
Booleans = {'caretLineVisible': True, 'preferFixed': 1, 'useSelFore': True}
 
CommonStyles = {'attribute name': {'fore': 7872391},
 'attribute value': {'fore': 3100463},
 'bracebad': {'back': 65535, 'bold': 1, 'fore': 6579400},
 'bracehighlight': {'back': 16758639, 'bold': 1, 'fore': 0},
 'classes': {'fore': 9145088},
 'comments': {'fore': 6908265, 'italic': False},
 'control characters': {'back': 16777215, 'fore': 0},
 'default_fixed': {'back': 16777215,
                   'bold': 0,
                   'eolfilled': 0,
                   'face': 'Consolas',
                   'fore': 0,
                   'hotspot': 0,
                   'italic': 0,
                   'size': 9,
                   'useFixed': 1},
 'default_proportional': {'back': 16777215,
                          'bold': 0,
                          'eolfilled': 0,
                          'face': 'Tahoma',
                          'fore': 0,
                          'hotspot': 0,
                          'italic': 0,
                          'size': 9,
                          'useFixed': 0},
 'fold markers': {'back': 16777215, 'fore': 5592405},
 'functions': {'fore': 9145088},
 'identifiers': {'fore': 0},
 'indent guides': {'fore': 8421504},
 'keywords': {'fore': 16711680},
 'keywords2': {'fore': 7872391},
 'linenumbers': {'back': None, 'fore': 5592405},
 'numbers': {'fore': 255},
 'operators': {'fore': 0},
 'preprocessor': {'fore': 6908265},
 'regex': {'fore': 25800},
 'stderr': {'fore': 16711680, 'italic': 1},
 'stdin': {'fore': 0},
 'stdout': {'fore': 0},
 'stringeol': {'back': 10079487, 'eolfilled': 1},
 'strings': {'fore': 39168},
 'tags': {'fore': 16724480},
 'variables': {'fore': 0}}
 
LanguageStyles = {'Apache': {'directives': {'fore': 9145088},
            'extensions': {'fore': 139},
            'ip_addresses': {'fore': 6908265},
            'parameters': {'fore': 7872391}},
 'C#': {'UUIDs': {'fore': 0},
        'commentdockeyword': {'fore': 0},
        'commentdockeyworderror': {'fore': 14483456},
        'globalclass': {'fore': 9145088},
        'verbatim': {'fore': 0}},
 'C++': {'UUIDs': {'fore': 0},
         'commentdockeyword': {'fore': 0},
         'commentdockeyworderror': {'fore': 14483456},
         'globalclass': {'fore': 9145088},
         'verbatim': {'fore': 0}},
 'CSS': {'compound_document_defaults': {'back': 13559807},
         'ids': {'fore': 139},
         'important': {'fore': 9109504},
         'tags': {'fore': 9145088},
         'values': {'fore': 7872391}},
 'Diff': {'additionline': {'fore': 9109504},
          'chunkheader': {'fore': 9145088},
          'deletionline': {'fore': 139},
          'diffline': {'fore': 6908265, 'italic': 1},
          'fileline': {'fore': 7872391, 'italic': 1}},
 'Django': {'compound_document_defaults': {'back': 14543103}},
 'Errors': {'Error lines': {'fore': 102, 'hotspot': 1, 'italic': 1}},
 'HTML': {'attributes': {'fore': 102},
          'cdata': {'fore': 9109504},
          'compound_document_defaults': {'back': 16772829}},
 'IDL': {'UUIDs': {'fore': 0},
         'commentdockeyword': {'fore': 0},
         'commentdockeyworderror': {'fore': 14483456},
         'globalclass': {'fore': 9145088},
         'verbatim': {'fore': 0}},
 'Java': {'UUIDs': {'fore': 0},
          'commentdockeyword': {'fore': 0},
          'commentdockeyworderror': {'fore': 14483456},
          'globalclass': {'fore': 9145088},
          'verbatim': {'fore': 0}},
 'JavaScript': {'UUIDs': {'fore': 0},
                'commentdockeyword': {'fore': 0},
                'commentdockeyworderror': {'fore': 14483456},
                'compound_document_defaults': {'back': 65535},
                'globalclass': {'fore': 9145088},
                'verbatim': {'fore': 0}},
 'Mason': {'compound_document_defaults': {'back': 14544639}},
 'PHP': {'identifiers': {'fore': 5308416},
         'keywords': {'fore': 16711680},
         'operators': {'fore': 0},
         'strings': {'fore': 39168},
         'tags': {'fore': 16711680},
         'variables': {'fore': 102}},
 'Perl': {'compound_document_defaults': {'back': 16050922},
          'here documents': {'bold': 1, 'fore': 8594211}},
 'Python': {'compound_document_defaults': {'back': 16777173},
            'decorators': {'fore': 39168}},
 'RHTML': {'compound_document_defaults': {'back': 10092543}},
 'Regex': {'charclass': {'fore': 2237106, 'italic': 1},
           'charescape': {'fore': 9145088, 'italic': 1},
           'charset_operator': {'fore': 7872391, 'size': 12},
           'comment': {'fore': 6908265, 'italic': 1},
           'default': {},
           'eol': {},
           'groupref': {'fore': 2237106, 'italic': 1},
           'grouptag': {'fore': 7872391, 'size': 8},
           'match_highlight': {'back': 10092543},
           'operator': {'fore': 7872391, 'size': 12},
           'quantifier': {'bold': 1, 'fore': 16711680, 'size': 12},
           'special': {'bold': 1, 'fore': 16711680},
           'text': {}},
 'Ruby': {'compound_document_defaults': {'back': 15525631}},
 'Rx': {'breakpoints': {'back': 14540253},
        'children': {'back': 14540236},
        'default': {'bold': 1},
        'parents': {'back': 13434828}},
 'Smarty': {'compound_document_defaults': {'back': 10092543}},
 'Text': {},
 'XML': {'cdata': {'fore': 9109504},
         'cdata content': {'fore': 9145088},
         'cdata tags': {'fore': 9109504},
         'data': {'fore': 2302862},
         'declarations': {'fore': 3358812},
         'entity references': {'fore': 2302862},
         'pi content': {'fore': 9145088},
         'pi tags': {'fore': 9109504},
         'prolog': {'fore': 0},
         'xpath attributes': {'fore': 9109504},
         'xpath content': {'fore': 36095},
         'xpath tags': {'fore': 11}},
 'reStructuredText': {'comment': {'fore': 9616695, 'italic': 1},
                      'identifier': {'fore': 1602765},
                      'operator': {'fore': 9109504},
                      'regex': {'bold': 1}}}
 
MiscLanguageSettings = {'Django': {'globalSubLanguageBackgroundEnabled': True},
 'HTML': {'globalSubLanguageBackgroundEnabled': False},
 'JavaScript': {'globalSubLanguageBackgroundEnabled': False},
 'Mason': {'globalSubLanguageBackgroundEnabled': True},
 'Perl': {'globalSubLanguageBackgroundEnabled': True},
 'Ruby': {'globalSubLanguageBackgroundEnabled': True}}
 
Colors = {'bookmarkColor': 14342664,
 'callingLineColor': 16764159,
 'caretFore': 0,
 'caretLineBack': 13434879,
 'currentLineColor': 16764108,
 'edgeColor': 15658734,
 'foldMarginColor': 16777215,
 'selBack': 16750899,
 'selFore': 16772846,
 'whitespaceColor': 0}
 
Indicators = {'find_highlighting': {'alpha': 100,
                       'color': 1110271,
                       'draw_underneath': True,
                       'style': 7},
 'linter_error': {'alpha': 100,
                  'color': 255,
                  'draw_underneath': True,
                  'style': 1},
 'linter_warning': {'alpha': 10,
                    'color': 10223515,
                    'draw_underneath': True,
                    'style': 1},
 'soft_characters': {'alpha': 100,
                     'color': 13209,
                     'draw_underneath': False,
                     'style': 6},
 'tabstop_current': {'alpha': 100,
                     'color': 3355647,
                     'draw_underneath': True,
                     'style': 7},
 'tabstop_pending': {'alpha': 100,
                     'color': 16751001,
                     'draw_underneath': True,
                     'style': 6},
 'tag_matching': {'alpha': 100,
                  'color': 33023,
                  'draw_underneath': True,
                  'style': 7}}

Thursday, October 8, 2009

Take Our Engineering Quiz!

It’s hiring time here at Fuery Solutions, and with the help of Craigslist, 10%+ unemployment, and a chipper ad, we have far too many applicants.
As such, we’re asking all of you job hunters to take a quick test.
1. Nuts and Bolts.


Build any single major UI piece in this screen shot wholly from JavaScript. You can use any framework you wish, but bonus points if you use either only core JS (impressive) or mootools (cuz we use it). You should fashion your own structured data (as if the labels and such were the result of an XHR).

It is perfectly fine to ignore graphical components, like the subtle gradients here and there. Do replace these with approximate solid colors.

In the interests of time, you can develop against a single browser platform. Do note if/where you took this shortcut. Also, you might want to stick with just a single box. It’s just a quickie.

2. Conceptual.

We currently store archived data via the “old-fashioned” way — apache over http on a web server. We want to move to a model where all static content (picture uploaded Word and Acrobat documents) are served directly through Amazon S3, where they are ultimately archived anyway.

Now, serving static content to the public from S3 is easy. The link above does just that! But here’s the clincher — we want to do it and control the access on a per user, per session basis. Keep in mind that these are end users — not technical people who have an AWS account and think of XML when you say the word “soap”. Actually, in a perfect world, we’d be able to control the flow of S3 object data directly through the authentication model we’re already using, which is based in Apache, PHP Sessions, and some other clever app-level logic for the rest (man in the middle attacks and such). How would you approach this problem? What sort of security worries does your solution address? Or not address? Is your solution efficient? Why or why not?

3. Product/UI Design.

One of the problems plaguing any database of contacts is the problem of duplicate contacts. Think about the products you use that have contacts as a data point — your phone, Gmail contacts, Outlook contacts, Facebook, Plaxo, and all the rest. Ponder the de-duplication experiences you’ve personally dealt with. Or, more likely, the experiences you’ve wished for when dealing with this problem yourself.

Within the context of a desktop based application (whether iTunes or Gmail), describe what the ideal user experience would entail and why. Draw a sketch or three and snap an shot with your phone if it helps.

Stuff to think about:
  • How much should a de-duping engine verify with you as the end-user?
  • How intelligent would the engine have to be to fulfill your ideal UI? What might the algorithm requirements (or even better, approach) be?
  • Do dead contacts go to heaven when they die? (What do you do with extra data? Or, at least, data that you’re not absolutely certain is duplicated?)

Monday, October 5, 2009

Shout Out: Fix for “Cannot Start Outlook. Cannot Open the Outlook Window”

This particular issue had been plaguing me for a few days, forcing me to go around it to OWA (the Outlook web interface).

The solution, found over at ElectroGeek, is to start outlook from the command line with the flag “/resetnavpane”.

Thanks, ElectroGeek.

Thursday, May 14, 2009

Why doesn’t Mootools have a String.truncate() method?

I need a quick way to truncate strings! I’m surprised that neither MooTools’ String.js or String.Extras.js has such a method.  They have so many super-awesome functions, methods and extensions (I especially love the Date.js extensions!!).  Yeah, I really love mootools, and I feel compelled to share with the community.  So anyway, I wrote out a simple, straightforward String.truncate() function:

String.implement({
    /**
     * String.truncate(max, atChar, trail)
     *
     * ++All parameters are optional.
     * @param max = (integer) maximum length of truncated string. Defaults to 100 chars.
     * @param atChar = (string) truncate at the last index of this string. If not found, just truncates to max length.
     *                 If null, does not search and truncates to max length.
     * @param trail = (string) what you want appended to the end of the returned string
     *
     * @author Michael Fuery, Fuery Solutions, Inc. http://www.fuerysolutions.com/
     *
     * +Requires MooTools Core 1.2.2
     */
    truncate:function(max, atChar, trail){
        var s = this.trim();
        if(s.length&lt;1) return '';
        if(!$defined(max)) var max = 100;
        else max = max.toInt();
        if(!$defined(atChar)) var atChar=' '; // break at space
        else if(atChar == null) var atChar=false;
        if(!$defined(trail)) var trail = '...';
 
        if(s.length &gt; max) {
            var i=0;
            s = s.slice(0,max);
            if(atChar){
                if((i = s.lastIndexOf(atChar)) != -1){
                    s = s.substring(0, i);
                }else{
                    s = s.substring(0, max);
                }
            }
 
            s += trail;
        }
 
        return s;
    }
});

Tuesday, May 5, 2009

World Peace via Mootools

MerusCase disposes of A1Law and Tritek using Mootools.

While I was at it, I created a one line algorthm to solve world peace using our JS framework of choice, Mootools.  Yes, we love the moo over here at Fuery Solutions!



If you can't quite make out what that says, here's a recap:

MerusInit = function(){
  $$('A1Law','Tritek').each(function(e){
     e.dispose();
  }
}


World.Peace = $$('evil').each(function(e){e.destroy()});









Sunday, April 5, 2009

Problem Solved: Windows Update redirecting to Google

I had a piece of adware installed that seemed to randomly redirect me to various sites I didn’t ask for… sometimes reputable, sometimes offshore viagra. Turns out it also consistently redirected any link to a microsoft update or download site to Google’s English language home page.

I think the cluprit was Vundo.JC.dll — found this little tidbit of love after running Defender in safe mode. However, even after removal, the redirection continued.

The clue was that this redirection was consistent, worked in all browsers (or, actually, was broken in all browsers — if it were only broken in Internet Explorer, a “browser helper object” add-in would probably have been the cause), and even returned the wrong address from the command line. After a little digging, I discovered that my DNS settings had been hijacked. That is, the stinking adware changed my DNS settings to point to the publisher’s servers. In this case, the new server settings were 85.255.112.69 and 85.255.112.209. If you see these in your Network configuration, you’ve found your culprit!

I reset my DNS back to “automatically via DHCP” and all returned to normal. Hooray!

Monday, January 19, 2009

Building Word AddIn Utilities

We have a need to build a "Save to (your custom web application)" Add-In for Microsoft Word. This book should help:
Mastering VBA in Microsoft Office 2007

Tuesday, January 13, 2009

The Unix Epoch Reachs 1234567890 Seconds!

On Friday the Thirteenth, February 13, 2009 at 15:31:30 (or 3:31:30 pm) PST, the Unix Epoch count reached 1234567890 seconds!

My good friend and coworker Derek found this website that Michael was able to get a screenshot of: http://coolepochcountdown.com/