Scott Hanselman

Ultimate Developer PC 2.0 - Part 1 - Building a WEI 7.9 and RFC for building a GOM (God's Own Machine)

June 23, '10 Comments [66] Posted in Hardware | Musings
Sponsored By

Got enough acronyms in that title?

  • WEI - Windows Experience Index. How fast is your machine? If you say "I've got a WEI 6.0" you've got a good machine, for example.
  • RFC - Request for Comments. This is crowdsourcing. I want to know what YOU think we need to do to make a machine that is so fast that it'll max out at WEI 7.9 and be a GOM.
  • GOM - God's Own Machine. If the Good Lord had a computer, it'd be a 7.9. We want to build that machine.

Pete and I are finally ready to build it. Specifically, I got permission from my wife to build a WEI 7.9 machine - a GOM (God's Own Machine.) You can go to your start menu now and type in WEI and see what your Windows Experience Index is. This used to be capped at 5.9 (and arbitrary number) in Vista and now the max is 7.9 in Windows 7.

We'll post the result on http://weishare.net, and it looks like there's a 7.8 up there now.

You can see from my laptop, for example, that I have a crappy video card (actually I think I'm using the lesser of my two video cards), but everything else is awesome. Of course, your machine is only as capable as its slowest part, so your WEI is the lowest subscore. My disk is an SSD, so it's great.

My W500 is a 4.6.

It's been believed that a 7.9 is either not possible, or is really really expensive. Either way, it's not easy. We've got US$3000 and we're going to see if it can be done. We've enlisted some engineers directly from the Windows Experience Index team and Pete and I are going to interview them in the first week of July for my podcast.

Parts List

Here's what we're thinking of starting with, with an initial parts list courtesy of Chris Kirk and friends. At this point I'm cheating a little as I have a case already and I'm pretending DVD drives are free.

We need your comments, Dear Reader. Can the elusive 7.9 be built for less than $3000?

Related Links from our Previous Ultimate Developer Rig Build in 2007

    Your thoughts?

    Ukrainian translation of this post

    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

    Do they deserve the gift of your keystrokes?

    June 22, '10 Comments [18] Posted in Blogging | Musings | Productivity
    Sponsored By

    There are a finite number of keystrokes left in your hands before you die. - Me

    One of the most influential (to me personally) posts Jon Udell has written was his classic "count your keystrokes." I've mentioned this post in a number of my talks, including my talk on "Tips to make your blog suck less" at Blogging While Brown this last weekend. This point, in particular always seems to resonate with people, so here's my own take, before you read the original.

    Let break it down. I'm 36 and change. I'll live to be 80, let's say, and I can type 100 words a minute (but 50 of that is errors and the backspace key) so let's say 50WPM. If I type for 6 hours a day, 5 days a week, 50 weeks a year, for the next 44 years, that means there are 198M keystrokes left in my hands. Max. Period. And that's generous; it's likely 10% of that.

    5.1CPW * 50WPM * 60m/hr * 6hr/s a day * 5 days/wk * 50 wks/year * 44yrs = 1,009,800,000 keystrokes left in your hands.

    Let's assume the average length of an English word is 5, plus a space, so six. That's a ceiling of 168M more words I can type in my lifetime. Nothing I can do, short of dictation, or some new brain invention is going to create more keystrokes. I am I/O bound by my hands. The keystrokes they contain are finite. And this assuming my hands don't give out.

    Drink that in. OK. So now, next time someone emails you ask yourself "is emailing this person back the best use of my remaining keystrokes?" That includes both 1:1 and 1:many emails. You could even add a little hubris to it and say: "Does this person deserve the gift of my keystrokes?"

    Instead, consider writing a blog post or adding to a wiki with your keystrokes, then emailing the link to the original emailer. (Like this email, er, blog post, for this example.) Send them to http://www.letmegooglethatforyou.com or http://www.letmebingthatforyou.com and teach them to fish.

    UPDATE: This is about reach and effectiveness vs. efficiency. If you email someone one on one, you're reaching that one person. If you blog about it (or update a wiki, or whatever) you get the message out on the web itself and your keystrokes travel farther and reach more people. Assuming you want your message to reach as many people as possible, blog it. You only have so many hours in the day.

    The best way to get more email is to reply to it. The best way to get less email is to stop answering it.

    Conserve what remaining keystrokes you have left, Dear Reader. Or, use them in the comments area here and give me the special gift that is your keystrokes.. ;)

    Related Links

    P.S. This blog post is 435 words or 2362 keystrokes. Hope it was helpful. I've only got 1,009,797,638 left!

    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

    Hanselminutes Podcast 218 - Baratunde Thurston on Punditry, Politics, Race, iPads, The Onion and the Web

    June 22, '10 Comments [1] Posted in Musings | Podcast
    Sponsored By

    baratunde My two-hundred-and-eighteenth podcast is up. Scott's in DC this week speaking at Blogging While Brown and he sits down with multimedia personality Baratunde Thurston. He's a Web Editor for TheOnion.com, a founder at JackAndJillPolitics.com, a host on the Science Channel and the author of the upcoming book "How To Be Black." He tells Scott how.

    Subscribe: Subscribe to Hanselminutes Subscribe to my Podcast in iTunes

    Download: MP3 Full Show

    Links from the Show

    Do also remember the complete archives are always up and they have PDF Transcripts, a little known feature that show up a few weeks after each show.

    I want to add a big thanks to Telerik. Without their support, there wouldn't be a Hanselminutes. I hope they, and you, know that. Someone's gotta pay the bandwidth. Thanks also to Carl Franklin for all his support over these last 4 years!

    Telerik is our sponsor for this show.

    Building quality software is never easy. It requires skills and imagination. We cannot promise to improve your skills, but when it comes to User Interface and developer tools, we can provide the building blocks to take your application a step closer to your imagination. Explore the leading UI suites for ASP.NET AJAX,MVC,Silverlight,Windows Formsand WPF. Enjoy developer tools like .NET reporting, ORM,Automated Testing Tools, TFS, and Content Management Solution. And now you can increase your productivity with JustCode, Telerik’s new productivity tool for code analysis and refactoring. Visit www.telerik.com.

    As I've said before this show comes to you with the audio expertise and stewardship of Carl Franklin. The name comes fromTravis Illig, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)

    Enjoy. Who knows what'll happen in the next show?

    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

    Found Video: Social Networking for Developers and Making Your Blog Suck Less

    June 21, '10 Comments [21] Posted in Blogging | Speaking
    Sponsored By

    I was putting together a list of resources for a friend on how to start in programming, and the importance of Social Networking and having an online presence for Developers. I did a talk a while back and there was really bad guerilla video taken. However, in my searching I discovered video of me (scandalous!) at a Microsoft website called Thrive. I had completely forgotten that this talk was recorded. Of course, as it's older, it may be dated in some ways.

    The video player on that site is too small, so I've embedded it here and made it big. Also, I've viewed-source and here's links to downloadable video files of both. This video was taken at Devscovery last year, as I recall and the audience was hardcore developers.

    Part 1: How to be a better developer through social media

    Download "How to be a better developer through social media" media directly here (right click | save as)

    Part 2: How to make your blog suck less

    Download "How to make your blog suck less" media directly here (right click | save as)

    There's newer slides at http://hnsl.mn/bwbslides and I'm considering updating the whole deck and writing an e-book, so watch for that.

    Hope these are useful!

    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 52 - You keep using that LINQ, I dunna think it means what you think it means.

    June 18, '10 Comments [25] Posted in ASP.NET | Data | Learning .NET | LINQ | Source Code
    Sponsored By

    Remember good developers don't just write source code, they also READ it. You don't just become a great poet by writing lots of poems. Read and absorb as well. Do check out the Source Code category of my blog here, there is (as of today) 15 pages of posts on Source Code you can check out.

    Recently my friend Jonathan Carter (OData Dude, my name for him) was working with a partner on some really weird stuff that was happening with a LINQ to SQL query. Remember that every abstraction sometimes leaks and that the whole port of an abstraction is "raise the level" so you don't have to worry about something.

    Plumbing is great because it abstracts away water delivery. For all I know, there's a dude with a bucket who runs to my house when I turn on the tap. Doesn't matter to me, as long as I get water. However, sometimes something goes wrong with that dude, and I don't understand what's up with my water. This happened to JC and this partner.

    In this example, we're using the AdventureWorks Sample Database to make this point. Here's some sample code the partner sent us to reproduce the weirdness.

    protected virtual Customer GetByPrimaryKey(Func<customer, bool> keySelection)
    {
    AdventureWorksDataContext context = new AdventureWorksDataContext();

    return (from r in context.Customers select r).SingleOrDefault(keySelection);
    }

    [TestMethod]
    public void CustomerQuery_Test_01()
    {
    Customer customer = GetByPrimaryKey(c => c.CustomerID == 2);
    }

    [TestMethod]
    public void CustomerQuery_Test_02()
    {
    AdventureWorksDataContext context = new AdventureWorksDataContext();
    Customer customer = (from r in context.Customers select r).SingleOrDefault(c => c.CustomerID == 2);
    }

    CustomerQuery_Test_01 calls the GetByPrimaryKey method. That method takes a Func as a parameter. He's actually passing in a lamdba expression into the GetByPrimaryKey function. That makes the method reusable and is the beginning of some nice helper functions for his DAL (Data Access Layer). He's split up the query into two places. Seems reasonable, right?

    Well, if you run this in Visual Studio - and in this example, I'll use the Intellitrace feature to see the actual SQL that was executed, although you can also use SQL Profiler - we see:

    Wrong SQL in the Watch Window

    Here's the query in text:

    SELECT [t0].[CustomerID], [t0].[NameStyle], [t0].[Title], 
    [t0].[FirstName], [t0].[MiddleName], [t0].[LastName],
    [t0].[Suffix], [t0].[CompanyName], [t0].[SalesPerson],
    [t0].[EmailAddress], [t0].[Phone], [t0].[PasswordHash],
    [t0].[PasswordSalt], [t0].[rowguid], [t0].[ModifiedDate]
    FROM [SalesLT].[Customer] AS [t0]

    Um, where's the WHERE clause? Will LINQ to SQL kill my pets and cause me to lose my job? Does Microsoft suck? Let's take a look at the second query, called in CustomerQuery_Test_02():

    SELECT [t0].[CustomerID], [t0].[NameStyle], [t0].[Title], 
    [t0].[FirstName], [t0].[MiddleName], [t0].[LastName],
    [t0].[Suffix], [t0].[CompanyName], [t0].[SalesPerson],
    [t0].[EmailAddress], [t0].[Phone], [t0].[PasswordHash],
    [t0].[PasswordSalt], [t0].[rowguid], [t0].[ModifiedDate]
    FROM [SalesLT].[Customer] AS [t0]
    WHERE [t0].[CustomerID] = @p0

    OK, there it is, but why does the second LINQ query cause a WHERE clause to be emitted but the first doesn't? They look like basically the same code path, just one is broken up.

    The first query is clearly returning ALL rows to the caller, which then has to apply the LINQ operators to do the WHERE in memory, on the caller. The second query is using the SQL Server (as it should) to do the filter, then returns WAY less data.

    Here's the deal. Remember that LINQ cares about two things, IEnumerable stuff and IQueryable. The first lets you foreach over a collection, and the other includes all sorts of fun stuff that lets you query that stuff. Folks build on top of those with LINQ to SQL, LINQ to XML, LINQ to YoMomma, etc.

    When you are working with something that is IQueryable; that is, the source is IQueryable, you need to make sure you are actually usually the operators for an IQueruable, otherwise you might fall back onto an undesirable result, as in this database case with IEnumerable. You don't want to return more data from the database to a caller than is absolutely necessary.

    From JC, with emphasis mine:

    The IQueryable version of SingleOrDefault, that takes a lambda, actually takes an Expression>, whereas the IEnumerable version, takes a Func. Hence, in the below code, the call to SingleOrDefault, is treating the query as if it was LINQ To Objects, which executes the query via L2S, then performs the SingleOrDefault on the in memory collection. If they changed the signature of GetByPrimaryKey to take an Expression>, it would work as expected.

    What's a Func and what's an Expression? A Func<> (pronounced "Funk") represents a generic delegate. Like:

    Func<int,int,double> divide=(x,y)=>(double)x/(double)y;
    Console.WriteLine(divide(2,3));

    And an Expression<> is a function definition that can be compiled and invoked at runtime. Example"

    Expression<Func<int,int,double>> divideBody=(x,y)=>(double)x/(double)y;
    Func<int,int,double> divide2=divideBody.Compile();
    write(divide2(2,3));

    So, the partner doesn't want a Func (a Func that takes a customer and returns a bool, they want a compliable Expression with a Func that takes a Customer and returns a bool. I'll have to add "using System.Linq.Expressions;" as well.

    protected virtual Customer GetByPrimaryKey(Expression<Func<customer,bool>> keySelection)
    {
    AdventureWorksDataContext context = new AdventureWorksDataContext();

    return (from r in context.Customers select r).SingleOrDefault(keySelection);

    }

    [TestMethod]
    public void CustomerQuery_Test_01()
    {
    Customer customer = GetByPrimaryKey(c => c.CustomerID == 2);
    }

    [TestMethod]
    public void CustomerQuery_Test_02()
    {
    AdventureWorksDataContext context = new AdventureWorksDataContext();
    Customer customer = (from r in context.Customers select r).SingleOrDefault(c => c.CustomerID == 2);
    }

    Just changed that one line, so that GetByPrimaryKey takes a Expression> and I get the SQL I expected:

    Corrected SQL in the Watch Window

    Someone famous once said, "My code has no bugs, it runs exactly as I wrote it."

    Layers of Abstraction are tricky, and you should always assert your assumptions and always look at the SQL that gets generated/created/executed by your DAL before you put something into production. Trust no one, except the profiler.

    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.