Archive for the ‘Personal’ Category

SVCC done, on to Fresno

October 4, 2009

The talk at the Silicon Valley Code Camp went great yesterday. Only a few people showed up, but they were people who really wanted more information about ClickOnce. I had spent a lot of time creating samples for deploying data, and completing an article for Microsoft about certificates expiring along with the code samples for that in both C# and VB, and they chose certificates (we only had an hour).

We talked about bugs features in various areas of ClickOnce, and then talked about “The Certificate Problem”. They found the trick of clicking the OK button on the uninstall very clever, but I must profess it was not my idea nor my code. I did place a reference to the original author in the code, because I always believe in giving credit where credit is due.

I’m going to give the whole talk at the East Bay .NET User Group meeting on October 14th, so if you want to know more, and you live in the San Francisco Bay Area, come check it out!

I ran into Gustavo Cavalcanti who runs the Central .NET Users Group in Fresno at SVCC, and I had to admit I had not written all of the content for my talk out there yet (it’s in 4 days). He wasn’t concerned; he said I was fairly entertaining the last time I went out there, so he figured it would be fine whatever I wanted to talk about. 🙂

In Fresno, I’ll be talking about using Visual Studio Tools for Office. I wanted to mess around with Outlook Add-Ins, and we write what we’re most interested in, so I wrote one that let me send images with a hyperlink for a GoldMail embedded in the image. This was on my own time, and it kind of got out of hand, as these things do when developers write code for themselves, and turned out to be pretty full-featured.

I added a group to the Ribbon, and added controls to it, then added a new command bar to the main Outlook window, messing around with dropdown menus and buttons and links. I tossed in a configuration form and then discovered a way to render html e-mail in Outlook if you’re sneaky (which I am). GoldMail liked my add-in so much, they asked and I consented to release it as a full-blown feature (coming soon!). So this is what I will start my demo in Fresno with.

For the rest of the talk, I’m going to draw inspiration (thinly disguised as code samples) from the excellent new VSTO book by Eric Carter and Eric Lippert, Visual Studio Tools for Office 2007. I haven’t decided what’s most interesting, but like the looks of databinding Excel to a SQLServer database, Smart Tags, Outlook Form Regions, and Application-level add-ins. I’ll figure it out today.

If you’re interested in VSTO, and Fresno is too far, come see me talk about it at the San Francisco .NET Users Group meeting on November 18th. VSTO is pretty cool.

Early morning surprises

October 1, 2009
I woke up earlier than intended this morning, and before going back to sleep pulled my iPhone out of the drawer and checked my e-mail. I know this sounds compulsive, but I frequently work until 2 a.m. or later, so I generally sleep a little later. Many in the company start work before I do (okay, most in the company start work before I do), so I check to make sure there is no emergency that requires me to get up “early”. Ok, yes, this is compulsive, but I can’t help myself.

I saw an e-mail from the MVP Lead who had requested information from me when I was nominated earlier this year by my friend Beth Massi. Beth had told me she thought the awards were handed out in January, so I just figured the MVP Lead was asking for more information. I squinted and tried to read the e-mail (have you ever tried to read e-mail on an iPhone? It’s really tiny, and I wasn’t cognizant enough to do the un-pinch-y-finger-move to make it bigger). I thought the e-mail said I had been awarded an MVP award.

I figured I was delusional, being a little sleep-deprived this week preparing for my talks and still trying to work my usual number of hours, so I put on my glasses and tried again, and it still said I had been awarded an MVP award. So I took the glasses off, cleaned them on my shirt, put them back on, and it still said I had been awarded an MVP award. So I called Beth.

Having been awake for about 60 seconds, I wasn’t terribly coherent, but Beth finally figured out what I was trying to tell her. She was very happy for me. After that e-mail, how could I possibly go back to sleep?

This was a surprise to me. I knew I had been nominated, but wasn’t sure it would happen because my expertise is in such a niche area (ClickOnce Deployment, in case you didn’t get that from the Blog title), and I wasn’t sure I was worthy. And apparently I was wrong about January.

I feel very honored and am grateful to my friend Beth Massi for nominating me. In fact, she blogged about me today, and it made me feel a little teary-eyed. It’s really nice to be appreciated.

I’ve made a GoldMail explaining why I got an MVP Award, and explaining the benefits and fun I’m going to have, including next year’s MVP Summit (Geekfest!!). I will continue blogging about ClickOnce (new features in 4.0 coming soon!!) and evangelizing and answering questions in the MSDN Forums. Hope you enjoy the GoldMail!

View in browser

October Appearances

September 30, 2009

You can meet me at one of these events (oooooh, aaaaah):
10/2/2009 Silicon Valley Code Camp
10/8/2009 Central California .NET User Group
10/14/2009 East Bay .NET User Group
11/18/2009 San Francisco .NET User Group

I’m going to be speaking this weekend (October 2nd) at the Silicon Valley Code Camp. My session is at 11:00 a.m. and is on the difficulties of ClickOnce Deployment, and some of the bugs I have uncovered and how to deal with them. I have several topics for discussion, but will try to address questions that people bring, and then discuss whichever topics they are most interested in.

The questions that seem to be asked the most in the forums are about desktop shortcuts and deploying data or just including extra files. Deploying data is a big one, and I have done a bunch of tests to see exactly how to deploy a SQLCE or SQLExpress database with your ClickOnce application. I will be blogging that some time in the not-too-distant future.

If you miss the SVCC event, and/or want more detail, come to the East Bay .NET User Group meeting on October 14th at University of Phoenix in Livermore. It’s right on the west edge of Livermore, barely out of Pleasanton. I will be covering the data deployment and certificate issues and basically the same topics as CodeCamp, but in more detail.

If you are interested in VSTO development, I will be giving a talk at the Central California .NET User Group meeting on October 8th. That one will cover how to create an Outlook Add-In, including modifying the ribbon, and I’m thinking data binding in Excel and maybe Forms in Outlook. I will also discuss ClickOnce deployment of a VSTO application and the bug I discovered therein.

If that interests you but Fresno is too far away, I will be giving the same talk in San Francisco on November 18th.

I also have an update to the “expiring certificate problem”, and I will be adding the new content here and linking the previous entry to the new one. I have also translated the code into VB.Net for those of you who are VB developers. (Unlike many C# developers, I don’t feel there is a whole lot of difference between the two languages, and do not discriminate based on your language of choice.) I just need to pass it by someone at Microsoft to make sure it’s completely accurate and then I will post it.

Chocolate Oatmeal No-Bake Cookies

August 2, 2009

I offered to share my recipe for Chocolate Oatmeal No_Bake Cookies with someone I met on Twitter (Jennifer Fong, a great resource for Direct Sales & Social Media), who also has a WordPress blog with some of her own recipes on it. I thought I would just post it here on my blog, because others may enjoy it too.

For you tech people reading this, these cookies work no matter what browser you use, whether it’s IE, Firefox, Safari, or Opera, which I’m sure will be a relief. Also, there’s none of that pesky caching problem.

Granted, this has nothing to do with ClickOnce deployment, so in order to justify putting it here on my ClickOnce blog, I will say that this is something you can do while installing the .Net 3.5 Framework (with or without SP-1) … and still have time left over to do unit testing on the resulting product.

Of course, it takes longer to install the .Net 3.5 Framework (with or without SP-1) than it takes to build all of the backend products for GoldMail, listen to half of a DotNetRocks! podcast, or read 1/4 of my favorite Data Binding book. But none of those activities yield a plate of cookies.

Now, for all you tech people checking this out, I will point out that even YOU can make this recipe. It’s mostly just adding a bunch of stuff to a pot, stirring it and letting it boil while you count slowly to 60 (or the amount of time it takes to write a complicated linq statement), then glopping it out on wax paper (which you can buy at the grocery store, where the Saran Wrap is. You remember Saran Wrap — it’s what you wrap your extra bare hard drives in, to keep the connectors clean).

The hard part is waiting a few minutes for the cookies to set before you start eating. That’s easier to do if you spend that time cleaning out the pan with your finger, if you know what I mean. You should do that anyway, because it makes it easier to actually wash the pan.

Here’s the recipe in C#. If you need it in VB, post a comment and I will translate. Just instantiate the class, and you’ll have cookies…

/// This creates cookies.
/// It is assumed that there is another process
/// throwing events from the saucepan
/// which result in the state changing.
class ChocolateOatmealNoBakeCookies
{
  internal class Ingredients
  {
    internal int Two_Cups_Sugar {get; set;}
    internal int Half_Cup_Cocoa { get; set; }
    internal int Half_Cup_Milk { get; set; }
    internal int Half_Cup_Butter { get; set; }
    internal int Half_Cup_Peanut_Butter { get; set; }
    internal int Teaspoon_Vanilla { get; set; }
    internal int Three_Cups_Oatmeal { get; set; }
  };

  Ingredients input;

  public ChocolateOatmealNoBakeCookies()
  {
    input = new Ingredients();
    MakeCookies();
  }

  private void MakeCookies()
  {
    int three_qt_saucepan = input.Two_Cups_Sugar
      + input.Half_Cup_Cocoa
      + input.Half_Cup_Milk + input.Half_Cup_Butter;
    string heat_level = "medium";
    string state = "cold";
    while (heat_level == "medium")
    {
      do
          stir();
      while (state != "boiling");
      heat_level = "off";
    }
    three_qt_saucepan += input.Half_Cup_Peanut_Butter;
    while (state != "melted")
        stir();
    three_qt_saucepan += input.Teaspoon_Vanilla;
    stir();
    three_qt_saucepan += input.Three_Cups_Oatmeal;
    while (state != "mixed")
      stir();
    int spoonful_of_stuff = 1;
    int waxpaper = 0;
    while (state != "empty")
    {
      three_qt_saucepan -= spoonful_of_stuff;
      waxpaper += spoonful_of_stuff;
      if (three_qt_saucepan == 0)
        state = "empty";
    }
  }
  private void stir()
  {
    //stir the stuff in the pot
  } 
}

Here’s the recipe for those who don’t speak C# or .Net. Not that there’s anything wrong with that.

Chocolate Oatmeal No-Bake Cookies
2 cups sugar
1/2 cup cocoa
1/2 cup milk
1/2 cup butter
1/2 cup peanut butter (chunky or smooth, your choice)
1 teaspoon vanilla
3 cups oatmeal (old fashioned oats — the kind that takes 5 minutes to cook, not the instant kind)

  • Combine the sugar, cocoa, milk, and butter in a 3-quart saucepan.
  • Cook on medium while stirring, until it starts to seriously boil. Boil for one to one-and-a-half minutes. (Use a timer, seriously. Use the clock on your computer if you have to, or the stopwatch on your iPhone in the World Clock app).
  • Remove from heat. At this point, it’s going to start to set, so act fairly quickly or you will end up with 1 chocolate oatmeal no-bake cookie in a pot.
  • Add the peanut butter; stir until melted.
  • Add the vanilla, stir it in, then add the oatmeal.
  • Stir until mixed, then drop it on waxed paper with a spoon in whatever size you want. (I drop about 1/2 tablespoon at a time).
  • Let them set.
  • Eat them.

Servings: 1. Total number of calories: 4,250.

You don’t have to store them in the fridge, although I do, because I like them cold. And I’ve never had a problem with them going bad. That doesn’t mean they will last forever, it just means I’ve never had any last long enough to find out how long they last. I hope you enjoy them!

Incommunicado

July 9, 2009

I’ve joined twitter with the username RobinDotNet. If you want to chat me up, you can join twitter and ping me!

I’ve been a bit incommunicado for a while, because I’ve been back to working major hours. I’m still answering questions in the MSDN ClickOnce and Setup & Deployment forums, though. It’s important to me to keep up with that, because very few people other than MSFT answer ClickOnce questions there, and I seem to be able to help people. When I’ve needed help, people in the C# and WinForms forums, etc., have helped me, so it’s my way of giving back to the community.

Why have I been working so much? I’m working on streamlining and standardizing the software in the backend at GoldMail. You know how you take over a job from someone, inherit a bunch of code, get no turnover, and have to figure it out? Welcome to my world. But I always love a challenge. The problem was that a lot of this code was the kind of thing that you write when you’re in a hurry and you’re just trying to get it to work, and you never have time to go back and clean it up. You know what I mean; we’ve all done it. (Actually, I’ve never done it, I just work more hours. 😉 ) The code worked, but it wasn’t optimal, and some was overcomplicated. Plus, some of it was still in .Net 1.1.

Also, someone had taken all of the private webservices and tucked them into one Visual Studio solution, and same for the public webservices. The problem with that is if you want to branch one of the private webservices for version 1.1 and another for 1.1 later, it makes it very difficult.

I split out all of the webservice projects into separate solutions and rebuilt all of the web references and made sure everything targeted .Net 2.0. So now we can build and deploy them separately. This makes it really clear what is being released in each GoldMail Release.

The next thing was our conversion service, which takes the GoldMail assets that are uploaded by our desktop product (the Composer) and turns them into a playable GoldMail. This is a Windows Service, and we had not modified it in well over a year. The one that we have in production works, but once in a great while it has a problem unzipping the files.

The first step for this was to get it to build as a .Net 2.0 project, and figure out how to deploy it. It had a lot of moving parts, and was extremely complicated.

After I finished, we built everything and put it on staging and gave it a good drubbing, and then moved it to production. This gave us a baseline to work with. I was very excited about this, because it was a huge release, and nobody noticed it. This means that it worked.

Our next release, currently scheduled for the end of this month, is what we call our “Facebook release”. I don’t want to give specifics, but I will say we’ve made things more elegant for our customers who post GoldMails on Facebook. This release required updates to the conversion service. Did I mention the code was incredibly overcomplicated? Updating it seemed like adding more gargoyles to the Notre Dame Cathedral, so I decided to rewrite it.

It took me 2 days. I removed all of the unneeded code (someone was planning for expansion that never happened), and added a substantial amount of logging, including showing the GoldMail ID in each logged entry so you can easily track the progress of a GoldMail conversion. I added the features we needed for Facebook, added double-checking on the files after they were unzipped, and addressed a couple of other bugs as well. And I added a whole lot of comments. (Someone I used to work with would sneer and say, “She puts comments in the code”, as if that’s a bad thing.)

I think the “files missing after unzip” problem was caused because the old program unzipped the files, then set the zip archive to null and called the Garbage Collector. I think it basically removed it before the files were flushed to disk. The only time you really should ever need to call the Garbage Collector is if you are using something that is unmanaged, like GDI+ or audio or something like that.

I reduced the code base from over 5,000 lines of code to about 600. From 20+ classes to 3. Yes, you read that right. AND I added logging and comments. I reduced the complexity of the build and reworked the process to remove a CLR trigger from our database.

CLR triggers are very cool, but that’s not a good reason to use them. This is a trigger you can write in C# or VB and have SQLServer run; they are not performant, and you should pretty much only use them if they are your only choice. I removed this trigger and backed the business logic up into the prior step.

The conversion service rewrite, along with all of the other backend changes we needed for the Facebook release, have kept me very busy. After working 18 hours on Monday and 12 on Tuesday, I’m happy to report all of the backend and client application work items have been completed, and we deployed it all to staging for QA to test today (Wednesday). It is currently scheduled to be released some time before the end of July.

So what comes next? I’m going to structure the backend to handle what I call “Replace-A-GoldMail”, and then wait for the Product Manager to figure out how best to take advantage of it. I think it would be awesome if you could replace the content of a GoldMail and not have to change the URL. For example, you could do monthly status GoldMails and embed it, and it would play the newest one.

Things are calmer at work now that I have a baseline on the backend that is pretty clean, and I’ll be able to stop working weekends again (I’m making no promises about the length of my days though!) I have some great ideas for articles for my blog.

How to deploy a SQLServer (Express or CE) database, and handle updates? How to add files to your deployment? How to deploy 3rd party dll’s without pushing them as prerequisites? How to deploy SQLCE without pushing it as a prerequisite? How to deploy to localhost to test your deployment? These are questions I see over and over again in the MSDN ClickOnce forum.

Other ideas: How to create an Outlook 2007 Add-In that customizes the Office Ribbon and deploy it using ClickOnce? (I wrote one for GoldMail on my own time, just for fun — it’s very cute.) How to write a windows service and have it run multiple tasks simultaneously and asynchronously using a thread pool and callbacks? How to install the same windows service? How to add and remove items from an MSMQ? How to run an MSMQ on your own machine?

I also have an idea about writing a PowerPoint Add-In for GoldMail. My friend Beth Massi, who works at MSFT, grins every time I mention that. Apparently PowerPoint is the least-documented object model in Microsoft Office. Heck, why start with something easy?

(Note: If you’re working on VSTO applications, check out the new VSTO book by Eric Carter and Eric Lippert. It’s awesome, and covers a LOT of information.)

So that’s what’s coming up. I’m looking forward to it, and hope you are too.

Update on Fresno

April 13, 2009

You know those collective nouns, like a herd of elephants, an army of ants, a murder of crows, a sleuth of bears, a charm of hummingbirds, an ostentation of peacocks, etc.? For tech people, I would use an enumeration of programmers. That’s a programming thing, so if you’re not a tech person and you didn’t get it, don’t worry about it. If you are a .Net programmer and you didn’t get it, check this out:
http://en.wikipedia.org/wiki/Enumeration_(programming)

I spent time with an enumeration of programmers at the .Net Users Group in Fresno last week, where I gave a talk about Click Once Deployment. I thought the talk went really well. Nobody fell asleep that I noticed, or if they did, they didn’t snore so you could hear, and that’s always a good sign.

While not as large as the Pleasanton (California) .Net User Group meetings I attend regularly, they seemed just as determined to have an experience where tech people can come together and share information, which is what it’s all about. If you actually figure out how to get something complicated to work, don’t you want to share it with someone else who might have the same problem, to save them all the time you spent? That’s one of the many great things about the tech community.

Thanks to the people in Fresno for asking me to come down there, and for listening to me; I had a great time.

I’ve lived in different-sized towns in several states — Ohio, Pennsylvania, New Jersey, Texas, and California — and I have had relatives all over Texas in small towns and large, and every town, no matter how small, has something interesting about it.

I wouldn’t call Fresno small — according to the 2000 census, they have over 425,000 people living there, and that doesn’t count the surrounding environs — but it isn’t exactly close to a huge metropolitan area, but it still has things to do and points of interest — and I’m not just counting the three National Parks within an hour or so of driving distance.

In the next few days, I will make a GoldMail or two and share what I found interesting about Fresno. In the meantime, code on!

Where did Robin go?

April 9, 2009

I’m going to Fresno, California! Woohoo!

I’ve worked a lot in the past few months, and have hardly taken a weekday off. The first six weeks of this year, I worked pretty consistent 12 hour days (or longer) every day, including weekends. I realized one day (it was about 3:00 in the afternoon on a Saturday) that I was starting to crack up a little, so I (mostly) cut out weekends, and I’m trying to cut my daily hours back as well (mostly).

I was working on the backend changes for our next big release, which impacted all of the different parts of our product — the Player, the Composer, the database, the web services, the billing system, and so on. With all the time I spent “directoring”, I had trouble getting the coding done too. This was the first time I can ever remember that updates to almost all of the products were released almost simultaneously.

I work with a lot of great people at GoldMail, and putting out that release took everybody’s effort. We all worked together as a team, and I was really impressed. From design from the PMs through development from the Engineers and into QA and testing, with help from Operations and Release Management and even the CIO, everybody chipped in and did his (or her) part. It took a lot of work, and seeing it all come together and get released at the end was definitely worth it.

Things have calmed down, but we continue to work on new features. The next one coming out is one of the best usability additions I’ve seen, and because I got to write it, I get to use it before it’s released. 😀 We’ve added the ability to write notes for each slide, that you can refer to while recording your GoldMail. It makes it easier to remember what you were going to say. I’ve fixed all the bugs (famous last words), and I think it’s going to be released soon.

I’m fortunate because this quiet time fell right at the time I have agreed to go to Fresno, California and talk at the .Net User Group meeting about Click Once deployment.

I live in the San Francisco Bay Area (out in the suburbs), and it’s about 150 miles to Fresno, so I’m going to take the rest of the week (Fri-Sun)and hang out there. Now, I have to say, it’s not like spending a weekend in San Francisco, and I’m not sure what there is to do there. It’s pretty close (1-2 hours) to Yosemite National Park, and to the Kings Canyon and Sequoia National Parks. Unfortunately, it’s snowing up at those elevations.

I was actually thinking about getting some chains and braving the snow and going to Sequoia National Park, and mentioned it to Mike, one of my co-workers. He asked if I had winter wear. (I just thought I’d wear a couple of polar fleece jackets.) He said, “Tell me you at least have hiking boots.” (silence) He said, “There’s always some fool who gets out of his car in flip flops and shorts to put on his chains.” (I would never wear flip-flops! Honest!) “You guys will be two frozen corpses that they find in a car on the side of the highway after the snowplows finally come through.” Ouch.

The road up to Lake Tahoe occasionally gets blocked, and you have to sit in your car for hours waiting for it to open back up, and the same could happen to me in a National Park. Apparently sneakers and a jacket won’t keep me from dying of hypothermia after my car runs out of gas. Picky, picky, picky.

So I’ll have to find something else to do. I’m thinking I’ll drive around in the foothills (as far as I can go without dying, because I won’t give Mike the satisfaction) and look at the scenery, and see what other kind of trouble I can get into in Fresno. There’s a college there, so there has to be something to do.

If I get really desperate, the hotel has wi-fi.

If you’re in Fresno or the surrounding area, come see me on Thursday night. The meeting is at 6:30 p.m. at the California State University in the Peters Building/Business Center. I don’t know what room; hopefully they will have signs. Or I can just run around yelling “Marco” and wait for the answering “Polo”.

Viva Las Vegas

March 27, 2009
This is from my trip to Las Vegas in 2008, and has nothing whatsoever to do with ClickOnce Deployment. Just trying out GoldMail, a marvelous new product that lets you record voice (or use a sound file) with your visuals. (Credibility warning: I work for GoldMail. 😉 )

View in browser