Free training from Microsoft

By James at May 21, 2009 03:24
Filed Under: Microsoft, Technology in General, Web Development

Microsoft has released two sites with tons of free training. Yup, I checked it out and it's free.

"Ramp Up",, covers topics from moving from ASP or PHP to ASP.NET, ASP.NET, Mobile Developent and Sharepoint. has tons of webcasts and training materials, geared towards solution providers, however the content is available for all.

Check it out.



Keeping the faith

By James at May 05, 2009 05:41
Filed Under: Life in General

Having faith when life is going well is easy. Keeping that faith when its not a bed of roses is hard. However it’s the difficult times which shape us, hone our character and make us who we are.

For me, this past month has been one of those difficult times. Laid off at the end of March, going through the ups and downs of finding a job, offers changed at the last minute, sitting across from IT managers who could be my son, answering esoteric programming questions, dealing with lost paperwork at the unemployment office, being tested in various situations, and, battling to keep the faith in both myself and the Universe.

I am happy to say, it has all paid off. I have come through this period stronger, smarter, humbled, blessed, and most importantly, employed.

Say hello to the new Senior .NET Developer for I will be handling new development and will be working with a team to build even better energy management systems which EnerPath is famous for. The company is cool, everyone is happy, laid back, and insanely intelligent. Some of my new co-workers are members of the IEDOTNETUG. And best of all…wait for it… the office is 15 minutes away from my house. It is close enough, I could ride my bike to work – well, ahem, after some conditioning time.

I start tomorrow.

Thanks to all my friends who got me through this.

Sloane, Erin and Kevin at Job Spring Partners, who worked with me to find what it was I wanted, taught an old guy how to interview, and did not treat me like just another commodity. If you need a job, or want to test the waters, call these guys. Seriously.

Geoff, David, Lynn, Matt, and Mike who made sure I wasn’t curled up in a ball eating ice cream, but was keeping busy and upbeat.

Volkan, Cigdem, and Rich who worked their butts off making sure I was ready for whatever interview question came my way, and being there on a moments notice when I needed a hand.

And most of all to Carmina, who not once showed an ounce of doubt in her eyes (even though I knew it was chewing her up inside). She is my consejero, my friend, my sounding board, my partner, my wife. Usted es la luz de mi vida. va a querer para siempre.

Time for a haircut.


It’s official! I’m an MVP. Time for a nap.

By James at April 01, 2009 04:27
Filed Under: Inland Empire .NET UG, Life in General, Microsoft, MVP

I was up way late again, this time checking email every 30 seconds for the “official” congratulations message. Click – Wait – Click – Wait – Repeat. “OK Johnson”, I say to myself. “Go to bed, it will come.”

7:00 am – nothing
7:30 am – nada
8:00 am – hmm, ok
8:30 am – nervous tension starts
8:45 am – uh oh, comments are coming in from last night’s blog
9:00 am – where is that darn thing?
9:01 am – this can’t be an April Fools Joke, can it?
9:02 am – maybe I shouldn’t have blogged last night and they took it away?
9:15 am – more nervous tension, beads of sweat on my face
9:30 am – this *REALLY* can’t be an April Fools Joke, can it?
9:31 am – HEY! there’s an email in the Junk folder?! WTF?
9:31:05 am – YAHOO! LIVE!



For quite some time, this is something I have been wanting and working for. Not for the recognition, more to learn what all the mystery of the MVP is about, to sneak a peak behind the blue door, to reach out and touch the secret squirrels.

Of all the emails that have come in the last 24 hours, there is one line that stands out:

…enjoy the award; take advantage of the opportunities it offers you…

Believe me… I fully intend to. I can’t wait to dive into the MVP site to check out what’s there.

Thanks again to everyone who watches my back and helped me get to where I am today.


Time for a nap.

Wow! What a roller coaster ride. I'm dizzy.

By James at March 31, 2009 15:31
Filed Under: Inland Empire .NET UG, Life in General, Microsoft, MVP

How many of you have watched the movie Parenthood? In one speech, Grandma makes a little statement about when Grandpa took her on a roller coaster…

“I always wanted to go again. You know, it was just so interesting to me that a ride could make me feel so frightened, so sick, so excited, so scared, so safe, and so thrilled, altogether! Some didn't like it. They wanted to go on the merry-go-round. That just goes around. Nothing. I like the roller coaster. You get more out of it.”

I usually prefer the roller coaster as well, but for the past month I have been quietly wishing for the merry-go-round.

I have many great friends who are always there to support me. And because of my work with the Inland Empire .NET User’s Group and other .NET community efforts, several of them took it upon themselves to nominate me for a Microsoft MVP award. Thinking, and being told, it was a slam dunk, I was disappointed when I received an email last month telling me there just wasn’t any room for me, and perhaps next go round.

With development and management issues at work, supervisors reneging on their decision to let me attend Mix, so much code churn I’m going to patent C# butter, and then to top it all off, yesterday… “at our board meeting three weeks ago, we decided to cut back the IT department and eliminate your position.”  (A software company without a developer – smart decision. I’m sure they’ll be around a long time.)

Last night was rough. I stayed up till three doing the online resume thing and filing for unemployment. Carmina and I discussed if I should go into the office today, and decided I should. More along the lines of “they can’t get rid of me that easily”  than anything else.

Sitting in traffic on the 91, my phone rings. It’s one of my Microsoft friends, Daniel Egan. He starts chatting, then coyly asks, “have you read your email today?”  Nope, buddy, I’m on the road. He then goes on to start babbling about getting to a computer, not wanting to spoil the surprise, then, all of a sudden he blurts out, “you got your MVP! I just got off the phone with Suzanna.”

Ok, I like to play April fools jokes on my kids and everything, but after yesterday now is not the time. Daniel assures me its true and when I get into the office and have a chance to check my email there is this little tidbit waiting for me.

MVP prémio

Bem James, apenas não sei o que a say…. Excepto parabéns! Sei, apenas quando pensei que não era que vai acontecer, você foram aprovados! Bem-vindo ao programa MVP, conhecimentos de dev de aplicativo de cliente. Você receberá um e-mail oficial (ou dois) mas queria deixar sabe um dia mais cedo porque esse é o tipo de renegade estou;~)

Por favor manter esta notícia para si mesmo até receber a notícia oficial amanhã. Parabéns novamente e bem-vindo!

Suzanna Moran
Sr. MVP Lead, Community and Online Support

So trying to be a good sport I don’t tell anyone the news. Well Carmina deserved to know, so I called her. I’m waiting and waiting. It’s like being 12 all over again on Christmas Eve.

While at my desk at home, doing some work I start noticing some Tweets come in from @Zannabanna; “congratulations this, w00t that”. Then right about 8 pm PDT, I see the following:

Zannabanana Welcome, welcome NEW MVP @jamesLatringo :~)

Hmm… a quick little DM to Suzanna: “hey. does this mean I can shout it out now?”

The response: “SHOUT IT OUT! I figure hey, it's after 8 PM on the west coast, besides, I can NEVER wait!”

Well, what can I say? It’s still not April 1, and I haven’t received the “official” email, but boy, do I have proof!


So, is anyone in the market for a well seasoned ASP.NET/SQL Developer who just got his MVP? I’m available and ready to roll.

Thanks everyone for helping me to get to this part in my career. I couldn’t have done it without you.


Windows 7, iTunes and GEARAspiWDM.sys. No black turtlenecks for me.

By James at March 23, 2009 16:24
Filed Under: Technology in General, Beta Software

So after my adventures yesterday with Win7 Beta 1 and no web access, I thought things were all cleared up. Tonight I realized my DVD Drive wasn’t being recognized. Going into Device Manager I saw that Windows had disabled the Drive because the driver being used was unsigned. Digging a bit deeper I find that one of the drivers being used is GEARAspiWDM.sys. This is a pretty common driver for DVD/CD RW drives, so I was intrigued why that was the issue.

Googling for GEARAspiWDM.sys I found the following article on ZDNet by Ed Bott, “An inside look at Apple's sneaky iTunes 8 upgrade”. The article talks about how Apple sneaks in a bunch of crap during their iTunes and QuickTime upgrades and doesn’t indicate what is being installed. I followed the articles suggestions about trying to roll back to a previous version, but, of course, there isn’t one on my system.

A quick trip to, Support, Drivers and I download Driver_Installer_x86_x64.exe Version 4.008.5, Date Feb 4, 2009. Running the installer is a snap, and I have my DVD Drive back.

Thanks Ed! Thanks Gear Software! Screw you Apple.



Windows 7 Beta – no web browsing for you

By James at March 22, 2009 12:18
Filed Under:

I always like to try the new software, and when I was at PDC last year I installed the Windows 7 PDC version natively on one of my laptops. No problems and when Beta 1 (Build 7000) came out, I decided to install it natively on my development machine. Never had a problem until yesterday – 3/21/2009.

I was working in Visual Studio 2008 and opened the Help file. I have it set to use Online help and was confused when it wasn’t displaying any pages. I started IE 8 beta to go to MSDN and that didn’t load. I then tried Firefox and got the same thing…no web pages. Ok, so maybe a reboot is in order – no affect. I checked Windows Update and the last update was on 3/19 with a Windows Defender definition file. I turned off Windows Firewall and disabled my ESET Nod32 Anti Virus and that didn’t help either. All the other machines on my network were fine.

I lost track of all the things I tried, but here is a list of things that were occurring

in “regular” mode, I could not access http, https or mail, but could ftp and ping

in “regular” mode the Network and Sharing Center showed full connectivity

in safe mode, I had full internet access – web, mail, ftp, ping

running a VPC of Win XP had full internet access

My great friend Rich Manley is an IT god and he couldn't figure out the issue. I then twittered another friend of mine, Stephen Rose, who is on the Windows 7 marketing team. He called me right back and asked a few questions, then said he would get me in touch with some of the devs. However, I have a project I'm working on and really had to get this fixed right away. Not wanting to do an entire re-paving of my machine, I decided to do an "upgrade" to Win 7 Beta 1. After 3 hours, and several reboots, I finished up with full internet connectivity again.

As soon as I was up and running again, Windows Update wanted to install 6 updates. I nervously let it do so, thinking at least I had a baseline to go back to if it crapped out again. Thankfully, that all worked out well.

The perils of beta software...


Joining Returned SQL Data Services Responses

By James at February 05, 2009 05:08
Filed Under: SQL Data Services, SQL Services, Web Development

In preparing for my talk on SDS at last month’s Code Camp, I needed to figure out a way to join to SQL Data Services responses. I came up with this method using LINQ. I don’t know if its the best way to do it, but it works for me. I’d appreciate any feedback.


1. Master Page – Page_Load calls GetPodcasts()

2. GetPodcasts() gets two SDS responses, podCastDoc and guestDoc, does some LINQ, then returns a System.Linq.Enumerable

3. A ListView on the Master Page is bound to the podcast object.


Method GetPodcasts()

   1: public void GetPodcasts()
   2: {
   3:     AT_Podcasts at_Podcasts = new AT_Podcasts();
   4:     AT_Guests at_Guests = new AT_Guests();
   5:     XElement podCastDoc = at_Podcasts.SelectPodcasts();
   6:     XElement guestDoc = at_Guests.SelectGuests();
   8:     if (podCastDoc != null && guestDoc != null)
   9:     {
  10:         var podcasts = from podcast in podCastDoc.Descendants("at-podcastdata")
  11:                        join guest in guestDoc.Descendants("at-guest")
  12:                        on (string)podcast.Element("GuestID").Value
  13:                        equals (string)guest.Element("GuestName").Value
  14:                        orderby (DateTime)podcast.Element("PublishDate")
  15:                        select new
  16:                       {
  17:                           PodCastId = podcast.Element("PodCastDataId").Value,
  18:                           PodCastTitle = podcast.Element("PodCastTitle").Value,
  19:                           PodCastPublishDate = DateTime.Parse(podcast.Element("PublishDate").Value).ToLongDateString(),
  20:                           PodCastAbstract = podcast.Element("Abstract").Value,
  21:                           RunTime = podcast.Element("RunTime").Value,
  22:                           GuestID = podcast.Element("GuestID").Value,
  23:                           GuestName = guest.Element("FullGuestName").Value,
  24:                           GuestCompany = guest.Element("GuestCompany").Value
  25:                       };
  26:         lvPodCasts.DataSource = podcasts;
  27:         lvPodCasts.DataBind();
  28:     }
  29: }


Method at_Podcasts.SelectPodcasts()

   1: public XElement SelectPodcasts()
   2:     {
   3:         XElement atPodCasts;
   4:         AT_SDSConfig config = AT_SDSConfig.Create();
   5:         Uri container = config.GetPodCastDataContainer();
   6:         string uri = container.ToString() + "?q=";
   7:         var request = AT_SDSUtils.CreateRequest(config, new Uri(uri), "GET", string.Empty);
   8:         try
   9:         {
  10:             var response = (HttpWebResponse)request.GetResponse();
  11:             using (var stream = response.GetResponseStream())
  12:             using (var reader = new System.IO.StreamReader(stream))
  13:             {
  14:                 XmlTextReader r = new XmlTextReader(reader);
  15:                 atPodCasts = XElement.Load(r);
  16:                 return atPodCasts;
  17:             }
  18:         }
  19:         catch (WebException ex)
  20:         {
  21:             AT_SDSUtils.OutputException(ex);
  22:             return null;
  23:         }
  24:     }

NOTE: at_Guests.SelectGuests() is similar, just going into the Guest Container


Results of SelectPodcasts()

   1: <s:EntitySet xmlns:s="" xmlns:xsi="" xmlns:x="">  
   2:   <at-podcastdata>
   3:     <s:Id>getting-restful</s:Id>
   4:     <s:Version>539244</s:Version>
   5:     <PodCastDataId xsi:type="x:string">getting-restful</PodCastDataId>
   6:     <PodCastTitle xsi:type="x:string">Getting RESTful</PodCastTitle>
   7:     <RunTime xsi:type="x:string">48:25</RunTime>
   8:     <Description xsi:type="x:string">Volkan talks about how to work with REST and process the XML with LINQ</Description>
   9:     <AdminNotes xsi:type="x:string">Great episode</AdminNotes>
  10:     <Abstract xsi:type="x:string">REST, XML and LINQ</Abstract>
  11:     <IsPublished xsi:type="x:boolean">true</IsPublished>
  12:     <GuestID xsi:type="x:string">volkan-uzun</GuestID>
  13:     <CreateDate xsi:type="x:string">1/23/2009 12:00:00 AM</CreateDate>
  14:     <PublishDate xsi:type="x:string">2/20/2009 12:00:00 AM</PublishDate>
  15:   </at-podcastdata>
  16:   <at-podcastdata>
  17:     <s:Id>sql-data-services</s:Id>
  18:     <s:Version>539554</s:Version>
  19:     <PodCastDataId xsi:type="x:string">sql-data-services</PodCastDataId>
  20:     <PodCastTitle xsi:type="x:string">SQL Data Services</PodCastTitle>
  21:     <RunTime xsi:type="x:string">12:35</RunTime>
  22:     <Description xsi:type="x:string">Jennifer goes into detail about how to use SQL Data Services to run a web site.</Description>
  23:     <AdminNotes xsi:type="x:string">This is the first podcast</AdminNotes>
  24:     <Abstract xsi:type="x:string">Using SQL Data Services to run a website</Abstract>
  25:     <IsPublished xsi:type="x:boolean">true</IsPublished>
  26:     <GuestID xsi:type="x:string">jennifer-louie</GuestID>
  27:     <CreateDate xsi:type="x:string">1/24/2009 12:00:00 AM</CreateDate>
  28:     <PublishDate xsi:type="x:string">1/24/2009 12:00:00 AM</PublishDate>
  29:   </at-podcastdata>
  30:   <at-podcastdata>
  31:     <s:Id>working-with-office-2007</s:Id>
  32:     <s:Version>539227</s:Version>
  33:     <PodCastDataId xsi:type="x:string">working-with-office-2007</PodCastDataId>
  34:     <PodCastTitle xsi:type="x:string">Working with Office 2007</PodCastTitle>
  35:     <RunTime xsi:type="x:string">30:45</RunTime>
  36:     <Description xsi:type="x:string">In this episode, Joe talks about a cool macro he wrote that makes all the busy work his boss has him do, a lot more fun.</Description>
  37:     <AdminNotes xsi:type="x:string">Kinda flakey, but ok to publish</AdminNotes>
  38:     <Abstract xsi:type="x:string">Office 2007 Macros</Abstract>
  39:     <IsPublished xsi:type="x:boolean">true</IsPublished>
  40:     <GuestID xsi:type="x:string">joe-blow</GuestID>
  41:     <CreateDate xsi:type="x:string">1/23/2009 12:00:00 AM</CreateDate>
  42:     <PublishDate xsi:type="x:string">2/11/2009 12:00:00 AM</PublishDate>
  43:   </at-podcastdata>
  44: </s:EntitySet>

Results of SelectGuests()

   1: <s:EntitySet xmlns:s="" xmlns:xsi="" xmlns:x="">
   2:   <at-guest>
   3:     <s:Id>jennifer-louie</s:Id>
   4:     <s:Version>50343029</s:Version>
   5:     <GuestName xsi:type="x:string">jennifer-louie</GuestName>
   6:     <FullGuestName xsi:type="x:string">Jennifer Louie</FullGuestName>
   7:     <GuestEmail xsi:type="x:string"></GuestEmail>
   8:     <GuestCompany xsi:type="x:string">Louie Software</GuestCompany>
   9:     <GuestBio xsi:type="x:string">Jennifer is a .NET Rock Star. She's really cute and hot!</GuestBio>
  10:     <PublishEmail xsi:type="x:boolean">true</PublishEmail>
  11:   </at-guest>
  12:   <at-guest>
  13:     <s:Id>james-johnson</s:Id>
  14:     <s:Version>50404939</s:Version>
  15:     <GuestName xsi:type="x:string">james-johnson</GuestName>
  16:     <FullGuestName xsi:type="x:string">James Johnson</FullGuestName>
  17:     <GuestEmail xsi:type="x:string"></GuestEmail>
  18:     <GuestCompany xsi:type="x:string">Duringlunch</GuestCompany>
  19:     <GuestBio xsi:type="x:string">James is a .NET Developer who has been writing software since punch cards. He often remembers the time when his Computer Science PhD project got scattered to the wind, when he stumbled across a brand new orange screen monitor and his breath was taken away.</GuestBio>
  20:     <PublishEmail xsi:type="x:boolean">true</PublishEmail>
  21:   </at-guest>
  22:   <at-guest>
  23:     <s:Id>volkan-uzun</s:Id>
  24:     <s:Version>49928700</s:Version>
  25:     <GuestName xsi:type="x:string">volkan-uzun</GuestName>
  26:     <FullGuestName xsi:type="x:string">Volkan Uzun</FullGuestName>
  27:     <GuestEmail xsi:type="x:string"></GuestEmail>
  28:     <GuestCompany xsi:type="x:string">Uzun Enterprises</GuestCompany>
  29:     <GuestBio xsi:type="x:string">Inland Empire .NET User's Group Most Valuable Member - 2007/2008. LINQ Expert. Nice Guy.</GuestBio>
  30:     <PublishEmail xsi:type="x:boolean">true</PublishEmail>
  31:   </at-guest>
  32: </s:EntitySet>


Back to the LINQ which does the join

   1: var podcasts = from podcast in podCastDoc.Descendants("at-podcastdata")
   2:    join guest in guestDoc.Descendants("at-guest")
   3:    on (string)podcast.Element("GuestID").Value
   4:    equals (string)guest.Element("GuestName").Value
   5:    orderby (DateTime)podcast.Element("PublishDate")
   6:    select new
   7:   {
   8:       PodCastId = podcast.Element("PodCastDataId").Value,
   9:       PodCastTitle = podcast.Element("PodCastTitle").Value,
  10:       PodCastPublishDate = DateTime.Parse(podcast.Element("PublishDate").Value).ToLongDateString(),
  11:       PodCastAbstract = podcast.Element("Abstract").Value,
  12:       RunTime = podcast.Element("RunTime").Value,
  13:       GuestID = podcast.Element("GuestID").Value,
  14:       GuestName = guest.Element("FullGuestName").Value,
  15:       GuestCompany = guest.Element("GuestCompany").Value
  16:   };
  17: lvPodCasts.DataSource = podcasts;
  18: lvPodCasts.DataBind();




Again, like I said. I’d appreciate your comments.


Code Camp 2009 Presentation - Anonymous Types

By James at January 24, 2009 09:15
Filed Under: SQL Data Services

Today I presented "SQL Data Services - A real life SDS Application. Even though my laptop siezed just before the presentation, it went pretty well. Here is the code and slide deck for your enjoyment. (397.30 kb)


A new side project – Geeks Without Borders

By James at January 15, 2009 09:39
Filed Under:

I like to help people. I also believe in the power and promise of technology. I’ve been thinking on this for quite some time and the people I have mentioned it to, have all given me great feedback. So, I give you “Geeks Without Borders”

Come help me change the world.


My geekSpeak

By James at January 15, 2009 05:11
Filed Under:

Yesterday I did my first (and hopefully not last) geekSpeak with my friend Lynn Langit. I talked about SQL Data Services and had a great time. Today I received and email with my evaluation scores. Wow, I guess I did pretty good.


Number of registered participants: 69

Number of live attendees: 35

Registered to Attended Conversion: 50.7%

** Actual attendance numbers may vary due to various factors.  While we do make every effort to provide the accurate number of attendees and total number of evaluations submitted, the numbers can vary slightly depending on the method of registration.


Customer satisfaction scores are based on a scale from 0 to 9 points.

Following are the average scores for this webcast.

Usefulness of Information Presented: 7.9

Speaker's Presentation Skills: 8.1

Effectiveness of Demonstrations: 8.0

Overall Presentation Rating: 8.0

Average presentation score for this webcast: 8.0

Number of evaluations submitted: 9

Attendee to Evaluation Conversion: 25.7%

If you missed it and would like to hear it, or if you want to save it for your “I knew James when” archives, here’s the link,

Next on the agenda… So Cal Code Camp. Come see the rest of the presentation as I continue to build out


About the author

James James is a five time and current Microsoft MVP in Client App Development, a Telerik Insider, a past Director on the INETA North America Board, a husband and dad, and has been developing software since the early days of Laser Discs and HyperCard stacks. As the Founder and President of the Inland Empire .NET User's Group, he has fondly watched it grow from a twice-a-month, early Saturday morning group of five in 2003, to a robust and rambunctious gathering of all types and sizes of .NET developers.

James loves to dig deep into the latest cutting edge technologies - sometimes with spectacular disasters - and spread the word about the latest and greatest bits, getting people excited about developing web sites and applications on the .NET platform, and using the best tools for the job. He tries to blog as often as he can, but usually gets distracted by EF, LINQ, MVC, ASP, SQL, XML, and most other types of acronyms. To keep calm James plays a mean Djembe and tries to practice his violin. You can follow him on twitter at @latringo.

And as usual, the comments, suggestions, writings and rants are my own, and really shouldn't reflect the opinions of my employer. That is, unless it really does.

James Twitter Feed

Recent Comments

Comment RSS

Month List