<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rick Minerich's Development Wonderland : technology</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/tags/technology/default.aspx</link><description>Tags: technology</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Code Camp 12: Boston – Why F#?</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx</link><pubDate>Fri, 16 Oct 2009 15:18:54 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:19433</guid><dc:creator>RickM</dc:creator><slash:comments>1</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/19433.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=19433</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=19433</wfw:comment><description>&lt;p&gt;A couple of months ago I was talking to &lt;a href="http://www.atalasoft.com/cs/blogs/loufranco/default.aspx"&gt;Lou Franco&lt;/a&gt;, the head of our Software Engineering department and fellow functional programming enthusiast, about the possibility of using F# for projects in the future.&amp;#160; Being business minded, he replied that he would need a compelling reason to bring F# on board.&amp;#160; This presentation is dedicated to him and others who have functional programming on their radar but haven’t yet found a compelling reason to bring it in to their company.&lt;/p&gt;  &lt;p&gt;I acknowledge that, as for now, it’s difficult to suggest anyone do more than play with F#.&amp;#160; I have been anxiously awaiting the stabilization of the F# API which will come along with the release of VS2010.&amp;#160; With the recent changes breaking backwards compatibility, maintaining my old F# samples has become quite a nightmare.&amp;#160; Indeed, not a single code sample I have from a year ago works out of the box with the current release.&lt;/p&gt;  &lt;p&gt;However, VS2010 is only a few months away.&amp;#160; Now is the time to start learning about F# and the paradigms which make it so powerful.&amp;#160; Functional programming has amazing benefits in terms of parallelization, code compression and overall code robustness.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;At Code Camp 12 Boston, I will talk about the soon-to-be-realized world where programmers are divided into groups which each use different types of languages to build different kinds of things.&amp;#160; This is easy to predict as it is already occurring.&amp;#160; UI, data processing and data storage programmers are already diversifying both in working knowledge and tools.&lt;/p&gt;  &lt;p&gt;As is evidenced by WPF, HTML and CSS it seems UI design is moving more and more to a declarative style.&amp;#160; Similarly, the rise of F#, Scala, Erlang and Haskell indicates that algorithmic programmers are migrating to the functional programming languages.&amp;#160; SQL has long been the language of those involved in data storage.&amp;#160; It’s no wonder that this has happened.&amp;#160; When your tool is better designed for your job, the work gets done faster and you end up with a better result.&lt;/p&gt;  &lt;p&gt;Where does this leave imperative and object oriented languages?&amp;#160; Languages like Java, VB and C# will be relegated to being used as “glue” for existing systems while abstract languages slowly eat away their market share.&amp;#160; This will happen more and more as the number of cores per processor continues to increase and those with imperative implementations find that they are unable to scale.&lt;/p&gt;  &lt;p&gt;When: Oct 16th, 2009 (11:50am)    &lt;br /&gt;Where: 201 Jones Rd, 6th Floor, Waltham MA USA (Room TBC)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/files/folders/19474/download.aspx"&gt;Slides are available here.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Also, be sure to also check out my fellow F# User Group leader Talbott Crowell’s talk.&amp;#160; It’s right before mine (10:30) in the same room (Thanks Chris!).&amp;#160; You can find out more by heading over to Chris Bowen’s blog and reading his &lt;a href="http://blogs.msdn.com/cbowen/archive/2009/10/12/code-camp-12-the-schedule.aspx"&gt;post on Code Camp 12&lt;/a&gt;.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx&amp;amp;;subject=Code+Camp+12%3a+Boston+%e2%80%93+Why+F%23%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx&amp;amp;;title=Code+Camp+12%3a+Boston+%e2%80%93+Why+F%23%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx&amp;amp;title=Code+Camp+12%3a+Boston+%e2%80%93+Why+F%23%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx&amp;amp;;title=Code+Camp+12%3a+Boston+%e2%80%93+Why+F%23%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx&amp;amp;;title=Code+Camp+12%3a+Boston+%e2%80%93+Why+F%23%3f&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/10/16/code-camp-12-boston-why-f.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=19433" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/object+oriented/default.aspx">object oriented</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Code+Camp/default.aspx">Code Camp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/talks/default.aspx">talks</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/technology/default.aspx">technology</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/haskell/default.aspx">haskell</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/scala/default.aspx">scala</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/csharp/default.aspx">csharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming+languages/default.aspx">programming languages</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/erlang/default.aspx">erlang</category></item><item><title>More Cores Requires More Abstraction, What Does This Mean For Image Processing?</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx</link><pubDate>Thu, 04 Dec 2008 19:47:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:16755</guid><dc:creator>RickM</dc:creator><slash:comments>2</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/16755.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=16755</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=16755</wfw:comment><description>&lt;p&gt;Compilers and programmers are good at very different things.&amp;#160; This is why they must come together in order to build software.&amp;#160; The programmer has the vision and the intention, the compiler keeps track of all of the small machine related details and optimizations.&amp;#160; Unfortunately, this is not an ideal world.&amp;#160; At any given time a programmer will be worrying about any number of insignificant platform details while working.&amp;#160; However, intelligent platforms that take care of many of these details are on the way and they are coming hand in hand along with functional programming and the many-core revolution.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;Recently, Steve Hawley built a &lt;a href="http://www.atalasoft.com/cs/blogs/stevehawley/archive/2008/12/04/more-image-processing-with-c-lambdas.aspx"&gt;Lambda expression interface on top of our existing ImageCommand infrastructure&lt;/a&gt;.&amp;#160; However, he ran into a few roadblocks.&amp;#160; The two biggest of which were performance and flexibility.&amp;#160; It turned out that given our existing very mutable and very object oriented infrastructure, it is all but impossible to be flexible enough to implement all of our image commands as lambdas without severe performance costs.&amp;#160; These performance costs were directly due to having to pass back and forth a great deal of semantic information about the particular changes to each pixel.&amp;#160; I see this as a direct result of trying to graft on functional programming onto a very procedural API.&lt;/p&gt;  &lt;p&gt;The next big programming revolution will be one of having intelligent systems deal with the details.&amp;#160; Things like managing threads and wiring complex objects together will disappear from the lives of the average developer and will instead be left to those developing the platform those programmers are using.&amp;#160; We will move from describing how to do things at a low level and instead use abstractions to describe what we want to be done.&amp;#160; This is all necessary to for the production of software on the very complex and very distributed hardware platforms that are coming.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Performant Complexity Works Well in Non-Distributed Systems&lt;/h3&gt;  &lt;p&gt;Our own representation of an image is very complex.&amp;#160; By this I mean it has a large number of properties.&amp;#160; This is necessary because we have many customers all of which have slightly different goals.&amp;#160; We need to be able to support anything our customers might need to do.&amp;#160; They must be able to directly access the underlying memory that represents an image for the fastest image processing possible.&amp;#160; This type of implementation is performant on the dual to quad core environments people are dealing with today.&amp;#160; However, as the number of cores increase it becomes much more important for processing to distribute quickly instead of being heavily optimized for operation on a single processor.&amp;#160; &lt;/p&gt;  &lt;p&gt;This may sound like a really awful burden but in reality it is a huge boon to the average programmer.&amp;#160; What it means is that we will be working at a much higher level of abstraction than we are today.&amp;#160; Because of all of these extra cores, we will have platforms which will optimize our abstractions on the fly without us having to handle the messy details.&amp;#160; This is much like what modern compilers and runtime environments do today, however it will be to a much greater extent.&lt;/p&gt;  &lt;p&gt;Mathematica has been successful with an interesting approach for abstraction. Usually in the math world an image bitmap is just a integer matrix.&amp;#160; However, In it’s most recently release Mathematica has taken the abstraction even further; &lt;a href="http://blog.wolfram.com/2008/12/01/the-incredible-convenience-of-mathematica-image-processing/"&gt;unless you need deeper access, an image is just an image&lt;/a&gt;.&amp;#160; This allows mathematicians and computer scientists to not worry about the underlying code, much of what is desired is inferred.&amp;#160; It’s this kind of innovative development that will be driving the future of our programming languages.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;An Inferred World&lt;/h3&gt;  &lt;p&gt;We are all moving in the direction of inferred programming.&amp;#160; By this I mean, systems are getting intelligent enough that they can make very accurate estimations of what you want without you explicitly asking for it.&amp;#160; They may not always be correct, but they are in the vast majority of cases and when they aren’t you can correct them.&amp;#160; For example, &lt;a href="http://devhawk.net/2007/11/29/F+Hawkeye+Type+Inference.aspx"&gt;F# has very intelligent and integrated type inference&lt;/a&gt;.&amp;#160; I have found that it takes much of the type safety burden off of the programmer and still enforces compile time type checking.&amp;#160; However, I believe this is just the tip of the iceberg.&amp;#160; &lt;/p&gt;  &lt;p&gt;Part of the reason for the shift to inference is that &lt;a href="http://www-i2.informatik.rwth-aachen.de/Forschung/FP/"&gt;functional programming lends itself to this type of analysis&lt;/a&gt;.&amp;#160; Similarly, if we wish for image processing to move in this direction we must change the level of abstraction we work at in order to provide an environment similarly amenable to analysis.&amp;#160; This can be broken down into two parts: how we represent the image and how we deal with processing an image.&lt;/p&gt;  &lt;p&gt;The first part of this would be to change how we think about storing images in memory.&amp;#160; To do this it will be necessary to to design an image property manager which will take care of the messy details for you. In image processing, is it necessary to have a static height, width and pixel format?&amp;#160; All of these decisions should be inferred.&amp;#160; In a cleverly designed system these properties would be given values behind the scenes in whichever way would lose the least precision.&amp;#160; This can be done by deferring fixing the properties of an image until output time.&amp;#160; In other words, lazy decision making.&amp;#160; If they are required they should be stated as constraints instead of procedures.&lt;/p&gt;  &lt;p&gt;The second part is to change how we define our image manipulations to be in terms of transformations instead of procedures.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Transformations not Procedures&lt;/h3&gt;  &lt;p&gt;Along with inference and functional programming will come the idea of using transformations on data instead of procedures.&amp;#160; In the Microsoft world, this is mainly evidenced by LINQ.&amp;#160; In LINQ one describes the transformation of a data set instead of describing the steps needed to change that data. &lt;/p&gt;  &lt;p&gt;Right now our commands for processing an image are defined by a set of ordered steps.&amp;#160; This comes directly from the heritage of our API which sprung directly from procedural programming.&amp;#160; If instead, we were to view image processing as a set of transformations we would do a great number of things to speed up processing.&amp;#160; &lt;/p&gt;  &lt;p&gt;For instance, many image processing commands can be simply &lt;a href="http://www.codeproject.com/KB/GDI-plus/matrix_transformation.aspx"&gt;represented as matrices&lt;/a&gt;.&amp;#160; These matrices can then be combined into a single matrix for almost no cost.&amp;#160; This new combined matrix can be applied once for the same result of applying each matrix that came before.&amp;#160; In this way many different processing commands can be combined and done all at once.&amp;#160; This is much more efficient than doing each command separately over any image of significant size.&amp;#160; &lt;/p&gt;  &lt;p&gt;Some types of image processing cannot be represented as a single matrix. This could be for a great number of reasons. In some cases it is because they perform a great deal of processing in order to decide on the actual transformation; processing that would be directly affected by previous transformations.&amp;#160; In other cases the transformation is not uniform over the entire image.&amp;#160; However, to represent them as transformations would at the very least make them easier to parallelize.&lt;/p&gt;  &lt;p&gt;Also, this type of abstraction could have significant overhead at the single core level.&amp;#160; However, when looking at the vastly many-core world coming, these types of optimizations could produce a result much faster than would be possible by simple procedural case handling. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;The programming world is about to change in a way that will make it extremely difficult for even a very savvy programmer to hand optimize software.&amp;#160; Even today an &lt;a href="http://www.ddj.com/development-tools/212201710"&gt;article by Michael Swaine on the Dr. Dobbs portal&lt;/a&gt; proclaimed that it’s time to get ready for this and learn functional programming.&amp;#160; Instead of mourning this change, we should embrace it as it will come along with a new layer of abstraction which will, in the end, make our lives easier and our software more performant.&amp;#160; As for image processing, it’s important to keep the ideas of inference and transformation in mind as we head into a multi-cored future.&amp;#160; We need to focus on defining problems in a way that makes them easily parallelizable, instead of focusing on specific CPU level optimizations.&lt;/p&gt;  &lt;p&gt;Yes, bits will be wasted, and so will overall processor time, but get over it.&amp;#160; In a hugely parallel system, what counts is the time it takes to achieve the needed result, not the amount of work done to get there.&amp;#160; A five fold performance decrease is a worthwhile parallelization cost when dealing with an order of magnitude increase in the number of processing cores.&amp;#160; &lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx&amp;amp;;subject=More+Cores+Requires+More+Abstraction%2c+What+Does+This+Mean+For+Image+Processing%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx&amp;amp;;title=More+Cores+Requires+More+Abstraction%2c+What+Does+This+Mean+For+Image+Processing%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx&amp;amp;title=More+Cores+Requires+More+Abstraction%2c+What+Does+This+Mean+For+Image+Processing%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx&amp;amp;;title=More+Cores+Requires+More+Abstraction%2c+What+Does+This+Mean+For+Image+Processing%3f" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx&amp;amp;;title=More+Cores+Requires+More+Abstraction%2c+What+Does+This+Mean+For+Image+Processing%3f&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/04/more-cores-requires-more-abstraction-what-does-this-mean-for-image-processing.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=16755" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Processors/default.aspx">Processors</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/technology/default.aspx">technology</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/languages/default.aspx">languages</category></item><item><title>Windows Live Writer Makes Blogging Less of a Hassle</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx</link><pubDate>Fri, 14 Nov 2008 19:23:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:16588</guid><dc:creator>RickM</dc:creator><slash:comments>4</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/16588.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=16588</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=16588</wfw:comment><description>&lt;p&gt;The blog CMS we use is great in a lot of ways but it’s built in editor is really, really bad. Initially, I had used Microsoft Word to fill the gap, &lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/09/tidying-up-old-blog-entries.aspx"&gt;with disastrous results&lt;/a&gt;. Since then I have moved to using our blog software’s horribly antiquated text editing system but that has limited my formatting options quite considerably. Now, after a recommendation from a friend, I am giving Windows Live Writer a shot. This blog post is a recursive review of my experience writing this blog post in Windows Live Writer.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;Full Featured Editing&lt;/h3&gt;  &lt;p&gt;Here is a screenshot of Windows Live Writer:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/windowslivewriter_110DC75D.png"&gt;&lt;img src="http://www.atalasoft.com/cs/blogs/rickm/windowslivewriter_thumb_12DE1D24.png" title="windowslivewriter" style="border-width:0px;display:inline;" alt="windowslivewriter" border="0" height="418" width="416"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Windows live writer has everything you would expect from a html based text editor. This includes font formatting and paragraph formatting, colors, block quotes and alignment. &lt;/p&gt;  &lt;p&gt;For comparison, this is what the Community Server 2.0 interface I have been using looks like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/communityservereditor_4CCACF5F.png"&gt;&lt;img src="http://www.atalasoft.com/cs/blogs/rickm/communityservereditor_thumb_3CBE9159.png" title="communityservereditor" style="border-width:0px;display:inline;" alt="communityservereditor" border="0" height="510" width="416"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;It is not resizable and it has no undo between saves. Also, it has a feature set right out of the HTML 1.1 spec:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Bold, Italics, Underline, Strikeout, &lt;/li&gt;    &lt;li&gt;Indenting and Outdenting &lt;/li&gt;    &lt;li&gt;Linking &lt;/li&gt;    &lt;li&gt;Pictures &lt;/li&gt;    &lt;li&gt;Tables &lt;/li&gt;    &lt;li&gt;What, no blink? &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It lacks such basic 1990s era formatting as text size and alignment. This can make creating blog posts with any kind of real formatting really time consuming.&lt;/p&gt;  &lt;p&gt;It’s a huge difference.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;Content Made Easy&lt;/h3&gt;  &lt;p&gt;While I came for the the easy text editing interface, I stayed for the slick client-server integration and simple content management. Windows Live Writer has a number of wizards each of which take the hassle out of adding a type of content to your blog. For example, here is a screenshot of its GIS integration:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/wlwmap_48F68EF7.png"&gt;&lt;img src="http://www.atalasoft.com/cs/blogs/rickm/wlwmap_thumb_31CB1479.png" title="wlwmap" style="border-width:0px;display:inline;" alt="wlwmap" border="0" height="420" width="537"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;As Windows Live Writer completely manages the process for you, inserting non-text content is extremely easy. For images, you can just add them your post using the insert picture wizard and it will handle the thumbnailing, uploading and linking for you. It has native &lt;a href="http://youtube.com"&gt;youtube&lt;/a&gt; and &lt;a href="http://soapboxteam.spaces.live.com/"&gt;sopebox&lt;/a&gt; support as well as the ability to add your own local video via a wizard. As shown in the screenshot, it has out of the box integration with windows live maps for quickly inserting interactive maps into your post. &lt;/p&gt;  &lt;p&gt;It also has a plugin interface so other types of content integration can be added. When you click on “Add a Plug-in” Windows Live Writer will actually take you to a &lt;a href="http://gallery.live.com/"&gt;list which currently contains 105 different live plugins&lt;/a&gt;. I haven't yet tried to implement my own content integration but if 105 different plugins already exist, it can’t be too difficult.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;The One Downside: High Resource Demands and Sluggishness&lt;/h3&gt;  &lt;p&gt;This seems to me to be the biggest problem with Windows Live messenger:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/wlwresources_47FDA200.png"&gt;&lt;img src="http://www.atalasoft.com/cs/blogs/rickm/wlwresources_thumb_39BF2910.png" title="wlwresources" style="border-width:0px;display:inline;" alt="wlwresources" border="0" height="23" width="429"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;That’s about 253 Megabytes of peak memory usage for what is essentially a text editor. Maybe it’s just that I once had a functional computer with 64 k&lt;u&gt;ilo&lt;/u&gt;bytes of ram but I find this kind of memory usage from a blog editor to be absurd. That amounts to about 15% of your ram if you have 4 gigs in your box.&lt;/p&gt;  &lt;p&gt;On my Intel Core 2 6600 @ 2.4 Ghz with 2 gigabytes of ram I have found Windows Live Writer to often be sluggish. When I click to move my cursor or highlight text it can take what seems like a whole second to respond.&amp;nbsp; When typing or deleing text it sometimes will lag slightly behind my input. &lt;/p&gt;  &lt;p&gt;Performance issues are forgivable considering that it is still a beta software package. I do hope that the development team is able to take some time to try and work through these issues. &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;Conclusion&lt;/h3&gt;  &lt;p&gt;Although it has some problems, Windows Live Writer is by far the easiest and most convenient blog editor I have ever had the pleasure to use. The tight client-server integration means that in the future I will be able to avoid all of the tedious resizing, uploading and pasting of html snippets and instead be able to concentrate on content. I can only hope that by the time it gets out of beta some of the memory issues and sluggishness will be worked out as otherwise this is an amazing piece of software. &lt;/p&gt;  &lt;p&gt;I’m not the only one who thinks so. If you want to read some other opinions, you should check out a Phil Wainewright article entitled &lt;a href="http://blogs.zdnet.com/SAAS/?p=199"&gt;“Writer is Microsoft’s first Live Killer app”&lt;/a&gt; and &lt;a href="http://paulstamatiou.com/2006/08/14/review-windows-live-writer-beta"&gt;Paul Stamatiou’s Review&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Edit:&lt;/b&gt; After I posted this blog I noticed that its formatting looked remarkably similar in both Internet Explorer 7 and Firefox 3.0.&lt;/p&gt;  &lt;p&gt;Pros:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Slick looking. &lt;/li&gt;    &lt;li&gt;Everything would expect in terms of text editing features. &lt;/li&gt;    &lt;li&gt;Direct Community Server integration. &lt;/li&gt;    &lt;li&gt;Conveniently manages inserted content for you. &lt;/li&gt;    &lt;li&gt;Its output looks great in both Firefox and Internet Explorer.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Cons:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Keyboard input can be sluggish. &lt;/li&gt;    &lt;li&gt;Huge memory footprint. &lt;/li&gt;    &lt;li&gt;Beta software. &lt;/li&gt; &lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx&amp;amp;;subject=Windows+Live+Writer+Makes+Blogging+Less+of+a+Hassle" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx&amp;amp;;title=Windows+Live+Writer+Makes+Blogging+Less+of+a+Hassle" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx&amp;amp;title=Windows+Live+Writer+Makes+Blogging+Less+of+a+Hassle" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx&amp;amp;;title=Windows+Live+Writer+Makes+Blogging+Less+of+a+Hassle" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx&amp;amp;;title=Windows+Live+Writer+Makes+Blogging+Less+of+a+Hassle&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/11/14/windows-live-writer-makes-blogging-less-of-a-hassle.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=16588" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/internet/default.aspx">internet</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/technology/default.aspx">technology</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/blogging/default.aspx">blogging</category></item><item><title>Avoiding the Dangers of Ambiguously Defined Data-Types</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx</link><pubDate>Fri, 03 Oct 2008 15:10:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:15911</guid><dc:creator>RickM</dc:creator><slash:comments>11</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/15911.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=15911</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=15911</wfw:comment><description>&lt;p&gt;When you are handed a string, integer, or any value type, can you know what it really represents?&amp;nbsp; Can you define the range of appropriate behaviors for that data?&amp;nbsp; Can you tell if it's formatted correctly?&amp;nbsp;&amp;nbsp; The problem is, in all of these cases, you can't.&amp;nbsp; You can't be sure of it's meaning, it's format or even how to treat it.&amp;nbsp; This is why ambiguous types break the &lt;a href="http://en.wikipedia.org/wiki/Object-oriented_programming"&gt;object-oriented programming paradigm&lt;/a&gt; and should be avoided whenever possible.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Forward&lt;/b&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;It's laughable to think that a Physical Engineer or Physicist would work without the aid of units. This is because, when you have undefined units, you can't verify that the thing you get at the end of a computation is defined in a consistent way. &amp;nbsp; &lt;/p&gt;&lt;p&gt;In computing, the counterpart to the Physical Engineer is the Software Engineer.&amp;nbsp; Why is the Software Engineer not held to the same type of design integrity?&amp;nbsp; The use of ambiguously defined variables is one of the largest sources of bugs in modern software development and yet we ignore it.&amp;nbsp; In fact, with many dynamically typed languages we are moving in the direction of more and more ambiguity.&lt;br&gt;&lt;/p&gt;&lt;p&gt;In C# and Java, strings and value types are defined only in terms of their lexical and
mathematical operations.&amp;nbsp; Except from the context in which they are used, they carry no additional information about the meaning of their
content.&amp;nbsp; In order to perform any non-trivial operation on that data, you have to make assumptions about it's meaning, which in turn leads to bugs.&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Is what you are writing really object oriented?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This may seem like a silly question to ask in the modern programming era.&amp;nbsp; Almost everyone is using an object oriented language these days and its mostly taken for granted.&amp;nbsp; However, as any beginning programmer knows, it is very
easy to program in an object oriented programming language while
completely ignoring the underlying paradigm.&lt;/p&gt;&lt;p&gt;We don't use OO because it's an agreed standard for implementing a programming language, we use it to solve a specific set of problems.&amp;nbsp; These problems are directly related to the modeling of data and data manipulation.&amp;nbsp; Groups of data subtypes are classified into a larger object and operations on that data are defined in such a way as to model behavior in terms of that classification.&amp;nbsp; If the paradigm is ignored these issues become manifest as ambiguity and disorganization.&amp;nbsp; &lt;/p&gt;&lt;p&gt;It follow that using ambiguous data-types in a public API goes directly against not only the object oriented paradigm but also the broader goal of data classification and program integrity.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Why not pass strings and value types as arguments to public methods?&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Using an ambiguously defined data type instead of a well defined object
means that the domain and formatting of that data is left open to
question.&amp;nbsp; It also means that if a user of that data formats it
inappropriately it may find it's way into an operation for another type of data and cause havoc. &lt;br&gt;&lt;/p&gt;&lt;p&gt;For a programmer that is familiar with object oriented programming it often comes down to a choice of encapsulation versus convenience.&amp;nbsp; I know as well as anyone that having to define an object to carry your data when you could just pass in a string and a couple of integers can feel tedious.&amp;nbsp; However, by taking the easy way out, you are setting things up to fail down the road.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Consider, is it possible that sometime in the future someone will be using the API you are defining?&amp;nbsp; Will the person looking at that code know the specific format you chose for that string?&amp;nbsp; What about the range of valid values for those integers?&amp;nbsp; What kinds of assumptions about that data will be made that you may have not considered?&amp;nbsp; If they mess up that format or get the range wrong, at what point will it become obvious?&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;There are a lot of advantages to using objects instead:&amp;nbsp; An object which was designed to carry that same data could verify that it is well defined when it is constructed.&amp;nbsp; It can hand back that data formatted or manipulated in many different ways.&amp;nbsp; You can well defined questions which can be asked about that data which makes program control flow more obvious.&amp;nbsp; Best of all, the code for all of these things is centralized and up to the discretion of the designer of said object.&amp;nbsp; Using a well defined object, two people with different assumptions about that data but asking the same question will get the same result.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Of course, at the lowest level a CPU will be operating on basic value
types and so our code will always reflect that to some degree.&amp;nbsp;
However, because ambiguous types are extremely dangerous, they should
almost always be encapsulated and well defined.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;What tools are available to me in .NET?&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;If you are a .NET programmer the best thing you can do right now is to become familiar with the already existing classes available for making your strings more well defined such as &lt;a href="http://msdn.microsoft.com/en-us/library/system.uri%28VS.80%29.aspx"&gt;System.Uri&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.fileinfo%28VS.80%29.aspx"&gt;System.IO.FileInfo&lt;/a&gt;.&amp;nbsp; I've put up a &lt;a href="http://stackoverflow.com/questions/168732/what-are-some-string-encapsulation-classes-which-specify-both-meaning-and-behav"&gt;question on stackoverflow&lt;/a&gt; in order to try to build up a list of available container classes.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Beyond the use of predefined classes, it's best to make your own encapsulation objects with heavy up front validation.&amp;nbsp; You can then use extension methods to make native .NET classes take your new validated type.&amp;nbsp; It would be worth putting together a library of free encapsulation classes, structs and extension methods to allow for easy interoperability.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Beware, the .NET Framework encourages ambiguous types.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Unfortunately, as well designed as it is for many things, the .NET Framework is pretty bad about ambiguity.&amp;nbsp; Based on classes such as System.IO.Path and System.IO.FileStream which for some reason take paths represented as strings,&amp;nbsp; you might even say that ambiguity is encouraged.&amp;nbsp; Consider the vast number of methods in .NET classes which take unencapsulated strings and scalar types. &lt;br&gt;&lt;/p&gt;&lt;p&gt;The most unfortunate side effect of this design is that users of the .NET API may come to believe that this is the way things should be in a proper object oriented API.&amp;nbsp; Also, as a consequence, if you want your own product's API to be easily understood by a .NET user you have to follow the same destructive conventions.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;F# helps to solve this problem with Units of Measure.&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In most object oriented languages, if you were to encapsulate every single scalar value that was passed into a method, it would be quite a lot of extra coding.&amp;nbsp; Microsoft's newest programming language, F#, has a feature called &lt;a href="http://blogs.msdn.com/andrewkennedy/archive/2008/08/20/units-of-measure-in-f-part-one-introducing-units.aspx"&gt;Units of Measure&lt;/a&gt; which allows a programmer to optionally specify both meaning and behavior for classes of scalar types.&amp;nbsp; &lt;/p&gt;&lt;p&gt;A scalar with a unit of measure is a real type which is enforced by the compiler.&amp;nbsp; When an operation is performed the resulting type is that of the combined units used for the calculation, just as they would be in physics or engineering.&amp;nbsp; This is because F# is designed in part to be used by engineers and scientists.&amp;nbsp; As a side effect we as programmers get to reap the same benefit.&lt;br&gt;&lt;/p&gt;&lt;p&gt;This type of scalar type classification has long been missing from object oriented languages.&amp;nbsp; It's a huge step forward and I hope other programming languages move to adopt it quickly.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Addendum&lt;/b&gt;&lt;/p&gt;&lt;p&gt;@Mark and Jon:&lt;/p&gt;
&lt;p&gt;I think I may not have fully expressed what I meant by "handed a
string or integer". The context am talking about is post-compilation
when variable names no longer have real meaning. In this context
(discounting reflection on variable name) all you can tell about an
integer is where it is coming from and it's value. An executing program
does not have access to documentation.&lt;/p&gt;
&lt;p&gt;It's also important to consider reflective programming. It is generally agreed that reflective
programming is where the object oriented world is headed. However, when
you have a scalar value, you can tell very little about it through
reflection. While it is possible to retrieve the variable's name using reflection, actually
using the name of said variable to carry type information is a methodology which is extremely
prone to errors from mistyping. Errors which will not be caught at
compile time and which may lead your program to incorrect paths of
execution.&lt;/p&gt;&lt;p&gt;Also, I want to note that while a string is not a scalar value it does suffer from the same type of ambiguity. For this reason it, and other "base" types, should be handled similarly.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;subject=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;title=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;title=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;title=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;title=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=15911" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/meta/default.aspx">meta</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/object+oriented/default.aspx">object oriented</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/javascript/default.aspx">javascript</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/technology/default.aspx">technology</category></item><item><title>The Cursed History of Smalltalk in .NET</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/06/18/the-cursed-history-of-smalltalk-in-net.aspx</link><pubDate>Wed, 18 Jun 2008 20:44:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14335</guid><dc:creator>RickM</dc:creator><slash:comments>4</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/14335.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=14335</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=14335</wfw:comment><description>After my last blog post, due to some of the responses, I decided to spend some time with Smalltalk. As a DotNET developer by trade, I wanted to see what kinds of options were available for use on the CLR. Unfortunately, out of the five different DotNET...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/06/18/the-cursed-history-of-smalltalk-in-net.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14335" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/IS/default.aspx">IS</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/functional/default.aspx">functional</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/IL/default.aspx">IL</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/MSIL/default.aspx">MSIL</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/technology/default.aspx">technology</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/smalltalk/default.aspx">smalltalk</category></item><item><title>20 Years Later IRC is Still Useful; Are You Taking Advantage of it?</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/05/30/20-years-later-irc-is-still-useful-are-you-taking-advantage-of-it.aspx</link><pubDate>Fri, 30 May 2008 18:23:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14216</guid><dc:creator>RickM</dc:creator><slash:comments>8</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/14216.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=14216</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=14216</wfw:comment><description>This upcoming August the IRC protocol will officially be 20 years old. I think anyone would agree that it has weathered the years better than any other high level internet protocol. It does not suffer from the spam and abuse that have overtaken other...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/05/30/20-years-later-irc-is-still-useful-are-you-taking-advantage-of-it.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14216" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/wmassdevs/default.aspx">wmassdevs</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/experiences/default.aspx">experiences</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/irc/default.aspx">irc</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/internet/default.aspx">internet</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/technology/default.aspx">technology</category></item></channel></rss>