Scott Hanselman

Embrace Authorship - The importance of rel=me and rel=author on your content's SEO and Google

October 28, '11 Comments [29] Posted in Blogging | Musings
Sponsored By

There's a lot of garbage out of there on the internet. I know, I've been writing some on this blog for almost 10 years. ;) One way to let Google and Friends know that you are a real person and are really the writer of something is to use microformats like authorship markup like rel="author" to markup your content.

When you write a blog post, make sure that the rel="author" attribute is on the page with a link back to your "About Me" page or to your Google+ profile. The easiest way is to just include a link like this:

by <a title="Scott Hanselman is on Google+" rel="author" href="http://profiles.google.com/hanselman.scott?rel=author" alt="Google+" title="Google+">Scott Hanselman</a>

But it's not proof enough that you wrote something just to link to a profile. You have to close the loop by linking back to your site from your profile, indicating that the page is about your. This will end up looking like this with a rel="me" attribute:

<a href="https://www.hanselman.com/blog/" rel="me" title="Scott Hanselman">Scott Hanselman</a>

While this isn't a perfect way to guarantee to Google that you actually authored and own some content, it's a good start. Presumably if Google trusts your Profile and your website there is an implied chain of trust. If some spammer decides to programmatically steal your entire site, or even just suck it down with RSS and reblog it, it's now possible for Google to downrank those splogs (spam blogs) or delist them, while simultaneously assigning a higher Page Rank - or Author Rank - to your site.

Alternatively you can have an "author page" or About Me page on your site within the same domain and use rel="author" to point to it. You then use rel="me" to markup links that all point to sites that represent the same person. If you are using rel="author" to point to an About Me page, that page should the include a link with rel="me" that points to your Google Profile.

If this seems confusing, you can use the Rich Snippets Testing Tool to test our your pages and how they might show up if Google decides to trust you.

My site as seen by the Google Rich Snippets Testing Tool

The most important part with the Rich Snippets Testing Tool is the Extracted Author info. Does Google successfully extract that you are an author and show those links without  errors or warnings?

My rel="author" markup is error-free

At this point, you know only that Google doesn't think you suck but you have no idea if they will actually use the data. This appears to be where magic pixie dust comes in. You essentially wait a week or two and if it works, when you start Googling for your articles they will start showing up like this in search results:

Googling for Scott Hanselman

Or a specific article, for example:

Googling for Windows 8 Scott Hanselman

Note that Google shows that I'm in some Google+ circles and that there's 31 comments on a G+ post on this blog post.

Aside: This starts to seem a little unbalanced to me, as Google could have looked at my RSS feed or RSS Comments Feed and determined how many actual comments there are on that post on my site. Or, I could include microformat metadata on comments to indicate that they are comments vs. original content. I want the discussion to happen on my blog, not on Google+. Or maybe I want the conversation to happen on Disqus, or on Facebook. It's too bad that Google doesn't support a microformat like rel="comments" (I made that up) so that I might take control of the URL where comments should be left. Maybe I want Twitter or Facebook profiles to be used with rel="author." With the addition of Google+ and the "convenience" of using Google+ for rel="author" and the automatic retrieval of comment metadata, again from Google+, the open markup-based Google The Search Engine plus Google+ The Social Networks becomes a walled garden without choice, like Facebook.

Commentary on openness put aside, the usefulness of rel="author" in the context of Google users and from the perspective of the content author is obvious.

  • Search results that list pages written by actual humans alongside their smiling faces will be more likely to be clicked on.
  • Folks can +1 results directly from the results AND add you, the author, to their Google+ circles.

Of course, I'm not sure what I think about searching Google for the word "phony" and finding my face show up as the result. ;)

What a phony

The task for you, Dear Reader, is to go forth and implement rel="author" for your blogs and content.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

I know apps

October 26, '11 Comments [49] Posted in Musings
Sponsored By

Lots of technologies listed on a resumeA very good friend of mine - not a programmer but a very technical IT professional - sent me their resume to review today and I noticed how the top part of the resume contained a lot of applications, technologies, keywords and acronyms.

At what point do we as a subculture need to stop doing this?

It's so ironic that the most technical amongst us without jobs are asked to create a resume to be consumed by the least technical so that they might facilitate an introduction to the very technical people with jobs to give. Some larger companies *cough*Nike*cough* are rumored to use high speed scanners and OCR to hunt for keywords and assign a weight value to a resume. This just results in us padding our resumes with every TLA (three letter acronym) we've ever encountered.

And why are we still listing Word and Excel? Has anyone missed out on an opportunity or lost a job when they forgot to add Microsoft Office? At what point in an industry or a level of experience does it become compulsory to know these tools?

Aside: Ever get a resume in Microsoft Word format then press the little Paragraph Mark toolbar button that shows tabs and spaces as characters? Not to sound too judgey or anything, but if you really want to know if someone knows Word or not, explore some of the insane feats that the uninitiated can do with a few thousand ill-conceived tabs or spaces.

I am less interested in whether you know Word or Excel and more interested if you know, for example, about iCal files. Could you subscribe to an iCal feed in a calendaring app? (Any calendaring app, to be clear) Could you write a program that creates a feed like this? Do you understand structured data, the many ways to store it and the many ways to move it from place to place?

I am less interested in the fact you have "Mozilla" on your list of Apps you're an "expert" at, and more interested in your understanding of HTTP and what certain headers do, how caching works and how mime-types enable browsers to launch apps. Do you know why bookmarklets are interesting? Why Greasemonkey is useful?

Are you a user? Are you a Real User? Do you actually use the hell out of your applications, your phones, your web sites, the Web itself?

I am less interested in your experience with Basecamp and more interested in how you implemented Agile at your last job. Did you use Scrum or Scrummerfall? What worked and what didn't and more importantly, do you know why?

I blogged years ago how funny it was that folks work for five-plus years to get the privilege of putting ",PhD" at the end of their names, but computer people take a 45 minute test and tack on ",A+,MCSD,MCP,MCSE+I" without a thought.

Why don't we include projects rather than companies on our resumes? How about a little post-mortem with some details about what worked and what didn't and why? Do you have 20 years experience or do you have the same 1 year of experience twenty times?

Do you know how to make text dance? There's a big difference between the XMLs, CSVs, vCards and open text formats of the world and the PSDs and proprietary binary formats of the world. Other than Adobe products that do years to master, I am going to assume you know how to use an application. I'm assuming you've seen a mouse, get the concept behind hotkeys and you can type, although perhaps that's too much to assume.

If you're truly able to make Excel dance or you spent a summer writing a TCP driver, by all means, tell us. If you wrote your own SQL lexer, you're a special person. But instead of a list of applications you know, tell a story about your successes and failures and the applications and technologies that played starring roles in your experiences.

I like what StackOverflow Careers is doing in this space in that a listing emphasizes not just what you've done, but also what you've written and what you've read. The list of technologies only happens in the context of projects you've worked on. Here's an invite if you want to try it. This is not an ad link or an affiliate code. They have advertised on my podcast once before, but I mention them here because their resumes present a more well-rounded picture of an engineer. My profile is at http://careers.stackoverflow.com/shanselman.

Personally, I think on my next resume I'll just put this:

Scott Hanselman
Programmer.
I know apps.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Reading more than ever: An analysis of four lazy years with an Amazon Kindle and no dead trees

October 24, '11 Comments [71] Posted in Musings
Sponsored By

Bezos on the cover of NewsweekIt's nice to finally see ebooks going mainstream. By mainstream, I mean that my Mom bought a Kindle Fire with minimal angst and gnashing of teeth. I've been reading ebooks since my first Apple Newton and I coveted the Sony Reader nearly 5 years ago. Finally bought a Kindle for my birthday in 2008, so come January I'll have had a Kindle as a part of my life for four years.

Even more, I haven't purchased a physical book in that time. In fact, I actually spend more time in my local libraries now than I did before the kindle. My library is the place where I get dead tree books. Ironically, my local library just announced their ebook lending program.

Interesting Historical Aside: I did architectural consulting with netLibrary around 1999. They were a totally-ahead-of-their-time e-book company. They scanned thousands of ebooks in anticipation of the coming ebook revolution. It's tragic they were at least a half decade if not a full decade ahead of their time. They are gone now.

According to the Amazon Kindle Social Network (yes, they have their own social network! You and I can connect and you can stalk my books as well) I've purchased 141 books since I got my Kindle and read 90 of them. It doesn't see books that you copied to your Kindle from free websites, so that's maybe another dozen or so. I'm in the middle of reading 5 books right now. 

The Kindle keeps my current page sync'd between any other devices I may choose to read on. A few pages on the iPhone, a few on the PC, then back to the Kindle.

I read before, but never so much as when I got a Kindle? Why the change? Laziness. It's effortless to get books. The Kindle is literally a one-click link between my wallet and Jeff Bezo's bank account. I see a book and click, I'm reading it. You might think that gets expensive, but for every $8.99 book I get (which is not a lot) there's a lot of really good books I grab under $5 and some for free or 99 cents.

Remember all the blog posts about how Kindle would never work because it was $359? Well, three years later and the cheap Kindle is $79. That's less than two copies of The Walking Dead Compendium.

It's the reading, stupid.

A recent study showed that it doesn't matter if you read from paper or from an electronic screen. The words make it into your head all the the same. Here's a passage from the Mashable article, emphasis mine.

The study was conducted after readers in Germany became skeptical about reading from electronic devices like ereaders and tablet PCs compared to traditional printed books.

Participants in the study read a variety of texts with different levels of understanding on an Amazon Kindle 3, Apple iPad and in print. Their reading behaviors and brain activity were examined using an EEG machine and eye tracking tools.

The study proved that reading from an electronic device instead of print has no negative effects, contradicting the misconception from German readers.

Everywhere I go I take my Kindle with me. And everywhere I go I end up meeting someone who says what all non-Kindle owners say "I just like the tactile experience...the feel of the paper." At this point I ask them if they've ever read a book on a Kindle or used an ereader. Most never have. They're just down on the idea of change. I get that, and I too, mourn the end of the physical book. But at the same time I, for one, welcome our new e-ink overlords.

I issue them the same challenge I'll issue you, Dear Reader. Read one book on a Kindle or small e-ink device. Just one, cover to virtual cover. I'm confident that most folks will never go back. I realize there are advantages to reading from paper just as there are advantages to using photographic film over digital cameras, but they are few and they don't outweigh the overwhelming advantages of a small e-reader.

Some folks swear by iPad or other illuminated LCD reading, but I believe those screens cause eye fatigue. They have a lower resolution than eink, they are hard to read  - if not impossible - in the sun or outside, they have limited battery life and they just don't look like paper. Each of these reasons is reason enough to go with e-ink. I went overseas for a week and didn't even take my Kindle charger. No need to. It lasts weeks on a full charge; that's almost long enough to pretend it's not an electronic device. Even the 3G wireless worked seamlessly all over Europe without me doing anything special.

I feel awful about it, but I can't count how many times I've been at a small airport bookseller, browsed, looked at a book, then purchased it on my Kindle while standing right there. If only there were a way to give that book seller some money for the referral.

My 4 years with a Kindle have got me reading more than ever because the Kindle has:

  • made it easy to get books
  • made it easy to carry my whole collection
  • made it easy to read even large books with thousands of pages (I'm looking at you, Neal Stephenson)
  • made it easy to finish a book in a series and immediately start the next book.

These are the reasons I've read more in the last 4 years with my Kindle than in previous years. It's removed what little friction physical books had imposed while seamlessly fitting into my life.

Nicolas Negroponte said last year that physical books would be dead within 5 years and Kindle ebooks surpassed the sales of physical books at Amazon last July. In fact, it's starting to be a multiplier, where for every 100 physical books sold there's perhaps 200 ebooks sold.

Everyone believes that the DTB (dead tree book) is on its last legs. How long do you think it'll take, Dear Reader? 5 years? 10? Will it be Amazon's centralization and DRM (digital rights management) that will hold it back or do you think that Amazon will eventually do what iTunes did, turning off DRM in favor of MP3s and low prices?

How long until physical books die, then are brought back from the dead by future-hipsters just like vinyl records? (Bet you didn't know vinyl sales were up 40%, did you?)

I don't know, but I know physical books will die. Why will physical books die? One reason and one reason only.

Because it's cheaper to move electrons than molecules.

Ultimately that's why ebooks will win.

Related Links

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

There is only one Cloud Icon in the Entire Universe

October 16, '11 Comments [45] Posted in Apple | Musings
Sponsored By

I recently worked on the update to the ASP.NET site, now in beta at http://beta.asp.net. On that site we used an icon from the Pictos collection. I have an email from March of 2010 where we selected that icon, in fact.

Recently we updated the old site's cloud icon from this, to this:

Old ASP.NET Cloud IconNew ASP.NET Cloud Icon

I saw a few tweets and got some emails that said "nice iCloud icon." Well, it does look familiar! ;)

iCloud Icon

Of course, MobileMe before this:

Mobile Me Icon

I knew I'd see this icon somewhere before. Folks have even written articles talking about how beautiful this icon is and how the Golden Ratio is infused in its design. There are even tutorials written on how to create the icon from scratch in PhotoShop.

iCloud Icon Golden Ratio

Apple's logo artists have infused the iCloud logo with some mathematical elegance. In this case, the golden ratio or φ...Simple, but profound. Awesome Apple's design philosophy.

Funny thing about the Golden Ratio, if you look for it, you'll find it everywhere. Read about it in the book "The Golden Ratio: The Story of PHI" or watch this video on the Golden Ratio.  It's intuitive. Cool, also that they attribute this icon and it's "brilliance" to the Apple Designers, except the icon isn't from Apple, it's straight from Pictos 1. I know, because we bought it from them for our site. Plus Pictos 1 has been around for years. It includes a regular cloud, clouds with arrows up and down and a lightening bolt cloud.

Pictos - The Original iCloud Icon

Of course, there's only so many ways to draw a cloud, right? But somehow this one just nails it and is itself iconic, if you'll excuse the pun.

Where else might you have seen this cloud icon? Seems everyone with an internet-connected or music app uses it:

Another app using the same cloud iconYet another app using the same cloud icon

Just a few...

Daum Cloud UtilitiesCloud 2 Go

Dreams ControllerCloud of Inspirations

Cloud WalletCosa Icon

Zendit iconWiFi Fast Connect

iStorage IconSound Cloud Icon

Even though the first appearance of this cloud icon was in the commercial Pictos 1 set, you'll find suspiciously similar clouds in other cloud icons packs like the one at Yay.se that's Creative Commons. Notice that you can change the look of the cloud icon slight if you the circles smaller or larger or add a border, push and pull, or squish and stretch.

More clouds!

But again, it's essentially four circles. My 3 year old draws similar clouds. At what point does a unique design stop being unique and just absorb into the consciousness?

Today, it seems there is only one cloud icon in the universe and it's four circles with a flat base. I like it.

UPDATE: Hat tip to Ian Griffiths who points out that the BBC Weather Service beat all of us to the iCloud icon, kind of...over 30 years ago. ;)

iCloud - BBC Style, 30 years ago

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

The Weekly Source Code 59 - An Open Source Treasure: Irony .NET Language Implementation Kit

October 14, '11 Comments [19] Posted in Learning .NET | Open Source | Source Code
Sponsored By

Select Grammars Dialog in Irony filled with grammarsOne of the best, if not the best way to sharpen the saw and keep your software development skills up to date is by reading code. Sure, write lots of code, but don't forget to explore other people's brains code. There's always fifteen different ways to create a "textboxes over data" application, and while it's interesting to take a look at whatever the newest way to make business software, sometimes it's nice to relax by looking at some implementations of classic software issues like parsers, lexers, and abstract syntax trees. If you didn't go to school or failed to take a compilers class at least knowing that this area of software engineering exists and is accessible to you is very important.

It's so nice to discover open source projects that I didn't know existed. One such project I just stumbled upon while doing research for a customer is "Irony," a .NET language implementation kit. From the CodePlex site:

Irony is a development kit for implementing languages on .NET platform. Unlike most existing yacc/lex-style solutions Irony does not employ any scanner or parser code generation from grammar specifications written in a specialized meta-language. In Irony the target language grammar is coded directly in c# using operator overloading to express grammar constructs. Irony's scanner and parser modules use the grammar encoded as c# class to control the parsing process. See the expression grammar sample for an example of grammar definition in c# class, and using it in a working parser.

Irony includes "simplified grammars for C#, Scheme, SQL, GwBasic, JSON and others" to learn from. There are different kinds of parsers that are grammar generators you might be familiar with. For example, ANTLR is a what's called a LL(*) grammar generator, while Irony is a LALR (Look Ahead Left to Right) grammar generator.

Here's a very basic SQL statement for getting a show from my Podcast database:

SELECT ID, Title FROM Shows WHERE ID = 1

Here's the Irony Parse Tree as viewed in the irony Grammar Explorer:

A complete parse tree of the SQL statement with every node expanded

Typically, in my experience, when creating a parser one will use a DSL (Domain Specific Language) like the GOLD Meta Language building on the BNF (Backus-Naur Form) expression grammar. These domain specific languages are tightly optimized to express exactly how a language is structured and how it should be parsed. You learn a language to create languages.

Remember in the Irony intro text earlier? Let me repeat:

Unlike most existing yacc/lex-style solutions Irony does not employ any scanner or parser code generation from grammar specifications written in a specialized meta-language. In Irony the target language grammar is coded directly in c# using operator overloading to express grammar constructs.

What Roman from Irony has done here is use C# language constructs as if it's a DSL. A fluent parser, as it were. So he's using C# classes and methods to express the language grammar. It's a very interesting and powerful idea if you are interested in creating DSLs but not interested in learning other parsers like GOLD. Plus, it's just fun.

The Irony Grammar Explorer

He has a very rich bass class called Grammar that you derive from, like:

[Language("SQL", "89", "SQL 89 grammar")]
public class SqlGrammar : Grammar {
public SqlGrammar() : base(false) { //SQL is case insensitive
...

But instead of a grammar language like this (simplified by me) to express a SQL SELECT Statement:

! =============================================================================
! Select Statement
! =============================================================================
<SELECT Stm> ::= SELECT <COLUMNS> <INTO Clause> <FROM Clause> <WHERE Clause>
<GROUP Clause> <HAVING Clause> <ORDER Clause><COLUMNS> ::= <RESTRICTION> '*' |
<RESTRICTION> <COLUMN List>...snip for clarity...<RESTRICTION> ::= ALL |
DISTINCT |<AGGREGATE> ::= Count '(' '*' ')' | Count '(' <EXPRESSION> ')' |
Avg '(' <EXPRESSION> ')' | Min '(' <EXPRESSION> ')' | Max '(' <EXPRESSION> ')' |
StDev '(' <EXPRESSION> ')' | StDevP '(' <EXPRESSION> ')' | Sum '(' <EXPRESSION> ')' |
Var '(' <EXPRESSION> ')' | VarP '(' <EXPRESSION> ')'<INTO Clause> ::= INTO Id |
<FROM Clause> ::= FROM <ID List> <JOIN Chain><JOIN Chain> ::= <JOIN> <JOIN Chain> |
...snip for clarity...

You'd have something like this instead, again, simplified so this doesn't turn into a giant listing of code rather than a blog post.

//Select stmt
selectStmt.Rule = SELECT + selRestrOpt + selList + intoClauseOpt + fromClauseOpt + whereClauseOpt + groupClauseOpt + havingClauseOpt + orderClauseOpt;
selRestrOpt.Rule = Empty | "ALL" | "DISTINCT";
selList.Rule = columnItemList | "*";
columnItemList.Rule = MakePlusRule(columnItemList, comma, columnItem);
columnItem.Rule = columnSource + aliasOpt;aliasOpt.Rule = Empty | asOpt + Id;
asOpt.Rule = Empty | AS;columnSource.Rule = aggregate | Id;
aggregate.Rule = aggregateName + "(" + aggregateArg + ")";
aggregateArg.Rule = expression | "*";
aggregateName.Rule = COUNT | "Avg" | "Min" | "Max" | "StDev" | "StDevP" | "Sum" | "Var" | "VarP";
intoClauseOpt.Rule = Empty | INTO + Id;fromClauseOpt.Rule = Empty | FROM + idlist + joinChainOpt;
joinChainOpt.Rule = Empty | joinKindOpt + JOIN + idlist + ON + Id + "=" + Id;
joinKindOpt.Rule = Empty | "INNER" | "LEFT" | "RIGHT";
whereClauseOpt.Rule = Empty | "WHERE" + expression;
groupClauseOpt.Rule = Empty | "GROUP" + BY + idlist;
havingClauseOpt.Rule = Empty | "HAVING" + expression;
orderClauseOpt.Rule = Empty | "ORDER" + BY + orderList;

Here the variables and terms that are being use to build the grammar were defined earlier like this, as an example:

var SELECT = ToTerm("SELECT"); var FROM = ToTerm("FROM");var AS = ToTerm("AS"); 

You might immediately declare, Dear Reader, that this is blasphemy!  How can C# compete with a specialized DSL like the BNF? This is a C# shaped peg being shoved into a round hold. Well, maybe, but it's interesting to point out that the SQL GOLD Grammar is 259 lines and the C# version of essentially the same thing is 247 lines. Now, I'm not pointing out line numbers to imply that this is a better way or that this is even a valid 1:1 comparison. But, it's interesting that the C# class is even close. You might have assumed it would be much much larger. I think it's close because Roman, the Irony developer, has a very well factored and specialized base class for the derived class to "lean on." Each of his sample grammars are surprisingly tight.

For example:

  • "Mini" Python - ~140 lines
  • Java - ~130 lines
  • Scheme - ~200 lines
  • JSON - 39 lines

To conclude, here's the JSON grammar generator. 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Irony.Parsing;

namespace Irony.Samples.Json
{
[Language("JSON", "1.0", "JSON data format")]
public class JsonGrammar : Grammar
{
public JsonGrammar()
{
//Terminals
var jstring = new StringLiteral("string", "\"");
var jnumber = new NumberLiteral("number"); var comma = ToTerm(",");

//Nonterminals
var jobject = new NonTerminal("Object");
var jobjectBr = new NonTerminal("ObjectBr");
var jarray = new NonTerminal("Array");
var jarrayBr = new NonTerminal("ArrayBr");
var jvalue = new NonTerminal("Value");
var jprop = new NonTerminal("Property");
//Rules
jvalue.Rule = jstring | jnumber | jobjectBr | jarrayBr | "true" | "false" | "null";
jobjectBr.Rule = "{" + jobject + "}";
jobject.Rule = MakeStarRule(jobject, comma, jprop);
jprop.Rule = jstring + ":" + jvalue;
jarrayBr.Rule = "[" + jarray + "]";
jarray.Rule = MakeStarRule(jarray, comma, jvalue);
//Set grammar root
this.Root = jvalue; MarkPunctuation("{", "}", "[", "]", ":", ",");
this.MarkTransient(jvalue, jarrayBr, jobjectBr);
}
}
}

Pretty clever stuff, and a well put together project and solution that is well structured. I could myself using this in a C# or Compiler class to teach some of these concepts. It's also a great little tool for creating small languages of your own. Perhaps you have a Wiki-dialect that's specific to your company and you want to get rid of all that nasty manual parsing? Or many you have an old custom workflow engine or custom expression system embedded in your application and never got around to changing all your parsing to a proper grammar? Maybe now is the time to get that little language you've been thinking about off the ground!

I encourage you, Dear Reader, to support open source projects like this. Why not go leave a comment today on your favorite open source project's site and just let them know you appreciate what they're doing?

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.