<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Walking Ideas Game Blog</title>
	<atom:link href="http://walkingideas.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://walkingideas.com/blog</link>
	<description>Making Games That Haven&#039;t Been Played</description>
	<lastBuildDate>Thu, 09 Feb 2012 18:05:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Tim Schafer, Double Fine to crowd-source a new adventure game</title>
		<link>http://walkingideas.com/blog/tim-schafer-and-crowd-sourcing-a-new-adventure-game/</link>
		<comments>http://walkingideas.com/blog/tim-schafer-and-crowd-sourcing-a-new-adventure-game/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 18:04:57 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Gaming Bizdev]]></category>
		<category><![CDATA[Theoretical Thoughts]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=107</guid>
		<description><![CDATA[Okay, I admit, I am a Tim Schafer fan.  If you know what we do at FableLabs, it should be no surprise that I love to see good stories in a game.  And Schafer has produced some of the most beautiful and story-rich graphics adventure games in the past.  He now turns to Kickstarter to [...]]]></description>
			<content:encoded><![CDATA[<p>Okay, I admit, I am a Tim Schafer fan.  If you know what we do at FableLabs, it should be no surprise that I love to see good stories in a game.  And Schafer has produced some of the most beautiful and story-rich graphics adventure games in the past.  He now turns to Kickstarter to fund his next &#8220;modern age&#8221; point-and-click adventure game.  Do yourself a favor and check them out!</p>
<p><a href="http://www.kickstarter.com/projects/66710809/double-fine-adventure">http://www.kickstarter.com/projects/66710809/double-fine-adventure</a></p>
<p>On the KS page, they pointed out that &#8220;<em>even something as &#8216;simple&#8217; as an Xbox LIVE Arcade title can cost upwards of two or three million dollars.  For disc-based games, it can be over ten times that amount.&#8221;  </em>This is something I mentioned in my rant about in my other post about the <a title="Game Design: Rise of the Clones" href="http://walkingideas.com/blog/game-design-rise-of-the-clones/">rise of game clones in the social/freemium space</a>.  Traditional games are expensive to make, and developers have to finish all the content at the time of release because players don&#8217;t continue to download updates to content and game mechanics each time they play.</p>
<p>Yes, downloadable content things like Steam update are starting to change that situation slowly, but it is not the same as freemium games for one major reason.  If I paid $20 up front, I need to know that I will have $20 worth of content ready for me.  But if I started a game for free, I wouldn&#8217;t mind if it only has three weeks worth of content and I just have to see how the game evolves as I continue to play.  So instead of having no revenue stream until the entire game is finished, freemium games can start to receive revenue at a much earlier stage.</p>
<p>Crowd-sourcing however, is giving game developers another viable way to fund-raise through the dev cycle.  There have been a few indie games that were funded and eventually released through KS (e.g. <a href="http://www.kickstarter.com/projects/1296948465/no-time-to-explain-indie-game">No Time To Explain</a>), but Double Fine just proved (this morning!) that crowd-sourcing can do a lot more.  Their original pledge goal of $400k is rather small for any studio quality game, but they already hit $700k in just over 9 hours.  Obviously, having Tim Schafer as a lead makes a night-and-day difference (to the point where they didn&#8217;t even need to reveal any info or screenshot on the game being made), but this reinforces two of my existing believes:</p>
<p><strong>1. Story driven, click-adventure games are viable today</strong></p>
<p>The recent success of Machinarium and Sword &amp; Sworcery EP and the wild funding success of Double Fine show that there is a demand for adventure games.  Their audience is somewhat different from the popular FPS, RTS, or MMORPG players, but developers are finding new ways to reach those players.  We&#8217;re also seeing less adventure games focused on challenging puzzles and more focus on making sure puzzles do not impede players from progressing through the game plots.</p>
<p><strong>2. Studios are finding new paths to funding and revenue outside of the old developer-publisher relationship</strong></p>
<p>Whether it&#8217;s freemium, crowd-sourcing or episodic releases, developers are finding new ways to get it done without relying on a publisher.  I think this bodes well for everybody, because this will allow more courageous and out-of-the-box ideas to see the light of day.</p>
<p>Can&#8217;t wait to see how much momentum Tim Schafer and Double Fine will generate from this KS project.</p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/tim-schafer-and-crowd-sourcing-a-new-adventure-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gevent compatible Memcache client</title>
		<link>http://walkingideas.com/blog/gevent-compatible-memcache-client/</link>
		<comments>http://walkingideas.com/blog/gevent-compatible-memcache-client/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 18:38:55 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[gevent]]></category>
		<category><![CDATA[memcache]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=95</guid>
		<description><![CDATA[I have been looking for a memcache client that plays well with gevent, and I stumbled upon one today: https://github.com/esnme/ultramemcache It&#8217;s written and maintained by the good folks at ESN.me.  They built Battlelog, the social network for Battlefield 3, using gevent and this memcache client.  They also released a gevent-compatible MySQL driver and a few [...]]]></description>
			<content:encoded><![CDATA[<p>I have been looking for a memcache client that plays well with gevent, and I stumbled upon one today:</p>
<p>https://github.com/esnme/ultramemcache</p>
<p>It&#8217;s written and maintained by the good folks at ESN.me.  They built Battlelog, the social network for Battlefield 3, using gevent and this memcache client.  They also released a gevent-compatible MySQL driver and a few other interesting python projects.</p>
<p>I&#8217;ll be doing load/stress testing with various different clients and setups for flask/gevent in the coming weeks, and I&#8217;ll post my findings here.</p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/gevent-compatible-memcache-client/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Game Design: Rise of the Clones</title>
		<link>http://walkingideas.com/blog/game-design-rise-of-the-clones/</link>
		<comments>http://walkingideas.com/blog/game-design-rise-of-the-clones/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 07:05:29 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Gaming Bizdev]]></category>
		<category><![CDATA[Theoretical Thoughts]]></category>
		<category><![CDATA[cloning]]></category>
		<category><![CDATA[freemium]]></category>
		<category><![CDATA[zynga]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=93</guid>
		<description><![CDATA[There has been a recent flurry of media coverage on big game companies releasing clones of games developed by smaller, indie studios.  Here are a couple of claims made by two studios against Zynga: http://kotaku.com/5879046/zynga-totally-rips-off-tiny-tower http://venturebeat.com/2012/01/29/buffalo-studios-blasts-zynga-for-copying-bingo-blitz-social-game/ And here is a more recent and more serious accusation that is actually turning into a lawsuit, against our [...]]]></description>
			<content:encoded><![CDATA[<p>There has been a recent flurry of media coverage on big game companies releasing clones of games developed by smaller, indie studios.  Here are a couple of claims made by two studios against Zynga:</p>
<p><a href="http://kotaku.com/5879046/zynga-totally-rips-off-tiny-tower">http://kotaku.com/5879046/zynga-totally-rips-off-tiny-tower</a><br />
<a href="http://venturebeat.com/2012/01/29/buffalo-studios-blasts-zynga-for-copying-bingo-blitz-social-game/">http://venturebeat.com/2012/01/29/buffalo-studios-blasts-zynga-for-copying-bingo-blitz-social-game/</a></p>
<p>And here is a more recent and more serious accusation that is actually turning into a lawsuit, against our own publisher 6waves/LOLAPPS:</p>
<p><a href="http://www.edery.org/2012/01/standing-up-for-ourselves/">http://www.edery.org/2012/01/standing-up-for-ourselves/</a></p>
<p>Having been in contact with several folks involved in the accusation and lawsuit, it&#8217;s been interesting to hear people&#8217;s take on the issue.  There is a really fine line between inspiration and copying, and this problem has been seen in any creative field for a long time.  It has come up before in the game industry in the past, but it has become more of a focus in the current social/freemium game landscape.  Why?  Because the efforts involved in cloning a game have been reduced while the financial reward has gone up.</p>
<p><span id="more-93"></span></p>
<p>For a long time, shipping any computer game was not for the faint of heart.  Development cycles often lasted a year or more, and studios lived and died by the whims of publisher because games generate no revenue until it finally hits the shelf.  Game developers worked long and hard hours to deliver milestones to just keep the publishers happy, and it was commonplace to see game projects canned for financial reasons.  Even when a game was completed, it still needed the publisher&#8217;s buy-in to get the shelve placement and marketing effort required to reach financial success.</p>
<p>However, the tough landscape did bring the best out of the game industry.  The game economy filtered out anyone that didn&#8217;t have the passion for it.  It had never been a good paying gig outside of a few rock stars, but folks stuck around because of a sense of pride and ownership in what they created.  A lot of industry visionaries made their marks, and they all brought something unique to the industry &#8211; in the form of game design or technology.</p>
<p>Nowadays, with the advancement of dev tools, distribution channel, and new revenue models, online freemium games are achieving financial success while having shorter production cycles.  I am still trying to wrap my brain around this every day.  Some of my friends in the traditional gaming space are making almost half of what my other friends are making at some social game studios.  Hey, game developers are finally able to pay their bills and put food on the table!</p>
<p>The new landscape brought in more money, but also fundamentally changed how games were designed.  In traditional games, we have seen the occasional bad games that sold well due to licensing and buzz (Enter the Matrix, 62/100 on metacritic, 5m copies sold), critically acclaimed games flopping commercially (Grim Fandango, Okami, etc), and bad games sold poorly despite big marketing effort (Haze, &lt;500k copies sold).  It&#8217;s a hits-driven business, and a fun game or strong marketing alone does not guarantee commercial success.  Combining with the fact that traditional game productions are rather expensive and lengthy, it makes cloning games a rather risky business.</p>
<p>In freemium games, it becomes a very different numbers game.  There are many fun games that simply don&#8217;t monetize (unfortunately, I&#8217;ve worked on a couple), and not-so-fun games that monetizes well.  In fact, just a few key numbers determine the entire fate of nearly any freemium games &#8211; conversion rate, retention rate, and revenue-per-active-user.  If a game converts free players at a high rate and monetizes them well, the developer/publisher can continue to ramp up marketing and buy installs as long as each player brings in more revenue than the acquisition cost.  Conversely, if you have a lot of people playing your game but few are paying, the game is going to eventually shut down, regardless how fun it is.  The financial success of games can now be projected early and accurately from the sea of metrics, and this is something that is very hard to do in the traditional game space.  And this gives rise to a new kind of visionaries &#8211; the ones who master metric driven design, A/B testing, and monetization techniques.  With the advanced understanding of metrics, it has become easier and less risky to replicate the financial success of an existing freemium game.  Not to mention the time to market on these games are also shorter than the traditional games, making the decision to clone a game an even more profitable one.  While I believe it&#8217;s a good thing that more dollars are flowing into the market and developers, I also believe that the recent focus on monetization has relegated game design innovation to the back seat.</p>
<p>One other key difference is that these cloned games are serving the new &#8220;freemium casual game audience&#8221;.  These players are not the ones who read reviews in gaming magazine.  They have not been playing games long enough to build a &#8220;refined&#8221; taste that traditional gamers have.  They are not the ones who will tell you that Angry Bird is a copy of &#8220;Crush the Castle&#8221;, which is inspired by &#8220;Worms&#8221;, which is inspired by &#8220;Scorched Earth&#8221; (they call it <a href="http://en.wikipedia.org/wiki/Scorched_Earth_(video_game)">The Mother of All Games</a> for good reason).  In a landscape where audience does not yet fully recognize and reward innovation, it is natural that the market supplies only what the consumers demand.</p>
<p>What used to be a creative process of &#8220;designing games for the sake of fun&#8221; becomes a financially driven process of &#8220;quickly expanding revenue generation portfolio&#8221;.</p>
<p>Let me go on a tangent for a second and look at another sector flooded with copycat ideas &#8211; the current day Silicon Valley.  With regards to the start-up world, the industry seems to have relatively little problem with cloning ideas.  Just look at all the daily deal companies (Groupon, LivingSocial, Bloomspot, etc), FourSquare/Gowalla, and of course, Friendster/Facebook/Myspace.</p>
<p>Why hasn&#8217;t it been an issue?  I believe it&#8217;s because the ultimate gauge of success for start-ups is financial success.  At the end of the day, whoever is able to get a bigger market share, generate more revenue, and offer more value to the shareholders is the winner.  The better product is the one that generates more revenue, not necessarily the one that is functionally and aesthetically superior.  Folks are constantly bashing Microsoft products, but we all recognize that the company is enormously successful.  Zynga has a terrible reputation among game developers for their design practice, but they are one of the mos most valuable gaming company in the US.  They are innovative in proving out the freemium business model, but not so in game design.  The game industry looks down on them for delivering copycat products, cranking out uninspired ideas that are based metrics and not fun factors.  But as long as they are able to reward their shareholders and offer their developers twice as much money as traditional developers, you bet they will keep their formula going.</p>
<p>When a good, innovative game idea comes about, it will attract designers who are inspired by the game mechanics, as well as players who has grown familiar and become attached to those same game mechanics.  As future &#8220;inspired&#8221; games sprouts out from the first innovation, they form a game genre over time.  The success of Dune 2 and Warcraft draws in many subsequent developers and designers who create the RTS genre together.  In a way, Zynga has also paved way for many of the freemium games today with their innovation in monetization strategy.  The forming of a new game genre tends to happen organically and is sprinkled with small bits of innovation in each new iteration along the way.</p>
<p>However, there is definitely a line between adhering to a genre and copying a game.  It&#8217;s a very subjective matter, and I don&#8217;t think there&#8217;s an easy way to define how the line is drawn.  But when a company crosses it, the public tends to see it quickly.  But in our current space, the developers are the ones who recognize and speak up, but not the audience &#8211; yet.  Companies looking at these short term clones are making the business decision between short term gain versus a long term reputation and growth.  Will the consumers be knowledgeable enough with a discerning taste to reward the ones who come up with cool ideas and good execution versus the ones with recycled ideas and clones?  Only time will tell.  But I believe that all businesses should to stay true to their core value.  And for us at FableLabs, it&#8217;s about creating games with original content that offer a unique experience to players.  We want to be the next group of visionaries that marry the learnings from the freemium model with the good ol&#8217; spirit of game design innovation.</p>
<p>I do think that this new freemium/social/casual game audience is quickly maturing.  And this will only in turn foster a new crop of games that will build on the existing mechanics that they are familiar with, while introducing new ones that provides many of the things old school gamers have general come to recognize as being a good, original games:</p>
<ul>
<li>A story line that create emotional attachment</li>
<li>New game mechanics that departs from or combines existing ones</li>
<li>Emergent game play stemming from a good set of game rules</li>
</ul>
<p>FWIW, here&#8217;s Zynga&#8217;s internal response to the accusations:</p>
<p><a href="http://kotaku.com/5880941/zyngas-formerly+secret-defense-against-copycat-accusations">http://kotaku.com/5880941/zyngas-formerly+secret-defense-against-copycat-accusations</a></p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/game-design-rise-of-the-clones/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Key stats to monitor for your Membase cluster</title>
		<link>http://walkingideas.com/blog/key-membase-stats-for-monitoring-and-how-to-get-them/</link>
		<comments>http://walkingideas.com/blog/key-membase-stats-for-monitoring-and-how-to-get-them/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 06:45:12 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[membase]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=86</guid>
		<description><![CDATA[Happy holidays everyone!  I realize that from working with Membase in our production over the last year, I&#8217;ve collected a few key commands in my .bashrc for quickly checking vital stats on my Membase servers, many of them came from the good folks at Couchbase.   Their wiki has improved over the year as well, [...]]]></description>
			<content:encoded><![CDATA[<p>Happy holidays everyone!  I realize that from working with Membase in our production over the last year, I&#8217;ve collected a few key commands in my .bashrc for quickly checking vital stats on my Membase servers, many of them came from the good folks at Couchbase.   Their wiki has improved over the year as well, and you can find a lot of good information there.  Here I will list the most common commands I run for monitoring and troubleshooting, along with related links to the Membase wiki:</p>
<p><span id="more-86"></span></p>
<p><strong>mbstats</strong> is the most useful utility that will print out all the important stats in the system.  Like I said, many of these stats are accessible via the web console.  But ultimately, if you want a script to periodically capture the data and alert if something goes wrong, you still want to keep this command handy:</p>
<pre>/opt/membase/bin/mbstats  localhost:11210 all</pre>
<p>When first growing out your database, it&#8217;s good to observe how quickly <strong>mem_used </strong>approaches<strong> high_wat</strong>, which is when Membase will have to start ejecting data from memory, and subsequent read of ejected data will result in a disk read.  For animal party, we&#8217;ve been near high_wat for many months, but our working dataset is fairly small part of the entire data, so we don&#8217;t have a lot of disk reads.  But if you see your cluster is approaching high_wat quickly, start to keep a watch on how often server is fetching data from disk.  If you see the <strong>cache miss ratio</strong> from the web console start to climb, then you should look into adding more memory to the cluster.</p>
<p>For more detailed monitoring on the effect of cache miss, <strong>ep_bg_fetched</strong> will tell the numbers disk fetches that has been performed since server was started.  You can pull the number twice with a time lapse in between to estimate disk fetches per second or minute to give you a stat to record and later compare.  Adding up <strong>ep_bg_load_avg </strong>and<strong> ep_bg_wait_avg </strong>should tell you how long on average it takes an item to get loaded off the disk in microsecond, and if it starts to get too high you know you need to get more memory into the cluster to reduce ejecting item and subsequently reduce disk fetches.</p>
<p><strong>eq_queue_size</strong> and <strong>ep_flusher_todo</strong> combine to tell you how many items are waiting to be written to the disk.  When an item needs to be written, it first gets added into a queue that goes towards the ep_queue_size count.  A dedicated disk writing process or processes (ala flusher) will on a periodic basis take items out of this queue and write them to the disk.   The items that are off the queue but have not made it onto the disk yet will be accounted for in ep_flusher_todo.  Obviously, you always want the disk queue to drain more quickly than it&#8217;s being filled, or server will run out of memory to store these pending items.</p>
<p>In general, you don&#8217;t want the queue to be too large anyways, because that means you have a lot of data that are not persisted to disk.  Granted, they will be replicated in another node in the cluster, but if both the main copy and the replica copy are both stuck waiting in the disk queue and servers are rebooted, you would lose those data.  During a rebalance, you will see the disk queue shoot up dramatically, since data needs to be relocated to the appropriate node.  This is why I choose to schedule a downtime for the application during rebalance even though theoretically it can still serve data normally &#8211; all the new writes that are happening during a rebalance may take much longer than normal before they are persisted to disk, increasing the risk of losing those data.</p>
<p>The Membase wiki has a good explanation on what stats to monitor and why:<a href="http://www.couchbase.org/wiki/display/membase/Ongoing+Monitoring+and+Maintenance"></p>
<p>http://www.couchbase.org/wiki/display/membase/Ongoing+Monitoring+and+Maintenance</a></p>
<p>As a reference, here&#8217;s a link for complete list of all the stats and what they mean:<br />
<a href="https://github.com/membase/ep-engine/blob/master/docs/stats.org">https://github.com/membase/ep-engine/blob/master/docs/stats.org</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>dispatcher</strong> is another interesting command that gives you visibility into what Membase is actually doing at this moment.  You can run it with the following command:</p>
<pre>/opt/membase/bin/mbstats localhost:11210 dispatcher logs</pre>
<p>There are a few dispatchers, and to be frank, I don&#8217;t really know any details about them (you can read <a href="http://www.couchbase.org/wiki/display/membase/DGM+Implementation+Details">http://www.couchbase.org/wiki/display/membase/DGM+Implementation+Details</a> if you are curious).  But for monitoring purpose, I look at the entries in the &#8220;Slow jobs&#8221; section.   For example, this is one of the jobs that is returned in the dispatcher log:</p>
<pre>        runtime:   2s
        starttime: 43439
        task:      Fetching item from disk:  StoryQuest40000001045816</pre>
<p>So here I see that item &#8220;StoryQuest40000001045816&#8243; took 2 seconds to come off the disk, and the job was started at a time that is 43439 seconds after the server booted up.  If you didn&#8217;t see any recent slow jobs in the log, then you know things are doing fine.  If a task is taking a long time to finish, you may get an idea what is going on by looking at the description, but chances are you may need to get some support help from the Membase folks to decipher the issue.</p>
<p>Last useful command is <strong>mbcollect_info</strong>, which is what folks at Membase always ask me to run whenever I report an issue.  Since I need to run this on all the nodes in the cluster and aggregate the output, I ended up adding this to a larger script so this can be automated.</p>
<pre>/opt/membase/bin/mbcollect_<wbr>info FILENAME.zip</wbr></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/key-membase-stats-for-monitoring-and-how-to-get-them/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating Membase Cluster – Part 2</title>
		<link>http://walkingideas.com/blog/migrating-membase-cluster-%e2%80%93-part-2/</link>
		<comments>http://walkingideas.com/blog/migrating-membase-cluster-%e2%80%93-part-2/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 00:50:06 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=78</guid>
		<description><![CDATA[After up all night babysitting the rebalance process, I am happy to report that it was a rather uneventful night of maintenance.  The rebalance itself took 8-9 hours to complete, and then took another hour for all the replicas to get saved to the disk also.  Theoretically, I didn&#8217;t need to take the site down [...]]]></description>
			<content:encoded><![CDATA[<p>After up all night babysitting the rebalance process, I am happy to report that it was a rather uneventful night of maintenance.  The rebalance itself took 8-9 hours to complete, and then took another hour for all the replicas to get saved to the disk also.  Theoretically, I didn&#8217;t need to take the site down while the rebalance was happening, but I took the game down just to be safe and not compromise the game experience.</p>
<p>The disk access was definitely the bottleneck through out the rebalance process once again.  One the the reason we went for more # of smaller nodes rather than smaller # of bigger nodes is to spread out our disk activities over more # of EBS drives during a rebalance, conceptually similar to a RAID 0.  We do increase the higher risk of hardware failure simply by having more nodes in the cluster, but the disk performance gain is definitely worth it.</p>
<p>Some folks are doing a RAID 0 setup using multiple EBS as described <a href="http://alestic.com/2009/06/ec2-ebs-raid">here</a> on alestic, but I haven&#8217;t tried it personally.  If anyone has attempted that setup, especially in a production environment, please share your experience in the comments!</p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/migrating-membase-cluster-%e2%80%93-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migrating Membase Cluster &#8211; Part 1</title>
		<link>http://walkingideas.com/blog/migrating-membase-cluster-part-1/</link>
		<comments>http://walkingideas.com/blog/migrating-membase-cluster-part-1/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 07:04:05 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=74</guid>
		<description><![CDATA[I got an email from EC2 a few days ago that a number of our instances that serves Animal Party have pending reboots coming up.   It turns out that ALL of the 8 nodes in our membase cluster are scheduled for a reboot.   Sure, a reboot on any database server is expected to [...]]]></description>
			<content:encoded><![CDATA[<p>I got an email from EC2 a few days ago that a number of our instances that serves Animal Party have pending reboots coming up.   It turns out that ALL of the 8 nodes in our membase cluster are scheduled for a reboot.   Sure, a reboot on any database server is expected to cause some interruption, but I know from my past experience that warming up a membase node after reboot can take a really long time, especially if the data on disk is highly fragmented.  Since I&#8217;m waiting for our scheduled downtime to kick in, I figured it&#8217;s a good time for me to share my learning with membase &#8211; especially how and why we are doing the cluster migration.</p>
<p><span id="more-74"></span></p>
<p>Our cluster currently holds about 240m key-value pairs over a total of about 160GB of data.   We have only about half of those data in memory, but it&#8217;s enough to cover our working set and the cluster doesn&#8217;t read from our disks much at all.  However, when a member node is rebooted, it must warm-up all the items that the node is &#8220;master&#8221; of.</p>
<p>What do i mean by &#8220;master&#8221;?  We have a replication count of 1 in our cluster, so while any item (a key-value pair) will exist on two nodes at any given time, all the writes to that piece of data will only take place on a single node to ensure consistency.  When a membase server reboots, it needs to &#8220;warm-up&#8221; and finds &#8220;all the data that it is master of&#8221; from the disk.  Since we got ~32m items per node, it can take a while.</p>
<p>Another thing that causes this warm-up to take a long time is the fact that membase uses sqlite3 engine for persisting data to the disk.  Sqlite3 uses btree to store its data, and when items are deleted, the underlying btree pages are merely marked as &#8220;free&#8221;.  Later on when new items are stored, their content can be spread over different pages, causing fragmentation.  So if the membase cluster is seeing a lot of delete or expiration, which ours does, the warm-up time will slowly increase overtime.  This fragmentation issue will be addressed in the next major release Couchbase 2.0, since it will be replacing sqlite3 with CouchDB.  But in the mean time, this is a real problem that we will need to deal with in production.</p>
<p>While it&#8217;s possible to vacuum the sqlite database, it&#8217;s not really a viable option for us because data persistence needs to be suspended during the process, leaving the system vulnerable to data loss.  And we know EBS has pretty awful disk performance, so vacuum is surely going to take a really long time with the amount of data we have.</p>
<p>After talking to Perry Krug from Couchbase (who has always been extremely helpful) about the situation, he suggested doing a complete cluster migration by rebalancing in 8 new nodes while removing the 8 old nodes.  This will take care of the reboot issue since we&#8217;ll be moving to new instances, but we will also get a free vacuuming of our data.  As a side bonus, Perry said we can also use this opportunity to upgrade our cluster from version 1.7.1.1 to 1.7.2 too.  I don&#8217;t know if this &#8220;rebalace your entire cluster&#8221; upgrade path works for older versions too, since you will need to mix two versions of membase server in your cluster during the rebalance &#8211;  but I am glad it works for 1.7.2 <img src='http://walkingideas.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>One caveat Perry mentioned was that the webconsole UI does not allow you to remove all the nodes, but this can be circumvented with the command line tools.  After all the new nodes are added to the existing cluster and show up as &#8220;pending for rebalance&#8221; in the webconsole, this command will remove all the old nodes and rebalance them into the new ones:</p>
<p>/opt/membase/bin/membase rebalance -c 10.0.0.10 -u &lt;username&gt; -p &lt;password&gt; &#8211;server-remove=10.0.0.1 &#8211;server-remove=10.0.0.2 &#8230;</p>
<p>(assuming 10.0.0.10 is one of the new nodes)</p>
<p>I&#8217;ll write up a postmortem after the actual migration, and I hope I will have nothing but good news to report&#8230; <img src='http://walkingideas.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/migrating-membase-cluster-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trouble handling Icon\r file with Git</title>
		<link>http://walkingideas.com/blog/trouble-handling-iconr-file-with-git/</link>
		<comments>http://walkingideas.com/blog/trouble-handling-iconr-file-with-git/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 00:30:57 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=62</guid>
		<description><![CDATA[We installed a new process for managing content couple weeks ago, where we had one of the game designer check in his CSV data file into git so we can pull his changes and run the data through our tests automatically. He was on a Mac, so he used GitHub for Mac (very user friendly, [...]]]></description>
			<content:encoded><![CDATA[<p>We installed a new process for managing content couple weeks ago, where we had one of the game designer check in his CSV data file into git so we can pull his changes and run the data through our tests automatically. He was on a Mac, so he used GitHub for Mac (very user friendly, by the way) to get his files in.  I tried to pull his changes, and I got an error about some &#8220;Icon\r&#8221; file. What on earth?!</p>
<p>It turns out that &#8220;Icon\r&#8221; is a file that exists in all directories that have a custom icon in the Mac OSX Finder.   Normally hidden, but GitHub for Mac sees the file and committed it without any issue.  However, when I was trying to pull that file through git on my Ubuntu box, I get an error telling me that it&#8217;s unable to create &#8220;Icon\r&#8221;.   I tried to use GitHub for Mac to delete the file and commit that change, but GitHub for Mac is failing when trying to commit that delete change with a generic error message.  It looked like they are all having problem with the &#8220;\r&#8221;, the carriage return character.</p>
<p>I am able to login to GitHub and see the file &#8220;Icon &#8221; (\r is not rendered in the browser), but unfortunately there was no way to delete the file there.  After an hour of futile attempt, I finally was able to get rid of it by running &#8220;git gui&#8221; in my cygwin, and use the interface to select the file and commit that delete.  I&#8217;m not sure why or how &#8220;git gui&#8221; was able to get it done, but there you go &#8211; I hope this post may help someone out there.</p>
<p>By the way, you probably want to add that pesky &#8220;Icon\r&#8221; to the .gitignore file as well so you can prevent them from getting into the codebase in the first place.   For that, you should check out <a href="http://blog.bitfluent.com/post/173740409/ignoring-icon-in-gitignore?7ea74050">this post</a> on dealing with the &#8220;\r&#8221; character.</p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/trouble-handling-iconr-file-with-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setup Namespace URL for Flex project in FlashDevelop</title>
		<link>http://walkingideas.com/blog/setup-namespace-url-for-flex-project-in-flashdevelop/</link>
		<comments>http://walkingideas.com/blog/setup-namespace-url-for-flex-project-in-flashdevelop/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 22:52:52 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[flashdevelop]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[namespace]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=67</guid>
		<description><![CDATA[Our game client at Tribal Crossing is all written in Flex, and naturally we used Flash Builder to handle our project.  However, I&#8217;ve always been partial to FlashDevelop, a much leaner IDE that has great editor features, faster compile time, and fantastic community support.  After being fed up with another Eclipse (the IDE that Flash Builder [...]]]></description>
			<content:encoded><![CDATA[<p>Our game client at Tribal Crossing is all written in Flex, and naturally we used Flash Builder to handle our project.  However, I&#8217;ve always been partial to <a href="http://www.flashdevelop.org">FlashDevelop</a>, a much leaner IDE that has great editor features, faster compile time, and fantastic community support.  After being fed up with another Eclipse (the IDE that Flash Builder is built on top of) crash, I decided to give FD a try for our project.</p>
<p>We had multiple Flex Library projects, and since there&#8217;s no direct support for that in FD, I simply added the src folder from each of the library as additional project code path &#8211; and that worked.  There was a problem with the namespace URL used in MXML and CSS, however.</p>
<p>There is no UI in FD to specify namespace URL.  But you can point your project to the manifest.xml files that contains the namespace URL info by adding this to your advanced compiler options (under  Project settings-&gt;Compiler Options-&gt;Advanced Compiler Options):</p>
<pre>-namespace library://project.com/comp c:\code\src\manifest.xml</pre>
<p>Hope this helps!</p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/setup-namespace-url-for-flex-project-in-flashdevelop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Issue with &#8220;npm install socket.io&#8221; on CentOS 5</title>
		<link>http://walkingideas.com/blog/issue-with-npm-install-socket-io-on-centos-5/</link>
		<comments>http://walkingideas.com/blog/issue-with-npm-install-socket-io-on-centos-5/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 15:52:08 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[centos socket.io npm]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=64</guid>
		<description><![CDATA[Hey guys, I just ran into some issue installing socket.io using npm on my personal CentOS 5 box.  All the other node modules installed fine &#8211; but not socket.io.  After some searching around, I found that it appears to be an issue with the version of tar that came with CentOS 5, which was 1.15. [...]]]></description>
			<content:encoded><![CDATA[<p>Hey guys,</p>
<p>I just ran into some issue installing socket.io using npm on my personal CentOS 5 box.  All the other node modules installed fine &#8211; but not socket.io.  After some searching around, I found that it appears to be an issue with the version of tar that came with CentOS 5, which was 1.15.  After upgrading to 1.26, the issue went away.</p>
<p>You can find the original fix here <a href="https://github.com/LearnBoost/socket.io/issues/456">https://github.com/LearnBoost/socket.io/issues/456</a> from korch towards the bottom of the page.</p>
<p>Hope this helps!</p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/issue-with-npm-install-socket-io-on-centos-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Video Games Live Tour &#8211; Damn it was good.</title>
		<link>http://walkingideas.com/blog/video-games-live-tour-damn-it-was-good/</link>
		<comments>http://walkingideas.com/blog/video-games-live-tour-damn-it-was-good/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 04:50:13 +0000</pubDate>
		<dc:creator>Shawn</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://walkingideas.com/blog/?p=60</guid>
		<description><![CDATA[I went to the Video Games Live tour with Rick in LA earlier this weekend.  We heard tracks from their past shows on Spotify, and we just decided to grab some tickets on a whim a couple months ago.   We know they play music from many classic games which are also our favorites, and the [...]]]></description>
			<content:encoded><![CDATA[<p>I went to the <a href="http://videogameslive.com">Video Games Live tour</a> with Rick in LA earlier this weekend.  We heard tracks from their past shows on Spotify, and we just decided to grab some tickets on a whim a couple months ago.   We know they play music from many classic games which are also our favorites, and the tour seems well received from our scant research prior to the purchase.</p>
<p>We got there, sat down&#8230; and it just blew me away.</p>
<p>On a personal level, it reminded me how video games have been such a tremendous part of my life, and how I am grateful to be part of this community.  I sat through the entire concert with goosebumps running through every square-inch of my skin, and I nearly teared up upon hearing the Halo and Chrono Trigger/Cross pieces.</p>
<p>I want to write more about it, but since the concert I&#8217;ve been reinvigorated to get some tedious game programming done.  But I certainly hope that you have a chance to check them out live!</p>
<p>P.S. Laura &#8220;Flute Link&#8221; Intravia performed at our show.  I have never seen her Zelda flute performance on YouTube, but now I understand why there is a major buzz surrounding her.  She is one impressively multi-talented video game geek who could be mistaken for a model.</p>
]]></content:encoded>
			<wfw:commentRss>http://walkingideas.com/blog/video-games-live-tour-damn-it-was-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

