<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Hive7</title>
	<atom:link href="http://corp.hive7.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://corp.hive7.com</link>
	<description>Social games for social networks!</description>
	<pubDate>Fri, 06 Nov 2009 22:23:01 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Functional Optimistic Concurrency in Knighthood</title>
		<link>http://corp.hive7.com/2009/06/26/functional-optimistic-concurrency-in-knighthood/</link>
		<comments>http://corp.hive7.com/2009/06/26/functional-optimistic-concurrency-in-knighthood/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:44:23 +0000</pubDate>
		<dc:creator>jd</dc:creator>
		
		<category><![CDATA[DB]]></category>

		<category><![CDATA[Games]]></category>

		<category><![CDATA[Tech]]></category>

		<category><![CDATA[C#]]></category>

		<category><![CDATA[Functional Programming]]></category>

		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=671</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p style="font-size:larger">A few months ago Phil Haack wrote about how C# 3.0 is a  <a href="http://haacked.com/archive/2009/02/15/the-functional-language-gateway-drug.aspx">gateway drug</a> to functional programming. I couldn&#8217;t agree more. I find myself solving problems using functional rather than imperative programming quite often nowadays. It&#8217;s much more elegant for many problem spaces.</p>
<p style="font-size:larger">Before we go any further, here&#8217;s the sample app used for this article. Even if you don&#8217;t like my writing, you should play with it. Yeah, you! <a href="http://jdconley.com/blog/downloads/optimistic-concurrency.zip">optimistic-concurrency.zip</a></p>
<p style="font-size:larger">One problem space that fits very well with functional patterns is in developing apps that have to use <a href="http://jdconley.com/blog/archive/2009/01/20/concurrency.-its-like-doing-the-dishes.aspx">optimistic concurrency</a> to maintain data consistency at scale. Here at Hive7 we build PvP games. In such games, multiple  people and background processes are often affecting the same entity at the same time. We can&#8217;t use coarse grained locks or high isolation levels in MS-SQL, or the whole game would come to a halt. Here&#8217;s a common scenario in a game like <a href="../games/knighthood/">Knighthood</a>:</p>
<p><img class="alignleft" style="0" src="http://knight.fb.hive7.com/res/img/area/wall.png?63356112540" alt="" width="113" height="100" /> Multiple rival lords are attacking my Kingdom at once trying to steal my most prized vassal, my wife! My wall is staffed with a heavy defense, and my hospital has a strong set of medics healing my kingdom over time. But to keep a handle on  the attack I also have to continuously spend gold to heal my defensive army.</p>
<p style="font-size:larger">
<p style="font-size:larger">In this common use case there are a number of subtleties. First, multiple people are attacking me at once. That  means they&#8217;re doing damage to my defenses in real time, and at the same time. My hospital is healing my vassals over time. This occurs in a background process once every few minutes. And I&#8217;m triggering an instant heal to my defensive vassals using my gold supply. My Marketplace is also generating gold for me over time in another background process. To top it all off, this is happening across a cluster of  application servers that are certain to be processing multiple requests simultaneously. Phew!</p>
<p style="font-size:larger">So what does all that mean? Well, basically, there are a lot of possibilities for change conflicts. And we have to  deal with those conflicts to both keep a consistent data model and perform well.</p>
<p style="font-size:larger">There are a a number of potential strategies for managing these change conflicts in the persistent store – a few beefy Microsoft SQL Server databases in our case. We chose to go with optimistic concurrency and an abort on conflict transaction strategy. That basically means when we write data to the database we make sure we are always writing the most recent version of a row. If an application attempts to write an old version of the row, the data access layer throws an exception and aborts the transaction. Knighthood uses <a href="http://www.hibernate.org/">NHibernate</a> so the validation is done for us automatically using a  simple version number on the row. The basic algorithm is:</p>
<ol>
<li>Read data and serialize into objects (done by NHibernate)</li>
<li>Modify objects in code</li>
<li>Tell NHibernate to persist the changes, which does the following
<ol>
<li>Increments the version number</li>
<li>Finds all the changes and batches up insert/update calls</li>
<li>Uses the version number in the WHERE clause of updates like: &#8220;UPDATE Table SET Col1=&#8217;blah&#8217; WHERE Version=36&#8243;</li>
<li>Checks the rows modified reported by SQL server and throws an exception if it&#8217;s an unexpected number</li>
</ol>
</li>
</ol>
<p style="font-size:larger">As you can imagine, this fails regularly in a high concurrency scenario, but it succeeds orders of magnitude more often than not. It&#8217;s also pretty standard for any web app nowadays.</p>
<p style="font-size:larger">The only problem is, to preserve consistency, an exception is thrown and the transaction is aborted when change conflicts occur. That means whatever request the application or user issued fails. We could show the user a friendly error message, but that would be a frustrating experience. Nobody likes seeing errors for non-obvious reasons. And in the case of headless software running in the background the error would just be in a log somewhere. If it&#8217;s something important that needs to happen, then we have to make sure it gets done! So us imperative programmers devise a retry scheme and write a loop with an exception trap around our code. Maybe you get clever and create a class that does this which raises an event any time you need to execute your retry-able code. But, this gets pretty cumbersome. Enter functional programming!</p>
<p style="font-size:larger">We have a little class named DataActions that is used to simplify and consolidate this retry process and make it painless to use. I&#8217;m going to use LINQ to SQL as the example here. Here&#8217;s some usage code:</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<pre>DataActions.ExecuteOptimisticSubmitChanges&lt;GameDataContext&gt;(
    dc =&gt;
    {
        var playerToMod = dc.Players.Where(p =&gt; p.ID == playerId).Single();
        SetRandomGold(playerToMod);
    });</pre>
<p style="font-size:larger">As you can see it&#8217;s really straight forward. Notice all the goodness going on there. We don&#8217;t have to instantiate our own DataContext, manually submit the changes, or worry at all about transactions. It&#8217;s all handled by the wrapper. And, you just have to provide some code to execute once the DataContext has been instantiated.</p>
<p>The ExecuteOptimisticSubmitChanges helper method itself is pretty simple as well:</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<pre><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span>
ExecuteOptimisticSubmitChanges&lt;TDataContext&gt;(Action&lt;TDataContext&gt; action)
    <span class="kwrd">where</span> TDataContext : DataContext, <span class="kwrd">new</span>()
{
    Retry(() =&gt;
        {
            <span class="kwrd">using</span> (var ts = <span class="kwrd">new</span> TransactionScope())
            {
                <span class="kwrd">using</span> (var dc = <span class="kwrd">new</span> TDataContext())
                {
                    action(dc);
                    dc.SubmitChanges();
                    ts.Complete();
                }
            }
        });
}</pre>
<p>And, finally, we have the Retry method:</p>
<p><!-- code formatted by http://manoli.net/csharpformat/ --></p>
<pre><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Retry(Action a)
{
    <span class="kwrd">const</span> <span class="kwrd">int</span> retries = 5;
    <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; retries; i++)
    {
        <span class="kwrd">try</span>
        {
            a();
            <span class="kwrd">break</span>;
        }
        <span class="kwrd">catch</span>
        {
            <span class="kwrd">if</span> (i == retries - 1) <span class="kwrd">throw</span>;

            <span class="rem">//exponential/random retry back-off.</span>
            var rand = <span class="kwrd">new</span> Random(Guid.NewGuid().GetHashCode());
            <span class="kwrd">int</span> nextTry = rand.Next(
              (<span class="kwrd">int</span>)Math.Pow(i, 2), (<span class="kwrd">int</span>)Math.Pow(i + 1, 2) + 1);

            Thread.Sleep(nextTry);
        }
    }
}</pre>
<p>When you string all this together you get pseudo-stacks that look like:</p>
<pre>MyCode
  ExecuteOptimisticSubmitChanges
    Retry
      ExecuteOptimisticSubmitChanges
        MyCode</pre>
<p style="font-size:larger">So, why should you care? The calling code is really easy to read, and you get a number of other benefits with this code. In addition to handling exceptions caused by concurrency errors, you also get retries on deadlocks, and more common Sql Connection errors.</p>
<p style="font-size:larger">I put together a little sample application you can play with. It uses these helpers and has a SQL Database with it. The sample simulates really high concurrency and you can watch it deal gracefully with deadlocks. Then you can change  line 29 of Program.cs and execute the same concurrent code without retries enabled. It ouputs the number of failed transactions and a bunch of other interesting stuff to the console. Here&#8217;s some example output:</p>
<pre>...

Retrying after iteration 0 in 1ms
Retrying after iteration 0 in 0ms
Thread finished with 0 failures. Concurrency at 3
Retrying after iteration 1 in 3ms
Retrying after iteration 1 in 4ms
Thread finished with 0 failures. Concurrency at 2
Retrying after iteration 2 in 5ms
Thread finished with 0 failures. Concurrency at 1
Retrying after iteration 3 in 15ms
Thread finished with 0 failures. Concurrency at 0

0 total failures and 7 total retries.
All done. Hit enter to exit.</pre>
<p>And the same test run with retries disabled:</p>
<pre>...

Starting worker. Concurrency at 8
Thread finished with 0 failures. Concurrency at 7
Thread finished with 0 failures. Concurrency at 6
Thread finished with 1 failures. Concurrency at 5
Thread finished with 1 failures. Concurrency at 4
Thread finished with 1 failures. Concurrency at 2
Thread finished with 2 failures. Concurrency at 3
Thread finished with 0 failures. Concurrency at 1
Thread finished with 2 failures. Concurrency at 0

7 total failures and 0 total retries.
All done. Hit enter to exit.</pre>
<p>Here&#8217;s the download link again: <a href="http://jdconley.com/blog/downloads/optimistic-concurrency.zip">optimistic-concurrency.zip</a></p>
<p style="font-size:larger">Let me know if you have any questions.</p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2009/06/26/functional-optimistic-concurrency-in-knighthood/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ioDrive, Changing the Way You Code</title>
		<link>http://corp.hive7.com/2009/03/14/iodrive-changing-the-way-you-code/</link>
		<comments>http://corp.hive7.com/2009/03/14/iodrive-changing-the-way-you-code/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 07:20:50 +0000</pubDate>
		<dc:creator>Max</dc:creator>
		
		<category><![CDATA[DB]]></category>

		<category><![CDATA[Games]]></category>

		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=608</guid>
		<description><![CDATA[Our brilliant chief architect JD have been playing recently with one cool pricey toy from Fusion-IO. After running IODrive through our demanding MMO database usage patterns the results are amazing!]]></description>
			<content:encoded><![CDATA[<p>Our brilliant <a href="http://corp.hive7.com/about/" target="_blank">chief architect JD</a> have been playing recently with one cool pricey toy from <a href="http://www.fusionio.com/Products.aspx" target="_blank">Fusion-IO</a>. After running IODrive through our demanding MMO database usage patterns the results are amazing! Here is JD research with all nice charts and juicy technical details.<br />
<hr /></p>
<p style="font-size:larger">At <strong>Hive7</strong> we make web based social games for platforms like Facebook and Myspace. We&#8217;re a small startup, but producing a successful game on these platforms means we&#8217;re writing code to deal with millions of monthly users, and thousands of simultaneous users pounding away at our games. Because our games are web based they&#8217;re basically written like you&#8217;d write any other web application. They&#8217;re stateless, with multiple RDBMS back end servers for most of the data storage. Game state is pretty small so we don&#8217;t really store that much data per user. We don&#8217;t have Google sized problems to solve or anything. Our main problem is with speed.</p>
<p style="font-size:larger">When you&#8217;re surfing the web you want it to be fast but can live with a page taking a few second to load here and there. When you&#8217;re playing a game, on the other hand, you want instant gratification. A full second is just way too long to wait to see the results of your action. Your character&#8217;s life might be on the line!</p>
<p style="font-size:larger">To accomplish this speed in our games we currently buy high end commodity hardware for our database servers, and have a huge cluster of memcached that we tap into. It works. But, properly implementing caching is complex. And those DB servers are big 3U power hungry monsters! Here&#8217;s a typical disk configuration of one of our DB servers:</p>
<p><span style="text-decoration: underline;"><a href="http://corp.hive7.com/wp-content/uploads/2009/03/h7raidsetup.png"></a><img class="alignnone size-full wp-image-609" title="h7raidsetup" src="http://corp.hive7.com/wp-content/uploads/2009/03/h7raidsetup.png" alt="" width="369" height="94" /></span></p>
<p style="font-size:larger">Each of those drives are 15k RPM 72 GB SAS (or whatever the fastest is at the time of build). And the RAID controllers are very high end with loads of cache. And here&#8217;s the kicker! We can only use about 25% of the capacity of these arrays before the database write load gets too high and performance starts to suffer. They cost us about $10k a piece. Sure, there are much more complex architectures we could use to gain performance. Or we could spend a few hundred grand and pick up a good SAN of some sort. Or we could drop some coin for <a href="http://www.youtube.com/watch?v=96dWOEa4Djs&amp;fmt=22">Samsung SSD&#8217;s</a>. But, those options are a bit out of the price we want to spend for our hardware, not to mention the necessary rack space and power requirements.</p>
<p style="font-size:larger">Enter the <a href="http://www.fusionio.com/Products.aspx">ioDrive</a>. With read/write speeds that are very close to the 24 SSD monster that Samsung recently touted, at a way lower price, I have a hard time imagining choosing the 24 drive option. Maybe if you had massive storage requirements, but for pure performance you can&#8217;t beat the ioDrive price/performance ratio right now. I don&#8217;t remember if I&#8217;m allowed to comment on pricing, but you can contact a sales rep at Fusion-io for more info.</p>
<p style="font-size:larger">Last month we picked up one of these bad boys for testing. In summary, &#8220;WOW!&#8221; I spent a few hours this week putting the ioDrive through the ringer and comparing it to a couple different disk configurations in our datacenter. My main goal was to see if this is a viable option to help us consolidate databases and/or speed up existing servers.</p>
<h3><a name="system"></a><strong>The Configuration</strong></h3>
<p><strong></strong><em>ioDrive System (my workstation)</em></p>
<ul>
<li>Windows Server 2008 x64 Standard Edition</li>
<li>4 CPU Cores</li>
<li>6 GB Ram</li>
<li>80 GB ioDrive</li>
<li>Log and Data files on same drive</li>
</ul>
<p><em>Fast Disk System</em></p>
<ul>
<li>Windows Server 2008 x64 Standard Edition</li>
<li>8 CPU Cores</li>
<li>8 GB Ram</li>
<li>16 15k RPM 72 GB SAS Drives (visualization above)</li>
<li>Log and Data files on different arrays</li>
</ul>
<p><em>Big and Slow Disk System</em></p>
<ul>
<li>Windows Server 2008 x64 Standard Edition</li>
<li>4 CPU Cores</li>
<li>8 GB Ram</li>
<li>12 7200 RPM 500 GB SATA Drives</li>
<li>Log and Data files on different arrays</li>
</ul>
<h3><a name="test"></a><strong>Test Configuration</strong></h3>
<p style="font-size:larger">For this test I used <a href="http://support.microsoft.com/kb/231619">SQLIOSim</a> with two five minute test runs. We were really only interested in simulating database workloads. If you want a more comprehensive set of tests check out <a href="http://www.tomshardware.com/search.php?s=iodrive&amp;x=0&amp;y=0">Tom&#8217;s Hardware</a>. I should also mention that this was obviously not a test of equals. Both disk based systems have a clear RAM advantage and the fast disk system has a clear CPU advantage. The hardware chipsets and CPU&#8217;s are also slightly different, but they&#8217;re the same generation of Intel chips. In any case, when you see the results you&#8217;ll see how this had a negligible effect. We&#8217;re talking orders of magnitude differences in performance here&#8230;</p>
<p style="font-size:larger">I ran two different configurations through SQLIOSim. One was the &#8220;Default&#8221; configuration that ships with the tool. It represents a pretty typical load on a SQL Server disk system for a general use SQL server. The other was one I created called &#8220;Write Heavy Memory Constrained&#8221;. The write heavy one was designed to simulate the usage in a typical game, where, due to caching, we have way more writes than reads to a database. Also, the write heavy one is much more parallel. It uses 100 simulated simultaneous random access users where the default one has only 8. And, with the write heavy one there is no chance the entire data set can be cached in memory. It puts a serious strain on the disk subsystem.</p>
<p style="font-size:larger">I took the output from SQLIOSim and imported it into Excel to do some analysis. I was primarily concerned with two metrics: IO Duration and IO Operation count. These two things tell me all I need to know. First, how long does it take the device to perform IO on average, and how many can it get done in the given time period.</p>
<h3><a name="results"></a><strong>Test Results</strong></h3>
<p><em>Write Heavy Memory Constrained Workload</em></p>
<table border="0">
<tbody>
<tr>
<th>Metric</th>
<th>ioDrive</th>
<th>Slow Disks</th>
<th>Fast Disks</th>
</tr>
<tr>
<td>Total IO Operations</td>
<td>10,625,381</td>
<td>1,309,673</td>
<td>3,260,725</td>
</tr>
<tr>
<td>Total IO Time (ms)</td>
<td>17,625,337</td>
<td>1,730,147,612</td>
<td>356,839,912</td>
</tr>
<tr>
<td>Cumulative Avg IO Duration (ms)</td>
<td>1.66</td>
<td>1,321.05</td>
<td>109.44</td>
</tr>
</tbody>
</table>
<p><img src="http://corp.hive7.com/wp-content/uploads/2009/03/mc-avgtime.png" alt="" width="483" height="291" /></p>
<p>Wow, 100x faster IO&#8217;s on average!</p>
<p><img src="http://corp.hive7.com/wp-content/uploads/2009/03/mc-time.png" alt="" width="483" height="291" /></p>
<p>Over 20x less time spent doing IO operations!</p>
<p><img src="http://corp.hive7.com/wp-content/uploads/2009/03/mc-ops.png" alt="" width="483" height="291" /></p>
<p style="font-size:larger">And over 3x more operations performed. This would have been way higher, but the ioDrive system was CPU constrained, taking 100% CPU. Looks like we&#8217;ll be loading up at least 8 cores in any database servers we build with these cards!</p>
<p><em>Default Workload</em></p>
<table border="0">
<tbody>
<tr>
<th>Metric</th>
<th>ioDrive</th>
<th>Slow Disks</th>
<th>Fast Disks</th>
</tr>
<tr>
<td>Total IO Operations</td>
<td>690,753</td>
<td>287,180</td>
<td>456,300</td>
</tr>
<tr>
<td>Total IO Time (ms)</td>
<td>3,616,903</td>
<td>231,859,576</td>
<td>93,991,055</td>
</tr>
<tr>
<td>Cumulative Avg IO Duration (ms)</td>
<td>5.24</td>
<td>807.37</td>
<td>205.99</td>
</tr>
</tbody>
</table>
<p><img src="http://corp.hive7.com/wp-content/uploads/2009/03/d-avgtime.png" alt="" width="483" height="291" /></p>
<p style="font-size:larger">
40x faster on average in this workload! Looks like the bulk operations and larger IO&#8217;s present in this workload narrowed the gap a bit.
</p>
<p><img src="http://corp.hive7.com/wp-content/uploads/2009/03/d-time.png" alt="" width="483" height="291" /></p>
<p>This time, a little under 30x less time spent doing IO operations!</p>
<p><img src="http://corp.hive7.com/wp-content/uploads/2009/03/d-ops.png" alt="" width="483" height="291" /></p>
<p style="font-size:larger">Only 1.5x more total operations this round. This time we weren&#8217;t CPU constrained, and I didn&#8217;t take the time to dig in to the &#8220;why&#8221; on this one. Based on the raw data I would guess this is caused by IO blocking a lot more often for ioDrive than the fast RAID system. This probably has to do with the caching system in the RAID cards under this mixed write workload. You&#8217;ll notice if you look at the raw report, that the ioDrive has no read or write cache at the device level. It doesn&#8217;t really need it.</p>
<p>In case you want to see the raw data or the SQLIOSim configuration files, you can download the package here:<a href="http://jdconley.com/blog/downloads/ioDrive/ioDrive.zip">ioDrive Test Results</a></p>
<h3><a name="conclusion"></a><strong>Conclusion</strong></h3>
<p style="font-size:larger">Wow! ioDrive is going to be scary fast in a database server, especially when it comes to tiny random write IO&#8217;s, parallelism, and memory constraints. I think we&#8217;ll be seeing a lot of new interesting software development and system architectures due to this type of technology. The industry is changing. You no longer need either tons of cache (or cash) or tons of RAM to get great performance out of your data store. We&#8217;re talking 100x better performance than our fast commodity arrays. I think it&#8217;s safe to say we&#8217;ll be using these devices in production in the near future. Since this device is currently plugged into my workstation, maybe I&#8217;ll post another review about how it&#8217;s improving my development productivity so you can convince your boss to buy you one. : ) </p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2009/03/14/iodrive-changing-the-way-you-code/feed/</wfw:commentRss>
		</item>
		<item>
		<title>link:  pretty loaded</title>
		<link>http://corp.hive7.com/2009/01/29/link-pretty-loaded/</link>
		<comments>http://corp.hive7.com/2009/01/29/link-pretty-loaded/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 18:44:04 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=605</guid>
		<description><![CDATA[Pretty Loaded is a nice collection of beautiful loading animations.  Its interesting to see how far we&#8217;ve come from the progress bar.
Pretty Loaded
]]></description>
			<content:encoded><![CDATA[<p>Pretty Loaded is a nice collection of beautiful loading animations.  Its interesting to see how far we&#8217;ve come from the progress bar.</p>
<p><a href="http://www.prettyloaded.com/" target="_blank">Pretty Loaded</a></p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2009/01/29/link-pretty-loaded/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Be inspired:  Onesize&#8217;s new motion reel</title>
		<link>http://corp.hive7.com/2009/01/28/be-inspired-onesizes-new-motion-reel/</link>
		<comments>http://corp.hive7.com/2009/01/28/be-inspired-onesizes-new-motion-reel/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 22:33:17 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[inspiration]]></category>

		<category><![CDATA[motion]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=602</guid>
		<description><![CDATA[While I like watching reels okay, I don&#8217;t normally post them, but this one is particularly good for the sound track &#38; effects as well as editing.
Onesize Reel 2008
And just to keep posting more about stuff not web game related, check out this incredibly talented group in the uk that has done consistently amazing work [...]]]></description>
			<content:encoded><![CDATA[<p>While I like watching reels okay, I don&#8217;t normally post them, but this one is particularly good for the sound track &amp; effects as well as editing.</p>
<p><a href="http://www.onesize.nl/projects/Showreel-2008" target="_blank">Onesize Reel 2008</a></p>
<p>And just to keep posting more about stuff not web game related, check out this incredibly talented group in the uk that has done consistently amazing work in motion graphics.  <a href="http://www.mainframe.co.uk/" target="_blank">Mainframe</a></p>
<p>Seriously though, its always good to look outside your domain for inspiration and ideation.  The most impactful innovation happens when translating ideas from one domain to another.</p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2009/01/28/be-inspired-onesizes-new-motion-reel/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Users reminisce about Knighthood over the past year&#8230;</title>
		<link>http://corp.hive7.com/2009/01/28/users-reminisce-about-knighthood-over-the-past-year/</link>
		<comments>http://corp.hive7.com/2009/01/28/users-reminisce-about-knighthood-over-the-past-year/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 08:43:07 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Games]]></category>

		<category><![CDATA[community]]></category>

		<category><![CDATA[knighthood]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=530</guid>
		<description><![CDATA[The Good Old Days Post

When a game can create moments powerful enough for people to feel nostalgia, I get a warm tingly feeling that we&#8217;ve done something good. Gaming can bring people together online and be more than just killing boredom.
]]></description>
			<content:encoded><![CDATA[<p><a title="the good old days" href="http://apps.facebook.com/knighthood/forum/default.aspx?g=posts&amp;t=24261" target="_blank">The Good Old Days Post<br />
</a></p>
<p>When a game can create moments powerful enough for people to feel nostalgia, I get a warm tingly feeling that we&#8217;ve done something good. Gaming can bring people together online and be more than just killing boredom.</p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2009/01/28/users-reminisce-about-knighthood-over-the-past-year/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Put down the abstract factory and get something done</title>
		<link>http://corp.hive7.com/2009/01/26/put-down-the-abstract-factory-and-get-something-done/</link>
		<comments>http://corp.hive7.com/2009/01/26/put-down-the-abstract-factory-and-get-something-done/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 19:58:01 +0000</pubDate>
		<dc:creator>jd</dc:creator>
		
		<category><![CDATA[Games]]></category>

		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=624</guid>
		<description><![CDATA[This may sound short sighted, and it is. In fact, that's the point. Projects change. You have to adapt. You will never know how your code will be used 5 years from now. Stop thinking about it. ]]></description>
			<content:encoded><![CDATA[<p>It seems as a group, us programmers have our priorities screwed up. Programmers value clean, concise code. Code that requires no documentation. Code that perfectly uses design patterns and best practices. Code that other programmers will look at and think &#8220;wow, I wish I was as l33t as this guy.&#8221;</p>
<p>But, let&#8217;s get real. That stuff doesn&#8217;t matter.</p>
<p>Why do you write code? Well, chances are someone pays you to do it. Of course the best programmers also love what they do and do it for fun. But at the end of the day it&#8217;s your profession. Maybe you&#8217;re (un)lucky enough to be doing it for yourself in your own startup.</p>
<p>In the early years of a startup only one thing should matter to a programmer: shipping your product to meet your customers&#8217; needs. Everything else we do is simply a result of this, the humblest of goals. Without the product people want you have no revenue. Without the revenue you have no company. Without the company, well, you get the idea.</p>
<p>Startups are widely considered the purest form of a company. You exist to meet a perceived need with a pretty small scope. There aren&#8217;t layers of management or TPS reports to get in the way of getting things done. The only barrier to getting something done is yourself. No excuses. It is in this environment where an engineer&#8217;s need for perfection must be replaced with a hacker&#8217;s passion to get things done, and get them done fast. Nothing else matters.</p>
<p>Maintainability isn&#8217;t a factor. Best practices don&#8217;t matter. Design patterns don&#8217;t matter. All that matters is getting things done. Don&#8217;t worry about scalability until you have to. Instantiate that object. Who cares about the factory. Skip the interface, and create a static class. Some day if you need the interface come back and re-factor your code. With the power of the IDE these days re-factoring is a lot less scary than it used to be.</p>
<p>This may sound short sighted, and it is. In fact, that&#8217;s the point. Who knows if the company will even exist in a year to have anything to maintain. Projects change. You have to adapt. You will never know how your code will be used 5 years from now. Stop thinking about it. 5 years ago did you think you&#8217;d be integrating your [random business application] with this Facebook thing? I bet you&#8217;ve thought about it now. Not to mention, 5 years from now it&#8217;s likely the entire programming paradigm will have changed. Were they thinking about AJAX when they designed ASP.NET? How about 3D graphics in desktop applications when the window message pump was developed? Such is life in our fast paced world. No amount of overly designed or perfectly formatted code will change it.</p>
<p>If you find yourself maintaining this horribly designed, hacked together legacy code from the early days of a company be thankful and bask in its glory. Without that spaghetti nightmare you wouldn&#8217;t have that job. It was that short sighted thinking that was able to get something done and create a profitable product/company.</p>
<p>Of course, I&#8217;m not advocating you just toss all your code in a button&#8217;s click event or anything that silly. Be smart, organize things well, but don&#8217;t waste time overly designing code to be flexible. If you have to spend more than a couple hours sketching out your design, it&#8217;s probably too complicated. Write some code. Re-factor it if you need to. You don&#8217;t need a proper RESTful architecture, or a perfect DDD. Your application isn&#8217;t going to change from Microsoft SQL to MySQL some day.</p>
<p>Alright, I&#8217;ll admit it. If you&#8217;re building enterprise server products, or work on a large team, or are building framework products for developers to use, then ignore everything I&#8217;ve said. Of course, then I&#8217;d question why you&#8217;re a startup in that position in the first place&#8230;.</p>
<p>So I urge you, especially if you&#8217;re in a startup, to put down put down the abstract factory and get something done.</p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2009/01/26/put-down-the-abstract-factory-and-get-something-done/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Big brands do mmos</title>
		<link>http://corp.hive7.com/2008/12/04/big-brands-do-mmos/</link>
		<comments>http://corp.hive7.com/2008/12/04/big-brands-do-mmos/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 00:00:46 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=519</guid>
		<description><![CDATA[Big brands that have strong content around entertainment are finding that the best way to go online and build a successful community on the web is to create a social network powered mmo game around their content.
Disney&#8217;s pixar will be releasing a Car&#8217;s flavored mmo next year.

Cartoon networks is releasing fusion fall this month.

Fusion Fall
]]></description>
			<content:encoded><![CDATA[<p>Big brands that have strong content around entertainment are finding that the best way to go online and build a successful community on the web is to create a social network powered mmo game around their content.</p>
<p>Disney&#8217;s pixar will be releasing a Car&#8217;s flavored mmo next year.</p>
<p><a href="http://worldofcars.go.com/" target="_blank"><img class="alignnone size-full wp-image-522" title="cars" src="http://corp.hive7.com/wp-content/uploads/2008/12/picture-5.png" alt="" width="350" height="335" /></a></p>
<p>Cartoon networks is releasing fusion fall this month.</p>
<p><a href="http://www.fusionfall.com/" target="_blank"><img class="alignnone size-full wp-image-521" title="fusion fall" src="http://corp.hive7.com/wp-content/uploads/2008/11/picture-6.png" alt="" width="300" height="166" /></a></p>
<p><a href="http://www.fusionfall.com/" target="_blank">Fusion Fall</a></p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2008/12/04/big-brands-do-mmos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Abby&#8217;s Magic Academy&#8230;</title>
		<link>http://corp.hive7.com/2008/11/21/abbys-magic-academy/</link>
		<comments>http://corp.hive7.com/2008/11/21/abbys-magic-academy/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 22:17:04 +0000</pubDate>
		<dc:creator>Andrew</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[art]]></category>

		<category><![CDATA[character designs]]></category>

		<category><![CDATA[concept art]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=513</guid>
		<description><![CDATA[Thought I&#8217;d share some more art from our archives. This one being a game based around a magic academy similar to Hotter Potter and Co. It didn&#8217;t really develop into anything more than just a concept.
I did get to come up with a couple title character designs that I still enjoy looking back on. There [...]]]></description>
			<content:encoded><![CDATA[<p>Thought I&#8217;d share some more art from our archives. This one being a game based around a magic academy similar to Hotter Potter and Co. It didn&#8217;t really develop into anything more than just a concept.</p>
<p>I did get to come up with a couple title character designs that I still enjoy looking back on. There was only a couple of days to concept the two characters, the result being wholesome Abbey and her mischievous litte brother. Oh and a couple cute and cuddly sidekicks of course. I&#8217;m such a sucker for those clean vector lines ala Illustrator.</p>
<div id="attachment_514" class="wp-caption alignnone" style="width: 86px"><a href="http://corp.hive7.com/wp-content/uploads/2008/11/abbeysmagicacademy.png" target="_blank"><img class="size-thumbnail wp-image-514" src="http://corp.hive7.com/wp-content/uploads/2008/11/abbeysmagicacademy-76x76.png" alt="Abbey's Magic Academy" width="76" height="76" /></a><p class="wp-caption-text">Abbey</p></div>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2008/11/21/abbys-magic-academy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Some inspiring new game concepts from around the web</title>
		<link>http://corp.hive7.com/2008/11/20/some-creative-new-game-concepts/</link>
		<comments>http://corp.hive7.com/2008/11/20/some-creative-new-game-concepts/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 20:53:38 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=511</guid>
		<description><![CDATA[
The Unfinished Swan - Tech Demo 9/2008 from Ian Dallas on Vimeo.

Touchgrind Trailer - Illusion Labs from Streetlab on Vimeo.
]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="302" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=1807754&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="302" src="http://vimeo.com/moogaloop.swf?clip_id=1807754&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<a href="http://vimeo.com/1807754">The Unfinished Swan - Tech Demo 9/2008</a> from <a href="http://vimeo.com/user780137">Ian Dallas</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=2117294&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=2117294&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<a href="http://vimeo.com/2117294">Touchgrind Trailer - Illusion Labs</a> from <a href="http://vimeo.com/user161462">Streetlab</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2008/11/20/some-creative-new-game-concepts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mobties goes limited Beta</title>
		<link>http://corp.hive7.com/2008/11/19/mobties-goes-limited-beta/</link>
		<comments>http://corp.hive7.com/2008/11/19/mobties-goes-limited-beta/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 09:52:34 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://corp.hive7.com/?p=508</guid>
		<description><![CDATA[
We just recently launched our second game called Mobties.  Its a mob flavored social strategy game based off of knighthood.  While knighthood was developed in a more startup fashion, we built on the success of knighthood and fleshed out a more cohesive visual direction this time around.  Right now its in limited beta, meaning we [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://apps.facebook.com/mobties/" target="_blank"><img class="alignnone size-full wp-image-509" title="Mobties" src="http://corp.hive7.com/wp-content/uploads/2008/11/mobsappimage.png" alt="" width="395" height="434" /></a></p>
<p>We just recently launched our second game called Mobties.  Its a mob flavored social strategy game based off of knighthood.  While knighthood was developed in a more startup fashion, we built on the success of knighthood and fleshed out a more cohesive visual direction this time around.  Right now its in limited beta, meaning we are limiting access to the game while we work out the bugs.</p>
<p>Check it out <a href="http://apps.facebook.com/mobties/" target="_blank">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://corp.hive7.com/2008/11/19/mobties-goes-limited-beta/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
