<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-6795279657081675726</id><updated>2009-07-26T05:29:37.597-06:00</updated><title type='text'>Speak, Code</title><subtitle type='html'>The main idea here is to chronicle the difficulties of software development – the real stuff I go through.  I don’t focus on the end results; I show you the blood and sweat that gets spilled along the way.  The technology is generally Microsoft – NET Framework, BizTalk, WCF, etc.  But I’m game for anything.  I’ll blog about things that are difficult for me; things I wish I knew before I started.  With each new project, there are generally a lot of those types of things.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-8514286339566451069</id><published>2008-11-30T14:51:00.001-07:00</published><updated>2008-11-30T14:51:39.046-07:00</updated><title type='text'>Cloud Computing Chronicles: Stirring to Life</title><content type='html'>&lt;p&gt;   &lt;br /&gt;So I've been working on a software development project for a couple months now. Sporadically, but working on it nonetheless. I look at the changesets in my source control system (Subversion), and the dates go back to 9/4/2008.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;The idea for the project started germinating with Google.&amp;#160; I have been developing software for more than a few years now, but the technologies I'm into these days aren't necessarily aligned with what Google is doing.&amp;#160; I use Google's products as part of my everyday life, of course.&amp;#160; I started using its search engine early in its lifecycle, and I couldn't help but notice the clever software that Google continually pumps out (I'm writing this post with Google Docs). But software development is a mammoth, fragmented industry.&amp;#160; For the last several years, I've been working with Microsoft technologies. Google... hasn't.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;My path intersected with Google's, though, when one of my (day job) projects needed some basic mapping functionality.&amp;#160; At first we looked at some proprietary GIS (geographic information system) software, but decided to look at Google Maps as well.&amp;#160; Google's price was more attractive (essentially zero vs. big bucks), the interface was easier, and the feature set did all we needed.&amp;#160; The choice was not hard.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;More intriguing was the level of community participation in Google Maps.&amp;#160; People have created everything from maps of historical journeys to step-by-step maps of red light districts.&amp;#160; I wondered if this was the way things were in the Google developer community.&amp;#160; Legions of citizens across the world, leveraging Google to unleash their imaginations. &lt;/p&gt;  &lt;p&gt;I took a superficial look into the other APIs that Google offers -- data, YouTube, docs, etc. -- and thought it would be cool to create an application that could lead me into this world.&amp;#160; When I want to learn something in development, the only way to inject it into my bloodstream is to build an application with it.&amp;#160; Reading about a technology or writing sample code can only take me so far. I was ready to go, so I put the idea on the pile of other projects I'd like to do. My ratio of projects I'd like to do and projects I have time for is somewhere around 100:1.&amp;#160; So not much happened.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;Engine roarin'&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;The concept gained some momentum with the release of Google App Engine.&amp;#160; Here came a service where Google would host your application right in its data centers.&amp;#160; What better place to work on Google's technologies?&amp;#160; Sounded like fun. The drawbacks to GAE, of course, are well-documented by commentators of all stripe.&amp;#160; Namely, you can only develop with the Python language, and there's a little matter of a non-relational database at the heart of the system. &lt;/p&gt;  &lt;p&gt;But hey.&amp;#160; I was up for a challenge.&amp;#160; Development is both my vocation and my hobby.&amp;#160; The projects I do for my work are mainly out of my control -- they're what clients are willing to pay for.&amp;#160; But on my own time, the field is green. Building an application with GAE would put me in contact with all sorts of worlds I only knew superficially -- Python, Linux, Google APIs.&amp;#160; So I started working on it, as I found stray hours here and there.&amp;#160; I'll say more about my technical &lt;strike&gt;struggles&lt;/strike&gt; learnings in other posts. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Wizard of Ozzie &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Another piece fell into place when I attended Microsoft's Professional Developer Conference in late October, 2008.&amp;#160; One of the big technologies Microsoft was pushing was Azure, the cloud computing platform.&amp;#160; Ray Ozzie, Microsoft's Chief Software Architect, gave props to Amazon for blazing the trail of how cloud computing for the masses should work.&amp;#160; I'm sure he's right.&amp;#160; Amazon's EC2 (Elastic Cloud Computing) was the first behemoth out of the gate. From where I was sitting, though, the initiative looked a lot like Google App Engine.&amp;#160; &lt;/p&gt;  &lt;p&gt;So now there was another angle: Microsoft was coming into the cloud computing game full-bore.&amp;#160; I could make my project into a narrative -- how the Microsoft and Google approaches stack up to each other, as I build an application.&amp;#160; But I'm also interested in seeing what the developer experience is like for other comparable offerings between Microsoft and Google.&amp;#160; For instance, Microsoft has Live Maps, which is remarkably similar to Google Maps.&amp;#160; Microsoft answers YouTube with MSN Video.&amp;#160; Microsoft is moving Office online, to compete in the space Google Docs occupies. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;If you ask either company which has the better offering, you could probably predict the answer.&amp;#160; And that's generally who you have to rely on for in-depth answers about the details of technology. I would contend that the main difficulty of modern software development is not technical.&amp;#160; It is deciding from a seemingly infinite number of choices.&amp;#160; There are a finite number of problems in computer science, but they are generally complex problems.&amp;#160; And there are a lot of people/organizations who have thought up solutions.&amp;#160; If you're a developer, the stakes are high when you sit down to create a project and you choose a technology.&amp;#160; You can almost never predict where a project will take you.&amp;#160; You may end up finding out that the technology you chose is a dead end -- that it will not solve the problem.&amp;#160; By that time, you've probably lost a great deal of time and money.&amp;#160; So.&amp;#160; Doing this kind of exploratory development might help my technology bets be more accurate. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Underpromise and Overdeliver &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Despite having made my living as a writer at various points in my life, and despite the fact I enjoy sharing experiences with other developers, I have yet to find the enthusiasm to write a technical blog.&amp;#160; I've had some fits and starts, as you can see for yourself by reading previous posts on this blog. Maybe the material from this project will give me the &amp;quot;hook&amp;quot; to get into it.&amp;#160; Or maybe this will be my last post.&amp;#160; Guess we'll just have to see. &lt;/p&gt;  &lt;p&gt;But thanks for reading.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-8514286339566451069?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/8514286339566451069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=8514286339566451069' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/8514286339566451069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/8514286339566451069'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2008/11/cloud-computing-chronicles-stirring-to.html' title='Cloud Computing Chronicles: Stirring to Life'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-7854859281790182608</id><published>2008-10-13T14:24:00.001-06:00</published><updated>2008-10-13T14:24:35.614-06:00</updated><title type='text'>Red - Unit Testing with Python</title><content type='html'>&lt;p&gt;So.&amp;#160; Armed with my new favorite IDE -- PyDev, the first thing I'm starting to look for is a strategy for unit testing Python.&amp;#160; Since I'm starting afresh, I'm planning to write tests to lay out my objectives, then learn how to create the functionality for the tests. &lt;/p&gt;  &lt;p&gt;I'm not trying to be blinded too much by the way I usually work, but my expectation is that I will be able to find a unit testing framework that can be integrated into PyDev (or Eclipse, as the case may be).&amp;#160; Then I can write tests that will live &amp;quot;alongside&amp;quot; my classes and I can run the tests programmatically. &lt;/p&gt;  &lt;p&gt;We'll see.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-7854859281790182608?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/7854859281790182608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=7854859281790182608' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/7854859281790182608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/7854859281790182608'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2008/10/red-unit-testing-with-python.html' title='Red - Unit Testing with Python'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-764400161829581751</id><published>2008-10-03T07:16:00.001-06:00</published><updated>2008-10-03T07:16:48.655-06:00</updated><title type='text'>Green - Developing in Python</title><content type='html'>&lt;p&gt;I selected PyDev (&lt;a href="http://pydev.sourceforge.net/)"&gt;http://pydev.sourceforge.net/)&lt;/a&gt; as the tool to start out with.&amp;#160; There seems to be huge enthusiasm for plain-text editors in the Python community.&amp;#160; No doubt, it's fun to improvise on the command line.&amp;#160; I liken the feeling to going back to nature -- grabbing hold of the rough edges and learning to love them.&amp;#160; But I've grown too addicted to more full-featured editors. &lt;/p&gt;  &lt;p&gt;PyDev is an open-source Eclipse (&lt;a href="http://www.eclipse.org)"&gt;http://www.eclipse.org)&lt;/a&gt; plug-in with a pretty healthy feature set -- code completion, syntax highlighting, integrated debugging, refactoring, unit testing, third-party plug-ins, and on and on.&amp;#160; The main criticisms I see about PyDev are about the complexity/overhead of Eclipse and the fact that you need to run it on a pretty beefy machine.&amp;#160; After years of Visual Studio, I'm used to omnibus IDEs.&amp;#160; And the machines I use have some horsepower. &lt;/p&gt;  &lt;p&gt;I saw that PyDev was recently purchased by Aptana.&amp;#160; I don't know enough about the Python ecosystem to know if I should be concerned that PyDev will go a commercial route.&amp;#160; But I suppose on the scale of worries, that one is pretty small. &lt;/p&gt;  &lt;p&gt;So off I go.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-764400161829581751?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/764400161829581751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=764400161829581751' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/764400161829581751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/764400161829581751'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2008/10/green-developing-in-python.html' title='Green - Developing in Python'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-6039164203379173048</id><published>2008-09-28T14:37:00.001-06:00</published><updated>2008-09-28T14:38:11.032-06:00</updated><title type='text'>Red - Developing in Python</title><content type='html'>&lt;p&gt;For various reasons, I've decided to undertake a project using Python as the primary language.&amp;#160; I'm going in fairly cold, with plenty of experience in other areas, but none in Python.&amp;#160; My first thought was to develop with IronPython, since I'm steeped in Microsoft developer technologies.&amp;#160; (IronPython is a Microsoft Common Language Runtime implementation of Python). &lt;/p&gt;  &lt;p&gt;However, I found myself falling back too much on the things I know, and one of the goals of my project is to branch out into things I don't know.&amp;#160; No use in doing it, if I'm using a new language to do the same things I'm doing now. So, I'm going whole hog.&amp;#160; There are plenty of development tools for Python, so I looked at some overviews and comparisons: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://spyced.blogspot.com/2008/05/ide-update.html"&gt;http://spyced.blogspot.com/2008/05/ide-update.html&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://wiki.python.org/moin/IntegratedDevelopmentEnvironments"&gt;http://wiki.python.org/moin/IntegratedDevelopmentEnvironments&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#8230;etc.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-6039164203379173048?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/6039164203379173048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=6039164203379173048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/6039164203379173048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/6039164203379173048'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2008/09/developing-in-python.html' title='Red - Developing in Python'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-1673797923958652152</id><published>2008-09-26T15:05:00.001-06:00</published><updated>2008-09-26T15:05:32.712-06:00</updated><title type='text'>My Own Personal Red, Green, Refactor</title><content type='html'>&lt;p&gt;So, if you peruse the sporadic entries up until this one, you might notice that they run long.&amp;#160; That's my tendency -- to write long, with exhaustive research and explanations.&amp;#160; It's also what keeps me from blogging very often.&amp;#160; I'll have ideas, but the prospect of climbing Everest dissuades me from undertaking it.&amp;#160; Before I commit the time to explaining the development travails I went thorugh,&amp;#160; I'm working on the next idea, and I've left my previous troubles behind.&lt;/p&gt;  &lt;p&gt;I thought of an idea that might work for this site.&amp;#160; I dig the agile practice of test-driven development, where you start out with an idea of what to do -- write a test, knowing that it's going to fail (red), then work until that test passes (green).&amp;#160; That first pass most likely will not be the best solution, so you refactor until you've hit the best solution (given your constraints).&lt;/p&gt;  &lt;p&gt;I'm going to try to use a derivation of that method here.&amp;#160; I will tee up whatever development issue I'm facing in an initial blog post (call it red).&amp;#160; I will then talk about resources I tap into and experiments I attempt in trying to solve that issue.&amp;#160; The first idea that works is the green post.&amp;#160; And then onto the process of refactoring.&amp;#160; &lt;/p&gt;  &lt;p&gt;Most likely, the information will not be the definitive answer for the problems I run into.&amp;#160; However, the content will be actual issues encountered during actual development.&amp;#160; It will not be a contrived example to discuss a new feature.&amp;#160; And I won't bother posting about the easy stuff, or the stuff that's a simple google search away.&lt;/p&gt;  &lt;p&gt;I will try to keep a consistent set of headlines, so that if you find a topic that interests you, you can search the blog and get an idea of how the problem arose, and how I tackled it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-1673797923958652152?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/1673797923958652152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=1673797923958652152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/1673797923958652152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/1673797923958652152'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2008/09/my-own-personal-red-green-refactor.html' title='My Own Personal Red, Green, Refactor'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-5967764632129061005</id><published>2008-05-18T23:19:00.001-06:00</published><updated>2008-05-18T23:19:09.139-06:00</updated><title type='text'>The Sublime Beauty of the Apple Aesthetic</title><content type='html'>&lt;p&gt;That title may sound like I'm writing another dewy-eyed tribute to the genius of Apple.&amp;#160; I'm not.&amp;#160; This is more a story of an old friend returning to help out in a pinch. &lt;/p&gt;  &lt;p&gt;I bought my first Macintosh in 1990 -- a Macintosh Classic with a 9 inch monitor and 4MB of memory.&amp;#160; Those were the days when the Mac OS had a clear advantage on anything Microsoft was producing.&amp;#160; Even the biggest Microsoft fans would agree that Windows was an abomination before version 3.1, and that version didn't hit the market until a few years after I bought that Mac Classic. &lt;/p&gt;  &lt;p&gt;Things change, of course.&amp;#160; The story of what's happened in the industry since that time has been told in many different ways, by many different people.&amp;#160; Personally, over the years, I've worked with Macintoshes some, but they've clearly faded in importance for me.&amp;#160; Making my living as a&amp;#160; consultant specializing in Microsoft technologies doesn't often push me in the direction of Apple technologies. &lt;/p&gt;  &lt;p&gt;I've never lost a fondness for Apple's industrial design, though.&amp;#160; Making things look as cool as they do must be harder than it seems.&amp;#160; I always thought that some PC maker could have a viable business by simply copying Apple's designs, and manufacturing the machines for the PC market.&amp;#160; But whenever anyone tries that, the result is egg-suckingly lame. &lt;/p&gt;  &lt;p&gt;When Apple switched over the Intel chipset, and running Windows on Apple hardware became a viable option, I knew it was just a matter of time before I bought my next Macintosh.&amp;#160; I bought a MacBook Pro and I used it almost exclusively for running Windows.&amp;#160; I tried out some of the built-in Apple applications, and I played around with the new (for me) operating system. (The Macintosh OS is on version 10.5 now.&amp;#160; The last version I used seriously was somewhere around 9.) The experience was fine, but I had a lot more use for my machine as a Windows box.&amp;#160; In fact, I might be one of the few people on the planet who looked for a skin for my MacBook Pro that replaced the glowing Apple logo with a Windows logo.&amp;#160; (Only because I tended to get a hard time from my Windows-loving cohorts). &lt;/p&gt;  &lt;p&gt;Recently, though, something brought me back into the Mac OS, with force.&amp;#160; I'm currently starting a personal project that involves delving into innumerable technologies that I have not used before. I'll be chronicling the details later, but let's just say that the leap is huge, and my plate is more than full. The amount of new information to process is astronomical.&amp;#160; I decided to start podcasting, to go along with the project. Setting up a process to begin podcasting felt like a big hurdle I had to clear before I could even start. &lt;/p&gt;  &lt;p&gt;My goals were fairly simple at the outset: &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; 1. I didn't want my podcast to sound like I was recording in a bus terminal's bathroom stall (which many podcasts do)   &lt;br /&gt;&amp;#160;&amp;#160; 2. I wasn't interested in building a home studio, or becoming an audio engineer.&amp;#160; I wanted just enough to make it work. &lt;/p&gt;  &lt;p&gt;I thought to accomplish those goals, I would have to buy a decent microphone, research the available software packages, weigh the advantages of each, go through intense machine configuration, learn the vagaries of the software package, and on and on.&amp;#160; This wasn't just my imagination run wild.&amp;#160; It's the normal course of events for addressing a technology-related problem. &lt;/p&gt;  &lt;p&gt;I started off by taking a flyer on the microphone.&amp;#160; I went onto Amazon and got a microphone that seemed at least suitable for the serious hobbyist. Maybe it was better, but I had no objective basis of comparison.&amp;#160; I just bought it. &lt;a href="http://www.amazon.com/gp/product/B000H4HS72"&gt;http://www.amazon.com/gp/product/B000H4HS72&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A little later, I started my exploration of the podcasting options the same I way I begin just about everything these days -- with a Google search.&amp;#160; I noticed something interesting on my first page of results.&amp;#160; The program &amp;quot;GarageBand&amp;quot; appeared in several places.&amp;#160; I had heard some vague buzz about that program as a great way to record music.&amp;#160; This was the first I heard that it had the ability to be used for podcasting.&amp;#160; I was fairly certain that the program had been installed with my Macintosh, but I wasn't sure.&amp;#160; There is a suite of programs that come with the operating system, but there are also some programs that you have to pay for. &lt;/p&gt;  &lt;p&gt;My first pleasant surprise was that I had GarageBand, and I did not have to pay for it.&amp;#160; Then I noticed that by simply launching the program, I was given a clear path to make a podcast.&amp;#160; How much simpler could it be?&amp;#160; There is a button that says &amp;quot;Create a New Podcast Episode&amp;quot; on the main screen.&amp;#160; There is even a link for video tutorials right next to it.&amp;#160; Watching the tutorial video had me productive about five minutes later. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/robfcollins/SDENyX4gZfI/AAAAAAAAABU/MwbpqPClhOg/s1600-h/GarageBand%5B3%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="223" alt="GarageBand" src="http://lh5.ggpht.com/robfcollins/SDENy34gZgI/AAAAAAAAABg/NSgnbc2B7do/GarageBand_thumb%5B1%5D.jpg?imgmax=800" width="303" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I felt certain that there would be some work to configure the program to operate with the microphone.&amp;#160; Other than plugging in the USB cable, there was not.&amp;#160; The interface was clean. Having done some video editing in the past, the paradigm was utterly easy for me to pick up. &lt;/p&gt;  &lt;p&gt;Now, there are a lot of issues I have with Apple.&amp;#160; Their pricing for commodity components borders on predatory.&amp;#160; Their smug superiority about operating system security is setting them up for a huge fall some day.&amp;#160; Their cavalier attitude wholesale changes for each OS upgrade means that you have no choice to but keep buying software and hardware at each revision.&amp;#160; But, damn.&amp;#160; My experience with GarageBand was one of the best I've had with software.&amp;#160; And I've had a lot of experience with software. &lt;/p&gt;  &lt;p&gt;This is the kind of thing consumer software should aspire to.&amp;#160; Someone has a problem, and they don't want to be burdened with a learning curve or massive upfront work, before they even start solving their problem.&amp;#160; The program hides the complexity, and the user gets to work.&amp;#160; I mean, look: I know there's a whole lot more to broadcasting than what I see in GarageBand.&amp;#160; There's a whole scientific discipline to audio engineering that people have spent their lives working with and advancing.&amp;#160; Who knows?&amp;#160; Maybe there will come a day when my own needs or interests outstrip what I can accomplish with GarageBand, and I have to look for something more powerful.&amp;#160; But I doubt it.&amp;#160; As of now, GarageBand gives me a very simple solution to a complex problem and produces great results. &lt;/p&gt;  &lt;p&gt;I think, in a larger context, that is why Apple is successful.&amp;#160; Software designers tend to get hung up on feature wars. They think that if their software does not do everything (even if the use cases are obscure), they are at a competitive disadvantage.&amp;#160; Apple seems to take the approach of asking how you can solve a problem without having to become a software expert.&amp;#160; I mean, when the iPod came out, the market for MP3 players felt like it had peaked years before.&amp;#160; And it had, for the tech savvy.&amp;#160; Apple made it approachable for normal human beings. &lt;/p&gt;  &lt;p&gt;So there you go.&amp;#160; I'll keep this experience in mind.&amp;#160; Software isn't finished when every feature is implemented.&amp;#160; It's done when the benefit it provides is much greater than the effort it takes to learn how to use it. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-5967764632129061005?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/5967764632129061005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=5967764632129061005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/5967764632129061005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/5967764632129061005'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2008/05/sublime-beauty-of-apple-aesthetic.html' title='The Sublime Beauty of the Apple Aesthetic'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-3460177223930094696</id><published>2008-02-02T09:21:00.001-07:00</published><updated>2008-02-02T09:21:37.961-07:00</updated><title type='text'>Let it Bleed - On the Edge with Silverlight 1.1 Alpha - Part 1</title><content type='html'>&lt;p&gt;So I found an excuse to get my hands dirty with Silverlight 1.1.&amp;#160; I'm involved in campus recruiting for my company, and each semester we give an employer presentation that involves a talk about the company, then a short demo of some current Microsoft technology.&amp;#160; Generally, I give the spiel about the company, then organize some other folks to show off the technology.&amp;#160; I decided to flip it this semester, so that I could devise some way to show off Silverlight.&lt;/p&gt;  &lt;p&gt;Facebook felt like a good place to start.&amp;#160; For the Fall semester, we had given a presentation about using the Facebook API, and it had resonated.&amp;#160; As far as I can tell, Facebook adoption among college students runs about 100%.&amp;#160; It permeates every aspect of their lives, so talking about how to work with the Facebook API has built-in relevance.&amp;#160; &lt;/p&gt;  &lt;p&gt;Then I wanted to think of something that exercised a broad range of the Silverlight feature set.&amp;#160; Graphics, audio, video, animation, the works.&amp;#160; &lt;/p&gt;  &lt;p&gt;It was also a project that would give me a chance to learn in an enjoyable way.&amp;#160; That is -- dive right in, try things, see if they work.&amp;#160; If they don't work, dig into resources to find out why. That's one of the reasons you'll find that developers work on projects on their own time.&amp;#160; When a client is footing the bill, you can't be quite so free.&amp;#160; &lt;/p&gt;  &lt;p&gt;However, there were a number of times during the project where &amp;quot;enjoyable&amp;quot; wasn't the adjective I would have selected.&amp;#160; The fact that Silverlight is alpha software meant that there were hiccups, blind alleys and mysterious behavior.&amp;#160; Even more brutally, the documentation and online resources are not terribly mature.&amp;#160; It's funny -- in the space of seven years or so, the development process has changed completely.&amp;#160; It used to be that you learned by instinct, brute force, or hazy documentation.&amp;#160; Now, if you need to find out how to solve a particular problem, chances are, someone in the world has faced a similar problem and posted a solution. The answer is a Google search away. That's not necessarily the case with Silverlight at this point in its lifecycle. &lt;/p&gt;  &lt;p&gt;But I appreciate the experience now. It was enjoyable It was like a throwback to the wilder days.&lt;/p&gt;  &lt;p&gt;So.&amp;#160; When I started, here was my initial thought of what would make up the Silverlight demo:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A mechanism to sign in for Facebook&lt;/li&gt;    &lt;li&gt;A mechanism to harvest a user's friend list&lt;/li&gt;    &lt;li&gt;A XAML-based map of the United States, to indicate where friends are located&lt;/li&gt;    &lt;li&gt;Animation&lt;/li&gt;    &lt;li&gt;Video&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;From there, who knows?&amp;#160; I wanted to identify opportunities as I went. I will take you through some of the highs and lows of my experience. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-3460177223930094696?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/3460177223930094696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=3460177223930094696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/3460177223930094696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/3460177223930094696'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2008/02/let-it-bleed-on-edge-with-silverlight.html' title='Let it Bleed - On the Edge with Silverlight 1.1 Alpha - Part 1'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-3599765579991742830</id><published>2007-11-26T21:25:00.000-07:00</published><updated>2008-02-02T23:00:34.250-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSTO'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio.NET 2008'/><title type='text'>Moving Day for VSTO</title><content type='html'>I have been working on a Microsoft Office Business application sporadically with the Beta 2 version of Visual Studio.NET 2008. Once I got my hands on the RTM version of 2008, I tried to bring the project across. It did not immediately compile. I clocked in at about 20 build errors. A number of the assembly references were not recognized &amp;#8211; apparently there was some renaming between Beta 2 and the real thing.I did a Google search on one of the unrecognized assembly references:   &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Office&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;&amp;#8230; and I was pointed towards the Visual Studio 2008 Readme file. But of course. That&amp;#8217;s a handy place to put it, but I gave up reading readme files years ago &amp;#8211; when they stopped being pithy descriptions of important issues and started becoming dumping grounds for any minutiae that the developer had in mind.   &lt;br /&gt;  &lt;br /&gt;But this particular readme file had some good information. It began like this:   &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;You may experience build and runtime errors when you build and run Beta 2 Office projects in the release version of Visual Studio 2008. Changes have been made to a number of VSTO reference assemblies.&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;Bingo. Then we got a nice little table:   &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-family: courier new"&gt;   &lt;br /&gt;&lt;span style="font-size: 85%"&gt;&lt;/span&gt;&lt;/span&gt;&lt;tbody&gt;&lt;tr&gt;&lt;span style="font-family: courier new"&gt;   &lt;table cellspacing="0" cellpadding="2" width="613" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="337"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;&lt;strong&gt;Old Reference &lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;          &lt;td valign="top" width="339"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;&lt;strong&gt;New Reference&lt;/strong&gt; &lt;/span&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="337"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Applications.ServerDocument.dll &lt;/span&gt;&lt;/td&gt;          &lt;td valign="top" width="339"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Applications.ServerDocument.v9.0.dll &lt;/span&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="337"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Office.dll &lt;/span&gt;&lt;/td&gt;          &lt;td valign="top" width="339"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.Office.Tools.v9.0.dll &lt;/span&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="337"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Office.Common.dll &lt;/span&gt;&lt;/td&gt;          &lt;td valign="top" width="339"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.Office.Tools.Common.v9.0.dll &lt;/span&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="337"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Office.Excel.dll &lt;/span&gt;&lt;/td&gt;          &lt;td valign="top" width="339"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.Office.Tools.Excel.v9.0.dll &lt;/span&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="337"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Office.Outlook.dll &lt;/span&gt;&lt;/td&gt;          &lt;td valign="top" width="339"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.Office.Tools.Outlook.v9.0.dll &lt;/span&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="337"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Office.Word.dll &lt;/span&gt;&lt;/td&gt;          &lt;td valign="top" width="339"&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.Office.Tools.Word.v9.0.dll &lt;/span&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/span&gt;  &lt;br /&gt;&lt;/tr&gt;  &lt;br /&gt;The main change seemed easy enough to follow: The &lt;span style="font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Office.*&lt;/span&gt; assemblies had become &lt;span style="font-family: courier new"&gt;Microsoft.Office.Tools.*&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;I added the references noted above, and got it down to 9 compile errors. I then noticed that the table was not comprehensive. My suspicions fell on one of the last remaining missing assemblies --&lt;span style="font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Applications.AddInBase&lt;/span&gt;. I made the mistake of picking the namespace that looked the most like the old one to take up the slack -- &lt;span style="font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Applications.AddInManager&lt;/span&gt;. Wrong.   &lt;br /&gt;  &lt;br /&gt;So I applied the formula that seems to be implied by the conversion table and looked for the following assembly: &lt;span style="font-family: courier new"&gt;Microsoft.Office.Tools.Applications.AddInBase&lt;/span&gt;. Nope. Didn&amp;#8217;t exist.   &lt;br /&gt;  &lt;br /&gt;Back to Google:   &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Applications.AddInBase&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;No hits. Wow. It&amp;#8217;s not often your search term goes for 0-for-internet. Surely, the assembly name will be found somewhere within MSDN. Nope. I&amp;#8217;m starting to wonder where that came from. Let&amp;#8217;s try deleting it from the references. Boom. No effect on the number of errors.   &lt;br /&gt;  &lt;br /&gt;All right, then. Put that one aside and see where the errors are coming from. I started to suspect this namespace:   &lt;br /&gt;&lt;/span&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;Microsoft.VisualStudio.Tools.Applications.Runtime&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;&amp;#8230;it seems to be giving the compiler heartburn. I look closer at one of the errors:   &lt;br /&gt;  &lt;br /&gt;&lt;span style="font-size: 85%; font-family: courier new"&gt;The type 'Microsoft.VisualStudio.Tools.Applications.Runtime.IEntryPoint' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.VisualStudio.Tools.Applications.Runtime.v9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.&lt;/span&gt;   &lt;br /&gt;  &lt;br /&gt;Isn&amp;#8217;t that interesting? It&amp;#8217;s telling me what assembly is missing&amp;#8230; and I didn&amp;#8217;t seem to have that reference in the project before. Taking the tip that the compiler gave me, I added that assembly reference (Microsoft.VisualStudio.Tools.Applications.Runtime.v9.0) And now we&amp;#8217;re down to one compiler error.   &lt;br /&gt;  &lt;br /&gt;The final error concerns the Ribbon Add-In that I created for my beta project. This was what drew me to use VS.NET 2008 in the first place. It was the only environment where you could use the designer to create a ribbon add-in that was specific to one document. (You could get to the same end result in VS.NET 2005 + VSTO, but there was a whole lot of rolling your own.)   &lt;br /&gt;  &lt;br /&gt;In this case, I used the designer to build the Add-In, so the code was generated. That&amp;#8217;s always fun to debug, because it&amp;#8217;s sprinkled with warnings about how you should not touch the code under any circumstances. But let&amp;#8217;s see if we can hone in. First, the compiler takes exception to the parent class &amp;#8211; &lt;span style="font-family: courier new"&gt;WordRibbon&lt;/span&gt;. So. If the shipping version of VS.NET2008 doesn&amp;#8217;t like the way Beta 2 generated code, the next step is to see how the shipping version does it.   &lt;br /&gt;  &lt;br /&gt;For comparison&amp;#8217;s sake, I create a new Office project &amp;#8211; a Word document. I add a new item to the project: Visual C# Items -&amp;gt; Office -&amp;gt; Ribbon (Visual Designer) The parent class that it generates in this case is &lt;span style="font-family: courier new"&gt;OfficeRibbon&lt;/span&gt;. Otherwise, the method calls look fairly similar. So I simply change the &lt;span style="font-family: courier new"&gt;WordRibbon&lt;/span&gt; to &lt;span style="font-family: courier new"&gt;OfficeRibbon&lt;/span&gt;&amp;#8230; and this time, the project compiles. Hit debug&amp;#8230; and it fails on a SQL permission error. Vista&amp;#8217;s new security paradigm strikes again &amp;#8211; I&amp;#8217;ll blog about that another day. I clean up that error, and now the application runs in debug mode&amp;#8230; except my Ribbon Add-in does not show up. It does not throw an error, but neither does it show up.   &lt;br /&gt;  &lt;br /&gt;Back to the test project I created to see how VS.NET 2008 RTM creates the Ribbon Add-In. That one works just fine &amp;#8211; it shows up on the Ribbon where it&amp;#8217;s supposed to. I launch another instance of VS.NET 2008, so that I can have both projects open simultaneously. I hone in on the generated code, which mainly consists of InitializeComponent() method. Other than the specific buttons and so forth, the code looks awfully similar.But I find one class in the *.Designer.cs file that&amp;#8217;s not in the beta version   &lt;br /&gt;  &lt;br /&gt;  &lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ThisRibbonCollection : Microsoft.Office.Tools.Ribbon.RibbonReadOnlyCollection&lt;br /&gt;    {&lt;br /&gt;        &lt;span class="kwrd"&gt;internal&lt;/span&gt; TestRibbon TestRibbon&lt;br /&gt;        {&lt;br /&gt;            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.GetRibbon&amp;lt;TestRibbon&amp;gt;(); }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So I add that block of code to my new project (changing the class names). Why not? But that has no effect whatsoever. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is an opportunity to dig into the internals of how the Ribbon Add-Ins generate code&amp;#8230; but, then again, it&amp;#8217;s not like I&amp;#8217;m ever going to go back to the beta version of VS.NET 2008. It&amp;#8217;s probably easier to add a new item to my new project &amp;#8211; recreate the Ribbon Add-In with VS.NET 2008 RTM&amp;#8217;s designer. That gives me the straightest line between where I am and where I want to go. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Recreating the Ribbon Add-In is pretty straightforward, mainly consisting of dragging and dropping a number of buttons. All the functionality behind the buttons resides in other classes, so I just have to wire simple method calls to the buttons&amp;#8217; click events. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One mildly interesting thing did come out of the exercise. Whereas the previous iteration of Add-In allowed me to create a reference to my Word document when the class is initialized: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;IMPWriteFactorFour.ThisDocument _wordDoc = Globals.ThisDocument;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#8230; which I then referenced within the Add-In class to execute methods: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; nextLineButton_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RibbonControlEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _wordDoc.advanceLine();&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This caused a null reference error in the RTM version. It did not recognize the _wordDoc variable as a reference to the current Word document. I had to change the methods to explicitly set that variable. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; nextLineButton_Click(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RibbonControlEventArgs e)&lt;br /&gt;        {&lt;br /&gt;            _wordDoc = Globals.ThisDocument;&lt;br /&gt;            _wordDoc.advanceLine();&lt;br /&gt;        }&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;#8230; and it was happy. Apparently, something about the order of loading Ribbon Add-Ins changed between Beta 2 and RTM. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And now I can proceed, from the point I left off on Beta 2. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Lessons Learned?&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I found it interesting that I had to change a number of assembly references, but the actual namespaces within the code did not have to change. Once I added the correct assembly, the code compiled. In looking at the assembly naming, I'm guessing that the dev team wanted to standardize the naming in the final release to conform to the naming conventions in the previous versions of VSTO. It was also interesting to see the differences in functionality between the beta and final releases of the Ribbon Add-Ins.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-3599765579991742830?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/3599765579991742830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=3599765579991742830' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/3599765579991742830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/3599765579991742830'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2007/11/moving-day-for-vsto.html' title='Moving Day for VSTO'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-7380006244900594779</id><published>2007-11-25T22:00:00.000-07:00</published><updated>2007-11-25T22:05:41.436-07:00</updated><title type='text'>The Climb to Visual Studio.NET 2008</title><content type='html'>&lt;p&gt;So I was on the road when I heard the announcement that the RTM version of Visual Studio.NET 2008 had been released to MSDN subscribers.  It caught me unaware – I hadn’t been keeping up with the timeline for the release.  I tried to download it from my hotel room, but if you’ve tried to download anything bigger than, say, a text file on a hotel’s free WiFi, you know the folly of trying to grab a 4 Gigabyte file.  &lt;/p&gt;&lt;p&gt;&lt;br /&gt;When I got back home and finally got my hands on it, the game was on.  I had been playing with the beta 2 release of VS.NET 2008 for some months, so it was cool to get the real thing.  To get that program, I had downloaded the Virtual PC from MSDN that had VS.NET 2008 beta 2 and SQL Server 2005 pre-installed.  Being a Virtual PC junkie, I was touched by MSDN’s gesture of making that available to everyone.  &lt;/p&gt;&lt;p&gt;&lt;br /&gt;Seriously, though.  I'm deep with virtual machines.  Since my work involves multiple clients, and my interests range far afield, I tend to organize through Virtual PCs.  So if I go to one client, I’ll use one VPC with all the relevant programs and files, then when I go to another, I have a different VPC.  My personal stuff is contained on other VPC’s still.  I keep the whole shooting match synchronized through the excellent and underrated program Groove (which I will undoubtedly blog about later).  The only downside is that I have about 15 Petabytes worth of VPC’s.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Naturally, then, I decided to install the RTM version of VS.NET 2008 on a VPC.  Some interesting things came out of the exercise.  Because of the nature of this blog, I’ll tell you about the problems.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;I started with a base VMWare image that was running the Vista operating system.  It also had the Microsoft Office 2007 Ultimate suite, which I considered vital, since developing Office Business Applications is one of my current interests. I cloned the virtual machine, and then installed programs in the following order:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1.       Visual Studio.NET 2008 Team Edition&lt;br /&gt;2.       SQL Server 2005 Developer Edition&lt;br /&gt;3.       SQL Server 2005 Service Pack 2&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I had been through the painful process of trying to get VS.NET 2005/SQL Server 2005 to run on Vista, so that’s why I went straight from the base installation of SQL Server 2005 through Service Pack 2 without pause.  There is a good description of that process &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/09/19/Tip_2F00_Trick_3A00_-Using-IIS7-on-Vista-with-VS-2005.aspx"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Well, this “leave the configuration up to the programs” approach caused problems.  It seemingly always does, of course, but I’m a hopeful sort.  The first problem was that VS.NET 2008 gave me a warning about IIS not being configured.  SQL Server 2005 did the same.  Worst of all, I found myself without an instance of SQL Server Management Studio 2005.  And yes, I had selected Management Tools under Client Tools node in SQL Server Setup during installation.  It just apparently didn’t see fit to install or give a descriptive error of what caused the installation failure.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The IIS problems were understandable after a bit of detective work.  VS.NET wanted certain features to be turned on, and SQL 2005 wanted some to be turned on as well.  Even if you have IIS 7.0 turned on, the installers will not necessarily recognize it.  The correct configuration was hardly intuitive, but the information was available.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;The lack of SQL tools was a bit more troublesome.  Most of the discussion around the issue either blamed the person installing SQL for not selecting Management Tools.  There was some sporadic advice about how to install the client tools on their own.  &lt;/p&gt;&lt;p&gt;&lt;br /&gt;I tried to install the SQL client tools on their own.  First, I went the route of changing the program through the usual Vista method: Control Panel -&gt; Programs and Features -&gt; Uninstall a program (I regret that when you want to change a program installation in Vista, you have to select &lt;em&gt;Uninstall&lt;/em&gt; a program, but I digress.)  That didn’t work.  I ran the main SQL Server Installer, and I ran the specific MSI for the client tools (SqlRun_Tools.msi).    I was unsuccessful, but the errors were ambiguous.  I believe it had something to do with the fact that I had already applied Service Pack 2, and I was trying to go back to the original discs to add the client tools.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;I still haven’t got a concrete answer, but I could guess at some possible problems with the initial installation.  Maybe when SQL tried to install VS.NET 2005 (as part of Business Intelligence Studio), the installer recognized that a later version was installed (VS.NET 2008) and aborted the operation.  Or maybe VS.NET’s installation of SQL Express gummed up the works.  I just decided to attack the problem another way.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Solution abound&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;So.  Step #1 for me was to make another clone of my base virtual machine and take another shot from the beginning.  Then it was a matter of reconfiguring IIS so that the programs would recognize it. Using a variety of sources to find the requirements for both VS.NET and SQL, I ended up selecting the following settings (to get here in Vista, select Start Menu -&gt; Control Panel -&gt; Programs -&gt; Turn Windows Features On or Off)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Internet Information Services&lt;br /&gt;                Web Management Tools&lt;br /&gt;                                IIS 6 Management Compatibility&lt;br /&gt;&lt;strong&gt;                                                IIS WMI Compatibility&lt;br /&gt;                                                IIS Metabase and IIS 6 configuration compatibility&lt;br /&gt;&lt;/strong&gt;                                IIS Management Console&lt;br /&gt;                World Wide Web Services&lt;br /&gt;                                Application Development Features&lt;br /&gt;&lt;strong&gt;                                                .NET Extensibility&lt;br /&gt;                                                ASP.NET&lt;br /&gt;                                                ISAPI Extensions&lt;br /&gt;                                                ISAPI Filters&lt;br /&gt;&lt;/strong&gt;                                Common Http Features&lt;br /&gt; &lt;strong&gt;                                               Default Document&lt;br /&gt;                                                Directory Browsing&lt;br /&gt;                                                HTTP Errors&lt;br /&gt;                                                HTTP Redirection&lt;br /&gt;                                                Static Content&lt;br /&gt;&lt;/strong&gt;                                Health and Diagnostics&lt;br /&gt;&lt;strong&gt;                                                HTTP Logging&lt;br /&gt;                                                Request Monitor&lt;br /&gt;&lt;/strong&gt;                                Performance Features&lt;br /&gt;  &lt;strong&gt;                                              Static Content Compression&lt;br /&gt;&lt;/strong&gt;                                Security&lt;br /&gt;&lt;strong&gt;                                                Request Filtering&lt;br /&gt;                                                Windows Authentication&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;(The features in bold were the ones I checked).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Then I changed the order of my installation:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1.       SQL Server 2005 Developer Edition&lt;br /&gt;2.       SQL Server 2005 Service Pack 2&lt;br /&gt;3.       Visual Studio.NET 2008 Team Edition&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Right as rain this time.  Both programs were happy with how IIS was configured. The SQL client tools appeared as expected.  I now have my installation of VS.NET 2008 rocking.  And there was much rejoicing.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What have we learned?&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you are going to have a full version of SQL running with VS.NET 2008, install it first.  Tread carefully when configuring IIS on Vista, to work with VS.NET and SQL.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-7380006244900594779?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/7380006244900594779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=7380006244900594779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/7380006244900594779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/7380006244900594779'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2007/11/climb-to-visual-studionet-2008.html' title='The Climb to Visual Studio.NET 2008'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6795279657081675726.post-3616782669076465919</id><published>2007-11-24T22:22:00.000-07:00</published><updated>2007-11-24T22:30:43.871-07:00</updated><title type='text'>What I'm Up To</title><content type='html'>Almost all the important things I've learned about coding have come as a result of difficulties.  Don't get me wrong, I'm addicted to reference material -- technical books, blogs, and even user manuals.  I read them with abandon. I can find something interesting in just about any technical topic, no matter how obscure.  But training cannot substitute for the experience of sitting in front of a computer, trying to accomplish some piece of functionality.  The questions start immediately.  What am I trying to do? How can I accomplish it?  What is the best way to accomplish it?  How will this task fit into a larger picture?  The questions have real consequences.  If you don't find an answer, your code does not work. Reference materials help, but the fundamental process of trial and error is where learning really starts to happen.&lt;br /&gt;&lt;br /&gt;Another enduring problem is that reference material for technology is fairly good at telling you what it can do.  Finding out what it &lt;em&gt;can't&lt;/em&gt; do is another story.  It makes sense, I suppose.  If every software vendor had to document every feature it does NOT have -- "support for 64-bit", "vector graphics", "toilet cleaning" -- manuals would be very long indeed.  But it seems like there always comes a time where I say, "I'd like to implement feature A, surely there's a method to do that." -- but I can't find it.  Then it becomes a long process of guesswork, until the envisioned solution is hit upon, an alternate method is found, or I go take a rest in the insane asylum for a while.&lt;br /&gt;&lt;br /&gt;Most technical blogs -- and let me re-emphasize that they are invaluable to me -- take the tactic of tutorials, feature demonstrations, or product information.  I've been considering writing a similar blog myself for years.  But after some revelatory struggles with coding, I thought it might be more interesting to write about the challenges I face.  I plan to document some of the struggle; not just the pretty end result, but the mistakes, bumps, and bruises that lead to the goal.&lt;br /&gt;&lt;br /&gt;I have to believe that anyone who's serious about software development faces similar challenges.  It's an industry where you have to keep challenging yourself to move outside your comfort zone, or you never progress.  If you find a comfort zone, it generally changes.&lt;br /&gt;&lt;br /&gt;I've been in the industry for a decent amount of time.  The amount of change is staggering year-over-year.  The number and variety of development tools almost defies comprehension.  It's rare that I get involved with a work project that doesn't have some novel (to me) technology or technological approach.  Then there are the projects that I work on for my own interest.  For those, I generally choose new technologies I want to learn.  So the learning curve provides innumerable opportunities to share my difficulties.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I kind of doubt that this blog will develop a consistent theme, technology-wise.  Since my interests in technology and software development know almost no bounds, I'm generally all over the map.  If I hear about something that sounds interesting, I will go after it.  Chances are good that most posts will deal with the Microsoft stack, since my career is totally focused there, and my personal projects trend in that direction.  But don't bet the farm on it.&lt;br /&gt;&lt;br /&gt;So welcome to my blog.  If some of my challenges interest you, make you laugh -- or best of all, help you, then I've done what I've set out to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6795279657081675726-3616782669076465919?l=speakcode.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://speakcode.blogspot.com/feeds/3616782669076465919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6795279657081675726&amp;postID=3616782669076465919' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/3616782669076465919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6795279657081675726/posts/default/3616782669076465919'/><link rel='alternate' type='text/html' href='http://speakcode.blogspot.com/2007/11/what-im-up-to.html' title='What I&apos;m Up To'/><author><name>Rocko</name><uri>http://www.blogger.com/profile/05781206752532785835</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12406408377843902554'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>