<?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-1958740151001122210</id><updated>2009-11-13T22:52:56.853-07:00</updated><title type='text'>A Bear's Life</title><subtitle type='html'>The life, opinions and thoughts of a Software Architect</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.drcarver.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default?start-index=26&amp;max-results=25'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>82</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-5344577058093788312</id><published>2009-08-30T23:56:00.001-06:00</published><updated>2009-08-30T23:56:27.367-06:00</updated><title type='text'>News from the Mobile Front</title><content type='html'>&lt;p&gt;Someone recently asked me where I lived.&amp;#160; This is a interesting question, since for the last year I have not really had a permanent residence.&amp;#160; I pretty much live out 5 suitcases and a plastic Tupperware tub.&amp;#160; After this gig is done in Portland I plan on dropping that to 4 suitcases and a laptop bag.&lt;/p&gt;  &lt;p&gt;Since I live alone and travel alone I can travel pretty light.&amp;#160; Currently I have a extended stay hotel in Portland that I live in and rent by the month.&amp;#160; My current contract ends in May of 2010. At the time I will decide if I am staying in Portland or moving on. &lt;/p&gt;  &lt;p&gt;My work is now pretty much contract work.&amp;#160; Go in take a gig for 3 months to a year and move on. I spent 10 years in Boise putting down roots, and I have no desire to do that again, so I am planning on staying mobile.&amp;#160;&amp;#160; I also like the nature of contract work.&amp;#160; I can be very technical, solve the problem and move on.&amp;#160; No need for the politics of a company or the drama.&amp;#160; I enjoy the technical challenges of developing software, not so much the politics.&amp;#160; &lt;/p&gt;  &lt;p&gt;As for my collections, when I lived in Boise I had a extensive CD, DVD and Book collection.&amp;#160; Around 5000 hard bound books, over 1000 music cd’s and over 1000 movies.&amp;#160; Now that I have pretty much gone mobile and all these collections are digital.&amp;#160; &lt;/p&gt;  &lt;p&gt;I currently have over 40,000 digital books.&amp;#160; This includes books in EPUB and Kindle (mobi) format.&amp;#160; Both public domain works and books I have purchased.&amp;#160; As I mentioned before I really like &lt;a title="http://oreilly.com/" href="http://oreilly.com/"&gt;http://oreilly.com/&lt;/a&gt; for technical books since the have them in a variety of formats, but I also get a lot of technical books from APRESS as PDF’s and Amazon.com for my Kindle.&amp;#160; I try not to buy any physical copies, since those are hard to carry around :-).&amp;#160; Most of my older science fictions I get from &lt;a href="http://www.webscription.net/"&gt;Baen&lt;/a&gt; books.&amp;#160; Other books not available in EPUB format I but from Amazon.com and have them on my Kindle DX.&amp;#160; My current electronic book collection is a little over 15 gig in size.&lt;/p&gt;  &lt;p&gt;I have over 12,000 tracks of mp3’s I buy from Amazon.com.&amp;#160; Most of these are classic rock, but I admit I&amp;#160; have some pretty weird albums in my collection :-).&amp;#160; I have my album collection stored on my two laptops, my 512 gig passport and finally the main copy is on my IPOD classic (120 gig). My current music, audio book and podcast collection is about 100 gig in size.&lt;/p&gt;  &lt;p&gt;Movies I get through either net flicks or purchase them from amazons video on demand service.&amp;#160; My digital movie collection on Amazon.com is now about the same size as my old collection used to be.&amp;#160; Most of these I leave on the Amazon servers.&amp;#160; Only a few have I downloaded.&lt;/p&gt;  &lt;p&gt;My software is stored as ISO images.&amp;#160; All my software from Microsoft I get from my TechNet subscription and store it as ISO images.&amp;#160; I then mount this using Magic Disc (a very cool utility that gives me a ton of virtual CD’s). If the software comes on a CD then where possible I take a CD and copy it to an ISO image and then mount the ISO image.&amp;#160; I store the CD’s in my CD case.&amp;#160; These are my biggest headache currently.&amp;#160; I am trying to get all my software digitally so I can get rid of the CD’s.&amp;#160; Sadly the biggest issue is the software CD’s for portability.&amp;#160; Sigh…&lt;/p&gt;  &lt;p&gt;Email and document storage is all courtesy of Google apps.&amp;#160; I have several gigs of email on Gmail and am quite happy with it.&amp;#160; Everything else is stored on my laptops and my passport.&amp;#160; This combination makes it very easy to have all my primary files available digitally.&amp;#160; Digital pictures I keep on a a 16gig SD card and then stored on the passport and the IPOD.&lt;/p&gt;  &lt;p&gt;So there you have it.&amp;#160; Over a year and most of my life is nothing but bits stored on local drives or in the cloud.&amp;#160; Kind of scary when I put it that way :-).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-5344577058093788312?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/5344577058093788312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=5344577058093788312' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/5344577058093788312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/5344577058093788312'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/08/news-from-mobile-front.html' title='News from the Mobile Front'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-458818039523618758</id><published>2009-07-12T22:58:00.003-06:00</published><updated>2009-07-12T22:58:59.426-06:00</updated><title type='text'>Sony Ebook Reader or a book shelf of half a million plus…</title><content type='html'>&lt;p&gt;I recently picked up a new gig in Portland at just about the same time as my Kindle died.&amp;#160; With the death of my Kindle I was looking for a new ebook reader.&amp;#160; The kindle2 was out but I really liked the specs on the KindleDX.&amp;#160; Problem was the DX was not going to be out for a while.&amp;#160; To aggravate the situation I now have a 45 minute commute into town on the train.&amp;#160; &lt;/p&gt;  &lt;p&gt;Now don’t get me wrong, the train is a great way to go.&amp;#160; No traffic and I get some exercise walking back and forth to the train station (2 miles a day).&amp;#160;&amp;#160; The problem is a 45 minute ride leaves me bored to tears.&amp;#160; My lifestyle is such that I no longer want to collect a ton of hardcover or paper back books.&amp;#160; I have over 5000 of these in storage in Idaho and don’t need anymore. The kindle worked great for me because all my books were digital and I could carry them around in my hand.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;I really wanted the DX, but those are all on back order and anyone who knows me knows I hate waiting for toys.&amp;#160; I decided to get a Sony PR700 series ebook reader for the short term.&amp;#160; I will still probably get a DX so I can read the Wall Street Journal on the way to work and because it is easier to read my PDF’s on.&lt;/p&gt;  &lt;p&gt;I have started to collect a lot of ebooks and wanted to switch to a standard format that I keep my main library in.&amp;#160; I have standardized on the &lt;a href="http://www.openebook.org/"&gt;epub&lt;/a&gt; format because it is a open standard that has no DRM.&amp;#160; This means I can easily play with books in that format using .NET since an epub is simply a zip file containg a standard set of files a content in html.&amp;#160; These files include:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;A xml file containing the bibliographic data for the publication (title, author, publisher, etc…) in &lt;a href="http://dublincore.org/"&gt;Dublin Core&lt;/a&gt; format &lt;/li&gt;    &lt;li&gt;A xml file containing the table of contents &lt;/li&gt;    &lt;li&gt;The contents of the publication in a series of html files &lt;/li&gt; &lt;/ol&gt;  &lt;ol&gt;So it is easy to build up a collection of EPUB files that are self contained and highly compressed.&amp;#160; The entire &lt;a href="http://www.gutenberg.org/"&gt;Gutenberg&lt;/a&gt; collection of 28000+ epub books takes less then 11 gig of space.&amp;#160; In addition, with Sony you have access to the entire Google library of over half a million public domain books (all in epub format).&amp;#160;&amp;#160;&amp;#160; I should stress here that it does not require a Sony reader to access this library.&amp;#160; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://oreilly.com/"&gt;OReilly&lt;/a&gt; is publishing their books in EPub, PDF and mobi (Kindle) format.&amp;#160; So if you want to read &lt;a href="http://oreilly.com/catalog/9780596521301/"&gt;Programming WCF Services&lt;/a&gt; on your Kindle, Sony or even IPhone it is easy enough to do.&amp;#160; &lt;/p&gt;  &lt;p&gt;Finally the relevance to the title above.&amp;#160; You can download any of Google’s Library of EPUB books easily without owning a Sony reader (say you want to read them with Stanza on your IPHONE).&amp;#160; To do this:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Download the Sony Reader from &lt;a title="http://ebookstore.sony.com/google-ebooks/" href="http://ebookstore.sony.com/google-ebooks/"&gt;http://ebookstore.sony.com/google-ebooks/&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Register with the site &lt;/li&gt;    &lt;li&gt;Click on the Unearth a Classic link on the far right &lt;/li&gt;    &lt;li&gt;Search Google books for books of interest &lt;/li&gt;    &lt;li&gt;Download those you want &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;You may also get free science fictions in EPUB/Stanza format from &lt;a href="http://www.baen.com/library/ "&gt;Baen books&lt;/a&gt;, and there are other source all over the net.&amp;#160; Almost all of Project Gutenberg is now available in EPUB format.&amp;#160; I will be posting a mass downloading utility for Gutenburg in a later post that allows you to download all 38,000 plus epub books from project Gutenburg.&amp;#160; &lt;/p&gt;  &lt;p&gt;So there you go.&amp;#160; EBooks have more then arrived, they have over run the competition :-).&amp;#160; Believe me my 40K+ ebook collection is much more portable then my 5000 book collection was (and is easier to search).&lt;/p&gt;  &lt;p&gt;The only drawback I have discovered so far is no EBook reader on the market today can handle the collection I have acquired.&amp;#160; So like any good developer I am writing my own.&amp;#160; More to come on that later.&lt;/p&gt;  &lt;p&gt;Darrel&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-458818039523618758?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/458818039523618758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=458818039523618758' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/458818039523618758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/458818039523618758'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/07/sony-ebook-reader-or-book-shelf-of-half.html' title='Sony Ebook Reader or a book shelf of half a million plus…'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-1419045108700027033</id><published>2009-05-16T15:19:00.001-06:00</published><updated>2009-05-16T15:19:43.490-06:00</updated><title type='text'>LINDUG: The LinkedIn .NET Users group</title><content type='html'>&lt;p&gt;If you do not make your regular user group meetings, or don’t have a user group in your area, you may want to join the &lt;a href="http://www.linkedin.com/groups?home=&amp;amp;gid=43315&amp;amp;trk=anet_ug_hm"&gt;Linked .NET Users Group&lt;/a&gt; on &lt;a href="http://www.linkedin.com"&gt;www.linkedin.com&lt;/a&gt;.&amp;#160; It is a virtual .NET Users group of 24,000+ members.&amp;#160; They sponsor webinars and have some decent discussions.&amp;#160; &lt;/p&gt;  &lt;p&gt;Some upcoming webinars include&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Scott Guthrie talks shop with developers, May 27, 11:30 AM PDT - &lt;a href="http://events.linkedin.com/LIDNUG-ScottGu-talks-shop-developers/pub/60571"&gt;http://events.linkedin.com/LIDNUG-ScottGu-talks-shop-developers/pub/60571&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Sara Ford talks about Open Source with CodePlex, June 21, 9:00 PM PDT - &lt;a href="http://events.linkedin.com/LIDNUG-Visual-Studio-Tips-Tricks-by-Sara/pub/65637"&gt;http://events.linkedin.com/LIDNUG-Visual-Studio-Tips-Tricks-by-Sara/pub/65637&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;For that matter you can always join the &lt;a href="http://www.linkedin.com/groups?about=&amp;amp;gid=67810&amp;amp;goback=%2Egdr_1242508108561_1"&gt;Elegant Code&lt;/a&gt; group on linked in.&amp;#160; If nothing else it keeps &lt;a href="http://www.linkedin.com/profile?viewProfile=&amp;amp;key=6846984&amp;amp;authToken=ZNHg&amp;amp;authType=name&amp;amp;goback=%2Egdr_1242508108561_1%2Eanb_67810_*2"&gt;David&lt;/a&gt; out of trouble :-).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-1419045108700027033?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/1419045108700027033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=1419045108700027033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/1419045108700027033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/1419045108700027033'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/05/lindug-linkedin-net-users-group.html' title='LINDUG: The LinkedIn .NET Users group'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-3631107860993157142</id><published>2009-04-17T08:51:00.001-06:00</published><updated>2009-04-17T08:51:24.810-06:00</updated><title type='text'>C Style operators in SQL Server 2008</title><content type='html'>&lt;p&gt;I started off my programming career developing C applications.&amp;#160; This was primarily because I did my work on Mini computers running UNIX.&amp;#160; Almost unheard of at the time :-).&amp;#160; For the first 14 years from 1982 to 1996 I developed my applications in C.&amp;#160; During that same time frame SQL came along for relational databases.&amp;#160; Now I had SQL, C and Embedded SQL for C.&amp;#160; Throw in curses for developing screen applications and what more could a developer want? :-).&lt;/p&gt;  &lt;p&gt;In late 1996 I began developing applications in Visual Basic 4, and found events.&amp;#160;&amp;#160; Very cool.&amp;#160; But I still missed some of the features I had grown to love in C.&lt;/p&gt;  &lt;p&gt;Recently I noticed the section on &lt;a href="http://msdn.microsoft.com/en-us/library/cc645922.aspx"&gt;compound operators&lt;/a&gt; in SQL Server 2008.&amp;#160; This is interesting since these are the first new operators added to SQL Server in at least the last 8 years.&amp;#160; SQL server 2005 and SQL server 2000 both had the same list of operators.&amp;#160; Now Microsoft has added some new ones.&amp;#160; In addition adding the BackSlash operator is just a nice little bonus (now if I could just get my ternary operator (?:)).&lt;/p&gt;  &lt;p&gt;I guess a good thing about starting my career developing C has been that all the new languages (including SQL server) are going back and picking up some of the concepts from C.&amp;#160; K&amp;amp;R should be proud :-).&lt;/p&gt;  &lt;p&gt;New expression operations in SQL Server 2008 Tranasact-SQL&lt;/p&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc627392.aspx"&gt;+= (Add EQUALS) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc645848.aspx"&gt;-= (Subtract EQUALS) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc627365.aspx"&gt;*= (Multiply EQUALS) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc627391.aspx"&gt;/= (Divide EQUALS) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd207007.aspx"&gt;\ (Backslash) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc645920.aspx"&gt;%= (Modulo EQUALS) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc627427.aspx"&gt;&amp;amp;= (Bitwise AND EQUALS) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc627409.aspx"&gt;|= (Bitwise OR EQUALS) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc627413.aspx"&gt;^= (Bitwise Exclusive OR EQUALS) (Transact-SQL)&lt;/a&gt; &lt;/li&gt;  &lt;li&gt;&lt;img src="http://i.msdn.microsoft.com/Global/Images/clear.gif" /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms173468.aspx"&gt;~ (Bitwise NOT) (Transact-SQL)&lt;/a&gt;    &lt;p&gt;&lt;/p&gt; &lt;/li&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-3631107860993157142?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/3631107860993157142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=3631107860993157142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3631107860993157142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3631107860993157142'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/04/c-style-operators-in-sql-server-2008.html' title='C Style operators in SQL Server 2008'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-4788967291655069012</id><published>2009-04-02T20:42:00.001-06:00</published><updated>2009-04-02T20:42:13.552-06:00</updated><title type='text'>Some Themes and a Little Crimson and Gray</title><content type='html'>&lt;a href="http://lh3.ggpht.com/_VciAuY3PV_s/SdV3goPnMmI/AAAAAAAAACI/BPkmNcozvYY/s1600-h/image%5B3%5D.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="121" alt="image" src="http://lh4.ggpht.com/_VciAuY3PV_s/SdV3hDC68uI/AAAAAAAAACM/OM6cshRu_Rw/image_thumb%5B1%5D.png?imgmax=800" width="244" border="0" /&gt;&lt;/a&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;   &lt;p&gt;I have been working on themes for WPF and Silverlight applications.&amp;#160; I found this one for SilverLight and WPF.&amp;#160; It is called shiny red.&amp;#160; Gotta love that.&amp;#160; Nice bit of crimson and gray.&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; As some of you know I am a bit of a WSU fan, so I love this theme.&amp;#160; They also have a couple of purple ones.&amp;#160; Needless to say I deleted those.&amp;#160; Pure evil they were… :-).    &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-4788967291655069012?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/4788967291655069012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=4788967291655069012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/4788967291655069012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/4788967291655069012'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/04/some-themes-and-little-crimson-and-gray.html' title='Some Themes and a Little Crimson and Gray'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-2209173598528568367</id><published>2009-03-19T01:32:00.001-06:00</published><updated>2009-03-19T01:32:52.460-06:00</updated><title type='text'>On Further Review…</title><content type='html'>Never mind.&amp;#160; Microsoft has a CTP of the 2.0 version of the Open XML SDK that does this much better.&amp;#160; Check out &lt;a title="http://www.microsoft.com/downloads/thankyou.aspx?familyId=c6e744e5-36e9-45f5-8d8c-331df206e0d0&amp;amp;displayLang=en" href="http://www.microsoft.com/downloads/thankyou.aspx?familyId=c6e744e5-36e9-45f5-8d8c-331df206e0d0&amp;amp;displayLang=en"&gt;http://www.microsoft.com/downloads/thankyou.aspx?familyId=c6e744e5-36e9-45f5-8d8c-331df206e0d0&amp;amp;displayLang=en&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-2209173598528568367?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/2209173598528568367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=2209173598528568367' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/2209173598528568367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/2209173598528568367'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/03/on-further-review.html' title='On Further Review…'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-3386350256969457152</id><published>2009-03-18T21:27:00.001-06:00</published><updated>2009-03-18T21:27:58.800-06:00</updated><title type='text'>Reading a Office 2007 docx file using C# and SharpZipLib</title><content type='html'>&lt;p&gt;I found myself needing to read a office 2007 docx file to get the xml of the document., so I went and got the ECMA spec for &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-376.htm"&gt;OfficeOpenXML&lt;/a&gt;. That is a heavy 1500 page heavy read :-).&amp;nbsp; So I decided to keep it handy and just write some code to see how bad it would be. So far it has not been as bad as I thought it would be so I thought I would post some code on it.&amp;nbsp; It has been a while since I have posted anything, so here goes.&lt;/p&gt; &lt;p&gt;The docx file is actually just a zip archive of a bunch of files.&amp;nbsp; The trick here is to read the zip and pull out the content.&amp;nbsp; I decided I wanted to load the data to a class hierarchy so I could do some Linq to objects work with it.&lt;/p&gt; &lt;p&gt;So I will start this with some simple code.&amp;nbsp; First the DocumentPart.cs class holds the document content and some information from it’s zip file.&amp;nbsp; The document content is stored as a linq to XML XDocument..&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Xml.Linq;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; OfficeOpenXML.Package&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; A document part in the OfficeOpenXML Package&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DocumentPart&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Name {&lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Comment { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;long&lt;/span&gt; CompressedSize { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; EntryDate { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;long&lt;/span&gt; Size { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt; Content { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 17&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 18&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;pre style="margin: 0px"&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style="margin: 0px"&gt;It is pretty basic so far (love those automatic properties).&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Now how do you read the zip file?&amp;nbsp; I use the &lt;a href="http://www.icsharpcode.net/OpenSource/SharpZipLib/"&gt;SharpZipLib&lt;/a&gt; to read the zip file and then store each member of the zip archive into a dictionary of DocumentPart with the filename as the Dictionary key. &lt;br /&gt;&lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Xml.Linq;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; ICSharpCode.SharpZipLib.Zip;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; OfficeOpenXML.Package&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Parts&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 11&lt;/span&gt;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;DocumentPart&lt;/span&gt;&amp;gt; DocumentParts { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; FilePath { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 14&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; OpenPackage(&lt;span style="color: blue"&gt;string&lt;/span&gt; filePath)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 16&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 17&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ZipEntry&lt;/span&gt; Entry;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 18&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt; contents;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 19&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt; XMLDocument;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 20&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;byte&lt;/span&gt;[] Buffer = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Byte&lt;/span&gt;[8192];&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 21&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;int&lt;/span&gt; bytesRead;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 22&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 23&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;ZipInputStream&lt;/span&gt; Package =&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 24&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ZipInputStream&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(filePath).BaseStream))&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 25&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 26&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;while&lt;/span&gt; ((Entry = Package.GetNextEntry()) != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 27&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 28&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XMLDocument = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StringBuilder&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 29&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;while&lt;/span&gt; ((bytesRead = Package.Read(Buffer, 0, Buffer.Length)) != 0)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 30&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 31&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XMLDocument.Append(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 32&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ASCIIEncoding&lt;/span&gt;.ASCII.GetString(Buffer, 0, bytesRead));&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 33&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 34&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; contents = &lt;span style="color: #2b91af"&gt;XDocument&lt;/span&gt;.Parse(XMLDocument.ToString());&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 35&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DocumentParts.Add(Entry.Name, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DocumentPart&lt;/span&gt;() &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 36&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { Name=Entry.Name, Size=Entry.Size, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 37&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Comment=Entry.Comment, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 38&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CompressedSize=Entry.CompressedSize, &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 39&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntryDate=Entry.DateTime, Content=contents });&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 40&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 41&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 42&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 43&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 44&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; Construct the class&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 46&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 47&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: gray"&gt;///&lt;/span&gt;&lt;span style="color: green"&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;param name="filePath"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;The office Open XML document&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 48&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; Parts(&lt;span style="color: blue"&gt;string&lt;/span&gt; filePath)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 49&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 50&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FilePath = FilePath;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 51&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DocumentParts = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;string&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;DocumentPart&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 52&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 53&lt;/span&gt;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 54&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;I use the using statement (on line 23) to handle the opening the docx file and then process the zip archive using the GetNextEntry.&amp;nbsp; The inner while loop (at line 28) reads the content of the entry into a string.&amp;nbsp; Finally while the DocumentParts.Add() adds the document dictionary.&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;A simple NUnit test (not exhaustive by any means) is: &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp; &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;using&lt;/span&gt; NUnit.Framework;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; OfficeOpenXML.UnitTests.Package&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4&lt;/span&gt; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af"&gt;TestFixture&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PartTests&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af"&gt;Test&lt;/span&gt;]&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; OpenPackageTest()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 11&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OfficeOpenXML.Package.&lt;span style="color: #2b91af"&gt;Parts&lt;/span&gt; p = &lt;span style="color: blue"&gt;new&lt;/span&gt; OfficeOpenXML.Package.&lt;span style="color: #2b91af"&gt;Parts&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 12&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p.OpenPackage(&lt;span style="color: #a31515"&gt;"../../TestData/AbilitiesandConditions.docx"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 13&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsTrue(p.DocumentParts.ContainsKey(&lt;span style="color: #a31515"&gt;"[Content_Types].xml"&lt;/span&gt;), &lt;span style="color: #a31515"&gt;"No Content_Types?"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 14&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;nbsp;&amp;nbsp; 16&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;In my next post I will show how to use the information from the [Content_Types].xml entry and the docsprops/app.xml and docprops/core.xml files to create an object that has information about the document being read (using some Linq to XML to populate the Class).&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Darrel&lt;/p&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-3386350256969457152?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/3386350256969457152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=3386350256969457152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3386350256969457152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3386350256969457152'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/03/reading-office-2007-docx-file-using-c.html' title='Reading a Office 2007 docx file using C# and SharpZipLib'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-2233997122445878384</id><published>2009-03-11T19:30:00.001-06:00</published><updated>2009-03-11T19:32:26.529-06:00</updated><title type='text'>Red, Green, Re-factor</title><content type='html'>&lt;p&gt;I find my self getting more and more into the test driven development paradigm.&amp;#160; I am working on some fairly heavy OO code with a great requirement specification (it is actually and ISO standard).&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;The application is growing pretty much via the unit tests.&amp;#160; Write the test, then make sure the code fits.&amp;#160; It is amazing how many times I am not sure how a piece of code is going to work so I just put together the unit test to fit the standard and then code the class.&amp;#160; I can then re-factor as needed.&lt;/p&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;p&gt;I am using the speech API’s to drive the interface so the speech api simply outputs a string of text that I can use to execute the program commands.&amp;#160; I wanted the program to be able to be both driven by speech commands and through the standard GUI approach.&amp;#160; Since I am working on a compiler, interpreter I have simply added the speech grammar as another grammar in the compiler.&amp;#160; .I will probably do the same to parse the command line options.&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;Makes for some interesting code :-).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-2233997122445878384?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/2233997122445878384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=2233997122445878384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/2233997122445878384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/2233997122445878384'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/03/red-green-re-factor.html' title='Red, Green, Re-factor'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-4976647765217294096</id><published>2009-03-10T16:31:00.001-06:00</published><updated>2009-03-10T16:31:14.455-06:00</updated><title type='text'>Not posting much lately</title><content type='html'>&lt;p&gt;I have been working on several projects.&amp;#160; They are starting to come to completion and I hope to post some more on them at the beginning of April.&amp;#160; I have also been busy with contracts and life in general, but I will get back to some posts in a few weeks.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-4976647765217294096?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/4976647765217294096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=4976647765217294096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/4976647765217294096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/4976647765217294096'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2009/03/not-posting-much-lately.html' title='Not posting much lately'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-5286076149565191291</id><published>2008-10-13T22:20:00.001-06:00</published><updated>2008-10-13T22:20:25.330-06:00</updated><title type='text'>Human Costs of a Bad Economy</title><content type='html'>&lt;p&gt;I have been traveling around the country for the past 90 days through the Midwest, the east coast and the south and staying in a lot of hotels.&amp;#160; Most recently my hotel in Daytona Beach.&lt;/p&gt;  &lt;p&gt;Now my hotel is right on the ocean.&amp;#160; In fact my balcony faces the ocean and the pool.&amp;#160; All in all not a bad place that I got for $32.50 a night.&amp;#160; Now Daytona Beach is a resort town.&amp;#160; All most all of the business here comes from the tourists.&amp;#160; With the state of the economy there are virtually no tourists around, the hotels and restaurants are getting almost no business.&amp;#160; Ditto for the tourist shops.&amp;#160; You can almost watch them close all up and down Atlantic Boulevard.&lt;/p&gt;  &lt;p&gt;As a geek I make pretty good money.&amp;#160; As a matter of fact I probably make more then any of the cooks, house keepers or shopkeepers around here.&amp;#160; it is sad when you hear some have cut back on hours to less then 20 hours a week.&amp;#160; I mean they already don't make that much and now they make half of that and most of them are not that well off.&lt;/p&gt;  &lt;p&gt;You can only hope it gets better soon for all of us.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-5286076149565191291?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/5286076149565191291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=5286076149565191291' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/5286076149565191291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/5286076149565191291'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/10/human-costs-of-bad-economy.html' title='Human Costs of a Bad Economy'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-3794665080450874990</id><published>2008-10-03T13:05:00.001-06:00</published><updated>2008-10-03T13:05:31.733-06:00</updated><title type='text'>Sunny Florida</title><content type='html'>&lt;p&gt;Well, I am the second elgant coder to be outside of the Boise, Id area.&amp;#160; I have moved to Florida and am currently camped in a hotel on Ormond Beach.&amp;#160; &lt;/p&gt;  &lt;p&gt;Although I enjoyed my 10 years in Boise it was time to move on.&amp;#160; After being riffed off from Micron I was pretty much at ends as to what was keeping me in Boise.&amp;#160; I had originally moved there in 1997 to be around my mom.&amp;#160; After she died in 2003 there was little keeping me in Boise except for momentum.&amp;#160; I had no real reason to change.&amp;#160; Micron's layoffs gave me a good reason to think about moving on.&lt;/p&gt;  &lt;p&gt;I have always wanted to see a shuttle launch and wanted to be around a ocean again.&amp;#160; So with those two criteria Florida was really the only choice.&amp;#160;&amp;#160; I spent two months driving across America seeing family I had not caught up with in years.&amp;#160; In addition I spent some time just seeing the country.&amp;#160; Something I have wanted to do for years.&amp;#160; I traveled 9000 miles in 60 days and went from one end of the country to the other.&amp;#160; A great trip for me and the cat (although I am not sure the cat would agree :-)).&amp;#160; I will be posting some blog entries about the trip over the next few weeks.&lt;/p&gt;  &lt;p&gt;For now I am planning on staying on Florida for a while.&amp;#160; I will start looking for full time work next week.&amp;#160; I am excited about the change and looking forward to some new challenges.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-3794665080450874990?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/3794665080450874990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=3794665080450874990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3794665080450874990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3794665080450874990'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/10/sunny-florida.html' title='Sunny Florida'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-3339854074702800737</id><published>2008-07-12T04:27:00.001-06:00</published><updated>2008-07-12T04:27:20.351-06:00</updated><title type='text'>The Tablet PC</title><content type='html'>&lt;p&gt;I recently took a tumble (anyone who knows me will tell you I am clumsy) and hurt my right arm. Needless to say this is not good if you and a computer geek. Fortunately at the same time I was trading out my Dell 1720 for a new dell lattitude XT. So I am actually writing this blog entry. Literally! I am using the handwriting recognition features of the tablet PC.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;   &lt;p&gt;So far I am very impressed. The tablet does a better job reading my handwriting they some of my friends do (hi joe!). It is interesting that it reads my writing better then my printing. For some reason all those years I actually thought my printing was easier to read then my writing. Guess I was wrong. I am pretty sure I actually can write faster than I can type.&amp;#160; This as is kind of sad knowing ] have made my living writing computer programs for the last 30 years.&lt;/p&gt; &lt;/p&gt; I will have to bring up my visual studio 2008 environment and see how easy it is to code this way. l should point out I am doing this all on Vista Ultimate. I did not like Tablet XP any where as much as Vista.  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-3339854074702800737?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/3339854074702800737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=3339854074702800737' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3339854074702800737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3339854074702800737'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/07/tablet-pc.html' title='The Tablet PC'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-3260032422261762429</id><published>2008-06-28T23:57:00.001-06:00</published><updated>2008-06-28T23:57:34.264-06:00</updated><title type='text'>Steve and Bill On-Stage</title><content type='html'>&lt;p&gt;In case you have not seen any of these videos of &lt;a href="http://blog.wired.com/cultofmac/2007/05/video_steve_and.html"&gt;Bill Gates and Steve Jobs on Stage&lt;/a&gt; talking about our industry past, present and future.&amp;#160; A fascinating discussion.&lt;/p&gt;  &lt;p&gt;Paraphrasing a classic comment from Gates.&amp;#160; We want a computer in every home.&amp;#160; We never thought about the fact that we would have to be a BIG company to do that...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-3260032422261762429?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/3260032422261762429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=3260032422261762429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3260032422261762429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3260032422261762429'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/06/steve-and-bill-on-stage.html' title='Steve and Bill On-Stage'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-1507170605823781227</id><published>2008-06-23T23:55:00.001-06:00</published><updated>2008-06-23T23:55:36.786-06:00</updated><title type='text'>Gates is the Rockefeller of our times</title><content type='html'>&lt;p&gt;Interesting article on MSN on &lt;a href="http://www.msnbc.msn.com/id/25332025/"&gt;Bill Gates&lt;/a&gt; and how his foundation is changing philanthropy today.&amp;#160; He will give away more money then Rockefeller did at the beginning of the century.&amp;#160; How will this change education and medicine in the next few years?&amp;#160; For example the Gates foundation is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;..a foundation whose combined assets will one day exceed the budgets of all but 30 percent of the countries in the world&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Talk about having to learn how to scale :-).&amp;#160; I it will be interesting to see how he takes on this challenge.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-1507170605823781227?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/1507170605823781227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=1507170605823781227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/1507170605823781227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/1507170605823781227'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/06/gates-is-rockefeller-of-our-times_23.html' title='Gates is the Rockefeller of our times'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-4236781860793691074</id><published>2008-04-15T04:56:00.005-06:00</published><updated>2008-04-15T05:04:34.470-06:00</updated><title type='text'>Am I asking for too much?</title><content type='html'>&lt;p&gt;I am currently participating in a interesting thread on Matt Berther’s bog on my podcast. I commented on his post &lt;a href="http://www.mattberther.com/2008/04/07/blasting-open-source/"&gt;Blasting open source&lt;/a&gt; because I felt my podcast was not meant to pick on up source projects although part of it could be interpreted that way. So since then what I have been explaining is why I don’t see any innovation happening in software today.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Although I like .NET and Java I think there has been no real innovation in software in the last 30 years. The primary things I see as the backbones of what we use computers for are:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Databases - CODASYL defined the standard for network databases in 1969 (RDMBS were first described by Codd in the 1960’s and 70’s at IBM) &lt;/li&gt;&lt;li&gt;Word Processing - The Unix Concepts of text formatting for publishing came around in the 1970’s (as a matter of fact UNIX was first designed as a text editing and text formatting system). Although UNIX text processing is much more akin to HTML then WYSIWYG editors like MS Word &lt;/li&gt;&lt;li&gt;Spreadsheets - First patented in 1971, VisiCalc was actually being distributed for the Apple II in 1979 &lt;/li&gt;&lt;li&gt;General Programming via high level Languages -&lt;br /&gt;a) Interpreted Languages (If you want the full deal Smalltalk was around in the 1970’s. Object oriented, dynamically typed and reflective)&lt;br /&gt;b) Compiled Languages (Cobol was created in 1959 and C in 1972) &lt;/li&gt;&lt;li&gt;WIMP Interfaces - (Pioneered by the Xerox Alto in 1973) &lt;/li&gt;&lt;li&gt;The Internet which started in 1969. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;So if you take as a baseline of 1980 we have had these systems around for at least 28 years. Most have been around longer. Sadly I have been programming for 30 years so I have played with some of these at one time or another in my career. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Do I expect too much? I can’t help but see the feature set of these products though and say that on the whole the pace of innovation in computers disappoints me. Those advances we do see to have picked up come about more because of hardware advances then software advances. As Brooks says in No Silver Bullet&lt;/p&gt;&lt;p&gt;&lt;strong&gt;…the anomaly is not that software progress is so slow, but that computer hardware progress is so fast.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As I see it we continue to attack the accidents of software engineering. I quote from Brooks&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;If we examine the three steps in software technology development that have been most fruitful in the past, we discover that each attacked a different major difficulty in building software, but that those difficulties have been accidental, not essential, difficulties.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The three that he describes include:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;• High Level Languages. Now this would include java and C#.&lt;br /&gt;• Time Sharing.&lt;br /&gt;Now this would be the entire concept or personal computers, laptops, PDA’s etc…&lt;br /&gt;essentially ways to get the answer immediately.&lt;br /&gt;• Unified frameworks. Here&lt;br /&gt;he talks about UNIX, but you can also include in this the .NET framework and the&lt;br /&gt;Java class libraries.&lt;/blockquote&gt;&lt;p&gt;So my contention is that one of the reasons software innovation is so slow is we spend too much time reinventing what we have had since the 1970’s and not focusing on advancing the art of computer science. Am I wrong? So many of the things we see in the Open Source and Commercial World are clones of each other. Are we as developers taking the simple way out? Sure we can design a new enhanced WIMP interface, but that is because we already know most of the requirements except for that little tweak we are going to make? It is fun to do these kinds of projects because we don’t have to think about the hard stuff like requirements analysis, test cases and design. We just set down and code another build system, or IOC Container or OS.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;We continue to attack the accidents because the essentials are so difficult. I was doing some reading on the System.Speech namespace in .NET and Natural Language Processing in general. One of the big things required to get these to work is to put together grammars for what we want the computer to do once it has recognized the words. The problem is almost no one is building the grammars. Why is that? Because it is hard. It would require us to step outside of the fun and simple things we do and take on some difficult tasks. The same thing could be said for coming up with systems that use common component architecture. How much simple would things be if we started building components and plugging them into applications. As David said in my Podcast, I want to drag and drop a CRM solution.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;What does it take to get to these? We have to give up on some of the fun things we do and start attacking the essential problems in software development. Am I expecting too much? Are we as Software Engineers unable to tackle our discipline as a engineering science and start innovating again?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;** Portions of this entry were posted a a comment on Matt’s blog ***&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-4236781860793691074?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/4236781860793691074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=4236781860793691074' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/4236781860793691074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/4236781860793691074'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/04/am-i-asking-for-too-much.html' title='Am I asking for too much?'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-3092071616884421900</id><published>2008-04-14T18:00:00.001-06:00</published><updated>2008-04-14T18:00:39.729-06:00</updated><title type='text'>Founding Brothers</title><content type='html'>&lt;p&gt;A friend of mine, &lt;a href="http://www.linkedin.com/pub/1/a27/1aa" target="_blank"&gt;Chuck Steffens&lt;/a&gt;, has convinced me to start reading &lt;b&gt;&lt;a href="http://www.amazon.com/gp/product/B000FBJF32/ref=yml_dp" target="_blank"&gt;Founding Brothers: The Revolutionary Generation&lt;/a&gt; &lt;/b&gt;by &lt;a href="http://www.amazon.com/s?ie=UTF8&amp;amp;search-type=ss&amp;amp;index=digital-text&amp;amp;field-author=Joseph%20J.%20Ellis"&gt;Joseph J. Ellis&lt;/a&gt;.&amp;#160; I must say this is a fascinating look at American history.&amp;#160; Specifically the time of the American Revolution and the founding of the republic.&amp;#160; I will do a book review in the next few days, but so far (up to chapter 3) it is a great read.&lt;/p&gt;  &lt;p&gt;I downloaded it to my Kindle last night at midnight and started reading it.&amp;#160; The only thing I can say about the kindle is I am glad they don't have a ton of Computer Books available on it yet.&amp;#160; I would go broke every time I went to amazons web site. :-).&amp;#160; The science fiction and historical stuff us costing me a fortune.&amp;#160; On the plus side I have finally started to read &lt;a href="http://www.amazon.com/s?ie=UTF8&amp;amp;search-type=ss&amp;amp;index=digital-text&amp;amp;field-author=Winston%20Churchill"&gt;Winston Churchill&lt;/a&gt;'s series on World War II after having owned the books for years.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-3092071616884421900?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/3092071616884421900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=3092071616884421900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3092071616884421900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3092071616884421900'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/04/founding-brothers.html' title='Founding Brothers'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-8648153988908860902</id><published>2008-04-08T01:13:00.001-06:00</published><updated>2008-04-08T01:13:57.925-06:00</updated><title type='text'>Google App Engine</title><content type='html'>&lt;p&gt;I just ran into a reference for this.&amp;#160; It looks pretty cool.&amp;#160; Develop your application offline and then deploy it to the Google servers.&amp;#160; The man page is at &lt;a title="http://code.google.com/appengine/" href="http://code.google.com/appengine/"&gt;http://code.google.com/appengine/&lt;/a&gt;.&amp;#160; &lt;/p&gt;  &lt;p&gt;I have been meaning to play with Python and Iron Python.&amp;#160; I have just never had a reason beyond curiosity.&amp;#160; Now it looks like it might be worth learning.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-8648153988908860902?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/8648153988908860902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=8648153988908860902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/8648153988908860902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/8648153988908860902'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/04/google-app-engine.html' title='Google App Engine'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-3678699642212858730</id><published>2008-04-03T03:28:00.001-06:00</published><updated>2008-04-03T03:28:59.187-06:00</updated><title type='text'>Mono 1.9 is Released</title><content type='html'>&lt;p&gt;Mono 1.9 is released.&amp;#160; This is the last version before 2.0 which supports the entire 2.0 version of .NET on Linux.&amp;#160; This version also supports some C# 3.0 features including Linq to XML and Linq to Objects.&amp;#160; Very Cool    &lt;br /&gt;&lt;a href="http://www.go-mono.com/mono-downloads/download.html"&gt;http://www.go-mono.com/mono-downloads/download.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;They have also released the Mono Develop IDE.&amp;#160; Full support in an IDE very similar to Visual Studio.&amp;#160; &lt;br /&gt;&lt;a href="http://www.monodevelop.com/Main_Page" target="_blank"&gt;http://www.monodevelop.com/Main_Page&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Checkout the screen capture with their integration with NUnit&lt;/p&gt;  &lt;p&gt;&lt;a title="http://www.monodevelop.com/Image:Nunitmain.png" href="http://www.monodevelop.com/Image:Nunitmain.png"&gt;http://www.monodevelop.com/Image:Nunitmain.png&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-3678699642212858730?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/3678699642212858730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=3678699642212858730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3678699642212858730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/3678699642212858730'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/04/mono-19-is-released_03.html' title='Mono 1.9 is Released'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-7849438418973382878</id><published>2008-04-01T09:01:00.001-06:00</published><updated>2008-04-01T09:01:46.020-06:00</updated><title type='text'>It is all about Portability...</title><content type='html'>&lt;p&gt;As cell phones get more and more powerful, you wonder how soon they replace laptops.&amp;#160; Primary thing missing are good keyboards, mice, decent size monitors, better performance and memory.&amp;#160; The Windows CE development environment is there already.&amp;#160; So let's take a look at these one at a time...&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Now I can get a &lt;a href="http://www.amazon.com/SanDisk-Standard-SDHC-Card-SDSDB-8192-A11/dp/B00138X65O/ref=sr_1_2?ie=UTF8&amp;amp;s=photo&amp;amp;qid=1207060506&amp;amp;sr=1-2" target="_blank"&gt;8 gig memory card from SanDisk&lt;/a&gt; for about $50.&amp;#160; This kind of makes me wonder.&amp;#160; How much document memory etc do you need? &lt;/li&gt;    &lt;li&gt;Now for keyboards I can get any number of &lt;a href="http://www.amazon.com/s/ref=nb_ss_e/105-1218050-1510807?url=search-alias%3Delectronics&amp;amp;field-keywords=bluetooth+laser+keyboard" target="_blank"&gt;virtual keyboards&lt;/a&gt; although the support looks a bit shaky. &lt;/li&gt;    &lt;li&gt;For Mice can I use any standard Bluetooth mouse? &lt;/li&gt;    &lt;li&gt;Now here comes a &lt;a href="http://www.nytimes.com/2008/03/30/business/30novelties.html?_r=2&amp;amp;ex=1364788800&amp;amp;en=93ccf5ccd46fa67d&amp;amp;ei=5088&amp;amp;partner=rssnyt&amp;amp;emc=rss&amp;amp;oref=slogin&amp;amp;oref=slogin" target="_blank"&gt;projection system&lt;/a&gt;.&amp;#160; Is this a possible replacement for the monitor? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Mind you,&amp;#160; none of these are that great now, but with cell phone providers adding more and more content to the phone and revenue from voice communications stabilizing you will probably see cell phone providers going after any source of revenue they can find.&amp;#160; Of course I don't think I will see Visual Studio there anytime soon, but who knows?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-7849438418973382878?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/7849438418973382878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=7849438418973382878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/7849438418973382878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/7849438418973382878'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/04/it-is-all-about-portability.html' title='It is all about Portability...'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-8689793345783240042</id><published>2008-03-30T01:54:00.001-06:00</published><updated>2008-03-30T01:54:40.458-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silver Bullet'/><category scheme='http://www.blogger.com/atom/ns#' term='Accidental Properties of Software'/><title type='text'>Accidental Properties of Software: Programmer Productivity</title><content type='html'>&lt;p&gt;While researching for these articles I ran across this &lt;a href="http://t-a-w.blogspot.com/2007/02/yanniss-law-programmer-productivity.html" target="_blank"&gt;blog&lt;/a&gt; entry describing something the author refers to as &lt;a href="http://www.cs.uoregon.edu/~yannis/law.html" target="_blank"&gt;Yannis's Law: Programmer Productivity Doubles Every 6 Years&lt;/a&gt;.&amp;#160; The whole premise of the article is to dispute Brooks statement that there will be no &lt;a href="http://en.wikipedia.org/wiki/Orders_of_magnitude" target="_blank"&gt;order of magnitude&lt;/a&gt; improvement in the essential properties of software development.&amp;#160; The author goes on to prove that programmers are seeing a 11x improvement in software development since 1986.&amp;#160; There are two places this assessment is wrong.&amp;#160; First Brooks was looking for an order of Magnitude improvement in 10 years (by 1996) not 21 years (2007).&amp;#160; Second this is an attack on the accidental property of software (it's construction), not the essence of software, the mental crafting of the conceptual construct.&lt;/p&gt;  &lt;p&gt;I do not dispute there are a great many cool tools and languages out there to increase programmer productivity, but we should all have seen the breakdown of the Software Development Life Cycle by now.&amp;#160; How much of the SDLC is related to software construction?&amp;#160; If we say it is 30% (which is probably a bit high) we are still looking at over 70% of the project time that is not being addressed by this improvement.&amp;#160; As we reduce the construction time to zero (which would be magic :-)), we are still only attacking the accidental properties of software.&amp;#160; What are we going to do about the other 70%?&amp;#160; We have still not addressed the essential property.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-8689793345783240042?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/8689793345783240042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=8689793345783240042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/8689793345783240042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/8689793345783240042'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/03/accidental-properties-of-software.html' title='Accidental Properties of Software: Programmer Productivity'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-2931317551529113797</id><published>2008-03-29T16:08:00.001-06:00</published><updated>2008-03-29T16:09:07.139-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silver Bullet'/><category scheme='http://www.blogger.com/atom/ns#' term='Essentail Properties of Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Accidental Properties of Software'/><title type='text'>Attacks on the Accidental and Essential Properties of Software</title><content type='html'>&lt;p&gt;Over the next several months I will be posting articles that discuss various aspects of software and the state of the industry. These will be titled as either attacks on the essential properties of software or the accidental properties of software as defined by Brooks in my post &lt;a href="http://elegantcode.com/2008/03/15/everything-i-ever-wanted-to-know-about-agile-development-i-learned/"&gt;I first learned about Agile Development&amp;#8230;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Brooks went on to provide a clearer definition of Accidental and Essential Properties in &lt;em&gt;No Silver Bullet Refired&lt;/em&gt; (Chapter 17 of &lt;em&gt;the Mythical Man Month&lt;/em&gt;).&amp;#160; In particular Brooks uses Dorothy Sayers definition of creativity:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;instead I follow the English&amp;#160; dramatist, detective story writer, and theologian&amp;#160; Dorothy Sayers in seeing all creative activity to&amp;#160; consist of (1) the formulation of the conceptual&amp;#160; constructs, (2) implementation in real media, and&amp;#160; (3) interactivity with users in real uses.[6] The part&amp;#160; of software building I called essence is the mental&amp;#160; crafting of the conceptual construct; the part I&amp;#160; called accident is its implementation process.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The goal is to try to discuss the progress towards a silver bullet for software development. These are my thoughts on progress in the methodologies and tools to make developing software easier. These are things we are doing as an industry to attack the Essential properties of Software. There are also that are just white noise interesting, fun and useful, but in the end just attacks on the accidental properties of software and have no real impact on our ability to &lt;strong&gt;quickly&lt;/strong&gt; create quality software that attacks the essence of building software, or as Brooks says:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;I believe the hard part of building software to be the specification, design, and testing of this conceptual construct, not the labor of representing it and testing the fidelity of the representation. We still make syntax errors, to be sure; but they are fuzz compared with the conceptual errors in most systems. &lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;If this is true, building software will always be hard. There is inherently no silver bullet.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So lets look around for what we have done in the last twenty years to attack the essential properties of software and progress towards the silver bullet of software (from the essay &lt;a href="http://www.lips.utexas.edu/ee382c-15005/Readings/Readings1/05-Broo87.pdf"&gt;No Silver Bullet&lt;/a&gt; written in 1986).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-2931317551529113797?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/2931317551529113797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=2931317551529113797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/2931317551529113797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/2931317551529113797'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/03/attacks-on-accidental-and-essential_29.html' title='Attacks on the Accidental and Essential Properties of Software'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-6611006636035345782</id><published>2008-03-17T07:12:00.002-06:00</published><updated>2008-03-17T07:17:35.843-06:00</updated><title type='text'>Taking the Library Digital...</title><content type='html'>I have been collecting books for over 40 years.  So now I have about 400 Technical books.  As for the Fiction I have almost 5000 volumes of those.  Ran out of wall space in the house and the garage last year.&lt;br /&gt;&lt;br /&gt;One of the reasons I picked up my kindle was to reduce the amount of paper I was throwing away.  I went to getting a online subscription of the Wall Street Journal.  Downloads everyday and no paper to throw away.  I also have started picking up the classics off project gutenburg, new ebooks from baen and fictionwise.  Up to 400 or so books on the kindle.&lt;br /&gt;&lt;br /&gt;I am currently reading some fiction,&lt;br /&gt;·         Fatal Revenant by Stephen Donaldson&lt;br /&gt;·         Myth-Gotten Gains (Myth Adventures) by Robert Asprin and Jody Lynn Nye&lt;br /&gt;&lt;br /&gt;I have started buying my technical books as pdf's so I am reading&lt;br /&gt;·         Pro LINQ: Language Integrated Query in C# 2008&lt;br /&gt;·         Client-Side Reporting with Visual Studio in C#&lt;br /&gt;·         Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition&lt;br /&gt;&lt;br /&gt;I also switched to getting my Music (over 10,000 tracks) as MP3 downloads from amazon and My dvd's through Amazon Unbox to save space.  The only disadvantage I see so far to going digital on this stuff is I am using over 100GB for Music, 450GB  for  ~700 movies and TV shows and ~5GB for electronic books.  I am trying to find out if I can put a 8GB Sd card my kindle now and I think I will try to pickup a MS Home Server from HP to supplement my 1TB World books.&lt;br /&gt;&lt;br /&gt;Now I just need something like this &lt;a href="http://www.engadget.com/2008/03/05/buffalos-linkstation-mini-packs-1tb-into-entirely-too-small-an/"&gt;http://www.engadget.com/2008/03/05/buffalos-linkstation-mini-packs-1tb-into-entirely-too-small-an/&lt;/a&gt; to carry around some of my digital collection with my laptop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-6611006636035345782?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/6611006636035345782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=6611006636035345782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/6611006636035345782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/6611006636035345782'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/03/taking-library-digital.html' title='Taking the Library Digital...'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-7740152837792918699</id><published>2008-03-15T01:28:00.001-06:00</published><updated>2008-03-15T01:34:02.947-06:00</updated><title type='text'>I first learned about Agile Development...</title><content type='html'>&lt;p&gt;From the essay &lt;a href="http://www.lips.utexas.edu/ee382c-15005/Readings/Readings1/05-Broo87.pdf" target="_blank"&gt;No Silver Bullet&lt;/a&gt; written in 1986.&amp;#160; Many of the principles described in this essay apply to the last 60+ years of Software development from the days of the &lt;a href="http://en.wikipedia.org/wiki/ENIAC" target="_blank"&gt;ENIAC&lt;/a&gt;.&amp;#160;&amp;#160; For example the concepts for constructing software are based on a comment from 1958!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;,&amp;#160; What follows is a fairly long discussion of things I have learned while developing software for the last 30 years.&amp;#160; I started writing software when I was a senior in high school in 1978.&amp;#160; I am still writing software and designing systems today.&amp;#160; Most of this blog entry is based on an essay written&amp;#160; by &lt;a href="http://en.wikipedia.org/wiki/Fred_Brooks" target="_blank"&gt;Fredrick P. Brooks&lt;/a&gt; in 1986.&amp;#160; He also wrote the &lt;a href="http://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1205564463&amp;amp;sr=8-1" target="_blank"&gt;The Mythical Month&lt;/a&gt; in 1975 and it is still a great read. Believe me most of what Brooks says in the &lt;em&gt;Mythical Man Month&lt;/em&gt; applied to my first&amp;#160; 8 years of programming as much as it applies today.&amp;#160; Brooks original &lt;em&gt;Mythical Man Month&lt;/em&gt; is based on developing an OS at IBM in the 1960's but ignore that and look at the principals.&amp;#160; There have been other authors who have expanded on what Brook's had to say in the original 15 chapters of this book but Brooks said it first.&amp;#160; Why do you think the primary law of project management is called &lt;a href="http://en.wikipedia.org/wiki/Brooks_Law" target="_blank"&gt;Brooks's Law&lt;/a&gt;?&lt;/p&gt;  &lt;p&gt;Two additional essays from Brooks, &lt;em&gt;No Silver Bullet&lt;/em&gt; and &lt;em&gt;Silver Bullet Re-fired&lt;/em&gt; were added to the 25th Anniversary addition of the Mythical Man Month.&amp;#160; &lt;em&gt;No silver Bullet&lt;/em&gt; was written in 1986 (over 20 years ago and 8 years after I started writing software).&amp;#160; This is the essay I want to talk about now.&amp;#160;&amp;#160; All quotes from &lt;em&gt;No Silver Bullet&lt;/em&gt; are in &lt;em&gt;&lt;strong&gt;Bold Itallics.,&lt;/strong&gt;&lt;/em&gt; &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;...the anomaly is not that software progress is so slow, but that computer hardware progress is so fast.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Essential Properties of Software&lt;/h3&gt;  &lt;p&gt;The essence of a software entity is a construct of interlocking concepts, &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;I believe the hard part of building software to be the specification, design, and testing of this conceptual construct, not the labor of representing it and testing the fidelity of the representation. We still make syntax errors, to be sure; but they are fuzz compared with the conceptual errors in most systems. &lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;If this is true, building software will always be hard. There is inherently no silver bullet.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Software is also essentially complex.&amp;#160; When a software architect models a system they must take this into account so that the Software Models do not obscure this essential property.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;The complexity of software is an essential property, not an accidental one. Hence, descriptions of a software entity that abstract away its complexity often abstract away its essence. For three centuries, mathematics and the physical sciences made great strides by constructing simplified models of complex phenomena, deriving properties from the models, and verifying those properties by experiment. This paradigm worked because the complexities ignored in the models were not the essential properties of the phenomena. It does not work when the complexities are the essence.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So what are some of the essential properties of software?&lt;/p&gt;  &lt;p&gt;First software must conform to business processes and institutions.&amp;#160; This adds to the complexity of software because the requirements of conformity are based on Business processes that do not always make sense or are not as clearly defined as the principles of other disciplines (such as physics).&amp;#160; So much of the complexity a software designer faces is a arbitrary complexity...&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;Much of the complexity that he must master is arbitrary complexity, forced without rhyme or reason by the many human institutions and systems to which his interfaces must conform.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;&lt;strong&gt;...in all cases, much complexity comes from conformation to other interfaces; this complexity cannot be simplified out by any redesign of the software alone.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Many large Enterprise Systems are just now beginning to try to tackle this.&amp;#160; Business Process reengineering targets the business process itself, not the software that implements the business process.&amp;#160;&amp;#160; Essentiality though this is just an attempt to do better requirements analysis and help to reduce the arbitrary complexity of software.&amp;#160; This complexity is not addressed by re-factoring code.&amp;#160; It is a essential property of the software.&lt;/p&gt;  &lt;p&gt;Another essential property of successful software is that it changes:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;All successful software gets changed. Two processes are at work. First, as a software product is found to be useful, people try it in new cases at the edge of or beyond the original domain. The pressures for extended function come chiefly from users who like the basic function and invent new uses for it.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Brooks goes onto describe another essential property of software.&amp;#160; It is invisible&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;As soon as we attempt to diagram software structure, we find it to constitute not one, but several, general directed graphs superimposed one upon another. The several graphs may represent the flow of control, the flow of data, patterns of dependency, time sequence, name-space relationships.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Many Enterprise Architecture tools demonstrate this truth.&amp;#160; In fact the entire premise of UML demonstrates this.&amp;#160; We have Class Diagrams, Component Diagrams, Sequence diagrams, etc.. all designed to help us try to visualize software.&amp;#160; These all succeed and fail to some degree because invisibility is a essential property of software.&lt;/p&gt;  &lt;h3&gt;Accidental Properties of Software&lt;/h3&gt;  &lt;p&gt;Brooks goes on to describe technology advances that attack the accidental part of software development&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;If we examine the three steps in software technology development that have been most fruitful in the past, we discover that each attacked a different major difficulty in building software, but that those difficulties have been accidental, not essential, difficulties.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The three that he describes include:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;High Level Languages.&amp;#160; Now this would include java and C#. &lt;/li&gt;    &lt;li&gt;Time Sharing.&amp;#160; Now this would be the entire concept or personal computers, laptops, PDA's etc...&amp;#160; essentially ways to get the answer immediately. &lt;/li&gt;    &lt;li&gt;Unified frameworks.&amp;#160; Here he talks about UNIX, but you can also include in this the .NET framework and the Java class libraries. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I find this section really amusing&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;Operating systems, loudly decried in the 1960's for their memory and cycle costs, have proved to be an excellent form in which to use some of the MIPS and cheap memory bytes of the past hardware surge&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;How often do you hear the cry that windows is bloated and overgrown but UNIX is lean and mean.&amp;#160; This battle has been going on for over 45 years with no end in site.&amp;#160; For all of you who continue in these debates know that the next 45 years will probably continue in the same way.&amp;#160; We will simply substitute a different OS name and battle on...&lt;/p&gt;  &lt;h3&gt;Hopes for the Silver Bullet&lt;/h3&gt;  &lt;p&gt;This is a interesting section.&amp;#160; See how many of these concepts seem familiar&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;High Level Languages advances.&amp;#160; We have all blogged about the neat new features in C#.&amp;#160;&amp;#160; So 25 years ago it was the neat new features of Ada... &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;Ada not only reflects evolutionary improvements in language concepts, but indeed embodies features to encourage modern design and modularization. Perhaps the Ada philosophy is more of an advance than the Ada language, for it is the philosophy of modularization, of abstract data types, of hierarchical structuring.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Object Oriented Design.&amp;#160; Have you seen an order of magnitude change by adopting C# or .Net in general? &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;An order-of-magnitude gain can be made by object-oriented programming only if the unnecessary type-specification underbrush still in our programming language is itself nine-tenths of the work involved in designing a program product. I doubt it.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Artificial Intelligence.&amp;#160; It is interesting that Brooks breaks out this section into two separate sections.&amp;#160; His comments on speech recognition and image recognition are very true today.&amp;#160; One of the essential problems in speech recognition is not recording what you say, but understanding what you mean. &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;The techniques used for speech recognition seem to have little in common with those used for image recognition, and both are different from those used in expert systems. I have a hard time seeing how image recognition, for example, will make any appreciable difference in programming practice. The same problem is true of speech recognition. The hard thing about building software is deciding what one wants to say, not saying it. No facilitation of expression can give more than marginal gains.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Expert systems. The most advanced part of the artificial intelligence art, and the most widely applied, is the technology for building expert systems.&amp;#160; The next section discusses why mentoring is so important for Architects and Senior Software Developers today since we have yet to build an expert system to do this for us. &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;The essential prerequisite for building an expert system is to have an expert. The most powerful contribution by expert systems will surely be to put at the service of the inexperienced programmer the experience and accumulated wisdom of the best programmers. This is no small contribution. The gap between the best software engineering practice and the average practice is very wide_perhaps wider than in any other engineering discipline.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Automatic Programming.&amp;#160; What we could term as code generation today still has not achieved the goal of being able to state the problem and have the computer just solve it for you.&amp;#160; Business Process Execution Languages are the latest attempt at this. But I still agree with Brooks when he says this about code generators &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;It is hard to see how such techniques generalize to the wider world of the ordinary software system, where cases with such neat properties are the exception. It is hard even to imagine how this breakthrough in generalization could occur.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Graphical Programming.&amp;#160; Brooks has some interesting comments on software diagrams (Read UML and generating code from UML diagrams).&amp;#160; I believe many of these apply just as easily to software developed today. How man times have you generated the class diagram from the existing code instead of the other way around? &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;Nothing even convincing, much less exciting, has yet emerged from such efforts. I am persuaded that nothing will.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;Brooks goes on to say:&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;In the pitiful, multipage, connection-boxed form to which the flowchart has today been elaborated, it has proved to be useless as a design tool--programmers draw flowcharts after, not before, writing the programs they describe&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Program Verification.&amp;#160; In the simplest form this is a way to have the tests match the requirements (as &lt;a href="http://elegantcode.com/2008/02/05/the-tests-are-the-requirements/" target="_blank"&gt;David&lt;/a&gt; put it).&amp;#160; In a broader form it is to verify program program correction overall.&amp;#160; To many times we take this as Unit testing and think if we have 100% code coverage on our Unit Tests we are golden.&amp;#160; Scott Hanselman has a two great podcasts that address this myth &lt;a href="http://hanselminutes.com/default.aspx?showID=121" target="_blank"&gt;here&lt;/a&gt; and &lt;a href="http://www.hanselman.com/blog/HanselminutesPodcast93PexWithJonathanPeliDeHalleuxAndNikolaiTillmann.aspx" target="_blank"&gt;here&lt;/a&gt;.&amp;#160; The root of this is as Brooks says, &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;More seriously, even perfect program verification can only establish that a program meets its specification. The hardest part of the software task is arriving at a complete and consistent specification, and much of the essence of building a program is in fact the debugging of the specification.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;Environments and tools.&amp;#160; Surely integrated development environments are the answer to better programs, right?&amp;#160; Although I would not want to give up Visual Studio, the interesting thing is Brooks saw those developments coming 20 years ago and still did not see them as that important even today integrated debuggers are now decried as less useful then unit tests by agile developers. &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&lt;strong&gt;One's instinctive reaction is that the big-payoff problems--hierarchical file systems, uniform file formats to make possible uniform program interfaces, and generalized tools--were the first attacked, and have been solved. Language-specific smart editors are developments not yet widely used in practice, but the most they promise is freedom from syntactic errors and simple semantic errors.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;So what about the latest and greatest in workstations.&amp;#160; That new laptop with 4 gig of memory, solid state disks, fast networking, 64 bit development environments... &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;What gains are to be expected for the software art from the certain and rapid increase in &lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;the power and memory capacity of the individual workstation? Well, how many MIPS can one use fruitfully? The composition and editing of programs and documents is fully supported by today's speeds. Compiling could stand a boost, but a factor of 10 in machine speed would surely leave thinktime the dominant activity in the programmer's day. Indeed, it appears to be so now.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;More powerful workstations we surely welcome. Magical enhancements from them we cannot expect.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Attacks on the Essence of the Problem&lt;/h3&gt;  &lt;p&gt;So in the end we are left with an early form of the discussion on Team Velocity&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;If, as I believe, the conceptual components of the task are now taking most of the time, then no amount of activity on the task components that are merely the expression of the concepts can give large productivity gains.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;Hence we must consider those attacks that address the essence of the software problem, the formulation of these complex conceptual structures. Fortunately, some of these attacks are very promising.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here is a shocker for how to swiftly deploy systems.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;Buy versus build. The most radical possible solution for constructing software is not to construct it at all.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;...Any such product is cheaper to buy than to build afresh. Even at a cost of one hundred thousand dollars, a purchased piece of software is costing only about as much as one programmer year. And delivery is immediate!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;The development of the mass market is, I believe, the most profound long-run trend in software engineering. The cost of software has always been development cost, not replication cost. Sharing that cost among even a few users radically cuts the per-user cost. Another way of looking at it is that the use of n copies of a software system effectively multiplies the productivity of its developers by n. That is an enhancement of the productivity of the discipline and of the nation.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And finally a initial discussion of the Knowledge worker of today&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;I believe the single most powerful software-productivity strategy for many organizations today is to equip the computer-naive intellectual workers who are on the firing line with personal computers and good generalized writing, drawing, file, and spreadsheet programs and then to turn them loose.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;How about a early discussion on Iterative development.&amp;#160; Software construction concepts based on a comment in 1958? &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;The hardest single part of building a software system is deciding precisely what to build.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;...Therefore, the most important function that the software builder performs for the client is the iterative extraction and refinement of the product requirements. For the truth is, the client does not know what he wants. The client usually does not know what questions must be answered, and he has almost never thought of the problem in the detail necessary for specification.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;...Much of present-day software-acquisition procedure rests upon the assumption that one can specify a satisfactory system in advance, get bids for its construction, have it built, and install it. I think this assumption is fundamentally wrong, and that many software-acquisition problems spring from that fallacy. Hence, they cannot be fixed without fundamental revision--revision that provides for iterative development and specification of prototypes and products.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;...Incremental development--grow, don't build, software. I still remember the jolt I felt in 1958 when I first heard a friend talk about building a program, as opposed to writing one. In a flash he broadened my whole view of the software process. The metaphor shift was powerful, and accurate. Today we understand how like other building processes the construction of software is, and we freely use other elements of the metaphor, such as specifications, assembly of components, and scaffolding.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So instead we should grow software systems organically&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;Let us turn nature and study complexity in living things, instead of just the dead works of man. Here we find constructs whose complexities thrill us with awe. The brain alone is intricate beyond mapping, powerful beyond imitation, rich in diversity, self-protecting, and self renewing. The secret is that it is grown, not built.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;So it must be with our software-systems. Some years ago Harlan Mills proposed that any software system should be grown by incremental development. [10] That is, the system should first be made to run, even if it does nothing useful except call the proper set of dummy subprograms. Then, bit by bit, it should be fleshed out, with the subprograms in turn being developed--into actions or calls to empty stubs in the level below.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;I have seen most dramatic results since I began urging this technique on the project builders in my Software Engineering Laboratory class. Nothing in the past decade has so radically changed my own practice, or its effectiveness. The approach necessitates top-down design, for it is a top-down growing of the software. It allows easy backtracking. It lends itself to early prototypes. Each added function and new provision for more complex data or circumstances grows organically out of what is already there.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;The morale effects are startling. Enthusiasm jumps when there is a running system, even a simple one. Efforts redouble when the first picture from a new graphics software system appears on the screen, even if it is only a rectangle. One always has, at every stage in the process, a working system. I find that teams can grow much more complex entities in four months than they can build.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As someone who has been developing software for over 30 years and never gone the management track, the next comment is very telling.&amp;#160; I became a Fellow at Micron in less then 5 years and still did not see the dedication to the technical team he mentions here.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;&lt;em&gt;Hence, although I strongly support the technology-transfer and curriculum development efforts now under way, I think the most important single effort we can mount is to develop ways to grow great designers.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;No software organization can ignore this challenge. Good managers, scarce though they be, are no scarcer than good designers. Great designers and great managers are both very rare. Most organizations spend considerable effort in finding and cultivating the management prospects; I know of none that spends equal effort in finding and developing the great designers upon whom the technical excellence of the products will ultimately depend.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;em&gt;My first proposal is that each software organization must determine and proclaim that great designers are as important to its success as great managers are, and that they can be expected to be similarly nurtured and rewarded. Not only salary, but the perquisites of recognition--office size, furnishings, personal technical equipment, travel funds, staff support--must be fully equivalent.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;So in the last 30 years of software development we have only begun to addresses the essence of software development.&amp;#160; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Software is Complex &lt;/li&gt;    &lt;li&gt;Successful Software is ever changing &lt;/li&gt;    &lt;li&gt;Software is invisible &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So as you continue to develop software look at what you are doing.&amp;#160; Attack the essence of the problem, not the accident.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Buy vs. Build where appropriate &lt;/li&gt;    &lt;li&gt;Empower your users to allow them to solve problems themselves &lt;/li&gt;    &lt;li&gt;Use Iterative Development Processes &lt;/li&gt;    &lt;li&gt;Build strong technical teams and designers &lt;/li&gt; &lt;/ol&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-7740152837792918699?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/7740152837792918699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=7740152837792918699' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/7740152837792918699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/7740152837792918699'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/03/everything-i-ever-wanted-to-know-about.html' title='I first learned about Agile Development...'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-204123434011315267</id><published>2008-03-13T21:56:00.001-06:00</published><updated>2008-03-13T21:56:36.376-06:00</updated><title type='text'>100 times the current broadband speeds</title><content type='html'>&lt;p&gt;My friend Herb sent me a link to this article, &lt;a href="http://www.itbusinessedge.com/blogs/hdw/?p=1784" target="_blank"&gt;&lt;strong&gt;Scientists Claim Breakthrough in Broadband Speeds&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&amp;#160; Pretty scary when you think about it.&amp;#160; My broadband network at home then my gigabit wired network..&lt;/p&gt;  &lt;p&gt;You always wonder what the connected world will be like in the future.&amp;#160; Extremely high speed broadband networks could be the start.&amp;#160; How soon before that hits the Wireless networks?&amp;#160; My built in cellular modem on my laptop could soon be faster then my current wired broadband connections.&lt;/p&gt;  &lt;p&gt;Maybe &lt;a href="http://www.pcpro.co.uk/news/176220/ericsson-predicts-swift-end-for-wifi-hotspots.html" target="_blank"&gt;Ericsson&lt;/a&gt; is right?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-204123434011315267?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/204123434011315267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=204123434011315267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/204123434011315267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/204123434011315267'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/03/100-times-current-broadband-speeds.html' title='100 times the current broadband speeds'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1958740151001122210.post-5856843453382565776</id><published>2008-03-12T18:34:00.001-06:00</published><updated>2008-03-12T18:38:40.829-06:00</updated><title type='text'>C# 3.0 automatic properties...</title><content type='html'>&lt;p&gt;I am a firm believer in encapsulation so I do not like to have public fields instead of public property gets and sets in my code. So here is how I used to write classes in C# 2.0. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;code&gt;public class Person {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string _firstName;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string _lastName;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private int _age;     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string FirstName {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return _firstName;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _firstName = value;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string LastName {     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return _lastName;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _lastName = value;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public int Age {     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return _age;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _age = value;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;p&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;&amp;#160; &lt;br /&gt;&lt;/p&gt; &lt;/code&gt;  &lt;p&gt;Now C# 3.0 has automatic properties so I can just write... &lt;/p&gt;  &lt;p&gt;&lt;code&gt;public class Person {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string FirstName { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string LastName { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int Age { get; set; }       &lt;br /&gt;}       &lt;br /&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Man is that cool! Great for the lazy coder in all of us. For more details see Scott Guthrie's &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/03/08/new-c-orcas-language-features-automatic-properties-object-initializers-and-collection-initializers.aspx" target="_blank"&gt;blog post&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1958740151001122210-5856843453382565776?l=blog.drcarver.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.drcarver.com/feeds/5856843453382565776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=1958740151001122210&amp;postID=5856843453382565776' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/5856843453382565776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1958740151001122210/posts/default/5856843453382565776'/><link rel='alternate' type='text/html' href='http://blog.drcarver.com/2008/03/c-3-automatic-properties.html' title='C# 3.0 automatic properties...'/><author><name>Darrel Carver</name><uri>http://www.blogger.com/profile/02375929351048367447</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09619660303299025636'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>