<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-137548844672956679</id><updated>2012-01-27T12:37:35.895+10:30</updated><category term='Dungeons and Dragons'/><category term='2009'/><category term='software'/><category term='programming'/><category term='Game Assistant'/><category term='Project'/><category term='2010'/><category term='blog'/><category term='beginner'/><category term='Live Spaces'/><category term='.NET'/><category term='novice'/><category term='CodePlex'/><category term='Contributions'/><title type='text'>Ozziemedes</title><subtitle type='html'>This blog documents my explorations of Microsoft's .NET software solutions platform and associated servers.  My target audience is students and novice developers.  I am far from an expert in the development sphere (despite 13 years in software infrastructure support), but hopefully this will offer a greater opportunity for "Eureka" moments, rather than being drowned in technical detail requiring assumed knowledge.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ozziemedes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ozziemedes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ozziemedes</name><uri>http://www.blogger.com/profile/13742620554956044085</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-dSxaJKzfW0c/TyIGcDKRH5I/AAAAAAAAAG4/fvQF2oeTmv0/s220/Ch9%2BAvatar.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-137548844672956679.post-2707243401389858640</id><published>2010-01-27T09:26:00.002+10:30</published><updated>2010-01-27T09:28:48.906+10:30</updated><title type='text'>Confessions of a Slacker (and OneNote Niftiness)</title><content type='html'>A quick update on DPGA and this blog...&lt;br /&gt;&lt;br /&gt;For those following this blog, I've been qujiet for a couple of weeks.&amp;nbsp; One reason for this is that I've been setting up a SQL Server blog over at http://ozziemedessql.blogspot.com, where I'm doing a series of posts on querying metadata for fun and productivity.&amp;nbsp; The other reason is that I have been working on building user story cards for the DPGA application.&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;As an aside, I've been building the DPGA story cards using Microsoft's OneNote application, which lends itself nicely to this kind of relatively ad hoc documentation.&amp;nbsp; It's possible to create OneNote post templates containing preconfigured content (which I've done), so that each time you create a new note within a given section it is based on an existing note.&amp;nbsp; The net result looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_ZmmQsx4XcS0/S19xZCRAc0I/AAAAAAAAADg/k1VSZeZW8fk/s1600-h/UserStoryCards_In_OneNote.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="301" mt="true" src="http://2.bp.blogspot.com/_ZmmQsx4XcS0/S19xZCRAc0I/AAAAAAAAADg/k1VSZeZW8fk/s400/UserStoryCards_In_OneNote.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Is it not nifty?&amp;nbsp; I just click "New Page" and I get a clean pre-formatted template and can populate data directly into the table.&lt;br /&gt;&lt;br /&gt;The DPGA app is fairly complex (lots of different TYPES of functionality), so building user stories isa relatively time consuming process. Anyone who wants to help out by building story cards is more than welcome to do so. Just leave a comment with an email address I can hit you back on and I'll set you up with access to the one-note repository on the DPGA project site. This is&amp;nbsp;a great opportunity to get involved in the design of the tool.&lt;br /&gt;&lt;br /&gt;Once I've got all the user stories worked out, I'll publish a "project backlog" (basically a list of user stories to be implemented) and will work through the priorities.&amp;nbsp; Once that's done, I can start working with code!&lt;br /&gt;&lt;br /&gt;Until then - Code Well and Code Often!&lt;div class="blogger-post-footer"&gt;This content is sponsored by http://www.poddify.com.au/ - please support them as they support the .NET community.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137548844672956679-2707243401389858640?l=ozziemedes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozziemedes.blogspot.com/feeds/2707243401389858640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ozziemedes.blogspot.com/2010/01/confessions-of-slacker-and-onenote.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/2707243401389858640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/2707243401389858640'/><link rel='alternate' type='text/html' href='http://ozziemedes.blogspot.com/2010/01/confessions-of-slacker-and-onenote.html' title='Confessions of a Slacker (and OneNote Niftiness)'/><author><name>Ozziemedes</name><uri>http://www.blogger.com/profile/13742620554956044085</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-dSxaJKzfW0c/TyIGcDKRH5I/AAAAAAAAAG4/fvQF2oeTmv0/s220/Ch9%2BAvatar.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZmmQsx4XcS0/S19xZCRAc0I/AAAAAAAAADg/k1VSZeZW8fk/s72-c/UserStoryCards_In_OneNote.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137548844672956679.post-3112810852588776033</id><published>2010-01-07T15:04:00.001+10:30</published><updated>2010-01-07T15:04:30.055+10:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Project'/><category scheme='http://www.blogger.com/atom/ns#' term='CodePlex'/><category scheme='http://www.blogger.com/atom/ns#' term='novice'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Dungeons and Dragons'/><category scheme='http://www.blogger.com/atom/ns#' term='Contributions'/><category scheme='http://www.blogger.com/atom/ns#' term='beginner'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Assistant'/><title type='text'>Note: Game Assistant Contributions</title><content type='html'>&lt;p&gt;Just so people are aware – I’ve created a project on &lt;a href="http://dpga.codeplex.com/" target="_blank"&gt;CodePlex&lt;/a&gt; for this project, so people will be able to inspect the source code and discuss what I’ve done, how I’ve done it.&amp;#160; I’m happy to accept that my code will not be brilliant quality at the start – this project is as much about teaching me to code as teaching others.&amp;#160; &lt;/p&gt;  &lt;p&gt;Also, if people want to help out on the project, I’m happy to accept other contributors.&amp;#160; My only request is that you focus on the real objective of the project – i.e. learning about what’s possible in the .NET framework – and make sure that your code is commented properly.&amp;#160; I’d also ask that you post blog entries on any modules submitted to the project, so both I and my readers can learn from what you’ve done.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;This content is sponsored by http://www.poddify.com.au/ - please support them as they support the .NET community.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137548844672956679-3112810852588776033?l=ozziemedes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozziemedes.blogspot.com/feeds/3112810852588776033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ozziemedes.blogspot.com/2010/01/note-game-assistant-contributions.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/3112810852588776033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/3112810852588776033'/><link rel='alternate' type='text/html' href='http://ozziemedes.blogspot.com/2010/01/note-game-assistant-contributions.html' title='Note: Game Assistant Contributions'/><author><name>Ozziemedes</name><uri>http://www.blogger.com/profile/13742620554956044085</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-dSxaJKzfW0c/TyIGcDKRH5I/AAAAAAAAAG4/fvQF2oeTmv0/s220/Ch9%2BAvatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137548844672956679.post-1531346285983477048</id><published>2010-01-07T12:39:00.002+10:30</published><updated>2010-01-07T13:14:21.866+10:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Project'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Dungeons and Dragons'/><category scheme='http://www.blogger.com/atom/ns#' term='beginner'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Assistant'/><title type='text'>Proposed Technologies for Game Assistant</title><content type='html'>&lt;p&gt;In my last post, I put together a feature list for my Gaming Assistant project. At this point I’m ready to propose a set of technologies that will be used to build my solution.&lt;/p&gt;&lt;h3&gt;Technology Selection&lt;/h3&gt;&lt;p&gt;I’m going to take a structured approach to the technology selection. There are five key technology choices I need to make, as follows:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Code Platform (choices: VB.NET, C#, other) &lt;/li&gt;&lt;li&gt;Visual Platform (choices: winforms, ASP.NET, WPF, Silverlight, DirectX) &lt;/li&gt;&lt;li&gt;Remoting Platform (choices: WCF, SOAP web services, TCP/IP Sockets) &lt;/li&gt;&lt;li&gt;MultiMedia Platform (choices: Live Services, DirectX, WPF MediaElement, SkypeAPI) &lt;/li&gt;&lt;li&gt;Structured Data Persistence &amp;amp; Distribution Platform (choices: XML files, SQL Server Compact Edition, SQL Server Express Edition) &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let’s tackle these one by one.&lt;/p&gt;&lt;h4&gt;Code Platform&lt;/h4&gt;&lt;p&gt;This is a personal choice only, not a criticism of any of the other options. I like the conciseness of C#. VB.NET might be a little “friendlier” to read, but I find myself having to read a lot more code to understand what’s going on in VB.NET than C#. I could possibly also look at alternative technologies with Common Language Runtime support (e.g. IronRuby, IronPython) but I’d be going back to square one, whereas with C# I at least have some idea about the syntax. So… C# it is.&lt;/p&gt;&lt;h4&gt;Visual Platform&lt;/h4&gt;&lt;p&gt;This is a much tougher choice. Most of the folks who will be using this program will also be geeky enough to have computer hardware capable of supporting all of the DirectX (and thus WPF and Silverlight) vector graphics features. So let’s walk through the pros and cons of each product.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Windows Forms&lt;/strong&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;p&gt;I have some experience writing simple windows forms&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;Windows forms is based on GDI+, not on DirectX&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;p&gt;Windows forms does not require .NET Framework version 3.0 features, so backward compatibility may not be as hard to implement&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;This means the “design palette” is not as functional as with other visual platform options&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;WinForms offers a rich eventing model and provides full multithreading support&lt;/td&gt;&lt;td valign="top" width="200"&gt;Windows Forms offers minimal support for vector graphics – particularly important for map rotation/zoom&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;ASP.NET Web Forms&lt;/strong&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;I have plenty of reference material on ASP.NET&lt;/td&gt;&lt;td valign="top" width="200"&gt;I have minimal experience working with ASP.NET&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;Using ASP.NET I could build something along the lines of a Web 2.0 “mashup”&lt;/td&gt;&lt;td valign="top" width="200"&gt;Managing session state and asynchronous events can be painful&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;ASP.NET supports the full functionality of the .NET framework in server-side code-behind&lt;/td&gt;&lt;td valign="top" width="200"&gt;ASP.NET requires extra effort around database security&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;ASP.NET does not support vector graphics to the same degree as other options&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;ASP.NET requires a server&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;For the app I want to build, ASP.NET will have to be mixed with AJAX or JQuery controls, requiring an additional language learning curve&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Windows Presentation Foundation&lt;/strong&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="402"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;I have done a 3 day course on WPF&lt;/td&gt;&lt;td valign="top" width="200"&gt;I have less direct experience working with WPF than WinForms&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;WPF supports vector graphics and DirectX&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;WPF uses XAML for form design – and as such is more declarative than WinForms – this simplifies coding slightly&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;WPF supports the full functionality of the .NET framework in code-behind&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;WPF does not require Javascript, AJAX or JQuery knowledge&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Silverlight&lt;/strong&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="402"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;Silverlight is heavily based on WPF&lt;/td&gt;&lt;td valign="top" width="200"&gt;I have no direct experience working with Silverlight&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;Silverlight supports vector graphics and DirectX&lt;/td&gt;&lt;td valign="top" width="200"&gt;Silverlight supports only a subset of the full functionality of the .NET framework in code-behind&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;Silverlight uses XAML for form design – and as such is more declarative than WinForms – this simplifies coding slightly&lt;/td&gt;&lt;td valign="top" width="200"&gt;Silverlight is a web-control set, and as such, runs in a sandbox that will make remoting awkward at best.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;Silverlight will work on a Mac.&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;Native Direct-X&lt;/strong&gt;&lt;/p&gt;&lt;table border="1" cellspacing="0" cellpadding="2" width="402"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;DirectX provides high performance access to graphics hardware&lt;/td&gt;&lt;td valign="top" width="200"&gt;I have no real experience working with DirectX&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;DirectX natively supports most of the things we want to do&lt;/td&gt;&lt;td valign="top" width="200"&gt;DirectX is a complex API for developers who haven’t written games before&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;DirectX offers the opportunity to design a very rich interface&lt;/td&gt;&lt;td valign="top" width="200"&gt;DirectX is very resource dependent – this could be a strength if I were artistically inclined, but I’m not, so having to create shader textures, rich bitmaps and so forth… too hard&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;DirectX is a stable set of APIs – it has been around since the mid-90s.&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;DirectX provides feature-rich audio capabilities, including DirectVoice – it’s audio conferencing API&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="200"&gt;Because DirectX is a set of modular APIs, it can be included into other visual platforms if required&lt;/td&gt;&lt;td valign="top" width="200"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;After working through the list above, I’ve decided that WPF provides the best mix of functionality and access to other tools.&lt;/p&gt;&lt;h4&gt;Remoting Platform&lt;/h4&gt;&lt;p&gt;What do I mean by “Remoting”? Remoting is the glue that connects one instance of the application to another over the network, allowing sharing of information, feeds (e.g. Chat) and streams (video/voice). Out of the APIs listed above, it’s probably going to be easiest to run with Windows Communication Foundation (WCF), as it serves as a wrapper/abstraction layer for the other two options (TCP/IP Sockets and Web Services).&lt;/p&gt;&lt;h4&gt;&lt;/h4&gt;&lt;h4&gt;Multimedia Platform&lt;/h4&gt;&lt;p&gt;I think I’m going to park this one for now while I do more research. There’s a lot of options out there (windows native and third party APIs) and I’d like to spend some time evaluating them more thoroughly before I make a choice. Once I get a bit further into the project, I’ll post my reviews online here.&lt;/p&gt;&lt;h4&gt;Structured Data Persistence &amp;amp; Distribution Platform&lt;/h4&gt;&lt;p&gt;Having spent over a decade as a SQL Server DBA/Developer, the product family of choice for me is going to be SQL Server of some sort. XML is an option, but it’s stored as plain-text and therefore prone to hacking. XML is also a bastard to query – XPath is a pain to use, and XQuery is not supported natively in all situations. &lt;/p&gt;&lt;p&gt;The choice to me seems to be between SQL Server Compact Edition (runs in-process with the application, no support for stored procedures, but very small footprint) or SQL Server Express Edition (provides more features, but also requires a fairly large installation footprint). &lt;/p&gt;&lt;p&gt;For the purposes of this application, I’m going to favour deployment footprint as the determinant of which edition to use. As such, SQL Server Compact Edition will be used. I will use Sync Services to make sure that players can inspect and annotate their character sheets offline, and have their changes synchronized back to the GM once they connect.&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;&lt;p&gt;I know I promised that I’d add some scheduling to this post, but the platform selection discussions got a bit bigger than I intended. &lt;/p&gt;&lt;p&gt;I’ve had a deeper think about scheduling and decided that I’m also going to manage the activities on this project using a 1-man “agile” approach. This means that the next post will lay out the process of turning the high level features from the previous post into a set of user stories to be implemented. I will rate the user stories by priority and effort, and seek to build a schedule from that.&lt;/p&gt;&lt;p&gt;Note that this is an out-of-hours project for me, so I’m only going to commit 10-15 hours a week to working on it, where the 10 is the actual coding/design effort, and the 0-5 extra is the blogging time. I may spend more time on development or blogging occasionally, but this project should be considered to be a long-term initiative.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;This content is sponsored by http://www.poddify.com.au/ - please support them as they support the .NET community.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137548844672956679-1531346285983477048?l=ozziemedes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozziemedes.blogspot.com/feeds/1531346285983477048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ozziemedes.blogspot.com/2010/01/proposed-technologies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/1531346285983477048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/1531346285983477048'/><link rel='alternate' type='text/html' href='http://ozziemedes.blogspot.com/2010/01/proposed-technologies.html' title='Proposed Technologies for Game Assistant'/><author><name>Ozziemedes</name><uri>http://www.blogger.com/profile/13742620554956044085</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-dSxaJKzfW0c/TyIGcDKRH5I/AAAAAAAAAG4/fvQF2oeTmv0/s220/Ch9%2BAvatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137548844672956679.post-6660757792789400931</id><published>2010-01-06T12:12:00.001+10:30</published><updated>2010-01-06T12:12:37.103+10:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='2009'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Project'/><category scheme='http://www.blogger.com/atom/ns#' term='2010'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Dungeons and Dragons'/><category scheme='http://www.blogger.com/atom/ns#' term='Game Assistant'/><title type='text'>MIA but now returned…</title><content type='html'>&lt;p&gt;Wow… what a year 2009 turned out to be.&amp;#160; I ended up doing a lot of travel – especially during the latter half of the year, and ended up working long hours on most of the projects I was assigned to last year.&amp;#160; I didn’t have the spare energy to do the personal learning or the blog posting required to be able to achieve the objectives of this weblog, but I’m back on deck now – refocused, rejuvenated and ready to start chasing Eureka moments again in 2010.&lt;/p&gt;  &lt;p&gt;So… to keep myself honest, I’m going to post somewhat of a schedule here that I’ll try my best to meet.&amp;#160; I’m also going to put my dev work in the context of a real-world project that will make use of .NET 3.0 and 3.5 technologies as a way to task orientate my learning, and the information I’ll be sharing on this blog.&lt;/p&gt;  &lt;p&gt;So – let’s get started then!&lt;/p&gt;  &lt;h2&gt;&lt;/h2&gt;  &lt;h2&gt;The App&lt;/h2&gt;  &lt;p&gt;The project I’m going to be working with is a dice-and-paper role-playing game assistant.&amp;#160; I’m an old school gamer (in the pre-PC gaming sense) who has some friends interstate who are keen to do some dice-and-paper gaming, so I want to build an application that can facilitate a distribute gaming session, where participants are in different cities, or perhaps even different countries!&amp;#160; For now, I’m going to focus on Dungeons and Dragons Ed 3.5, as it’s relatively well-known, and still widely enjoyed.&amp;#160; However, once the initial cut is out, I may look at using some extensibility tools to see if I can make the game system “pluggable” and look at writing some plug-ins for the White Wolf “World of Darkness” game system, and perhaps look into wiring up Cyberpunk 2020 and Shadow Run.&lt;/p&gt;  &lt;h3&gt;Requirements&lt;/h3&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Video &amp;amp; Voice&lt;/h4&gt;  &lt;p&gt;The first thing I want the tool to do is display multiple web-cam feeds and play multiple voice streams.&amp;#160; I also want to be able to have the tool enable private conversations between the Game Master (GM – aka Dungeon Master) and individual players.&lt;/p&gt;  &lt;h4&gt;Text Messaging&lt;/h4&gt;  &lt;p&gt;The next thing I need is the ability for the GM to send text messages to individual players, and be able to see a feed of text messages being sent between the other players.&lt;/p&gt;  &lt;h4&gt;Roll, baby, Roll!&lt;/h4&gt;  &lt;p&gt;Another feature I need to implement is a centralized dice rolling system.&amp;#160; In a distributed gaming environment, relying on players to be honest with dice rolls can – well… let’s call it an exercise in optimism.&amp;#160; So a centralized dice manager is critical.&amp;#160; The dice roller needs to have the ability for all of the GM’s rolls to be made private.&amp;#160; The GM also needs to be able to make certain player rolls private between the GM and the chosen player.&lt;/p&gt;  &lt;h4&gt;What a character…&lt;/h4&gt;  &lt;p&gt;Another core feature is character sheet tracking.&amp;#160; Character stats, abilities, experience points, To-Hit and Saving throw targets, Inventory, Banked Inventory and personal character notes all need to be tracked.&amp;#160; We will store some of this information in SQL Server database tables.&amp;#160; The database will also store relevant tables used for resolving combat and non-combat character situations.&amp;#160; I will also need to build a forms-based GUI for displaying and editing information in the character sheets.&amp;#160; The GM needs edit-level access to all character sheets, and the players need to be able to edit certain fields.&amp;#160; &lt;/p&gt;  &lt;h4&gt;A fast game is a good game…&lt;/h4&gt;  &lt;p&gt;A “nice to have” feature would be to include an sand-timer that the GM can trigger to force players to come to a quick decision.&amp;#160; This is particularly useful in combat scenarios where you don’t want players “meta-gaming” too much – i.e. haggling over who is going to hit the dragon with swords, where the archer is going to stand, what spell the magic user should be casting, or who the cleric should be healing first.&amp;#160; An alarm that plays in the audio channel of all players when the sand-timer empties should get the message across.&lt;/p&gt;  &lt;h4&gt;Combat Assistant&lt;/h4&gt;  &lt;p&gt;Another “nice to have” will be the inclusion of a combat ticker that can help the GM manage initiative rolls, character/enemy action sequencing and resolve the results of dice rolls.&amp;#160; Ideally, this would pop up in a separate window and provide support for various character choices such as subduing an enemy, charging, retreating, performing a defensive disengagement or calling an aimed strike.&lt;/p&gt;  &lt;h4&gt;Maps, maps and more maps!&lt;/h4&gt;  &lt;p&gt;Once again, on the “nice to have” list will be a map management tool, that allows the GM to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;“Automagically” generate dungeon and building maps (this actually requires some quite complex rules, which is why this feature is a nice to have) &lt;/li&gt;    &lt;li&gt;Upload maps created by the GM in Visio or JPEG format. &lt;/li&gt;    &lt;li&gt;Display currently visible map segments to players &lt;/li&gt;    &lt;li&gt;Manage the “Fog of War” based on player lines of sight. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;In-Game Economics and Politics&lt;/h4&gt;  &lt;p&gt;The final “nice to have” feature (and probably the most difficult to implement) is tracking of in-game economics and politics.&amp;#160; For example: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;If a band of adventurers clears all the goblins out of a dungeon, who moves in later?&amp;#160; What impact does this have on human, demi-human and humanoid populations in the area?&amp;#160; Who are the movers and shakers in the region?&amp;#160; &lt;/li&gt;    &lt;li&gt;If the player characters killed the goblin smith who was working on a doomsday weapon for a major political player, can they find out who did it?&amp;#160; And what form will their retribution take?&amp;#160; &lt;/li&gt;    &lt;li&gt;What about the slightly higher level scenario of a dark army levelling most of the towns in a given region and putting their crops to the torch?&amp;#160; What are the impacts of population change and resource changes?&amp;#160; &lt;/li&gt;    &lt;li&gt;If the players drain a major shrine of its healing power to raise one of their fallen comrades from the dead, will this anger the locals?&amp;#160; &lt;/li&gt;    &lt;li&gt;Given the typically feudal milieu that many role-playing games are set in, what sorts of problems might our characters set off by rising above their station, or mingling with lower castes than their own.&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A good GM will typically define a set of “factions” with whom adventurers can raise or lower their reputations.&amp;#160; A reputation tracker will be an important part of this module, but the GM should also be able to do some basic price modelling based on the demand and supply of resources, keeping in mind that humanoid races may participate in black-market economies, and that monsters can have an impact on the local demand and supply of goods (e.g. the undead roaming the marsh-lands, impacting the supply of peat to locals, or the bandits paying for their supplies with fools gold).&amp;#160; These impacts can probably be categorized as geographic, systemic, magic or malefic to help make the modelling easier.&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;Well… that’s a pretty fair volume of text for a single blog post.&amp;#160; I’ll sign off for now, but in the next post I’ll discuss the technologies I intend to use for the Game Assistant, and start building a schedule for follow-up posts.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;This content is sponsored by http://www.poddify.com.au/ - please support them as they support the .NET community.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137548844672956679-6660757792789400931?l=ozziemedes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozziemedes.blogspot.com/feeds/6660757792789400931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ozziemedes.blogspot.com/2010/01/mia-but-now-returned.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/6660757792789400931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/6660757792789400931'/><link rel='alternate' type='text/html' href='http://ozziemedes.blogspot.com/2010/01/mia-but-now-returned.html' title='MIA but now returned…'/><author><name>Ozziemedes</name><uri>http://www.blogger.com/profile/13742620554956044085</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-dSxaJKzfW0c/TyIGcDKRH5I/AAAAAAAAAG4/fvQF2oeTmv0/s220/Ch9%2BAvatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137548844672956679.post-8442641095376921614</id><published>2009-05-10T05:10:00.002+09:30</published><updated>2009-05-10T05:10:00.469+09:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Live Spaces'/><category scheme='http://www.blogger.com/atom/ns#' term='novice'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='beginner'/><title type='text'>Moving from GedZone on Live Spaces</title><content type='html'>&lt;span style="font-family:verdana;font-size:85%;"&gt;This is the first in what I hope will be a decent number of blogs on Blogger. I actually started this blog on &lt;a href="http://gedzone.spaces.live.com/"&gt;GedZone&lt;/a&gt; but I'm moving content over here as I'm disappointed in the Live-Spaces blogging engine's capabilities to support extensibility and RSS aggregation. I also have a blog over on &lt;/span&gt;&lt;a href="http://www.xanga.com/ged1970"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Xanga&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;.&lt;br /&gt;&lt;br /&gt;So… firstly, a few things about me.&lt;br /&gt;&lt;br /&gt;I’m an information technology professional who works for a large IT outsourcer. I’ve been somewhat rudderless there for about two years, trapped between infrastructure software support and software architecture (particularly in the SQL Server area), and catching just about everything Microsoft related that has fallen through the cracks, but largely twiddling my thumbs waiting for work to come along. One specific area in which I’ve spent a lot of hours is in tools support for development with the .NET platform. I can’t say I’ve had a huge amount of time to spend using those tools yet, but I’ve written a couple of hundred pages of documentation for support and development teams on tools such as &lt;/span&gt;&lt;a href="http://www.codeplex.com/sqlnexus"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;SQLNexus&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;, Microsoft’s &lt;/span&gt;&lt;a href="http://support.microsoft.com/kb/944837/en-us"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;RML utilities for SQL Server&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; and their Visual Studio Team System &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-au/vsts2008/db/default.aspx"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Database Edition tools&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; that ship with &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-au/vsts2008/products/default.aspx"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;VSTS 2008&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;.&lt;br /&gt;&lt;br /&gt;My employer is currently undergoing some interesting organizational changes as a result of a merger between it and a competitor. One of the things that is happening is that I’m moving across into the Microsoft Solutions Practice, in which my role will incorporate elements of a number of more formally defined roles – solution designs using Microsoft’s various application servers will certainly be a big part of my job, but I will also be responsible (along with my peers) for defining training paths, product capability maps, tools evangelism and standards evangelism. It looks pretty interesting, but I’m having to boost my skills both up into the software architecture space, and sideways into the sales support and software development areas. Just to round all this out, I’ve also decided to work towards raising my profile in the Microsoft developer community, and the blogging on this site will be the first step.&lt;br /&gt;&lt;br /&gt;I’ve just got back from two weeks touring around the south west of Western Australia. The trip was a lot of fun (despite having cataclysmic elements such as tipping the car onto its right side&lt;br /&gt;while driving a very loose pebbly dirt road near Pemberton and getting stuck in Manjimup for 4 days). From a .NET learning perspective it was also quite productive! The great thing about driving around on my own is that I had nights to myself, and spent several evenings cutting C# code for some demos which you’ll start seeing up here over the coming weeks.&lt;br /&gt;&lt;br /&gt;In the demos, I went back to my “CompSci 101” training and started out with a “Hello World” app. I then built that out with some user I/O, starting out with a static class for tracking the time between console events, and an instantiable class with private properties for file logging. I then reused the classes from my console app in a WinForms version of the Hello World demo. I’ve also started working on a “Demo 2” series that will focus more on inheritance, polymorphism and other OO features such as indexers, serialization and code attributes. I’m also taking pains to introduce a few .NET framework classes in each demo, so the output won’t just be “Here’s the C# language…” – it will be “Here’s the .NET Framework” as well.&lt;br /&gt;&lt;br /&gt;Over coming months I’ll be gearing up to actually video-casting some of this material, and preparing live presentations for user groups on more advanced topics. The products that will probably get most input from me in the new role at work will be BizTalk, SharePoint and Dynamics CRM, so expect to see more about these products. I will also be looking to stand up the infrastructure required to record some demos using these tools, and will start posting that material once I’m done exploring the .NET framework. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Well… that’s it for now. Code often… Code well!!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;This content is sponsored by http://www.poddify.com.au/ - please support them as they support the .NET community.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137548844672956679-8442641095376921614?l=ozziemedes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozziemedes.blogspot.com/feeds/8442641095376921614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ozziemedes.blogspot.com/2009/05/moving-from-gedzone-on-live-spaces.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/8442641095376921614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/8442641095376921614'/><link rel='alternate' type='text/html' href='http://ozziemedes.blogspot.com/2009/05/moving-from-gedzone-on-live-spaces.html' title='Moving from GedZone on Live Spaces'/><author><name>Ozziemedes</name><uri>http://www.blogger.com/profile/13742620554956044085</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-dSxaJKzfW0c/TyIGcDKRH5I/AAAAAAAAAG4/fvQF2oeTmv0/s220/Ch9%2BAvatar.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137548844672956679.post-591521556315003990</id><published>2009-05-09T14:33:00.004+09:30</published><updated>2009-05-09T14:44:09.043+09:30</updated><title type='text'>An introduction to Microsoft .NET and Object Oriented Programming (OOP)</title><content type='html'>&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;First proper techy post! :)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The purpose of this series of blog-post is going to be as follows:&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To give beginners a few insights into how to program software using .NET programming languages (especially C#) and the .NET framework. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To help people understand why object orientated programming (OOP) is a powerful approach to software development. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To help people understand how OOP is supported by the .NET framework and the languages hich run inside the .NET CLR. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To provide some context about the run-time context of .NET applications, software architecture and design patterns and principles. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Some interesting coding scenarios and challenges. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;To help me wrap my own head around the topics I'm going to blog about. Like they say - there's no better way to learn than to teach, right?&lt;br /&gt;&lt;br /&gt;What this blog series will not deliver: &lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Comprehensive coverage of the entire .NET framework - sorry, but I don't want to still be blogging about IT on my 300th birthday. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;DEEP coverage of object orientated programming practices... I'll try to provide useful examples, but I'm not going to go into the computer science behind every design pattern I introduce. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Authoritative advice for people who are already experienced software engineers. (There's already millions of sites out there for you folks!) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Guaranteed 100% rock solid "best practices" - I'm going to try to ensure that some of my practices will be at least "okay" and that others might even border on "good", but my advice is simply my advice... I'm not aiming to lay down "The Truth" in any singular, absolute or even expert way. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Some other stuff this blog series will contain now and then... &lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Audio discussions of various high level principles. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Video demonstrations of the principles outlined in the blog, including code walkthroughs and discussions of some of the design decisions behind the code. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Interviews from other members of the developer community - potentially including conference and/or user group demos and speeches. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Source code demonstrating the points I'm outlining in the blog. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Reviews of .NET programming books, training and other .NET resources (e.g. starter kits, CodePlex projects, tools &amp;amp; utilities) &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;References to good design practices for other platforms (e.g. SQL Server, BizTalk, WCF, etc) &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;So - that's the preliminaries done with. Now on to the meat of the matter!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;hr /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Many people may hear a developer talk about the .NET framework and will tell them "Oh - that's all about web services, right?" If they repeat that question to a Microsoft marketing drone, they'll get applause! But for those of us working with software on a daily basis, the .NET framework is basically an abstraction layer that sits over the top of an operating system (Windows for those of you not using Mono or tinkering with the project formerly known as Rotor - more about those later!). &lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The .NET Framework provides a centralized set of visual controls, class libraries, object factories and more that allow developers to write applications without having to learn &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-au/visualc/default.aspx" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;C++&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;, &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-au/library/aa139672.aspx" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;COM and the Windows API&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; - all of which are very difficult to work with, and prone to catastrophic errors when poor practices are used. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The .NET framework is extensible (many of the classes are not sealed, so are freely inheritable - especially many of the visual controls - great for custom control developers!) and probably one of the best documented software frameworks I've ever seen. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The .NET framework can be used to develop "&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/en-au/asp.net/default.aspx" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;ASP.NET&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;" web applications (requiring Microsoft's IIS hosting platform), which render a mixture of server-side controls (i.e. their logic and rendering is all managed directly by ASP.NET) and native HTML controls. Server-side controls are rendered as native HTML in the stream sent to the client browser. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The .NET framework can be used to build &lt;/span&gt;&lt;a href="http://www.w3.org/" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;standards compliant&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; web services. &lt;/span&gt;&lt;a href="http://www.w3.org/2002/ws/" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Web services&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; allow systems on different platforms to interoperate cleanly in a standards-based manner over the internet. If you've made a credit card payment online, odds are that the software that accepted the submission of your transaction and sent back an approval notice was a web service! Web services can be used for all sorts of things - ranging from social networking to weather reports, from stock market quotes to media streaming. The key point to understand here is that a web service won't display itself in a browser, but still uses HTTP (or HTTPS) as its communication protocol. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The .NET framework can be used to develop powerful, scalable enterprise applications that integrate cleanly not only with other Microsoft applications platform services (e.g. &lt;/span&gt;&lt;a href="http://www.microsoft.com/biztalk" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;BizTalk&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;, &lt;/span&gt;&lt;a href="http://www.microsoft.com/sql" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;SQL Server&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;, &lt;/span&gt;&lt;a href="http://www.microsoft.com/exchange" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Exchange&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;, &lt;/span&gt;&lt;a href="http://www.microsoft.com/sharepoint" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;SharePoint&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;), but with other more generic toolsets as well (e.g. &lt;/span&gt;&lt;a href="http://www-01.ibm.com/software/integration/wmq/index.html" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Websphere MQ&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;, &lt;/span&gt;&lt;a href="http://www.oracle.com/database/index.html" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Oracle&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; databases, &lt;/span&gt;&lt;a href="http://www.tibco.com/software/messaging/enterprise_messaging_service/default.jsp" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Tibco's Enterprise Messaging Service&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;, and so on). &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The .NET framework can also be used to build, manage, automate and deploy rich Windows applications, including those using the new "Windows Presentation Foundation" interface controls introduced in Windows Vista and with the Microsoft &lt;/span&gt;&lt;a href="http://www.microsoft.com/office" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Office&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; business productivity suite. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The .NET compact framework (once described by &lt;/span&gt;&lt;a href="http://www.neopoleon.com/" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Rory Blyth&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; of &lt;/span&gt;&lt;a href="http://www.dotnetrocks.com/" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;.NET Rocks&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; fame as "A wrapper around the System.NotImplementedException object") allows the development of mobile web applications, rich client mobile applications and even mobile games. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Finally, the .NET framework can be used to develop console applications and "lights out" services that run happily on Windows without the need for fancy GUIs. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;What does all this mean to me? The power to get the job done, wherever the data, wherever the user. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Digging a little deeper... Microsoft's .NET platform has been designed explicitly to support object orientated programming and design (OOPD). COM and the Win32 API provided a rich framework of objects which could be manipulated using external code, but the pointer arithmetic was dangerous and you had to get that right with your base objects. If you inherited from flaky base objects, all of your inherited code would be at risk. This is one of the things that led to a lot of vulnerabilities in Microsoft's flagship Windows operating system over the late 90s and early years of the current decade. C++ is very powerful, but it also requires an INSANE degree of attention to detail. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;So... what is all this object orientation stuff? How does it work? What does it do for me?  The key points are as follows: &lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;OOP allows developers to model real life THINGS based on the things they have in common. For example, mammals tend to have 4 limbs, 2 eyes - usually forward facing, two ears - typically capable of rendering hearing in a stereoscopic field, fur/hair/bristles, and teats to suckle their young on milk. However, it's possible to refine the definition of Mammal by breaking down additional definitions by genus, species, etc... in which the more specific refined models either override the base definition, or embellish it. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;As an example of this form of embellishment, consider the &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Felidae" target="_blank"&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;felidae&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt; family, which contains most of the cats. The felidae family can be categorized into subfamilies such as pantherinae ("big cats" such as tigers, leopards, panthers and lions), acinonychinae (cheetahs), felinae (typically smaller cats) - each of which has distinguishing characteristics and behaviours.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The pantherinae are much larger and heavier than the other felidae subfamilies, for example. The cheetah has non-retractable claws and a super-flexible spinal column. Where the big cats are all capable of roaring, the cheetah "yips" and yowls. Cheetahs have longer tails than their cousins, but shorter body-length to leg-length ratios. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;In the context of obejct orientated programming, a characteristic of a "Type" of thing is called an attribute of that thing, and the type itself is called a "Class". So in our feline example, "Felidae" would be a class of cats, in which the features common to all cats would be included as attributes. These would include the number of legs (4), type, number and distribution of teeth, stereoscopic vision, pivoting ears, good night vision, meat diet, and so on. The features specific to a "descendent" class of "pantherinae" would include higher maximum weight and length attributes than the class "felinae", a different list of preferred prey, and so on. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Howerver, cats don't only have attributes - they also have behaviours. Cats can stalk, run, leap, climb, eat, poop, and so on. There may be attributes that are specific to the behaviours of a specific class of felidae (e.g. Cheetahs have a higher maximum speed when running than other cats) which can be encapsulated (I'll get back to encapsulation in another blog) in the definition of their behaviours. In OOP these descriptions of behaviours are known as methods. This is because a software program executes a series of steps in a systematic order to model/perform the behaviour concerned. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;So now we have the idea of a class that has methods and attributes. The attributes are qualitative or quantitative descriptors of a type's characteristics. The methods are the type's behaviours. However, this is only a model right now. We haven't created a specific cheetah, lion or manx cat yet. When we talk about object orientated programming, the key objective is to perform operations on objects which can be described as specific instances of a class. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Consider the cat you may or not have had when you were growing up. Let's arbitrarily call this cat "Fluffy". Fluffy is an instance of the felinae class. As a member of the felinae class, it knows how to do all the usual catty things (yawn, stretch, eat, sleep, schmooze for food, throw cat-litter out of the box, stalk balls of wool, upset mother) and it probably has the usual characteristics of a typical house cat. In OOP we define instances of a class as objects, and we have now arrived at what OOP is named for. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;If I want to write a program to estimate the calories Fluffy burns each day, I would start by creating an instance of the felinae object called "Fluffy". If I knew Fluffy's schedule well enough I could then execute each of the methods on the Fluffy object to obtain a total for the amount of calories burned. Of course, the methods would have to return a calorific figure (which in itself is a specific "type" of information) after invokation, and would probably need to provide the method with a "time" value (or parameter) defining the amount of time spent by fluffy on each activity. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;The type returned by a method and the types and parameter names (which are really just placeholders) passed to a method comprise its signature. You shouldn't be able to pass a dollar amount to the time parameter of fluffy's AnnoyMother method - it doesn't make sense. Likewise, returning Fluffy's name after calling the Yawn method won't help me figure out whether I need to put him on a diet or not - as such, it would be an invalid return type. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Type safety is one of the big pluses in the .NET framework. This means it will make sure you are passing the right kinds of types in and out of methods and throw a warning message (exception) if you try to pass something that doesn't make sense. &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;Now that I've got you that far, I'm going to call it quits for the night. Next time I'll start off with a discussion of some additional OOP concepts (encapsulation, obfuscation, polymorphism, inheritance and operator overloading) and might throw in some C# code demos to illustrate each of these concepts. This has been a very high level discussion for those who've never really grokked what OOP is all about. I'll start moving through the concepts more quickly in future posts.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;This content is sponsored by http://www.poddify.com.au/ - please support them as they support the .NET community.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137548844672956679-591521556315003990?l=ozziemedes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozziemedes.blogspot.com/feeds/591521556315003990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ozziemedes.blogspot.com/2009/05/introduction-to-microsoft-net-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/591521556315003990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/591521556315003990'/><link rel='alternate' type='text/html' href='http://ozziemedes.blogspot.com/2009/05/introduction-to-microsoft-net-and.html' title='An introduction to Microsoft .NET and Object Oriented Programming (OOP)'/><author><name>Ozziemedes</name><uri>http://www.blogger.com/profile/13742620554956044085</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-dSxaJKzfW0c/TyIGcDKRH5I/AAAAAAAAAG4/fvQF2oeTmv0/s220/Ch9%2BAvatar.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-137548844672956679.post-1356021654741138712</id><published>2009-05-09T14:29:00.005+09:30</published><updated>2009-05-09T14:33:25.336+09:30</updated><title type='text'>A quick teaser</title><content type='html'>&lt;p&gt;For those of you who are interested in the .NET platform but are already familiar with OOP principles, you can skip the next few blog entries. For those of you coming into coding pretty much cold (or perhaps from effectively scripting objects in VB, VBA or similar without any OOP context), you'll see some introductory terminology wheeled out over the coming week or two. In these entries I'll be introducing (from waaaaaaay up at 50,000 feet) the basic building blocks of object oriented programming: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;The mission statement of object orientation &lt;/li&gt;&lt;li&gt;Simple vs Complex Types &lt;/li&gt;&lt;li&gt;Structs vs Classes vs Interfaces &lt;/li&gt;&lt;li&gt;An introduction to classes, properties, member variables and methods. &lt;/li&gt;&lt;li&gt;Static, Abstract and Virtual modifiers and their meanings &lt;/li&gt;&lt;li&gt;Object/variable scope - both declarative and implicit &lt;/li&gt;&lt;li&gt;Constructors and the "new" keyword &lt;/li&gt;&lt;li&gt;Destructors, IDispose and the finalize() method &lt;/li&gt;&lt;li&gt;Inheritance, Polymorphism and Operator Overloading&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I'll be trying to deliver this material in a fairly succinct and accessible fashion, so the hard core OOP crowd should excuse me if I'm not 100% complete with the textbook definitions. My focus on this site is going to be on application, not theory. However, in a few weeks' time I will be talking about some more advanced OOP principles and patterns. Once again, the focus will be on application, not theory, but for people coming out of the infrastructure world like myself, they're useful concepts to grok. I'll definitely be including links to more advanced content as I go. &lt;/p&gt;&lt;p&gt;You might be wondering "Where's the C# and .NET coding at?" - well... understanding the terminology and concepts I'm going to spell out in the next week is going to make it easier for you to understand material delivered further in subsequent entries. For example, learning how to declare a property in a C# class makes much more sense when you know what a property and a class are, and why you'd bother to build classes rather than simply writing procedural code. As I get into more advanced patterns and practices, I'll probably revisit some of the earlier examples and refactor them with the more advanced principles in mind. &lt;/p&gt;&lt;p&gt;I'm hoping to be able to write 1-2 blog entries a day for the next week, so check back regularly! &lt;/p&gt;&lt;p&gt;In the meantime: Code well, code often!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;This content is sponsored by http://www.poddify.com.au/ - please support them as they support the .NET community.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/137548844672956679-1356021654741138712?l=ozziemedes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ozziemedes.blogspot.com/feeds/1356021654741138712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://ozziemedes.blogspot.com/2009/05/get-geek-today.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/1356021654741138712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/137548844672956679/posts/default/1356021654741138712'/><link rel='alternate' type='text/html' href='http://ozziemedes.blogspot.com/2009/05/get-geek-today.html' title='A quick teaser'/><author><name>Ozziemedes</name><uri>http://www.blogger.com/profile/13742620554956044085</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/-dSxaJKzfW0c/TyIGcDKRH5I/AAAAAAAAAG4/fvQF2oeTmv0/s220/Ch9%2BAvatar.JPG'/></author><thr:total>0</thr:total></entry></feed>
