Thursday, October 29, 2009

I’m now a MCP

A couple of weeks ago I went away to a “boot camp” to prep for a set of Microsoft certification exams.  After a few years of plugging away at .NET programming, I got budget approval to take a class to prep for the MCTS ASP.NET 3.5 certification.  I’ve always wanted to do it and every now and then we get a RFP that has a line item about having MCP’s on staff.

There are two exams, the first one is 70-536 (Microsoft .NET Framework – Application Development Foundation).  The second one is 70-562 (Microsoft .NET Framework 3.5, ASP.NET Application Development).  When you pass both, you get the MCTS certification.  From there, you can take additional exams for more certifications.

I’ve been doing .NET programming for a few years, but it’s been pretty much self-taught all the way.  One of the goals of getting the MCTS certification was to learn where my strengths and weaknesses are.  About 2 years ago, we bought a self paced training kit for the MCPD exam.  After spending some time with the books and practice exams, I knew I needed some serious prep time and with out any interruptions.

I’m easily distracted by bright shiny objects.  I have the attention span of a mal-adjusted 4 year old.  This exam prep time would not be done at home or in the office.  I needed to get away from here.  After a brief search on the Internets, I found a company that offered “boot camp” courses.  Training Camp offered a 7 day boot camp course for getting the MCTS ASP.NET certification.

They provided a seven day schedule of instructor led review, labs, and self tests. Their package included hotel accommodations, training material, two exam vouchers, plus breakfast and lunch.  The training material included the Microsoft Press self-paced training guides.  The 70-536 guide weighed in at 750+ pages, while 70-562 was a bit bigger at 1000 or so pages. The price was reasonable, compared to sessions offered by other vendors.

I made arrangements to take their course at their PA location.  I planned on renting a car and driving down from Albany.  Accommodations would have been at the fabulous Fernwood Hotel in Bushkill, PA.  The training would have been at the Training Camp facility, not far from the hotel.

After paying for the course, they sent back a list of videos to watch to prepare for the class.  They were not from the TrainingCamp company, but freely available from  You can find them here.  That felt a little bit cheesy, but on the other hand they didn’t need to reinvent the wheel.

A week before the course was supported to begin, they canceled it.  They didn’t have enough people confirmed for the course.  They did have one in Orlando, starting the following week.  So it was off to Orlando.  Suprisingly, this ended up being a good thing.

The training was in the hotel that I would be staying in, the Marriott Courtyard out at the Orlando airport.  Since this was a remote location for Training Camp, they were using laptop computers.  It’s much easier to ship laptops around than desktop computers.  We were issued the laptops on the first day and we got to hold on to them 24/7.  This meant, we could use the laptops to study the labs and self-tests in our hotel rooms after dinner.  If I had gone to the PA session, I would have use the PC’s in their labs.

The instructor was top notch.  If you ever go for training through Training Camp, ask for the sessions taught buy Bill Chapman.  Just google “Bill Chapman MCT”, he knows the stuff and knows how to teach it to you.  He was a big reason why I passed the exams.  The man has more certifications than I knew even existed.  I think Microsoft makes up imaginary certifications just to trick Bill.  It wont work, he’s that good.

We started at 8am every morning.  After lunch, we would go to around 5pm.  Then we were cut loose to find our supper.  After dinner, We were expected to study the exams and take the practice exams, with lights out at 10pm.  It was very draining. By 10pm on the first few nights, my brain was toast and I went to bed.  No TV, no touristy type of things.  Just studying.

We spent 3 days on the material that would be in the 536 exam.  The fourth day was exam day.  We had 18 people in the class, on the fourth day the first 10 of us trooped in to take the exam.  The exams are scored from 0 to 1000, with 700 being the passing score.  Based on the practice exams, I was running at at 85%-95% correct.  I felt good walking into the exam.

And then I got hammered with the actual exam.  The license agreement that I accepted when I took the exam precludes me from discussing any of the questions, but I can say that the material on the test did not match what we had been prepping for.  There was considerable overlap, but there was a lot of stuff that I had not seen before.  I passed the exam, but it was not pretty.

Apparently, as we found out afterwards, Microsoft had updated the exam the week before.  They do that, not often, but enough to keep the exam current.  They focus the questions more on the newer technologies and start dropping the questions on the older material.  We just had the misfortune of getting a new exam before the study material had caught up.  Only two of us passed that exam.  After the exam, we were handed the second exam study guide with the instructions to start reading it.  That took care of Thursday.  Friday morning, we would tackle ASP.NET.

Most of the people who had failed the exam opted to spend their remaining time studying for that exam and then retake it on the final day, instead of taking the second exam.  We had two exam vouchers, you can retake a failed exam.  According to the instructor,the 536 exam is one of the harder Microsoft exams.  If I had failed it, I think I would opted to retake it and study for 562 on my own time.

We had Friday and Saturday to review the materials for the second exam.  I woke up on Friday with a bad cold.  Headache, runny nose, sore throat, body aches, it was not a good way to start the day.  We ripped through the prep book at high speed.  We had the afternoons and evenings to do the labs and take the practice exams.  I don’t do too much work with ASP.NET, I really needed the study time.  I was so wiped out from the cold, I went to bed right after dinner on those two nights.  On Saturday, I took the practice exam a few times and scored in the 35% to 40% range, well below what I needed to pass.

We had all Sunday morning to prep for the exam.  We had to start the exam by noon at the latest, but you could take it anytime after 8am..  I woke up Sunday morning feeling physically horrible, but mentally fit.  I had the choice of taking the exam now or go home with the test voucher and take it at a later date.  I decided to take the exam now and if I failed it, to find out where my weak points were and retake the exam later.

I went in to take the exam right after breakfast.  I went in with a bag of cough drops, no sense bothering the other people taking their exams with my hacking.  The exam proctor smelled the cough drops and asked for one.  On the way into the hotel, a bug had flown into her mouth and she wanted something drastic to get that taste out of her mouth.  Personally, I would have gone for something a little less toxic tasting, but it worked.

One of the lessons that Bill had drilled into us was if if you think you will fail the exam, you will.  I went in with the attitude that I will pass this exam.  And I did.  It wasn’t my best score on a test, but it was a passing score and that’s what counted.  I had now earned the MCTS certification.  I went back and thanked Bill and then went to airport to get an earlier flight home.

The boot camp wasn’t cheap, but I know I wouldn’t have passed the exams without attending it.  The instructor was excellent and being away from home without any distractions allowed me to study without interruption.  Being able to study in my room was a nice bonus, if I ever do one of these things again, I would try to it in the same way.



When HTML encoding can bite you

I’ve been using TweetDeck to follow Twitter.  It’s a great app, but it has some quirks.  Like it’s ginormous memory usage.   Another is how it renders the text of a tweet. I’ve seen a few tweets go by where the text had HTML escape sequences instead of the text. 

This tweet is an example:

It should display as:

City shelves happy hour: Many of you will be glad we aren’t this city — they’ve shelved their..

In Tweetdeck, it displays as:

City shelves happy hour: Many of you will be glad we aren’t this city — they’ve shelved their..

A screenshot of that tweet:


If you view the link on Twitter, you’ll see the text the “right” way.  I couldn’t figure out what was wrong.  I posted a message in the TweetDeck support site and they couldn’t replicate the problem.  Then I looked at bottom line of the tweet.  It has been posted to Twitter from TwitterFeed.  I had never heard of TwitterFeed, so I signed up for an account.

TwitterFeed is a free service that can scan your blog’s RSS feed and look for new blog postings.  It can then post the first 100 or so characters from the post to your Twitter and/or Facebook accounts.  And that’s where the problem occurs. 

HTML and XML use escape sequences to define special characters.  What you see rendered in the browser is not literally the same text in the source for that page.  Literal characters like “<” and “>” have special meaning in XML and HTML.  To display those characters on the page, they needed to be encoded as &lt; and &gt; respectively.  It’s all magic that goes on behind the scenes, you usually are never aware of it.

When TwitterFeed gets the latest post from your blog, it’s pulling it from the RSS feed and the text is encoded with the right escape sequences.  They then call the Twitter and/or Facebook API to post that text.  They are sending HTML/XML encoded text to functions that are expecting plain text.  When Twitter displays that new blog posting as a tweet, it’s including the encoded text.  Your browser sees that encoding and decodes it back again.  Facebook on the other hand displays the text encoded.

TweetDeck isn’t a browser, it’s a desktop or mobile application.  It renders the tweets as plain text and assumes that the API call that it suing to get tweets from Twitter is sending back plain text.  So the question is where is it broken.  I’ve only seen this problem with entrties posted by TwitterFeed, I would be the first place I would look.  I think they will need to a HTML decode on the text that they are scraping from the RSS feed and send it as plain text to Twitter and Facebook API’s.

btw:  Kristi Gustafson is worth following, even if her text is getting mangled by TwitterFeed.

Wednesday, October 07, 2009

Fess up when you made a mistake

I was working on a installer project for a new tool that we will be releasing this fall when I hit the most odd error.  Right after the installer started up, it would bomb out with an error message that the some files that it need were missing.  And it only happened when I called a command line app that I wrote from within the installer.  If I commented out the code that executed that app, the installer ran as expected.

Ok, so your first thought would be what is that command line app doing?  It wasn’t my first thought.  It was tested code and it worked just fine in some other installer projects.  That was a rookie mistake and I should have known better.  The app does a few things.  It was designed to cache the settings of an installed app and restore so that if you do an upgrade in place, the settings are migrated from the old version to the new version.  Plus it has code to clean up extra files left around from previous installers.

After beating my head against the wall for day on it, I contacted the technical support for the installer.  They asked for a sample project and I sent one in.  While I was waiting for a response back tech support, I continued to play around with the installer.  This tool (InstallAware) has been rock solid for me since I started using it, it had to be something that I was doing wrong.

I looked at source code for my command line app and sure enough, under the right conditions, it would delete the files that the installer was using to install the actual app.  That wasn’t good.

Actually it was good, the mistake was in my code which meant I could fix it.  Which I did and my installer did what it was supposed to do.  I would rather fix my own bugs than be dependent on another vendor fixing their bugs.  I had switched from Wise For Windows to InstallAware because it forever to get fixes from Wise.  They released a new build about once a year.  if they didn’t fix the bug and you didn’t have a work around, then that bug became a feature.

Meanwhile, I still had an open support case with InstallAware.  I immediately logged into their support site and I closed out the support request.  I added a brief note explaining that this was self-inflicted and explained why my code was turning in on itself.  A short while later I received a brief note from one of their support engineers thanking me for the explanation.

I think the courtesy message to tech support is the right thing to do.  First of all it’s just common courtesy, it’s wrong to waste their time tracking down your bug after you have resolved it on your own.  Plus it’s going to help me if I need support from this company again.  If they had spent time tracking down a problem that was caused by my own carelessness, they would be less likely to help out with a legitimate support request.

Thursday, October 01, 2009

I don’t care who signs a petition, Roman Polanski is a convicted sexual predator who needs to do his time.

I’ve never subscribed to the “Hollywood Elite” theory about radical liberals being in charge of Tinseltown, but I do think more attention is paid to people who lean to the left.  And too much attention is being paid to the people who signed the petition demanding the release of convicted child molester Roman Polanski.  Would they do the same thing if his name was Roman Ray Polan and was a Dade County dish washer?  I don’t think so.

Polanski was arrested by Swiss police when he tried to enter Switzerland because of an outstanding 1978 arrest warrant.  He was to attend the Zurich Film Festival, where he would have been honored with a Lifetime Achievement Award for his film work.  Representing the Zurich Film Festival, Debra Winger made the following comment:

“We hope today this latest (arrest) order will be dropped. It is based on a three-decades-old case that is dead but for minor technicalities. We stand by him and await his release and his next masterpiece.”

I have no idea what if anything, was going through their minds when they signed the petition.  Roman Polanski plea bargained the charges of having given alcohol and drugs to a 13-year old, and then allegedly sexually assaulted her down to being guilty for having sex with a minor.  He then fled the country to avoid sentencing.  Those are the facts, no one has been unjustly accused here.

I have never heard of sexual assault being described as a minor technicality.  He took a 13 year old child, gave her drugs and alcohol and then sexually assaulted her.  It wasn’t statutory rape, the victim had testified that she pleaded with Polanski just to take her home.

I don’t buy the argument that it’s been 30 years and that it’s time to let it go.  Polanski was a fugitive from justice for the last 3 decades, he actively avoided going to locations where he could be expedited from.  He could have done his time and resumed his career decades ago.  He probably would received a one year sentence, would have been paroled long before the year was up.

That worst part of all of this is that the victim has to relive what happened to her all over again.  While Polanski was living openly in a country that refused to extradite him, she had to rebuild her live, knowing that he had got away without paying consequences.  The only good part for her was that he had already plead guilty, she doesn’t have to testify again.

I hope that the authorities in Switzerland ignore these people and honor the US extradition request.  The Swiss do not need to take a position one way or another about Polanski’s fate.  They just need to honor a legal expedition request.

Personally, I’m sad to see some of those names on that petition.  I don’t want to see their movies anymore.

Here’s the list as of the time of this posting:

Abderrahmane Sissako, Alain Corneau, Alain Jessua, Alain Terzian, Albert Gauvin, Alejandro Gonzalez Inarritu, Alexander Astruc, Alexander Payne, Alexandre Arcady, Alexandre Desplat, Alexandre Tylski, Alfonso Cuaron, André Buytaers, André Larquié, Antoine Aronin, Arielle Dombasle, Asia Argento, Barbet Schroeder, Bernard-Henri Lévy, Bertrand Tavernier, Betrand Van Effenterre, Buck Henry, Camille Meyer, Candice Belaisch-Goldchmit, Carine Sarna, Charlotte Silvera, Christian Carion, Christian Gion, Christophe Barratier, Claude Lanzmann, Claude Lelouch, Claude Miller, Corinne Figuet, Costa Gavras, Cécile Telerman, Danis Tanovic, Danièle Thompson, Darren Aronofsky, David Heyman, David Lynch, Davide Homitsu Riboli, Diane Kurys, Diane von Furstenberg, Djamel Bennecib, Dominique Crevecoeur, Elie Chouraqui, Elsa Zylberstein, Emir Kusturica, Etienne Faure, Ettore Scola, Eugenia Varela Navarro, Fanny Ardant, Fatih Akin, François Margolin, Gabriel Auer, Gaelle Lancien, Georges Dybman, Gianluca Farinelli (Cinémathèque de de Bologne), Gilles Behat, Gilles Jacob, Giuseppe Bertolucci , Giuseppe Tornatore, Guillaume Stirn, Gérard Lenne, Harmony Korinne, Henning Carlsen, Isabelle Adjani, Isabelle Huppert, Jacques Bral, Jacques Fansten, Jacques Richard, Jan Kounen, Jean-Charles Tacchella, Jean-Jacques Annaud, Jean-Jacques Beineix, Jean-Loup Hubert, Jean-Marc Ghanassia, Jean-Paul Dayan, Jean-Paul Rappeneau, Jean-Paul Salomé, Jean-PierreMarois, Jean-michel Carre, Jeanne Moreau, Jerry Schatzberg, Jessika Cohen, Johanna Gozlan, John Landis, Jonathan Demme, Joël Farges, Julian Schnabel, Just Jaeckin, Jérôme Cornuau, Katarina De Meulder, Kent Jones (World Cinema Foundation), Ladislas Kijno, Laurence Roulet, Laurent Heynemann, Liria Begeja , Louis Garrel, Luc Barnier , Luc et Jean-Pierre Dardenne, Marc Guidoni, Marc Sandberg, Marco Bellochio, Margaret Walker, Marie Nieves Perez Neël, Mario Martone, Mario Monicelli, Martin Scorsese, Mathieu Celary, Michael Mann, Michel Ferry, Michel Ocelot, Michele Placido, Miguel Courtois, Mike Nichols, Milan Kundera, Monica Bellucci, Morgane Beauverger, Nadine Trintignant, Nathalie Faucheux, Neil Jordan, Nelly Kaplan, Nicolas Mauvernay, Nil Symchowicz, Olivier Assayas, Olivier Soares Barbosa, Paolo Sorrentino, Pascal Bruckner, Pascal Thomas, Patrice Chéreau, Patrice Leconte, Patrick Bouchitey, Patrick Braoudé, Patrick Mimouni, Paul Auster, Paul Boujenah, Pedro Almodovar, Philippe Corbé, Philippe Radault, Pierre Forciniti, Pierre Jolivet, Radovan Tadic, Radu Mihaileanu, Raphael Rebibo, René Gainville, Richard Pena (Directeur Festival de NY), Robert Hossein, Roger Kahane, Rosalinde et Michel Deville, Salman Rushdie, Sam Gabarski, Sam Mendes, Sandra Nicolier, Scott Foundas, Serge Toubiana, Souleymane Cissé, Stephane Allagnon, Stephen Frears, Steven Soderbergh, Taylor Hackford, Terry Gilliam, Thierry Frémaux, Thierry Kamami, Tilda Swinton, Tom Tykwer, Tonie Marshall, Tony Gatlif, Vinciane Lecocq, Walter Salles, Wes Anderson, William Shawcross, Wim Wenders., Wong Kar Waï, Woody Allen, Xavier Beauvois , Yamina Benguigui, Yann Moix, Yasmina Reza, Ysabelle Saura Del Pan