Code Camp interview

Summary: Joining the Twin Cities Code Camp leadership team. Being interviewed by Mike Hodnick, a well-known Minnesota developer and Code Camp leader. We talk software, the future, code camps, and, of course, llamas. If you find this amusing, you may want to follow up when the tables are turned and I interview Mike.

Who are you?

I’m Judah Gabriel Himango, I work for Avtex. I like programming. I like thinking about technology futures and the evolution of software. But mostly I like programming. Creating things is fun.

What are you most excited about in joining the TCCC leadership team?

The existing TCCC leadership is composed of some of the most well-known, respected names in the Minnesota software community. If I surround myself with excellent people, I might trick people into thinking I’m excellent, too.

Why is TCCC a great event to you?

Code Camp gave me perspective on the Minnesota dev community. Helps you see the broader picture, outside of your little technology ghettos and outside your company. I love talking with nerdly folk; with them I am in my element! 🙂 Really, the reason Code Camp rocks is the people. You get to talk to other devs you’d normally never be exposed to. Good networking comes out of that, but it’s not all about career — it’s good to pick other people’s brains, hear what other people are building, expand your own ideas and horizons. Code Camp does that. Oh, and the tech presentations are fun, too.

Llamas or Alpacas?

In my last Code Camp talk, I built, in front of a live audience, Twin Cities Llama Radio. Oh yeah! May the llamas reign forever and ever.

As a programmer, what is your technology comfort zone (what do you typically work with)?

Oh man. I typically work web dev these days — everything is moving to the web. But, honestly, even though I’ve done web dev for 2 years, I’m not really comfortable, in fact, I feel inadequate. It’s like I should really know more than I do, and someday, somebody’s gonna find me out and expose me as an imposter. Even in my talks, I preface my them with, “Hey, I am not an expert! Forgive me for blatant factual errors. But listen to me anyways.” 🙂

But, yeah, web dev is where I’m working now, where I think the most innovation is happening, and where I’ll be for the foreseeable future.

What is a hidden gem of programming that you think every programmer should know about, but most don’t?

Distributed map/reduce function in Erlang. Yes, Bob, I did.

Do you contribute to any open source projects?

Yeah, I’m a big believer in open source, honestly. I’ve contributed to some libraries I’ve found useful, such as HtmlAgility PackRhinoMocksLucene.NET, and Ninject. I’ve also created a few open source projects for my own stuff, like Chavah Radio. I’m currently in the process of launching a startup, and my main product will be open source as well.

Second try: llamas or alpacas?

Alpacas are llama-wannabes with an inferiority complex. Also, did you know *anyone* can start a Alpaca farm? That’s what an infomercial told me. I mean, are Alpacas so depraved and needy that they resort to late night infomercials? Llamas, dignified and honored as they are, would never stoop to such a low.

Five years ago, did you see yourself doing what you are doing now?

No way! I was really sheltered, actually. I was at a small company writing software; they treated me really well, and I have fond memories of my time there, but I was kind of living in a technology ghetto, ignorant of the state of technology, jobs, and trends in the industry. Code Camp helped me break out of that and see the broad software community, engage with other software people, exchange ideas. Since then, I’ve started speaking at software conferences and user groups, growing my skills, expanding my horizons. I think the last 5 years have been awesome, I’ve advanced myself professionally, I look back and am astounded at how far I’ve come. (Woohoo, go me! :pats self on back:). I’m looking forward to the next 5.

Why does a mouse when it spins?

LOL. At first, I read that, and I was like — wait, is that a typo? OH LOLZ HE MADE A MISTAKE!!111 But then I Googled it, and now I see the light and higher the few. Probably the same difference as a duck, one has wheels. Yee-ahhh!

Visual Studio 11 crashes with InvalidCastException

UPDATE: This issue can be solved by running the steps described here. There’s also a Microsoft Connect ticket describing the problem.

Just got Visual Studio 11 beta (with recent VS March Update) to crash consistently on start-up:

Launch VS, immediate crash:

Debugging that brings up the following exception:

The exception detail reads:

System.InvalidCastException was unhandled
HResult=-2147467262
Message=Unable to cast COM object of type ‘System.__ComObject’ to interface type ‘Microsoft.VisualStudio.OLE.Interop.IServiceProvider’. This operation failed because the QueryInterface call on the COM component for the interface with IID ‘{6D5140C1-7436-11CE-8034-00AA006009FA}’ failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
Source=mscorlib
StackTrace:
at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
at Microsoft.VisualStudio.OLE.Interop.IServiceProvider.QueryService(Guid& guidService, Guid& riid, IntPtr& ppvObject)
at Microsoft.VisualStudio.Shell.ServiceProvider.QueryService(Guid guid, Type serviceType, Object& service)
at Microsoft.VisualStudio.Shell.ServiceProvider.QueryService(Type serviceType, Object& service)
at Microsoft.VisualStudio.Shell.ThreadHelper.get_Invoker()
at Microsoft.VisualStudio.Shell.ThreadHelper.InvokeOnUIThread(InvokableBase invokable)
at Microsoft.VisualStudio.Shell.ThreadHelper.Invoke(Action action)
at Microsoft.VisualStudio.Services.TaskSchedulerService.VsUIThreadScheduler.<>c__DisplayClass2.<QueueTask>b__0(Object _)
at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
InnerException:

How did I get in this state? I’m unsure, but I think I accidentally hit F1 key. (Oh noes, the dreaded Visual Studio F1 key!) Somehow, I think that wired up the VS help, which resulted in a consistent crash at boot.

Running devenv.exe /resetskippkgs didn’t fix it. Running a full VS repair doesn’t fix it.

Anyone else hitting this issue?

5:01 developers are visionless hacks

The 501 Manifesto states that:

  • Our families are more important than the commercial goals of business owners
  • Free time is more important than free snacks
  • Living our lives is more important than maintaining our personal brands
  • Sustainable pace is more important than muscle-man heroics
  • Our personal creative projects are more important than commercial products the world doesn’t need
  • Having money for nice clothes is more important than getting free t-shirts from Microsoft
  • Playing fußball in the pub with our friends is more important than playing fußball in the office with our team leader
  • Not being a dick is more important than being a rockstar

“501” refers to programmers who punch out at 5:01pm and never think about technology until 9am the next morning. They don’t read programming blogs or books, nor do they have a desire to advance their craft. Technology is nothing special to them, software is just another job. They might as well be bagging groceries if the pay was comparable.

There’s some good to be gleaned from this manifesto. If your software job is all you do, your life will pass you by and you’ll wonder why you spent so much of your life living for a corporation. You’ll realize what a waste of a life it is to make all that money but not, you know, live. The young & ambitious tend to overlook this wisdom.

Having a life outside of tech is important and rewarding. For me, I play music, I help run a religious congregation, I spend time with my kids and my wife. Those things are hugely rewarding.

I sympathize with the 501 manifesto, but there’s something not quite right here.

The manifesto confuses corporate interference into personal life with passion for technology. That is to say, it incorrectly implies the people who are passionate about technology are those enslaved to their corporate masters. It makes this confusion when it says those who “write technical blogs, attend user groups, or contribute to open source projects” are those who are enslaved by their corporate masters.

It’s silly, because my corporation didn’t ask me to write this blog, attend Code Camp last week, go to user groups, or contribute to open source projects. In fact, many corporations frown on such things, since it takes time away from working on The Project. My corporate masters didn’t ask me to do those things, nor did I do those things in order to impress my corporate masters.

Instead, I do these things because I love technology. And I suspect those of you who do these things do so because, like me, you’re passionate about software and technology, not because some evil corporation forced your hand.

I entered technology because it’s my passion. I take joy in writing software, and in a bigger sense, I consider technology a frontier for humanity and the advancer of civilization. More on that in a minute.

If you entered the technology field for other reasons like money or easy labor, I suggest finding a career you are passionate about. It’s hard to put a price on happiness, and if you aren’t happy with your choice of career, get out before you waste any more of your life on it.

Why be passionate about technology?

I find it freakin’ awesome that we can make new things. We’re in a new age, an age of technology, and we’re the inventors at the fore. We build things from scratch! Then put those new things in front of people. And some of those things might be so useful, that people will use those things regularly. What a rare and precious opportunity we have, that we can build and invent new things, things that can impact humanity.

Hubris? Not at all:

We explore the universe because of technology.

We fix sick people because of technology.

We can communicate with anyone in the world via the push of a button because of technology.

We prevent disease because of technology.

We have the sum total of humanity’s knowledge in a single repository — the internet — because of technology. That we have a single repository containing the sum of human knowledge for the first time in our history is an accomplishment in itself, but just wait until you see the ramifications of this knowledge freely available to all. It will result in an explosion of learning, new technology, new ideas; raw civilization advancement.

I want to be part of that. It’s why I have a passion for technology. It’s why I don’t consider software, the brains behind technology, just another job. I don’t stop thinking about it at 5:01pm. Technology is a frontier for humanity. And I’m going to add to it, even if through some insignificantly small contribution.

Shortsighted and visionless is the person who looks at software as just another job, technology as just another field. If that’s you, find a job you take joy in, and in a field you are passionate about. Your life will be happier.

For the rest of us, the 21st century is a great time to be alive. We, the technologists, are the new inventors. We are the future, and the future, my friends, is bright. Watch and see.

Nerds, Code Camps, and You

Summary: Reflections on Twin Cities Code Camp 12, and my talk on the death of Silverlight and the triumph of HTML5. Why code camps and developer user groups are great for the happiness and careers of all who love technology.

This past weekend marked the 3rd Twin Cities Code Camp conference I’ve attended. Each year gets better.

Why are code camps so great?

You get to hang with nerdy people. That’s me in the blue shirt:portrait of me and another nerd at Code Camp

…You get to talk nerd crap with other nerds:

Cats (both LOL and Nyan variety)? Llamas? Star Wars? Sailor Moon? The nerdliness abounds:

…You get to give fun/silly talks. I spent a good 30 minutes talking serious about the death of web plugins and the triumph of HTML5, but ended with a from-scratch demo building an HTML5 radio station that played…llama music. Oh yes!


I rocked that talk hard, and had a blast doing so:

Move Your Silverlight Skills to the Native Web with KnockoutJS [slideshare id=12574854&w=425&h=355&sc=no]

View more PowerPoint from JudahGabriel

Doesn’t hurt to hear great feedback:


Oh yeah!

Code Camps are total nerd fests, and it’s a blast. You learn tech, you grow your career, you have fun.

If you’re a dev who loves software and technology, step outside your job and have some fun with technology. Try a Code Camp, or even just a local user group. Self-improve and have fun while doing it. Good for career, good for life happiness.

Move Your Silverlight Skills to the Web with KnockoutJS

Summary: Posted the slides for my recent, unconventional talk, “Move Your Silverlight Skills to the Web with KnockoutJS.” And a note about web plug-ins like Flash and Silverlight.

I spoke at the Twin Cities Silverlight User Group yesterday afternoon on a rather uncomfortable topic: Silverlight’s imminent irrelevance. I told Silverlight developers they should stop writing Silverlight code and move to the native web.  🙂 It definitely raised some eyebrows.

Fortunately, they didn’t throw rotten fruit at me; we actually had some great discussion back and forth about the software industry, Silverlight, and the future of the web. Overall, it was a blast! You can view my Rage Comic-infused slides online: Move Your Silverlight Skills to the Web with KnockoutJS

So why should Silverlight developers think about moving their skills to the web? See my earlier post, The Bell Tolls for Flash, and Silverlight Isn’t Far Behind. In a nutshell, we are witnessing in our industry a major shift away from web plugin technology like Flash, Silverlight, and JavaFX. With the explosion of mobile computing, I believe this trend will grow, such  that the only real platform for the web is the native web technologies: HTML, JavaScript, CSS.

If you’re a Silverlight dev, it’s time to move on. The war’s over and, for better or worse, web plugins lost. The native web is where it’s at.

Opened web FTW! How I used opened web APIs and standards to build a beautiful HTML5 web app

Summary: It’s a great time to be a web developer. HTML5, KnockoutJS, MVC3, RavenDB, and opened web APIs and services like Google Docs, IfThisThenThat, and RSS are combined to build a beautiful, useful web app. The opened web is coming to fruition.

I recently released MessianicChords.com, an HTML 5 site for finding lyrics and guitar chords to Messianic Jewish religious music.

Using opened web APIs to build this thing proved effective. Do web developers know these APIs exist? They should; these opened web APIs and standards are powerful tools that will make your app shine.

The raison d’etra of MessianicChords is to provide a way to find lyrics and guitar chords to Messianic Jewish music. This sounds simple, but building it presented a number of challenges:

  • Precise character formatting required. Guitar chords sheets require precise formatting; the G chord must be precisely above the “Let us exalt” line, for example.  This makes automatic conversion to straight HTML unfeasible. This lack of formatting preservation has plagued existing guitar chord sites like ultimate-guitar.com.
  • Proprietary file formats. Guitar chord sheets are often in .doc or .pdf formats due to precise formatting requirements, as well as for historical reasons. This is problematic, because I wanted the chord sheets to be viewable on all devices and platforms, especially tablets like iPad, seeing as how many artists and guitarists use tablets to view the chords while playing music.
  • Searching. I wanted to be able to type a title, artist, or even a partial lyric, and have results come back instantly. Today, users have come to expect Google-like instant search results. In reality, it’s very difficult to make search work like Google: partial matches, incomplete search terms, search qualifiers (such as placing quotes around a group of words) — these all present additional technical challenges.
  • Letting users upload content. While myself and a few contributors have created a large library of Messianic Jewish music chord sheets, approximately several hundred chord sheets, letting the community add chord sheets was important.
  • Automated announcement of new chord sheets. When new chord sheets are added, we’d like to announce it to the world. Better yet, make it automated.
  • An interactive, clean HTML5 app. The existing chords and lyrics sites are littered with ads, have a messy navigation system, and look as though they were designed in the 1990s. Can we do better?

Getting complex, proprietary documents onto the opened web

The formatting issue was the most important to tackle: how can we take complex documents of proprietary file formats and make them available on the opened web?

Enter Google Docs. With Google Docs, you can upload documents, including .doc and .pdf formats, and view them right in your web browser without having to install any special software or plugins. Google’s servers do the heavy lifting on the back end, and you with your web browser reap the fruit.

Additionally, Google provides a sharing model for documents on Google Docs: you can share the document with individuals (specified by email address), you can make the document semi-public by generating a link to the document, or you can make the document entirely public, discoverable by search engines and the like. For MessianicChords, I chose the latter: documents that are public, discoverable by search engines, with a public URL. In addition to sharing, docs can have multiple authors and collaborators. For MessianicChords, I made the chord sheets visible on the web, but read-only to the general public, editable only by myself and some trusted admins.

Finally, and most importantly, Google Docs comes with a powerful API to find documents, metadata, and grab URLs to them. For MessianicChords, having chose ASP.NET MVC3 on the server, there’s a free .NET wrapper for the Google Docs APIs, available as a NuGet package.

With Google Docs, it allowed me to preserve the special formatting of guitar chord sheets, while still making them available on the web. With the Google Docs API, I was able to use Google Docs as a kind of database for the chord sheets. It solved the proprietary file format problem not by lossy conversion, as so many other chord sites do, but by making them viewable via pure HTML/JS.

Seaching

Users have come to expect Google-like search capabilities: instant, partial search terms, close matches, special search terms such as words grouped in quotes, and so on.

With Google Docs as our pseudo-database for chord sheets, I get the best of the search world: Google’s own search algorithms via the Google Docs API. Send over a query with bless God should return all documents with the word bless and God in them; many results. However, if you search for that same phrase, but in quotes, “bless God”, you get only documents that contain that exact phrase.

Best of all, the performance of these queries is excellent: near instant, under a second.

Using Google Docs as a storage mechanism for MessianicChords results in a free, web-accessible database with built-in Google search functionality. Win.

User-generated content and automating the “tell the world about it” part

Since MessianicChords allows users to contribute their own chord sheets, wouldn’t it be nice if we could announce to the world new chord sheets as they’re added?

Sure, I could send out an email, but email blasts are so 1990.

And yeah, I could put an announcement on the Facebook fan page, but Facebook is ultimately a walled garden that will eventually pass away.

Keeping with our spirit of living on the opened web, can we do some sort of announcement of new content that lives on the opened web?

Enter RSS. This is a long-standing, UI-agnostic technology that keeps track of updates to blogs, news sites, or other content that is frequently updated. Boiled down, it’s just an XML file that describes the what, who, and when of updates in a standardized way. The result can be consumed in any RSS aggregator, such as Google Reader.

For MessianicChords, I wanted to publish an RSS feed of new chord sheets. This way, updates to the website are broadcast in a standardized way on the opened web, not limited to Facebook walled gardens, private email inboxes, or proprietary services like Twitter. (Though we can push to those services if we please. More on that later.)

So, the first problem: we need to persistently store the list of updated documents. I could probably have used Google Docs for this, too, but it felt right to have a real database here to keep track of purely application-level things. For this, I used RavenDB Embedded. RavenDB is an open source document database. It’s a great, free database for .NET development, and the embedded version can run inside web apps without any special machine configuration or installation. I plopped that sucker right into my web app, following the lead from the excellent MSDN article, Embedding RavenDB into an MVC3 app.

Within 5 minutes, I was up and running with RavenDB, storing the user’s uploaded chord sheets as records in Raven.

With the upload records in place,  how do you generate an RSS feed from ASP.NET MVC3?

Turns out, it’s a piece of cake, thanks in part to Microsoft’s Windows Communication Foundation (WCF) APIs, in particular, the SyndicationFeedFormatter class.

We’re looking to have a URL where the updates feed resides. For this, you can create a custom MVC ActionResult that wraps up an RSS feed.

public class FeedResult : ActionResult
{
    public Encoding ContentEncoding { get; set; }
    public string ContentType { get; set; }

    private readonly SyndicationFeedFormatter feed;
    public SyndicationFeedFormatter Feed
    {
        get { return feed; }
    }

    public FeedResult(SyndicationFeedFormatter feed)
    {
        this.feed = feed;
    }

    public override void ExecuteResult(ControllerContext context) {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType = !string.IsNullOrEmpty(ContentType) ? ContentType : "application/rss+xml";

        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }

        if (feed != null)
        {
            using (var xmlWriter = new XmlTextWriter(response.Output))
            {
                xmlWriter.Formatting = Formatting.Indented;
                feed.WriteTo(xmlWriter);
            }
        }
    }
}

This gives us an ActionResult we can then return from an MVC3 action to render an RSS feed. From there, we return an instance of this class, populating it with the upload records stored in RavenDB. End result? See it in action: MessianicChords.com/Home/UploadsFeed. As you can see, each upload record shows up in the RSS feed, as populated from Raven.

Wooohooo! We now have an RSS feed for user-generated content.

Pushing RSS to proprietary services like Facebook and Twitter

Is RSS enough? How many people know what RSS is, let alone know how to subscribe to it? Sadly, the current state of the web and web browsers makes it awkward at best to subscribe to an RSS feed.

How can we get our nice, standards-compliant, opened web feed of updates to regular, non-techie people?

Enter IfThisThenThat. In a nutshell, this is a free service that puts the web to work for you. In more concrete terms, it lets you listen for actions on the web — a new blog post, an RSS feed updated, a Tweet posted, a Facebook image tagged, whatever you can imagine — and then do some other action in response to that trigger. If [this], then do [that]. Scott Hanselman has a great write-up on the technology.

For MessianicChords, I decided my “this“, that is, my trigger, would be “when the MessianicChords RSS feed is updated”. And my “that“, which is my reaction to the trigger, would be, “Post a new Tweet announcing the new chord sheet.” It looks like this:

I also set up a trigger to announce the new chord sheet to Facebook. Also, to direct message my main Twitter account with the news, so that myself or other admins will quickly send it through the approval process.

Bottom line: we used the If This Then That cloud service to consume our “user uploads” RSS feed, then automatically tweet the news of the new user-generated content and spread it around the social networks. Awesome!

Interactive, clean HTML 5

Last but certainly not least, an important part of all this is the user experience. I want to differentiate my site from other chord sites by having zero ads, and a clean, responsive UI.

Yes, when search results come in, I want a subtle fade-in effect.

Yes, I want nice prompt text that disappears as you enter the textbox.

Yes, I want an inline upload functionality that doesn’t navigate away from the page or your current task.

Yes, I want each search to have its own URL.

Yes, I want search results to appear as I type. But if I type too fast, it should wait a moment before trying to search.

Yes, I want the whole thing to feel smooth and elegant.

While these things can be accomplished “manually”, as it were, with jQuery and straight DOM manipulation, this whole thing would become rather unwieldy.

Enter KnockoutJS. Knockout is a client-side library that makes it easy to build interactive web apps. It accomplishes this through data-binding and the MVVM pattern that separates your UI from your logic. Instead of a mash of UI DOM manipulation and logic in your JS code, with Knockout, you can write apps where your JS code free from DOM manipulation. Your code is cleaner — focused only on logic — allowing you to focus on doing awesome things in your UI.

For MessianicChords, I used data-binding to show the results of the search. My HTML looks like this:

<div class="search-results-container" data-bind="foreach: searchResults>
   <div>
      <a data-bind="text: Name, attr: { href: DocumentUrl }" />
   </div>
</div>

So simple! Our JS, then, creates an array called searchResults, populates it at runtime. When it gets populated, Knockout renders a template for every item in searchResults array. The search results come back with objects containing a Name, a DocumentURL, and those get rendered inside our search-results-container as shown. Awesome!

How about things like automatically searching when we type? And only searching if the typing has been idle for awhile? Knockout to the rescue again:

<input data-bind="value: searchText, valueUpdate: 'keydown'" />

And in our JavaScript:

var searchResults = ko.observableArray();
var searchText = ko.observable();
var searchTextThrottled = ko.computed(function() { return searchText(); }).extend({ throttle: 250 });
searchTextThrottled.subscribe(function(newSearchText) {
   // perform AJAX to MVC action to fetch search results from Google Docs
   $.getJSON("/Home/Search", { searchTerm: newSearchText }).success(function(results) {
      searchResults.pushAll(results);
   });
});

As soon as we push results into our searchResults array, Knockout automatically renders the search results onto the page, thanks to data-binding. Sweet!

And notice how we subscribed to the throttled value of the search text. The searchText observable is updated as the user types, then the searchTextThrottled value waits for a no-typing period of 250ms before sending the query to the server. Complex UI interaction pattern, but took just 3 or 4 lines of JS code to accomplish, thanks Knockout.

Bottom line: KnockoutJS gave us the ability to write an interactive UI with ease.

Summary: It’s a great time to be a web developer!

The web is evolving and getting better. The technologies now available to us as web developers is staggering; tools like HTML5, KnockoutJS, Modernizr, RSS make it easy to build web apps that shine. And  external services like IfThisThenThat, RSS, and Google Docs, makes building services that integrate with the opened web a piece of cake.

These opened web APIs grant web developers powerful capabilities not in previous generations. The opened web is coming to fruition, and we’re reaping the benefits.

Web dev for the win.

How to partially solve the blogs-are-dying problem: comments

One of the reasons that blogs are dying is that blogs no longer represent an individual online. Instead, Twitter, Facebook, or even email represents a person online. Blogs are relegated as unimportant side shows.

One problem with this — and forgive my verbing a noun — is that it silos a person into a single commercial entity. If your Facebook profile is you, no one can know about you except your Facebook friends. The only people than come in and go out are Facebook users. That’s a problem, because if Facebook ever becomes passe — not unlike MySpace did in recent memory — your identity online is scrapped.

So what other options do we have, and how can we make blogging relevant again?

Respected technologist Dave Winer recently posited that, on the net, your feed is you. What is your feed? I’d broaden Winer’s definition and say, it’s all the public stuff you do on the web: your blog posts. Your tweets. Your Facebook comments and status. Your comments on other blog posts. All of it.

That’s you. On the web, you are your feed. 

The important part is the content you write, which is ultimately your blog. Everything else is secondary; Twitter can be an announcement mechanism for your blog posts. Facebook can, too. Today, that’s what content producers tend to use Twitter and Facebook for. You author your content on your site, then spam Twitter and Facebook. Then people come out of those silos and read your content on the opened web. This addresses the first problem with blogging, and that is makes your blog your primary authoring tool on the web, which helps push it back into its spot as your online identity.

The Comments Problem

Another problem with blogs is nobody comments on them. It’s too hard to comment on a blog.

To be sure, an audience isn’t a problem: in your blogging, if you keep jabbing, and throw the occasional haymaker, and you do this consistently, you’ll get an audience, no matter your niche  topic. The problem isn’t from a lack of people.

Yes, even with an audience, people don’t comment on blogs. And part of the reason is the insane roadblocks you must navigate through to add a blog comment: OpenID provider? Do we know you? No? Sign up! Yes? Name, please! Password, please! Url, please! Type this hard to read CAPTCHA! Preview, please! Submit! Oh what’s that, we don’t support that HTML tag! Try again! OK! Now submit!

This commenting barrier problem has created an amusing phenomenon: the announcement of the blog post on Facebook gets more comments than the blog itself. Maybe 15 people will go back and forth about your blog…but they’ll do so on Facebook, not your blog. Ditto for Twitter. After all, it’s so easy to comment on Facebook; there’s no typing your name, no typing your URL, no preview, no CAPTCHA, no confusing OpenID provider selection, none of that. Just type your comment and hit enter.

One solution I’d like to propose to this problem is automated duplication of Facebook comments into blog post comments. Yes, if Daria M. writes a comment on your post announcement on Facebook, why not do her a favor and copy that comment onto the opened web, onto your blog? Make it automated. Suddenly, your blog posts have 40 comments instead of 5. And they’re all on the opened web.

Here’s what this would look like:

  1. Write a piece of software that looks at your Facebook feed.
  2. When that software detects a feed item that contains a link, unwrap the link (almost all services now, including Facebook and Twitter use web-breaking URL shortening services)
  3. If the unwrapped link points to a post on your blog, check the comments.
  4. If the comments exist on that feed item, talk to the blog services (e.g. WordPress, Blogger) APIs to post a comment to linked blog post.

End result: when someone comments on your Facebook status announcing your new blog post, comments to that status get reproduced on your blog. The same thing goes for Twitter and Google+.

Here’s what’s involved with making this work:

For #1, we’d need an app that talks to [social media service]. A Facebook app, in this case.

For #2, our software would need the ability to unwrap links from URL shortening services.

For #3, our software would need to work with the social media service’s APIs to fetch comments on a feed item. Facebook and Twitter already support this.

For #4, we’d need our software to communicate with [blogging service] to post a new comment to the blog. WordPress and Blogger likely already support this.

The feels like a problem that could be solved with the IfThisThenThat (IFTTT) web service. There, you can create recipes for [when something happens on the web] then [do this other thing on the web]. The problem, however, is it appears that IFTTT doesn’t have any tasks adequately powerful. While Twitter (and Facebook?) have RSS feeds for your feed, there’s no built-in IFTTT task for unwrapping shortened hyperlinks (step #2), fetching comments to feed items (step #3), or posting comments to blogs via blog APIs.

Could it be that this could be done with Yahoo Pipes? That feels a bit more powerful than IFTTT.

In any case, I’d like to see this done. I might just have to do it myself, but I’d love to find that someone’s already done the heavy lifting.

The Sick, Sad State of Windows Apps

Several months ago, prior to the announcement of Windows 8 app store, I tweeted:

What do I mean by “wild west” app store? I mean, isn’t it a good thing we have freedom with the internet to install any app we please?

The freedom is good, we should always have that option to side load whatever we want on our devices. However, the “wild west” model has devolved into a sea of pop-over ads, misleading links, hidden downloads, pleas for donations, and security nightmares.

Let me show you with pictures. (Let’s go shopping!) Today, I want to install one of the best, free Windows apps: Paint.NET. It’s a great photo editing tool, and I want to install it on my new work laptop.

Behold, the state of the art way to install Windows applications in 2011:

First, I’ll open my browser so that I can navigate Windows’ Wild West app store that is the internet. Now I’ll just type in http://paint.net and hit enter.

Umm…looks like I want the one on the left. I think. Grandma probably doesn’t know what to do here, so she’d close her browser already. But me, I’m tech smuggy smug smug smart, and I know it’s the one on the left right.

Alright, is it installed yet? Of course not, silly. We haven’t even downloaded it! So what’s next?

It’s that big green download button, right? I mean, it’s big. It’s green and stands out. And there’s a cute animal with a paint brush in his mouth. And since I’m downloading a paint program, that must be what I’m looking for!

Wrong.

That’s actually an ad. Clicking it takes you to a competitor’s product, GIMP, the popular open source image editing software. Of course, me being all techie in-the-know, I actually knew that. Grandma didn’t, but she gave up already. Her loss. I think.

Ok, where’s that damned download? Oh, silly me, it must be that other big green download button, with the nice big down arrow. For download:

Surprise, it’s not that either!

Haha, oh internetz, you are so funny. You tricked me! You tricked me real good. That big whitespace between the Big Green Download button and the “PDF Creator” label – you sure had me fooled!

Now that I’m aware of my situation of being in a software link minefield, I’ll just look around…

Ah! There we are. It’s no Big Green Button, it’s no Big Down Arrow, but it’s the name of the thing I’m looking for. I’ll just click that…

Erm, well, I thought I was there. But really I’m on some new page that, as far as I can tell, exists solely to show me fine advertisements from the classiest of internet ad vendors.

Ah, this just means I get to play Round 2 of Find the Download link. I know it’s not that Big Green Download button. That silly internetz already tricked me once.

Oh, I know, it’s that nice big yellow button, specially styled with double underlines! That must be it:

I know, I’ll just go mouse to click on it…

Oh noooes! It’s the dreaded Hover Sticky Pop Over. Another fine internet advertisement displays over the page, just by mousing over it! Imagine that, I don’t even have to do anything, and ads come flying at me!

Better yet, the ad is “sticky” — it doesn’t just go away on its own. You actually have to click on the ad (ha!), on that tiny little X button, to close the ad.

Ok, internetz, I promise not to move my mouse. I’ll just move my eyes, then navigate the hyperlink minefield to get to my good download. If I can find it…

Ha! I win! I found your damned download link! Take that, internetz! I may have lost a few battles, but I won the war, I have my download link! I’ll just carefully move my mouse through the whitespace and onto the download link. And now I’ll just click it and…

Wait – this isn’t my download! 🙁

Oh, immortal internetz! You came back for more. Round 3 here I come! I was fooled in the last 2 rounds, but this time I will defeat you, and find my download!

I have learned the ways of the fake Big Green Download button. I now know to avoid that, and avoid the Other Big Green Download button, a internet advertisement warrior who makes his second appearance in Round 3.

I shall not be fooled again! I shall not click you!

And behold, I have spotted what appears to be the real download link! I shall carefully navigate my mouse past the Dreaded Hover Sticky Pop Overs, and I’ve managed to click what appears to be the real link!

Claim Round 3 for the humans!

After a sweaty, multi-round battle for my download, which involved feigned paths down rogue installs, navigating multiple hyperlink minefields, and outsmarting my way past the decoys, I’ve downloaded my software:

Wooohooo!

Am I done? Have I made it? Is this heaven?

No, silly. We’re only halfway there! So much more fun to come! Now I’ll just click on that zip file. Grandma might not know to do that, but she left a long time ago. (Maybe I should have followed her and taken up a career in knitting?)

Nay! Faithlessness begone! I shall see it through and be victorious. I shall click on this zip file to unzip it:

Oh, shoot. My unzipper isn’t registered. As creepy as that sounds, it turns out I’ve already purchased this software…on my home machine. Windows is too dumb to know that. Now, I could go hunting for my registration key — it’s probably sitting on my home machine. Or in a backup folder. Or a cloud drive. I don’t remember.

Anyways, I’m too lazy. WinRar developers were kind enough to let me use it anyways. I’ll just dismiss this message, and I should be good…

Oh dear. Some UAC prompt. That’s User Account Control, for you uninformed peasants. Even though if I said “C colon slash software Adobe twelve ee en you es dot exe” to my grandma, she’d think I’m speaking in tongues. But me, I’m super techy so I know that just means the path to an executable file.

But this scary prompt about a program harming my computer is frightening. Is it safe?

I’ll just assume it’s safe. Assuming I went to the right website, clicked the right download link, unzipped the right zip file, and launched the right executable, it’s safe. Probably.

Let’s cross our fingers and roll with that. I’m determined to win this victory. I am determined to triumph! I shall click “OK” to the UAC security prompt…

Ah, this looks right! Of course, it could be a phishing attempt. But it looks legit. I’ll roll with it.

Now, what are these options? Custom or quick? Um, what if I just want it installed? Quick sounds good, but what if it’s skipping stuff I need? Ahhh! Too many decisions! Analysis paralysis!

I’ll just pretend I didn’t see those options and click “next”. I hope it works…

It’s installing. I think.

But it’s been installing for about 2 minutes now. The progress bar moves ocassionally, but I’ve seen software where the progress bar just resets to 0 once it gets to 100, so maybe it’s not working.

I’ll just go get some Mt. Dew and come back in a few minutes…

Ok, I’m back from my caffeine and pee break. What was I doing again?

Oh yeah, Paint.NET! My long, drawn out battle is coming to a close! Victory is so close, I can taste it.

But first, more clicking. I need to click “start Paint.NET”. It didn’t start. Oh, that’s right, I need to click done or next or whatever. Then it should start. (I hope?)

After performing lots of clicks on the right elements in the right order, I believe I have appeased the MSI Installation Click gods.

My final goal has been achieved! In as little as…well, time doesn’t matter. In just a few…we’ll, clicks don’t matter. With bold confidence I…we’ll, the whole process invoked uncertainty.

Installing apps for Windows (and Mac) sucks. In 2011, it freakin’ sucks. This is why people are afraid to install native apps. This is why web apps are taking over and native apps are disappearing.

If Microsoft doesn’t fix this with Windows 8, the Mighty Microsoft will go the way of Sun. No one will buy Windows, because OS won’t  matter; everything’s on the web. And if no one buys Windows, no one will buy Office. Microsoft’s 2 big cash cows will dry up like the Negev. Microsoft desperately needs to make Metro apps work.

The App Store model, and Microsoft’s new WinRT/Metro APIs, promise to fix these problems. If Microsoft executes well, they’ll make Windows apps relevant again, and Microsoft will survive. If they fail, you’ll see a decade’s worth of corporate reinvention, perhaps the largest reinvention in history of the world.

All eyes on Windows 8.

Blogs are dying, and I’m not sure it can be prevented

Blogs are failing for a couple of reasons:

  • They no longer serve as a person’s online identity.
  • They are unsuitable for polyglots: blogs tend to attract a particular niche audience; anything that mixes topics is not a good fit for a blog.
  • People don’t comment on blogs.
  • There’s no easy way to follow blogs.

I’ll explain these below, and propose some solutions.

Blogs no longer serve as a person’s online identity

That is, they no longer represent “you” on the web. When blogs started taking off in the late 1990s, a blog was where you represented yourself on the web. Anything and everything about you was your blog. That’s how you got yourself, your identity, on the web.

Example:  I’ve been running for almost a decade now my religious blog, Kineti, but it was not called “Kineti” originally, it was just the JudahGabriel blog.  My first and middle name. It’s because it was to represent me; my identity online. But that’s changed; blogs aren’t about people, now, they’re about topics, so it forced me to take my blog into a narrower direction. More on that in a moment.

Today, Facebook is your identity on the web. Or if you’re a tin-foil-cap holdout, email is your identity on the web.

The great thing about the web is that everyone on the web is a producer. You produce things. You produce pictures of your family. You produce status updates, you produce information about yourself. You produce thoughts on theology, or technology, or photography, or whatever interests you. You are the producer. Perhaps the greatest accomplishment of the web is that it made everyone a producer.

And when you produce your stuff, where do you put it? On your blog? Nope. You go straight to the social networks. You’ll post pictures of your Thanksgiving holiday on Facebook. You might tweet your pictures. If you’re old fashioned, you might email them out. Almost no one uses their blogs for this stuff.

So blogs aren’t the place to go for Anything About You. This space used to be owned by blogs. Now it’s owned by FacebookTwitter, and Google+.

Blogs are unsuitable for polyglots

When I started my religious blog nearly a decade ago, my tagline was “Tech, life, family, and faith.” Initially, that’s exactly what I posted about: technology thoughts. Stuff about my life and my family. And occasionally, thoughts about faith in God.

This resulted in a scatter-brained smattering of posts; today, CSS gradient techniques, tomorrow, Biblical Torah theology!

Worse, there was no audience for this. Who wants to read a blog where half the posts are [thing I care about] and the other half is [things I don’t care about]?

Nobody, that’s who.

And that’s how my religious blog morphed: I realized that to get a consistent audience, I needed to blog about a particular topic. A blog is Place for Topic X, not Person X’s Placejudahgabriel.blogspot.com is about Messianic Judaism and Hebrew Roots Christianity; it is no longer Judah’s place for tech, life, family, and faith.

This problem has exacerbated since then. You see, a major part of my life is technology. It’s what I do for a living. I give talks on technology. I have insight into the future of technology. If I posted all those technology posts over on my religious blog, we’d be back to square one: a smattering of posts on unrelated topics, with no audience caring to read them. It’s for that reason I started this blog: Debugger.Break(), where I post all things on my technologically-inclined mind.

But this is all part of the problem: blogs no longer serve as [Your Place]. They serve as [Place for topic X]. Topic Y goes elsewhere: another blog, Facebook, Twitter, Google Plus, whatever, but not on Your Place. This has resulted in a decline in blog relevance.

People don’t comment on blogs

Today, bloggers will write a post, then immediately spam it on Facebook via a status update like this:

New blog: What’s this crap Stallman just posted? http://debuggerdotbreak.wordpress.com

But here’s the amusing phenomenon: instead of commenting on the blog, everyone comments on the Facebook status update! I’ve seen this now with several of my latest posts: my Facebook status about the blog gets more comments than the blog itself. Likewise, for other bloggers, I’ve seen this same phenomenon.

Yes, the Facebook status updates get more comments than the blog itself.

Why? I see at three reasons:

  • Ease of commenting: people are already signed into Facebook; it’s easy to comment there. But to comment on the blog, you might have to authenticate with WordPress or Blogger orDisqus, or some other less trusted authority, maybe enter a hard-to-read CAPTCHA, hit preview, then submit. Yikes.
  • Visibility: everyone checks Facebook a few times a day, maybe more. How often do they fire up their web browser, type in your web address, and hit enter? Rarely. Your Facebook status update is more visible than your actual blog post. Heck, even direct email is more visible than blog posts.
  • Casual conduciveness: Blogs aren’t conducive to casual answers. People are afraid to comment on blogs. “Oh no, I’m going to get sucked into a big debate thread!”, or, “Oh no, my ‘nice post, I enjoyed the bit about X’ comment will look foolish compared to all these multi-paragraph responses!”

These things result in blogs with few or no comments.

There’s no easy way to follow blogs

When you log onto your computer in the morning, what’s the first thing you do? Check your email. Maybe check Facebook. Maybe you’ve got some email notifications from Facebook or Twitter. Oh, who sent me funny har har emails? Oh, who wrote on my Facebook wall? Who retweeted my wisdom-filled, perfectly-numbered twoosh?

Where does that leave blogs? Well, some dedicated fellow will eventually load up his web browser, type in the address to your lonesome blog, and hit enter. If you’re extra lucky, he might just leave a comment.

On Facebook, you automatically see your friend’s stuff: his pictures, status updates, all of it.

On Twitter, the Tweeple you follow show up in the flow of updates automatically.

For email, you automatically get all the stuff your friends send to you.

For blogs, there’s no “automatically.” It’s all manual. There’s no easy way to follow blogs.

Truth be told, there is something: RSS. Subscribe to this blog’s RSS feed, and you’ll automatically be notified of new posts. But, unless you’re a techie, most people don’t know about RSS, let alone what to do with it. First, you need an RSS reader, like Google Reader. Go sign up for that. Ok. Now come back to my blog, search the page for the little RSS syndication icon, and copy the feed URL. Then go back to Google Reader and hit subscribe. Paste in my link. Hit OK.

Congratulations, with only 17 easy steps, you’ve subscribed to my blog!

(Gah.)

There’s no easy way for people to follow blogs. And for that, blogs suffer.

In the next post, I’ll talk about some things we can do to make blogs relevant again. I’ll also make some predictions about future directions for blog publishers like WordPress and Blogger; they are ultimately in control of blogging relevance; it’s important for publishers to evolve, lest they, along with us content-producing bloggers, face death-by-irrelevance.

The Bell Tolls for Flash, and Silverlight isn’t far behind

The Flash ReaperThis week saw another victory for HTML5, and another nail in the coffin for web browser plugins: Adobe announced it was ceasing development of Flash on all mobile devices.

Mobile was easy ground to retreat from: Flash is already outlawed on numerous mobile devices, including popular consumer devices like iPhone and iPad. The only reason Google tolerated it on its Android platform was as a competitive advantage over Apple’s devices. And now that Adobe is abandoning Flash on mobile, it will soon disappear even from Google’s devices.

What does this mean for Silverlight? Amusingly, Microsoft chose a different strategy with Silverlight on mobile: they had the benefit of sitting on the sidelines and observing Apple laying the smackdown on Flash, and all the negative karma that comes from Steve Jobs cursing your beloved tech in public.

Even though Silverlight was originally called “WPF Everywhere“, Microsoft didn’t want the Curse of the Steve to afflict Silverlight, so Microsoft wisely changed course: Silverlight would not, in fact, be available everywhere. Just on desktops, and Microsoft’s own mobile device.

Adobe simply conceded that they lost the battle of Flash on mobile. They lost the battle because they don’t own those platforms, and those who do own those platforms — Apple, Microsoft, Google — are at best ambivalent about, and at worst, enemies, of Flash. Ditto for Microsoft’s Silverlight: Microsoft knew they couldn’t win on mobile when mobile is largely controlled by competitors, so where Adobe tried and failed, Microsoft wisely didn’t even try.

With the mobile battlefield now surrendered to HTML5, one might knee-jerk a thought that Flash and Silverlight are safe on the desktop, at least.

But that battle, too, will be lost: web sites are being rewritten as Flash-less. Oh, and Microsoft’s next operating system won’t run plugins like Flash and Silverlight. Or rather, it will run web plugins, but it will first make you launch some other legacy system and then inside that legacy system, launch a differently-configured browser and then navigate to a site that uses Flash, and oh, screw it. No one will run web plugins anymore. And, per Apple’s usual modus operandi, there will be a Mac OSX release, codenamed Metroid, several months before Windows 8, and it will not support web plugins, either, and everyone will hail Apple for making a bold, innovative move.

In the Great Plugin War of the 21st century, the mobile space has been abandoned by the plugins. And soon, in the next 5 years, the desktop space, too, will be abandoned. By 2016, web browser plugins like Flash and Silverlight will be as antiquated — and generally disdained — as much as Java applets are today.

Silverlight and Flash developers: it’s time to reinvest your skills elsewhere

In the classic western film, The Outlaw Josey Wales, Confederate soldier Josey Wales is betrayed by his old commander, Captain Fletcher, and, being filled with rage at old Union soldiers for murdering his family, Josey seeks vengeance years beyond the conclusion of the Civil War. But as the plot winds down, a disguised Josey comes face-to-face with his old commander Fletcher, who speaks a piercing truth to Josey:

Fletcher: I reckon I’ll go lookin’ for Wales down in Mexico.

Wales, disguised: And then?

Fletcher: Well, he’s got the first move. I owe him that. But I think I’ll try to tell him the war’s over.

Web plugin developers, the war is over. It’s time to move on.

For reasons outside your control, your platform is disappearing, and will soon be gone. Get out before it really hurts.

If you are a Silverlight or Flash developer, now’s the time to reinvest your skills in another platform. HTML/JavaScript is the safest bet, although it’s a crowded space. Native platforms like iPhone and Windows 8 Metro apps are riskier, but the rewards of succeeding on those platforms is greater. If you’re a Silverlight developer, the natural evolution for you is Windows 8 Metro: you’ve got a subset of XAML and the .NET framework on Win 8 Metro, just like you did on Silverlight. You’ll be right at home.

We think of this as the Great Plugin War of the 21st century, but really, it was never about plugins. Vendors like Sun, Microsoft, and Adobe really just wanted people writing code for their platforms. They didn’t care if it was via web plugins, desktop apps, whatever, it didn’t matter, as long as it was their platform. That way, they can sell tools, support, and generally make money hand-over-fist being god of Platform X. When these vendors saw the ubiquity of the web, they thought, “Hrrm, how about we make our platform run on the web? Then our platform will be everywhere the web is!” And that, friends, is how web plugins were born.

This was was, and is, about getting people to write code on proprietary platforms. Now that the native HTML5-ified web is powerful enough, we don’t need web plugins. And so, the big tech companies will have to look for another way to make developers write code for their platforms. The new battleground will be mobile, I predict, with each tech company heavily investing in their own mobile devices, where they control the platform, where native apps make sense for now, and where they can make money hand-over-fist being god of their own platforms. Microsoft will dump truckloads of cash into Windows Phone. They’re eventually rename it, too, since “Windows” sounds so…antiquated. Google will be king for a long time. Apple will be the choice for hipsters. And writing an app that reaches all your users will, once again, require writing your app thrice, once for each platform. That is, until the web becomes powerful enough to make mobile apps irrelevant, just like it did for desktop apps.

Though plugins have been the way of the web for a good 15 years, it will be — nay, it is — no longer. Plugins are going the way of the dodo. The bell tolls for Flash, Silverlight, and JavaFx.

The web is the future. And tomorrow’s web is plugin-less. Position yourself wisely.