<?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-1982668727859361377</id><updated>2012-02-15T23:53:40.479-08:00</updated><category term='wcf'/><category term='pex'/><category term='rooms'/><category term='netwoking'/><category term='integration'/><category term='silverlight'/><category term='sockets'/><category term='commander'/><category term='log4net'/><category term='design'/><category term='world'/><category term='framework'/><category term='testing'/><category term='code contracts'/><category term='citrine'/><category term='web services'/><category term='exits'/><category term='mercurial'/><category term='musings'/><category term='castle windsor'/><category term='networking'/><title type='text'>Obsidian#</title><subtitle type='html'>An interactive fiction/MUD engine written in C#, utilizing a Silverlight client interface.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-8042992690614441524</id><published>2010-01-11T22:46:00.000-08:00</published><updated>2010-01-11T22:52:50.973-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citrine'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='pex'/><category scheme='http://www.blogger.com/atom/ns#' term='code contracts'/><title type='text'>Exploring options</title><content type='html'>One of the original goals of this project was to have some good test coverage, for once. Embarrassingly, I've never worked within any unit testing framework.&lt;br /&gt;&lt;br /&gt;To that end, with the rewrite of Citrine, James and I are exploring two Microsoft Research Lab projects: &lt;a href="http://research.microsoft.com/en-us/projects/pex/"&gt;Pex&lt;/a&gt; and &lt;a href="http://research.microsoft.com/en-us/projects/contracts/"&gt;Code Contracts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Code Contracts provide a language agnostic .NET API for design-by-contract. At the simplest level, these allow for specifying guarantees with regards to function pre-conditions, post-conditions, and class invariants.&lt;br /&gt;&lt;br /&gt;Hand-in-hand with this idea, Pex is a framework for generating parameterized unit tests (PUTs). Pex analyzes the code under test for branches and uses a constraint solver to generate input combinations that provide maximal coverage. It has great synergy with Code Contracts, capable of creating unit tests to check edge cases that one might not normally come up with on his/her own. In addition, the Pex library provides an easy-to-use API for mocks and interceptors.&lt;br /&gt;&lt;br /&gt;I need to get more accustomed with these new tools before we delve too far into Citrine. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-8042992690614441524?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/8042992690614441524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2010/01/exploring-options.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8042992690614441524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8042992690614441524'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2010/01/exploring-options.html' title='Exploring options'/><author><name>Sapph</name><uri>http://www.blogger.com/profile/11756338638925427863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-2502072444209702299</id><published>2010-01-07T21:34:00.000-08:00</published><updated>2010-01-07T21:35:23.925-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citrine'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Just kidding</title><content type='html'>We're now refactoring most of Citrine to adhere to good testability standards, and as an exercise in unit testing. More to come later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-2502072444209702299?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/2502072444209702299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2010/01/just-kidding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/2502072444209702299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/2502072444209702299'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2010/01/just-kidding.html' title='Just kidding'/><author><name>Sapph</name><uri>http://www.blogger.com/profile/11756338638925427863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-2816409310061237646</id><published>2009-12-26T19:17:00.000-08:00</published><updated>2009-12-26T19:20:26.580-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citrine'/><category scheme='http://www.blogger.com/atom/ns#' term='netwoking'/><title type='text'>Citrine is stable.</title><content type='html'>Ha, it only took several months, but I'm now happy with the interface of Citrine... furthermore, it works.&lt;br /&gt;&lt;br /&gt;Now it's a matter of edge testing and beginning design of Obsidian's architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-2816409310061237646?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/2816409310061237646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/12/citrine-is-stable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/2816409310061237646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/2816409310061237646'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/12/citrine-is-stable.html' title='Citrine is stable.'/><author><name>Sapph</name><uri>http://www.blogger.com/profile/11756338638925427863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-6163149556430030009</id><published>2009-12-26T15:05:00.001-08:00</published><updated>2009-12-26T15:06:18.912-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citrine'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>News!</title><content type='html'>I've been working hard this week to finish Citrine. It's in a very useable state now (the interface is basically finalized). We're polishing though... finalizing an internal data protocol, bug-testing, etc. Hopefully Obsidian will pick up again soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-6163149556430030009?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/6163149556430030009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/12/news.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/6163149556430030009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/6163149556430030009'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/12/news.html' title='News!'/><author><name>Sapph</name><uri>http://www.blogger.com/profile/11756338638925427863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-1638487954213039825</id><published>2009-09-12T19:50:00.001-07:00</published><updated>2009-09-12T19:50:37.987-07:00</updated><title type='text'>Reporting in</title><content type='html'>No progress lately because school's started and I'm getting in a groove. This week is busy with interviews and netting a part-time job, so work will continue to be slow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-1638487954213039825?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/1638487954213039825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/09/reporting-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/1638487954213039825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/1638487954213039825'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/09/reporting-in.html' title='Reporting in'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-8656906061605289086</id><published>2009-08-10T01:51:00.000-07:00</published><updated>2009-08-10T01:55:24.004-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sockets'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='citrine'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Slow Citrine news</title><content type='html'>Not much exciting happening afraid. I cleaned up the test suites for my own sake:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://bitbucket.org/viserys/citrine/src/71b1079dbb9f/Citrine.TestServer/TestServerApp.cs"&gt;Server&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://bitbucket.org/viserys/citrine/src/71b1079dbb9f/Citrine.TestClient/TestClientApp.cs"&gt;Client&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Aside from that, I've started the serializeable-object server/clients to build on the raw data model. Not much working code there yet, though.&lt;br /&gt;&lt;br /&gt;Oh, and I fixed all the compiler warnings as far as XML doc goes. Exciting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-8656906061605289086?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/8656906061605289086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/08/slow-citrine-news.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8656906061605289086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8656906061605289086'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/08/slow-citrine-news.html' title='Slow Citrine news'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-8576964979292306493</id><published>2009-08-06T00:35:00.000-07:00</published><updated>2009-08-06T00:43:39.471-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sockets'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='citrine'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Citrine update</title><content type='html'>I made a lot of progress on Citrine today. It seems the most cases of clean and faulty disconnects now properly raise events. I'm sort of torn between using separate events for the two cases, but right now it's just "ConnectionLost" and "ClientDisconnected". It works pretty well, and I have a working Silverlight policy server done too.&lt;br /&gt;&lt;br /&gt;Testing and serialization to come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-8576964979292306493?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/8576964979292306493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/08/citrine-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8576964979292306493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8576964979292306493'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/08/citrine-update.html' title='Citrine update'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-3489647408849835883</id><published>2009-08-03T01:00:00.000-07:00</published><updated>2009-08-03T01:01:54.321-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sockets'/><category scheme='http://www.blogger.com/atom/ns#' term='citrine'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Citrine is underway</title><content type='html'>I've been working most of the weekend on the new Citrine project. It's taking a little more planning than anticipated; designing a robust TCP networking library and handling thread-safety, etc, has taken a lot of research.&lt;br /&gt;&lt;br /&gt;More news to come when I have it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-3489647408849835883?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/3489647408849835883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/08/citrine-is-underway.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/3489647408849835883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/3489647408849835883'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/08/citrine-is-underway.html' title='Citrine is underway'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-364940838370326698</id><published>2009-07-31T22:08:00.000-07:00</published><updated>2009-07-31T23:04:32.987-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sockets'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='citrine'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Networking update</title><content type='html'>I started a new repository for our System.Net.Socket networking library, located &lt;a href="http://bitbucket.org/viserys/citrine/"&gt;here&lt;/a&gt;. It's called Citrine, in the vein of naming my projects after minerals with no real value, heh.&lt;br /&gt;&lt;br /&gt;Citrine is open source, and I've currently settled on the &lt;a href="http://opensource.org/licenses/ms-pl.html"&gt;Microsoft Public License (Ms-PL)&lt;/a&gt;. I like the idea of sharing my code as I learn how to work with sockets, but I hate the concept of viral licenses. Hate on me all you want, but I'm going to side with Microsoft on the "GPL is a cancer" front.&lt;br /&gt;&lt;br /&gt;I was originally going to try to allow users of Citrine to use the client aspect in either Silverlight or regular .NET applications. Since the Silverlight assemblies are completely distinct, this is not going to be as easy as hoped. I might started two projects in VS and link the source code together (reference the same files), since it will mostly be identical.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-364940838370326698?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/364940838370326698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/networking-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/364940838370326698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/364940838370326698'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/networking-update.html' title='Networking update'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-3662371602786301222</id><published>2009-07-30T12:21:00.001-07:00</published><updated>2009-07-30T19:56:29.337-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sockets'/><category scheme='http://www.blogger.com/atom/ns#' term='musings'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Musings on framework design: Client Details</title><content type='html'>I was having a discussion with James earlier. He got a little flustered when I described the &lt;a href="http://timheuer.com/blog/archive/2008/06/06/silverlight-sockets-requires-policy-server-beta-2.aspx"&gt;Silverlight socket limitations&lt;/a&gt; to him.&lt;br /&gt;&lt;br /&gt;Namely:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Limited to port range 4502-4534&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Must have an additional server socket running on 943 to serve a policy file&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;A discussion ensued in which he advocated uses web services and polling to communicate between server and client. At this point, I'm pretty latched onto the idea of either sockets or WCF duplexing such that the server has a firm latch on a client object to call upon.&lt;br /&gt;&lt;br /&gt;As a result, we're now thinking about just implementing as many protocols as we can. WCF, web services, and sockets are all currently on the list. &lt;i&gt;Note: I'm still not bothering with PollingDuplexing. WCF duplexing will be for non-Silverlight clients.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;This would rely on the implementation of a client interface that allowed the server to specify various messages/events to be sent out. We'd then provide an implementation for each protocol. The socket implementation would write out data as it arrived on the underlying stream. The web service implementation would queue data up for a polling client to read. So on, so forth. The server would be blind to the implementation of each client, as each object would be instantiated at the initial connection and then thenceforth referenced as an IClient. Details to follow pending coding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-3662371602786301222?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/3662371602786301222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/musings-on-framework-design-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/3662371602786301222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/3662371602786301222'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/musings-on-framework-design-ii.html' title='Musings on framework design: Client Details'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-4548636103990416512</id><published>2009-07-29T21:59:00.000-07:00</published><updated>2009-07-30T12:31:04.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sockets'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='musings'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Musings on framework design: WCF v. Sockets</title><content type='html'>If we're abandoning WCF in favor of sockets, we lose out on something special - the ability to have well-defined communication between clients and server.&lt;br /&gt;&lt;br /&gt;PyMUD worked on the concept of basically no protocol. Raw text was sent back and forth between client and server, and it was up to the server to maintain a sense of what was expected from the client in terms of input. Since we're abandoning telnet support completely, that leaves us open to develop our own protocol. Exciting!&lt;br /&gt;&lt;br /&gt;I'm currently envisioning a system of serializeable Packet objects being transferred between client and server. The client and server projects would both reference a common assembly that defined the message interface. Similarly, for the purposes of this project, we would probably extend the base Client/Server objects that we've written and add event handlers. These handles would be used for extended Packets... such as CombatPacket, HPUpdatePacket, LootPacket... etc, I dunno. These would again be all defined in a common assembly. This assembly would ideally be well documented and then posted for distribution, so that others can implement our protocol if they want.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-4548636103990416512?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/4548636103990416512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/musings-on-framework-design-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/4548636103990416512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/4548636103990416512'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/musings-on-framework-design-i.html' title='Musings on framework design: WCF v. Sockets'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-7692308024947133833</id><published>2009-07-29T20:58:00.000-07:00</published><updated>2009-07-29T21:01:40.902-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>Nevermind</title><content type='html'>Wow, what a headache today. Apparently it's too much to ask to get a Silverlight application to play nicely with a self-hosted WCF duplex service. I thought it'd be simple after my tests last night, but &lt;i&gt;hell&lt;/i&gt; no. &lt;a href="http://blogs.msdn.com/michaelbraude/archive/2009/07/13/wcf-duplex-bindings-with-silverlight.aspx"&gt;This&lt;/a&gt; blog post by Michael Braude summarizes my pain.&lt;br /&gt;&lt;br /&gt;Following a tip off of the Silverlight game dev forums, I'm now investigating &lt;a href="http://www.silverlightshow.net/items/SocketsLight-Silverlight-Sockets-Framework.aspx"&gt;sockets&lt;/a&gt; again. They're not as cool as WCF, and it'll cause potential problems with firewalls, but I am &lt;b&gt;not&lt;/b&gt; dabbling in Silverlight WCF duplexing anymore until it stops making me want to gouge out my eyes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-7692308024947133833?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/7692308024947133833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/nevermind.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/7692308024947133833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/7692308024947133833'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/nevermind.html' title='Nevermind'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-8080010354057677426</id><published>2009-07-29T14:10:00.001-07:00</published><updated>2009-07-29T14:23:57.579-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>WCF, revisited</title><content type='html'>It turns out that Silverlight does not support the Duplex model I have coded as my test case. Instead, it relies on a new method created for SL3, called &lt;a href="http://weblogs.asp.net/dwahlin/archive/2008/06/16/pushing-data-to-a-silverlight-client-with-wcf-duplex-service-part-i.aspx"&gt;polling duplex binding&lt;/a&gt;. I am currently investigating whether this is lightweight/fast enough, and further whether it scales well enough, to fit our needs as the primary communication channel between client and server. It &lt;i&gt;may&lt;/i&gt; be prudent to switch tracks and investigate regular old sockets instead.&lt;br /&gt;&lt;br /&gt;Thanks again to &lt;a href="http://www.singingeels.com/UserDetails.aspx?UserName=Nullable"&gt;Timothy Khouri&lt;/a&gt; of SingingEels for pointing me in the right direction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-8080010354057677426?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/8080010354057677426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/wcf-revisited.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8080010354057677426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8080010354057677426'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/wcf-revisited.html' title='WCF, revisited'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-8953425302295304979</id><published>2009-07-29T13:58:00.000-07:00</published><updated>2009-07-30T12:31:19.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='exits'/><category scheme='http://www.blogger.com/atom/ns#' term='world'/><category scheme='http://www.blogger.com/atom/ns#' term='rooms'/><category scheme='http://www.blogger.com/atom/ns#' term='musings'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>Musings on MUD design: World Structure</title><content type='html'>This will be the first in a potential series of free-form posts where I dump a flash of inspiration, a brainstorm, or just thoughts.&lt;br /&gt;&lt;br /&gt;In PyMUD, we deliberately avoided the idea of a "mappable" world. We felt that sticking to a grid-based system was too constraining, especially after coming from &lt;a href="http://www.ishar.com/"&gt;Ishar&lt;/a&gt;, which does all sorts of quirky things with layout and exits. As such we defined some exits as de facto "standards" (N, S, E, W, Ne, Nw, Se, Sw, U, D, In, Out) and allowed for customization beyond those standards. Good idea, maybe, implemented in a messy fashion.&lt;br /&gt;&lt;br /&gt;I was thinking today about the idea of mapping, and in particular its merits. It's obviously beneficial to the player, but in particular it makes it easy to design a world for. When the world is mappable, it's much simpler to populate. However, I still feel constrained if a grid system is the &lt;i&gt;only&lt;/i&gt; option. &lt;br /&gt;&lt;br /&gt;I figure, why not have the best of both worlds? Create a world grid in 3D space. It would be tiled in the XY-plane, and layered vertically on the Z-axis. For the most part, this would be intuitive to map for. A room one tile in any direction would correspond to a shift U, D, N, E, S, W. What becomes slightly more complicated is how to handle diagonal lines (what if the slope is not a whole number?) and exits that span a location of "empty" grid locations. If (0, 0, 0) and (0, 2, 0) are populated and I want to link them, I need to know that (0, 1, 0) does not exist.&lt;br /&gt;&lt;br /&gt;At the moment, I envision the following rudimentary model:&lt;br /&gt;&lt;br /&gt;&lt;list&gt;&lt;br /&gt;&lt;li&gt;interfaces IRoom and IExit. An IRoom knows about its exits, and an IExit knows about its endpoints.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;implementations GridRoom and GridExit. These are for use in "standard" space. A GridRoom has a concrete, unique coordinate and is mappable. A GridExit points to a GridRoom, has a concrete direction, and a length.&lt;/li&gt;&lt;br /&gt;&lt;/list&gt;&lt;br /&gt;This would allow for other implementations that define complex Exit behavior (random Room targets, loops, wormholes, etc) as well as Rooms that exist outside of the grid-space. How exactly this model would be mapped to the database is material for another posting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-8953425302295304979?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/8953425302295304979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/musings-on-mud-design-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8953425302295304979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/8953425302295304979'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/musings-on-mud-design-i.html' title='Musings on MUD design: World Structure'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-32460811980252063</id><published>2009-07-28T22:25:00.000-07:00</published><updated>2009-07-28T22:45:30.757-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='commander'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='castle windsor'/><title type='text'>WCF</title><content type='html'>The basic WCF (&lt;a href="http://en.wikipedia.org/wiki/Windows_Communication_Foundation"&gt;Windows Communication Foundation&lt;/a&gt;) infrastructure is up and running. A lot of work done today!&lt;br /&gt;&lt;br /&gt;I initially added a new Commander project in a premature effort to try and emulate my previous reflection-based command parsing endeavors. That didn't work out so well because I realized I needed clients' input to actually parse. Instead of reflection, I devoted the evening to actually setting up client/server communication.&lt;br /&gt;&lt;br /&gt;Sadly, it seems documentation for getting WCF configured with Castle in a console application is pretty spare. I had to look far and wide and tear apart numerous WCF tutorials to get a grasp of what I'm doing. Much, much thanks to &lt;a href="http://www.singingeels.com/Articles/Client_Server_Programming_with_WCF.aspx"&gt;SingingEels&lt;/a&gt; for their client/server WCF primer, it was exceedingly helpful. As far as Windsor goes, &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using (var host = (DefaultServiceHost)&lt;br /&gt;    new DefaultServiceHostFactory().&lt;br /&gt;    CreateServiceHost(typeof(IObsidianServer).&lt;br /&gt;    AssemblyQualifiedName, new Uri[0]))&lt;br /&gt;{&lt;br /&gt;    host.Open();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;seemed to be the magic words.&lt;br /&gt;&lt;br /&gt;The result is that I now have a rudimentary client/server model going, sharing common interfaces for their WCF contracts. I'll probably work on documentation tomorrow since James and Steven B. still need to get their dev environments set up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-32460811980252063?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/32460811980252063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/wcf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/32460811980252063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/32460811980252063'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/wcf.html' title='WCF'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-4851364398390407953</id><published>2009-07-28T00:13:00.000-07:00</published><updated>2009-07-28T22:37:47.135-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='castle windsor'/><category scheme='http://www.blogger.com/atom/ns#' term='log4net'/><title type='text'>A little bit of progress</title><content type='html'>I got logging working today, and Windsor is all configured as of yesterday. Tomorrow or later I can start actually structuring the project. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-4851364398390407953?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/4851364398390407953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/little-bit-of-progress.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/4851364398390407953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/4851364398390407953'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/little-bit-of-progress.html' title='A little bit of progress'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1982668727859361377.post-3221838395600582879</id><published>2009-07-26T15:00:00.000-07:00</published><updated>2009-07-28T22:38:04.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mercurial'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>And, we're off</title><content type='html'>I finished researching technologies last night. Currently working on getting a &lt;a href="http://mercurial-scm.org/"&gt;Mercurial&lt;/a&gt; repository up and running on Bitbucket. This weekend will primarily consist of design, since James is unable to do any development yet, and Steven B. is out of town.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1982668727859361377-3221838395600582879?l=obsidian-sharp.sariph.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://obsidian-sharp.sariph.net/feeds/3221838395600582879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/and-were-off.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/3221838395600582879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1982668727859361377/posts/default/3221838395600582879'/><link rel='alternate' type='text/html' href='http://obsidian-sharp.sariph.net/2009/07/and-were-off.html' title='And, we&apos;re off'/><author><name>Viserys</name><uri>http://www.blogger.com/profile/05956641334844540017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_kCbNRv3kkiM/SmzJlgQwouI/AAAAAAAAALw/lZNJyLuxhi0/S220/SJ+San+Fran.jpg'/></author><thr:total>0</thr:total></entry></feed>
