<?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>Push cx</title>
	<atom:link href="http://push.cx/feed" rel="self" type="application/rss+xml" />
	<link>http://push.cx</link>
	<description>A tea-drinking web geek's coffee-flavored blog</description>
	<lastBuildDate>Thu, 26 Aug 2010 12:50:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Globalton</title>
		<link>http://push.cx/2010/globalton</link>
		<comments>http://push.cx/2010/globalton#comments</comments>
		<pubDate>Thu, 26 Aug 2010 12:50:51 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[design patterns]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1438</guid>
		<description><![CDATA[It&#8217;s Steve Yegge&#8217;s fault that I was rethinking the singleton pattern. I read his Singleton Considered Stupid post in early 2008 with the rest of the proggit before it devolved into a memetic garbage patch. Yegge&#8217;s rant ends with a note about design patterns that curled up in my hindbrain and has been whispering to [...]]]></description>
			<content:encoded><![CDATA[<p>
It&#8217;s Steve Yegge&#8217;s fault that I was rethinking the singleton pattern. I read his <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9zdGV2ZXllZ2dlMi9zaW5nbGV0b24tY29uc2lkZXJlZC1zdHVwaWQ=">Singleton Considered Stupid</a> post in early 2008 with the rest of the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5yZWRkaXQuY29tL3IvcHJvZ3JhbW1pbmcv">proggit</a> before it devolved into a memetic <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HcmVhdF9QYWNpZmljX0dhcmJhZ2VfUGF0Y2g=">garbage patch</a>. Yegge&#8217;s rant ends with a note about design patterns that curled up in my hindbrain and has been whispering to me since:
</p>

<blockquote>
The problem is, about 1/3 to 1/2 of them [design patterns] were basically cover-ups for deficiencies in C++ that don&#8217;t exist in other languages. Although I&#8217;m not a huge Perl fan anymore, I have to admit the Perl community caught on to this first (or at least funniest). They pointed out that many of these so-called patterns were actually an implementation of Functional Programming in C++. 
</blockquote>

<p>
I&#8217;ve had the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2NvbW11bml0eS5iYmdhbWV6b25lLm5ldC9pbmRleC5waHAvdG9waWMsMjgyMC5tc2cxOTk4OC5odG1s">ranty discussions</a> about how the singleton could be better known as <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL0tlbnRCZWNrL3N0YXR1cy8xMjI4MzY5NjI5Mg==">globalton</a> typical of any developer who&#8217;s heard that joke:
</p>

<blockquote>
I&#8217;ve never understood why people bother with all that mucking around with instances. Just tag the object initialization on to the end some startup script like the database initialization and add &#8216;global $map;&#8217; anytime you want to access it. It&#8217;s a global variable; most languages have very succinct idioms for managing those, unfortunately.
</blockquote>

<p>
Singleton has a very small niche managing some hardware access and then is abused approximately all of the time as a noisy version of global variables. Seeing this over and over kept me thinking about whether design patterns are indeed mostly a standard set of tools for working around language deficiencies. (ObSlander: It&#8217;d certainly explain the Java community&#8217;s fixation on them.)
</p>

<p>
I&#8217;ve had an urge to reread <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAyMDE2MzM2MTIvP3RhZz1wdXNoY3gtMjA=">Design Patterns</a> and work through them in a high-level language like <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Rlc2lnbnBhdHRlcm5zaW5ydWJ5LmNvbS9zZWN0aW9uMDEvYXJ0aWNsZS5odG1s">Ruby</a> or, better, JavaScript.
</p>

<p>
But it turns out, as usual, that Peter Norvig is way ahead, with a <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL25vcnZpZy5jb20vZGVzaWduLXBhdHRlcm5zLw==">1998 presentation</a> on design patterns in dynamic language noting that in some languages design patterns are simply invisible. Unfortunately he didn&#8217;t leave behind a detailed pronouncement of opinion as to the value remaining in design patterns when a language invisibly supports the most common patterns at the least, so I suppose I still have the exercise ahead of me.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1438" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/globalton/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Interview Questions</title>
		<link>http://push.cx/2010/interview-questions</link>
		<comments>http://push.cx/2010/interview-questions#comments</comments>
		<pubDate>Mon, 23 Aug 2010 15:21:59 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Biz]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1434</guid>
		<description><![CDATA[When I got my first jobs, I didn&#8217;t know that job interviews should include the candidate interviewing the company. I learned from the experience and, in talking with others, have slowly accreted a list of interview questions I&#8217;ll bring (yes, really, print out and bring) to learn interesting things about employers and avoid dysfunctional workplaces. [...]]]></description>
			<content:encoded><![CDATA[<p>
When I got my first jobs, I didn&#8217;t know that job interviews should include the candidate interviewing the company. I learned from the experience and, in talking with others, have slowly accreted a list of interview questions I&#8217;ll bring (yes, really, print out and bring) to learn interesting things about employers and avoid dysfunctional workplaces.
</p>

<p>
Most of the questions are intended to start interesting conversations about the workplace, though a few (&#8220;Which source control do you use?&#8221;) do have wrong answers (&#8220;None.&#8221;) that end an interview as quickly as a candidate being unable to solve <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ltcmFub250ZWNoLmNvbS8yMDA3LzAxLzI0L3VzaW5nLWZpenpidXp6LXRvLWZpbmQtZGV2ZWxvcGVycy13aG8tZ3Jvay1jb2Rpbmcv">FizzBuzz</a>.
</p>

<h3>Job</h3>
<ul>
<li>What is your typical day like?</li>
<li>What are the normal work hours?</li>
<li>What is the office environment like? Can I see it?</li>
<li>What is the job title?</li>
<li>What is the employee review process?</li>
<li>What benefits? (medical, dental, vision, 401k, transit, vacation, bonuses)</li>
<li>How is the team at deadlines?</li>
<li>Is there continuous learning?</li>
</ul>

<h3>Company</h3>
<ul>
<li>Who are your clients?</li>
<li>What makes the company special?</li>
<li>How do you see the company growing?</li>
<li>What are the NDA/NCAs?</li>
<li>How long have employees been here?</li>
</ul>

<h3>Coding</h3>
<ul>
<li>What is the codebase like? Can I see it?</li>
<li>What tools do you use?</li>
<li>Which source control do you use?</li>
<li>Is your build and deployment process automated?</li>
<li>How often do you build or deploy?</li>
<li>What testing (automated + Q&#038;A) do you have in place?</li>
<li>What bug database do you use?</li>
<li>Is your code great or good enough?</li>
<li>Do you release open source code?</li>
</ul>

<h3>Manager</h3>
<ul>
<li>What&#8217;s your personal management style?</li>
<li>What books have influenced you the most?</li>
<li>What technologies do you plan to use?</li>
<li>Do you have any concerns about my application?</li>
<li>Do you think I would be a good match for this position?</li>
</ul>

<p>
Do you have any questions you always ask?
</p>
 <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1434" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/interview-questions/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sample Camera Pictures</title>
		<link>http://push.cx/2010/sample-camera-pictures</link>
		<comments>http://push.cx/2010/sample-camera-pictures#comments</comments>
		<pubDate>Fri, 09 Jul 2010 12:37:05 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[cameras]]></category>
		<category><![CDATA[photography]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1420</guid>
		<description><![CDATA[If you&#8217;re researching which camera to buy, you&#8217;re probably frustrated by trying to find sample pictures. Google hasn&#8217;t dealt well with spam on expensive products like cameras, so you&#8217;ll see a lot of splogs and shops hosting the same handful of example pictures from the manufacturer. The non-spam review sites might have more, but they [...]]]></description>
			<content:encoded><![CDATA[<p>
If you&#8217;re researching which camera to buy, you&#8217;re probably frustrated by trying to find sample pictures. Google hasn&#8217;t dealt well with spam on expensive products like cameras, so you&#8217;ll see a lot of splogs and shops hosting the same handful of example pictures from the manufacturer.
</p>

<p>
The non-spam review sites might have more, but they also have professional photographers taking the pictures. (And if they&#8217;re not professional, someone who reviews dozens of cameras is going to take better pictures than you.) It doesn&#8217;t help answer the important question, &#8220;If I buy this camera, what will my pictures look like?&#8221;
</p>

<p>
The solution is the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5mbGlja3IuY29tL2NhbWVyYXMvYnJhbmRzLw==">Flickr Camera Finder</a>. When you take a picture, the camera embeds metadata that includes the brand and model. With tens of millions of photos, Flickr has samples from ordinary people using every kind of camera. (If you&#8217;re considering a camera that is not yet released, read the manufacturer&#8217;s and professional reviewer&#8217;s sites to find out about the sensor other internal technology; most new cameras are pretty close cousins to previous models.)
</p>

<p>
When you bring up Flickr&#8217;s page for the specific camera you&#8217;re interested in, search for the kinds of photos you&#8217;ll be taking. I knew I&#8217;d be taking lots of indoor shots of my friends and medium-range snaps of interesting things I see in daily city life, so I searched terms like &#8220;party&#8221;, &#8220;basement&#8221;, &#8220;couch&#8221;, &#8220;hanging out&#8221; for the former and &#8220;graffiti&#8221;, &#8220;bus&#8221;, &#8220;intersection&#8221;, &#8220;storefront&#8221; for the latter. I was able to avoid two cameras that I thought were great but turned out to be fairly poor for my needs.
</p>

<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDYvZ3JhZmZpdGkuanBn"><img src="http://push.cx/wp-content/uploads/2010/06/graffiti.jpg" alt="" title="Alley, ~2300 W Belmont" width="500" height="375" class="aligncenter size-full wp-image-1421 content" /></a> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1420" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/sample-camera-pictures/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>From Fixtures to Factories</title>
		<link>http://push.cx/2010/from-fixtures-to-factories</link>
		<comments>http://push.cx/2010/from-fixtures-to-factories#comments</comments>
		<pubDate>Tue, 06 Jul 2010 19:33:02 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[factories]]></category>
		<category><![CDATA[factory_girl]]></category>
		<category><![CDATA[fixtures]]></category>
		<category><![CDATA[Mocha]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1428</guid>
		<description><![CDATA[Automated tests need example data, and it&#8217;s a pain to have to construct a complete object in every test, especially when there are a lot of non-optional fields. The standard improvement is to use fixtures, a file with some example data, that your tests can load by giving the name of a fixture. Here&#8217;s one [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=L3RhZy90ZXN0aW5n">Automated tests</a> need example data, and it&#8217;s a pain to have to construct a complete object in every test, especially when there are a lot of non-optional fields.
</p>

<p>
The standard improvement is to use fixtures, a file with some example data,
that your tests can load by giving the name of a fixture. Here&#8217;s one of the
fixtures for a <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL05lYXJieUdhbWVycy5jb20=">gamer</a>:
</p>

<pre>
alice: # alice is heavily involved
  id: 1
  mail: alice@example.com
  handle: alice
  password: red queen
  teaser: Follow the white rabbit.
  profile: Not so plain, after all.
  homepage: http://www.example.com
  jabber: alice@example.org
  location_id: 3
  last_login: 2006-10-30 11:56:08
  created_at: 2006-10-30 11:56:08
  location_at: 2006-10-30 11:56:08
  tag_text: dnd, wod
  mail_on_message: true
  mail_on_nearby_discussion: true
</pre>

<p>
This is straightforward, but <kbd>location_id</kbd> is the id of another fixture in another file. As you can imagine it&#8217;s pretty easy to get them out-of-sync and break some tests. I end up leaving little <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2MyLmNvbS9jZ2kvd2lraT9Ub05lZWRDb21tZW50cw==">comments</a> in the YAML to remind myself of the cross-reference.
</p>

<p>
It&#8217;s awfully tempting to reuse fixtures from test to test. Maybe Alice was written to test logging in with a username and password and next I&#8217;m writing the test of logging in with an email address and a password. I could copy and paste Alice to another fixture to reuse in that test, but as a programmer I have a pathological aversion to copy and paste. Alice is going to get reused (most of those fields are optional and were used by very different tests), and after this happens a few times it&#8217;s hard to change a fixture without breaking an unrelated test.
</p>

<p>
I&#8217;ve gotten a lot of use out of fixtures as I&#8217;ve developed the habit of <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwOS93aHktaS13cml0ZS10ZXN0cw==">testing all my code</a>, but reuse has made my tests somewhat brittle. After a bit of research, I&#8217;ve moved over to using factories.
</p>

<p>
Here&#8217;s the factory for a gamer:
</p>

<pre>&nbsp;
Factory.<span style="">sequence</span> :handle <span style="color: #66cc66;">&#123;</span> |n| <span style="color: #ff0000;">"Gamer_#{n}"</span> <span style="color: #66cc66;">&#125;</span>
&nbsp;
Factory.<span style="">define</span> :gamer <span style="color: #b1b100;">do</span> |g|
  g.<span style="">handle</span> <span style="color: #66cc66;">&#123;</span> Factory.<span style="">next</span> :handle <span style="color: #66cc66;">&#125;</span>
  g.<span style="">mail</span> <span style="color: #66cc66;">&#123;</span> |m| <span style="color: #ff0000;">"#{m.handle}@example.com"</span> <span style="color: #66cc66;">&#125;</span>
  g.<span style="">password</span> <span style="color: #ff0000;">'secret'</span>
<span style="color: #b1b100;">end</span></pre>

<p>
Only the essential, required fields are listed. Using this simple template, the tests themselves specify the values of the fields they&#8217;ll be testing.
</p>

<pre>&nbsp;
def test_login_with_valid_username_and_password
  gamer = Gamer.<span style="">create</span> :handle =&gt; <span style="color: #ff0000;">'Alice'</span>, :password =&gt; <span style="color: #ff0000;">'red queen'</span>
  ...
<span style="color: #b1b100;">end</span>
def test_login_with_valid_email_and_password
  gamer = Gamer.<span style="">create</span> :mail =&gt; <span style="color: #ff0000;">'alice@example.com'</span>, :password =&gt; <span style="color: #ff0000;">'red queen'</span>
  ...
<span style="color: #b1b100;">end</span></pre>

<p>
Ideally, changing a fixture wouldn&#8217;t break any tests at all. And <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dpdGh1Yi5jb20vdGhvdWdodGJvdC9mYWN0b3J5X2dpcmw=">factory_girl</a> (what I&#8217;m using for factories in Rails) makes associations easy:
</p>

<pre>&nbsp;
Factory.<span style="">define</span> :post <span style="color: #b1b100;">do</span> |p|
  p.<span style="">association</span> :discussion, :factory =&gt; :discussion
  p.<span style="">association</span> :poster, :factory =&gt; :gamer
  p.<span style="">created_at</span> Time.<span style="">now</span>.<span style="">utc</span>
  p.<span style="">body</span> <span style="color: #ff0000;">"Post Body"</span>
<span style="color: #b1b100;">end</span></pre>

<p>
Now my tests include the specific data they care about, making them easier to understand and improve. And they don&#8217;t interrelate, so they&#8217;re much more reliable. I do still use fixtures, but now they&#8217;re exclusively for tests that need to deal with real-world examples.
</p>
 <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1428" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/from-fixtures-to-factories/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Camera Card</title>
		<link>http://push.cx/2010/camera-card</link>
		<comments>http://push.cx/2010/camera-card#comments</comments>
		<pubDate>Fri, 02 Jul 2010 14:55:25 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[cameras]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1409</guid>
		<description><![CDATA[Three-step process for improving your life. 1. Get a marker and an index card or piece of paper. Copy this and substitute your personal information: 2. Take a picture of it with your camera (or phone). Poke around in the camera&#8217;s menu, almost all have a way to mark photos as protected from accidental/mass deletion, [...]]]></description>
			<content:encoded><![CDATA[<p>
Three-step process for improving your life.
</p>

<p>
1. Get a marker and an index card or piece of paper. Copy this and substitute your personal information:
</p>

<img src="http://push.cx/wp-content/uploads/2010/06/camera_card.jpg" alt="" title="camera card" width="300" height="177" class="alignnone size-full wp-image-1411 content" />

<p>
2. Take a picture of it with your camera (or phone). Poke around in the camera&#8217;s menu, almost all have a way to mark photos as protected from accidental/mass deletion, so set that on this picture.
</p>

<p>
3. The last step is hard: don&#8217;t lose your camera. You might not succeed at this step, but if you&#8217;ve done the first two steps maybe you&#8217;ll get it back.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1409" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/camera-card/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>This is Not A Productivity Post</title>
		<link>http://push.cx/2010/this-is-not-a-productivity-post</link>
		<comments>http://push.cx/2010/this-is-not-a-productivity-post#comments</comments>
		<pubDate>Fri, 25 Jun 2010 16:28:53 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[sleep]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1408</guid>
		<description><![CDATA[I&#8217;ve had this little collection at my bedside for a dozen years. Well, not this collection. I go through the index cards pretty quick, so they need regular replenishment. And sometimes they&#8217;re a tear-off pad of paper. Or sticky notes. And this pen is a pretty recent replacement of the one I emptied. The brand [...]]]></description>
			<content:encoded><![CDATA[<img src="http://push.cx/wp-content/uploads/2010/06/sleep_aid.jpg" alt="" title="sleep aid" width="500" height="375" class="alignnone size-full wp-image-1410 content" />

<p>
I&#8217;ve had this little collection at my bedside for a dozen years. Well, not this collection.
</p>

<p>
I go through the index cards pretty quick, so they need regular replenishment. And sometimes they&#8217;re a tear-off pad of paper. Or sticky notes.
</p>

<p>
And this pen is a pretty recent replacement of the one I emptied. The brand and model don&#8217;t matter one whit, don&#8217;t be a moleskine nerd.
</p>

<p>
There isn&#8217;t usually a little flashlight, that&#8217;s way optional. It&#8217;s nice, at night, when I&#8217;m adding to a note, but I can use the backside or another card if I don&#8217;t have a light.
</p>

<p>
And for a couple years the whole pile was actually a small digital voice recorder.
</p>

<p>
This is not a post about some clever tool for increasing productivity. That&#8217;s a picture of a <em>sleep aid</em>.
</p>

<p>
When I lay down to fall asleep I&#8217;m still sorting through the jumble of the day and I think of things I left undone, or I plan tomorrow, or I have little inspirations for projects, or I realize I forgot to do something, or I have an upsight about how to improve some code, or, or, or, or&#8230;
</p>

<p>
I can&#8217;t fall asleep when I&#8217;m juggling several thoughts, trying to keep them all in the air until I get up in the morning. I have to get rid of them, get them out, evaporate the fear that I&#8217;ve lost track of something. Keeping a pen and notecard, or any other way of recording thoughts, in easy reach is how I relax to fall asleep.
</p>

<p>
Some nights I don&#8217;t write down a single thing. Some nights I write down three dozen. Most nights I write down one or two things. Very infrequently, I jot down all the clutter and with it all cleared away I realize I have an idea so big and important I have to get up and get a full-sized piece of paper to sketch it out, to get it all down or to dive into it and start exploring the implications and producing the work and making things happen. But most nights I sleep very well.
</p>

<img src="http://push.cx/wp-content/uploads/2010/06/sleep_aid_footer.jpg" alt="" title="sleep_aid_footer" width="200" height="90" class="aligncenter size-full wp-image-1416 content" />
 <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1408" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/this-is-not-a-productivity-post/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Freemium and Segmentation</title>
		<link>http://push.cx/2010/freemium-and-segmentation</link>
		<comments>http://push.cx/2010/freemium-and-segmentation#comments</comments>
		<pubDate>Thu, 17 Jun 2010 19:31:39 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Biz]]></category>
		<category><![CDATA[f2p]]></category>
		<category><![CDATA[freemium]]></category>
		<category><![CDATA[pricing]]></category>
		<category><![CDATA[virtual currency]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1398</guid>
		<description><![CDATA[How do games on Facebook make money? That&#8217;s how the conversation started: no hello, no context, right to the heart of the matter. I love it when fellow geeks IM me. My friend has a lot of experience in software and tabletop games, but has stayed away from the Privacy Destroyer. From the outside, online [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
How do games on Facebook make money?
</blockquote>

<p>
That&#8217;s how the conversation started: no hello, no context, right to the heart of the matter. I love it when fellow geeks IM me.
</p>

<p>
My friend has a lot of experience in software and tabletop games, but has stayed away from the Privacy Destroyer. From the outside, online games didn&#8217;t seem to make any sort of sense &#8211; if it&#8217;s one free click to add a game to a social profile, how do you sell your game? How do you make any money at all?
</p>

<p>
The answer is that there&#8217;s a bit of advertising and merchandising, but by far the bulk of the profit is in virtual currencies. Pay $10, get 75 gold coins you can spend in-game on items, upgrades, downtime removal, etc.
</p>

<p>
It&#8217;s successful because it allows for perfect market <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5qb2Vsb25zb2Z0d2FyZS5jb20vYXJ0aWNsZXMvQ2FtZWxzYW5kUnViYmVyRHVja2llcy5odG1s">segmentation</a>. Some of your customers are willing to pay much more for your product than others, whether you price low or high you&#8217;ll lose some potential profit. Losing potential profit is deeply painful to entrepreneurs, so you sell a copy of the product at the low price and another at the high &mdash; and to keep it from looking silly, you differentiate them by calling one &#8220;premium&#8221;, or limiting quantities of one, or selling it in a bargain bin after six weeks, or selling in different venues (soda machine vs. grocery store); anything that lets you charge multiple prices with a straight face.
</p>

<p>
If you do this wrong, people will <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3RlY2guc2xhc2hkb3Qub3JnL2FydGljbGUucGw/c2lkPTA5LzAyLzA0LzEzMjcyNTM=">mock you</a> <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwNy93aGljaC12aXN0YS12ZXJzaW9u">mercilessly</a> and the nerds <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbmFuZHRlY2guY29tL3Nob3cvMzU2NA==">will point out</a> you&#8217;re really selling only one product. (But you won&#8217;t notice because you&#8217;ll be busy trucking your wheelbarrows of cash down to the bank.)
</p>

<p>
This is so powerful that Facebook games (and a growing number of other games with low distribution costs) are &#8220;free to play&#8221; (f2p) or &#8220;freemium&#8221;. You can play as long as you like for free and buy virtual currency if and when you see something interesting.
</p>

<p>
Virtual currencies allow for <em>perfect segmentation</em>. If Alice thinks your game is worth $5, that&#8217;s what you&#8217;ll get from her. If Bob thinks it&#8217;s worth $5,000, you&#8217;ll get it from him for the exact same game. I&#8217;m not exaggerating; last week a payment processor <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5pbnNpZGVzb2NpYWxnYW1lcy5jb20vMjAxMC8wNi8xMC9zdXBlci13aGFsZXMtc3BlbmQtbW9uZXktdmlydHVhbC1nb29kcy8/dXRtX3NvdXJjZT1mZWVkYnVybmVyJiMwMzg7dXRtX21lZGl1bT1mZWVkJiMwMzg7dXRtX2NhbXBhaWduPUZlZWQ6K0luc2lkZVNvY2lhbEdhbWVzKyhJbnNpZGUrU29jaWFsK0dhbWVzKQ==">shared data</a> on their top five spenders:
</p>

<img src="http://push.cx/wp-content/uploads/2010/06/whale_chart.png" alt="" title="Whale Chart" width="500" height="317" class="alignnone size-full wp-image-1400 content" />

<p>
From a traditional gaming perspective, Facebook games look like the purest kind of bubble, a lunatic asylum dosed with crystal meth. Don&#8217;t charge for your game? Don&#8217;t sell expansions? Get everyone to bother their friends? Offer gold coins for taking surveys?
</p>

<p>
It&#8217;s not insane, low distribution costs and efficient capturing revenue so efficiently means a fundamentally different business model. And a great environment for making games.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1398" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/freemium-and-segmentation/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Hex Map Graphics</title>
		<link>http://push.cx/2010/php-hex-map-graphics</link>
		<comments>http://push.cx/2010/php-hex-map-graphics#comments</comments>
		<pubDate>Sun, 13 Jun 2010 02:24:46 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[hex maps]]></category>
		<category><![CDATA[image generation]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[web games]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1392</guid>
		<description><![CDATA[This PHP code uses the GD functions to create hex map images (eg. for wargames). Leland on GitHub Features: Shapes: rectangule, hexagonal (&#8216;circle&#8217;), freeform (&#8216;free&#8217;) Variable hex sizes shape() to calculate distance in hexes highlight a hex set a border on a hex color a hex add text to a hex I swear it used [...]]]></description>
			<content:encoded><![CDATA[<p>
This PHP code uses the GD functions to create hex map images (eg. for wargames).
</p>

<p><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dpdGh1Yi5jb20vSGFya2lucy9sZWxhbmQ=">Leland on GitHub</a></p>

<h2>Features:</h2>

<ul>
  <li>Shapes: rectangule, hexagonal (&#8216;circle&#8217;), freeform (&#8216;free&#8217;)</li>
  <li>Variable hex sizes</li>
  <li>shape() to calculate distance in hexes</li>
  <li>highlight a hex</li>
  <li>set a border on a hex</li>
  <li>color a hex</li>
  <li>add text to a hex</li>
  <li>I swear it used to allow setting a background picture, but I don&#8217;t see that functionality so maybe I dreamed it or lost it when I misplaced this code for four years.</li>
</ul>

<h2>Known Issues</h2>

<p>
The code has ugly styling (tabs, odd spacing, no optional braces) &#8211; sorry, I was young(er) and stupid(er).
</p>

<p>
There&#8217;s a fair amount of temporal coupling in there &#8211; functions that you can&#8217;t call before other functions, etc. I hadn&#8217;t heard of the command pattern or closures yet.
</p>

<img src="http://push.cx/wp-content/uploads/2010/06/hex_map_test.png" alt="" title="Hex map test" width="191" height="161" class="alignnone size-full wp-image-1395 content" />

<p>
There&#8217;s a bug in the &#8216;circle&#8217; shape (that the following code exercises):
</p>

<pre>&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">require</span> <span style="color: #ff0000;">'class_hex_image.php'</span>;
&nbsp;
<span style="color: #0000ff;">$radius</span> = <span style="color: #cc66cc;">3</span>;
<span style="color: #0000ff;">$map</span> = <span style="color: #000000; font-weight: bold;">new</span> Hex_image;
<span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">set_color</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'bg'</span>, <span style="color: #cc66cc;">255</span>, <span style="color: #cc66cc;">255</span>, <span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">set_l</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">set_shape</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'circle'</span>, <span style="color: #0000ff;">$radius</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$x</span> = <span style="color: #cc66cc;">1</span>; <span style="color: #0000ff;">$x</span> &lt;= <span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">xsize</span>; <span style="color: #0000ff;">$x</span>++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$y</span> = <span style="color: #cc66cc;">1</span>; <span style="color: #0000ff;">$y</span> &lt;= <span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">ysize</span>; <span style="color: #0000ff;">$y</span>++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">text</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$x</span>, <span style="color: #0000ff;">$y</span>, <span style="color: #ff0000;">'black'</span>, <span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">steps</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$x</span>, <span style="color: #0000ff;">$y</span>, <span style="color: #0000ff;">$radius</span>, <span style="color: #0000ff;">$radius</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #808080; font-style: italic;">// nice for getting a feel for coordinates</span>
        <span style="color: #808080; font-style: italic;">//$map-&gt;text($x, $y, 'black', &quot;$x,$y&quot;);</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5waHAubmV0L2hlYWRlcg=="><span style="color: #000066;">header</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Content-Type: image.png'</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #0000ff;">$map</span>-&gt;<span style="color: #006600;">finish</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;       <span style="color: #808080; font-style: italic;">// calls imagepng()</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre>

<h2>Future</h2>

<p>
One of the guys in #bbg on irc,freenode.net is building a browser-based game with a hex map and I remembered this code was squirreled away somewhere on my hard drive. I have no plans to fix, improve, or in any way maintain this code. I figure I may as well release it so someone can do something with it.
</p>

<h2>License</h2>

<p>
I release this code to the public domain. You may use it for any purpose with or without attribution. It would be polite to mention my name and let me know you come up with, but it&#8217;s not at all required.
</p>
 <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1392" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/php-hex-map-graphics/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tracking Finances Though Benign Neglect</title>
		<link>http://push.cx/2010/tracking-finances</link>
		<comments>http://push.cx/2010/tracking-finances#comments</comments>
		<pubDate>Fri, 04 Jun 2010 21:22:27 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[budgeting]]></category>
		<category><![CDATA[habit]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[personal finance]]></category>
		<category><![CDATA[spreadsheets]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1382</guid>
		<description><![CDATA[Amazingly, I&#8217;m not broke. I don&#8217;t spend a lot of time thinking about my personal finances, mostly I adopt a policy of benign neglect and it&#8217;s allowed me to save up enough to work for myself exclusively. Instead of designing a precise system that accounts for every wayward penny (which is pretty much what my [...]]]></description>
			<content:encoded><![CDATA[<p>
Amazingly, I&#8217;m not broke.
</p>

<p>
I don&#8217;t spend a lot of time thinking about my personal finances, mostly I adopt a policy of benign neglect and it&#8217;s allowed me to save up enough to work for myself exclusively. Instead of designing <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5ueXRpbWVzLmNvbS8yMDEwLzA1LzE2L21hZ2F6aW5lLzE2V29ydGgtdC5odG1sP3BhZ2V3YW50ZWQ9YWxs">a precise system</a> that accounts for every wayward penny (which is pretty much what my inner nerd cries out for) I&#8217;ve designed good habits and trained my intuition to create a low-key monitoring system that keeps expenses down.
</p>

<p>
The most important thing is that whenever I feel like I&#8217;m spending more money than I want or don&#8217;t have a good feel for where and how much I&#8217;m spending, I start a spreadsheet. Here&#8217;s an old example (with a few numbers fudged for privacy and example purposes):
</p>

<img src="http://push.cx/wp-content/uploads/2010/06/spreadsheet.png" alt="" title="spreadsheet" width="798" height="309" class="alignnone size-full wp-image-1385 content" />

<dl>
  <dt>Category</dt>
  <dd>Category is whatever&#8217;s useful: when I worked in an office, I had a &#8216;Lunch&#8217; category for when I bought lunch instead of bringing my own. Learned the expense of that fast. Sometimes I have a generic &#8216;spoiling myself&#8217; or &#8216;entertaining in&#8217; and &#8216;entertaining out&#8217; categories. You have to invent your own.</dd>

  <dt>Amount</dt>
  <dd>Both positive (income) and negative (expenses), making it easy to select the column to see the sum at the bottom of the window. Usually I use the menu item Data -> Filter to create a filter on category to make it easy to add up these subtotals.</dd>

  <dt>Essential</dt>
  <dd>Similar to &#8216;Amount&#8217;, this is for the bare necessities: rent, groceries, medicine, schoolbooks. When I enter some groceries, that might be Amount -$72.18 but Essential -$51.52 because I bought some wine and candy. It&#8217;s a lot harder to reduce this category, but it helps for exposing optional purchases.</dd>
</dd>

  <dt>Notes</dt>
  <dd>Reminders to myself about what this was or if I could&#8217;ve done it differently. The goal of the spreadsheet is to train my intuition into sync with reality, like remembering that movie tickets and popcorn for two cost $29.50 now, not $12 when I first started going on dates.</dd>
</dl>

<p>
So when do I feel like making a spreadsheet?
</p>

<p>
Mostly by not using credit or debit cards; aside from the former&#8217;s fees and debt eating me alive, I use cash so I can see it go. If I&#8217;m at the cash machine more than once a month or wanting to withdraw more than usual, that&#8217;s my cue to stop and look at the spreadsheet a bit to figure out where I&#8217;m overspending. When I&#8217;m at the bookstore on the 8th with a stack of books under my arm and I look in my wallet to see that I&#8217;d have $20 left after buying them, I&#8217;ll tuck the cash back in my wallet and look at the library card that&#8217;s in there instead. It&#8217;s much easier to physically look at my budget in my pocket than to stop and try to recall the current numbers.
</p>

<p>
I don&#8217;t think I&#8217;ve ever run one of these spreadsheets for more than 10 weeks or so &#8211; I find out where I&#8217;m spending money, I make changes, and I track again when things feel off. I&#8217;ve done it I think four times in the last 8 years, mostly after I move. I put all my receipts in my wallet and trained myself to fill in the spreadsheet anytime I hit reload in my feed reader &#8211; which usually means once a day in the evenings, but of course you can tie to any daily event.
</p>

<p>
As I&#8217;m building a feel for my expenses, I&#8217;ll also try to lower them. The best thing is to look at monthly bills. For rent, search Craigslist for places your size and in your neighborhood with a max price of what you&#8217;re paying now (and min price of $5 to avoid the unethical marketers who enter $1 or $2), then subscribe to the RSS feed in the lower-right corner. After a few days or weeks you&#8217;ll have a feel for what your budget can get you and know if you should renew your lease or even think about breaking it.
</p>

<p>
All you can do for utility bills is reduce use, get better about turning off unused lights, turn the thermostat down and wear all those nice long-sleeved shirts. That&#8217;s the blessing and curse of regulation.
</p>

<p>
Reducing other bills, well, there&#8217;s a pain-in-the-ass way to lower them. Call every single one and say &#8220;I&#8217;m concerned about my bill. I think I&#8217;m overspending. I&#8217;m considering other companies. Can you do anything to reduce my bill?&#8221; It&#8217;s an awkward conversation, but a lot of times a loss prevention department will give you a big reduction in price to keep you on. Works especially well on phone and cable companies.
</p>

<p>
It&#8217;s really easy to procrastinate on this one, no one likes to feel demanding or chintzy, but that attitude only helps them. I get over it by asking every time I&#8217;m annoyed at poor service, outages, or friends bragging about the deals they&#8217;ve gotten. Anytime my internet connection is being particularly Comcastic, I would say something like &#8220;How are you going to compensate me for this?&#8221; or &#8220;I just got a flyer from [the other guy] offering $x/month&#8221; (and not mention this is only the first Y months). In the last few years my internet connection has been on some kind of teaser or discount rate roughly half the time.
</p>

<p>
In short, I&#8217;ve avoided designing a complicated, explicit system in favor of an implicit system based on habit. I&#8217;m writing this out because a friend asked, but I think the worst thing he could do is adopt it. The particular habits don&#8217;t matter, design habits for your particulars. I share mine to explain the thought process and give some food for thought, anyone care to share their own?
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1382" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/tracking-finances/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Yomi vs. Nash Equilibria</title>
		<link>http://push.cx/2010/yomi-vs-nash-equilibria</link>
		<comments>http://push.cx/2010/yomi-vs-nash-equilibria#comments</comments>
		<pubDate>Fri, 07 May 2010 20:09:27 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[David Sirlin]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[yomi]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1377</guid>
		<description><![CDATA[I was rereading David Sirlin&#8217;s World of Warcraft Teaches the Wrong Things as part of a conversation with a friend and I got to pondering his concept of yomi. I&#8217;ve previously mentioned it as having an influence on my game designs, so I&#8217;ll just quote his short definition: Street Fighter taught me about yomi: knowing [...]]]></description>
			<content:encoded><![CDATA[<p>
I was rereading David Sirlin&#8217;s <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5nYW1hc3V0cmEuY29tL3ZpZXcvZmVhdHVyZS8yNTY3L3NvYXBib3hfd29ybGRfb2Zfd2FyY3JhZnRfdGVhY2hlc18ucGhwP3ByaW50PTE2Nw==">World of Warcraft Teaches the Wrong Things</a> as part of a conversation with a friend and I got to pondering his concept of yomi. I&#8217;ve <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwOS9nYW1lLWluZmx1ZW5jZXMta29uZ2Fp">previously mentioned it</a> as having an influence on my game designs, so I&#8217;ll just quote his short definition:
</p>

<blockquote>
<i>Street Fighter</i> taught me about yomi: knowing the mind of the opponent. You can&#8217;t just play the odds and do the textbook-correct responses, you have to adapt and anticipate your opponent&#8217;s moves. The game is merely a medium through which you play against the other <i>player</i>.
</blockquote>

<p>
Games vary in how much they require skill at yomi, and it occurred to me that a game including yomi skill precludes a game having a <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYXNoX2VxdWlsaWJyaXVt">Nash equilibrium</a>.
</p>

<blockquote>
<p>
a solution concept of a game involving two or more players, in which each player is assumed to know the equilibrium strategies of the other players, and no player has anything to gain by changing only his or her own strategy unilaterally. If each player has chosen a strategy and no player can benefit by changing his or her strategy while the other players keep theirs unchanged, then the current set of strategy choices and the corresponding payoffs constitute a Nash equilibrium.
</p>

<p>
Stated simply, Amy and Bill are in Nash equilibrium if Amy is making the best decision she can, taking into account Bill&#8217;s decision, and Bill is making the best decision he can, taking into account Amy&#8217;s decision. Likewise, a group of players is in Nash equilibrium if each one is making the best decision that he or she can, taking into account the decisions of the others.
</p>
<cite><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYXNoX2VxdWlsaWJyaXVt">Wikipedia</a></cite>
</blockquote>

<p>
Games like Street Fighter, Kongai, coker, chess, are interesting because they don&#8217;t have <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Fdm9sdXRpb25hcmlseV9zdGFibGVfc3RyYXRlZ3k=">evolutionarily stable strategies</a>, every player is obliged to change their strategy in response to another player&#8217;s change. If a game (or one decision in a game) has a Nash equilibrium, there is no value to yomi, the player doesn&#8217;t need to know what the other player plans.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1377" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/yomi-vs-nash-equilibria/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hackers and Gamers</title>
		<link>http://push.cx/2010/hackers-and-gamers</link>
		<comments>http://push.cx/2010/hackers-and-gamers#comments</comments>
		<pubDate>Wed, 05 May 2010 14:36:22 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1367</guid>
		<description><![CDATA[I&#8217;ve been meaning to mention for a while that I&#8217;ve been contributing to the tumblelog Hackers and Gamers to share interesting links at the intersection of business, code, and gaming. The blog was started by Peter Christensen and has one or two other contributors. With two Peters involved, here&#8217;s the handy guide to tell us [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve been meaning to mention for a while that I&#8217;ve been contributing to the tumblelog <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2hhY2tlcnNhbmRnYW1lcnMucG9zdGVyb3VzLmNvbQ==">Hackers and Gamers</a> to share interesting links at the intersection of business, code, and gaming.
</p>

<p>
The blog was started by <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5wY2hyaXN0ZW5zZW4uY29tL2Jsb2cv">Peter Christensen</a> and has one or two other contributors. With two Peters involved, here&#8217;s the handy guide to tell us apart: <i>He&#8217;s</i> the guy in Chicago named Peter who&#8217;s building a startup around an unconventional web-based game and <i>I&#8217;m</i> the guy in Chicago named Peter who&#8217;s building a startup around an unconventional web-based game.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1367" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/hackers-and-gamers/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Domain Registration Survey</title>
		<link>http://push.cx/2010/domain-registration-survey</link>
		<comments>http://push.cx/2010/domain-registration-survey#comments</comments>
		<pubDate>Mon, 03 May 2010 16:21:40 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Biz]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1359</guid>
		<description><![CDATA[I&#8217;ve had all my domains registered at Name.com for a few years &#8211; great price, decent control panel, and competent support. Last week I went to renew some domains and found that Name has quietly doubled their prices by charging for the whois privacy protection that used to be free. Name didn&#8217;t warn any customers [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve had all my domains registered at <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL25hbWUuY29t">Name.com</a> for a few years &#8211; great price, decent control panel, and competent support. Last week I went to renew some domains and found that Name has quietly doubled their prices by charging for the whois privacy protection that used to be free.
</p>

<p>
Name didn&#8217;t warn any customers this was coming and didn&#8217;t email customers about it, which is funny because they&#8217;ll send a half-dozen warnings if a single domain name nears the end of its registration. They know very well the effectiveness of sending emails, so instead they made a <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jsb2cubmFtZS5jb20vMjAxMC8wNC9wcml2YXRlLXdob2lzLWNoYW5nZXMv">brief blog post</a> (who knew they even had a blog?) to announce the price hike as quietly as possible. The post doesn&#8217;t mention the new price is $8/year (laughably saying &#8220;While some registrars charge as much as eight or nine dollars per domain for this service&#8221;) and falsely claims pre-existing domains will continue to receive free privacy protection (the control panel shows that this will expire when the domain is up for reregistration). Unsurprisingly, the comments have filled up with comments from angry, shocked customers and Name is only responding to the few people who had billing problems with the related pricing promotions.
</p>

<p>
I&#8217;ve got around a hundred domains registered, mostly because I handle domain registrations whenever I give a friend hosting. It&#8217;s worth the $800 per year to take a few minutes this morning to survey competitors and maybe get better customer service (besides this unpleasant surprise, I&#8217;ve never seen Name respond to a support request in less than 36h).
</p>

<p>
In the table below, domain cost is the <em>highest</em> cost I could find on the site for a .com, I&#8217;m not interested in dancing around promotions and &#8220;restrictions may apply&#8221; loss leaders. The &#8220;upselling&#8221; column is whether I was disgusted or confused by the amount of upselling of related domains and products during the registration process. Survey was taken on 2010-05-03 and prices ending in .95 or .99 were rounded up. 
</p>

<table>
  <thead>
    <tr><td>Registrar</td><td>1yr .com</td><td>Privacy</td><td>Upselling</td><td>Total/yr</td></tr>
  </thead>
<tbody>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovLzFhbmQxLmNvbQ==">1&#038;1</a></td><td>$9</td><td>$0</td><td>ugh</td><td>$9</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RpcmVjdG5pYy5jb20=">DirectNIC</a></td><td>$15</td><td>$5</td><td></td><td>$20</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RvbWFpbi5jb20=">Domain.com</a> (Dotster?)</td><td>$10</td><td>$7</td><td>ugh</td><td>$17</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RvbWFpbm1vbmdlci5jb20=">DomainMonger</a></td><td>$17</td><td>n/a</td><td></td><td>n/a</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2RvdHN0ZXIuY29t">Dotster</a></td><td>$16</td><td>$7</td><td>ugh</td><td>$23</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2R5bmRucy5jb20=">DynDNS</a></td><td>$15</td><td>$10</td><td></td><td>$25</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Vub20uY29t">Enom</a></td><td>$6</td><td>$6</td><td>ugh</td><td>$12</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dhbmRpLm5ldA==">Gandi</a></td><td>$15</td><td>$0</td><td></td><td>$15</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL21vbmlrZXIuY29t">Moniker</a></td><td>$8</td><td>$4</td><td>ugh</td><td>$12</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL25hbWVjaGVhcC5jb20=">NameCheap</a></td><td>$9.69</td><td>$2.88</td><td></td><td>$12.57</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL25hbWUuY29t">Name.com</a></td><td>$9</td><td>$8</td><td></td><td>$17</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL25lYXJseWZyZWVzcGVlY2gubmV0">NearlyFreeSpeech</a></td><td>$8.59</td><td>$3.65</td><td></td><td>$12.24</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL25ldHdvcmtzb2x1dGlvbnMuY29t">NetworkSolutions</a></td><td>$35</td><td>$9</td><td>ugh</td><td>$44</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3BhaXJuaWMuY29t">PairNIC</a></td><td>$19</td><td>$0</td><td></td><td>$19</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3JlZ2lzdGVyLmNvbQ==">Register.com</a></td><td>$35</td><td>$11</td><td>ugh</td><td>$46</td></tr>
  <tr><td><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NtYWxsYnVzaW5lc3MueWFob28uY29tL2RvbWFpbnM=">Yahoo! Domains</a></td><td>$10</td><td>$9</td><td></td><td>$19</td></tr>
</tbody>
</table>

<p class="aside">
I didn&#8217;t include <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2ZhYnVsb3VzLmNvbQ==">Fabulous</a> because it has great prices but is primarily (only?) for domain parking and requires customers to have >750 domains. I didn&#8217;t include GoDaddy because I don&#8217;t like their support of torture and their habit of deactivating/deleting/holding hostage domains in response to any outside complaints.
</p>

<p>
If you&#8217;re not familiar with domain names, they&#8217;re a perfect commodity. Except for customer support issues (easy bulk management, quick responses to questions, downtime), every .com domain is exactly the same and costs the company the same $6.86 to register with Verisign, the .com registry.
</p>

<p>
Anyone have a registrar I should add to the list? Any stories, good or bad, about managing a lot of domains at any of these?
</p>
 <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1359" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/domain-registration-survey/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>One Fine Git Book: Pro Git</title>
		<link>http://push.cx/2010/one-fine-git-book-pro-git</link>
		<comments>http://push.cx/2010/one-fine-git-book-pro-git#comments</comments>
		<pubDate>Sat, 24 Apr 2010 16:07:06 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[book review]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[version control]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1316</guid>
		<description><![CDATA[As long as I&#8217;m reading too much, let me suggest that you can skip the couple dozen blog posts and half-dozen books about Git. Read this one introductory blog post and, if git sounds like a good tool for you, you can read one fine book about Git and be thoroughly informed. I was reading [...]]]></description>
			<content:encoded><![CDATA[<p>
As long as I&#8217;m <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMTAvYWRtaXR0aW5nLWRpbWluaXNoaW5nLXJldHVybnM=">reading too much</a>, let me suggest that you can skip the couple dozen blog posts and half-dozen books about Git. Read this one introductory blog post and, if git sounds like a good tool for you, you can read one fine book about Git and be thoroughly informed.
</p>

<p>
I was reading through <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3RvbS5wcmVzdG9uLXdlcm5lci5jb20v">the blog</a> of one of the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dpdGh1Yi5jb20=">GitHub</a> cofounders and an article caught my eye because it described a process very similar to the one that I&#8217;ve heard from people who don&#8217;t use any version control:
</p>

<blockquote>
You start your project in a directory named working. As you code, you try to write one feature at a time. When you complete a self-contained portion of a feature, you make sure that all your files are saved and then make a copy of the entire working directory, giving it the name snapshot-0. After you perform this copy operation, you make sure to never again change the code files in the new directory. After the next chunk of work, you perform another copy, only this time the new directory gets the name snapshot-1, and so on.
</blockquote>

<p>
I like this because doesn&#8217;t insult anyone for using a process like this (as I&#8217;m occasionally tempted to do). Instead, he sees it as the first step toward the design of a distributed version control system (DVCS) to manage the process. He explains how a version control system encapsulates all the best practices people have learned from decades of coding and collaborating into a reliable software tool.
</p>

<blockquote>
The following parable will take you on a journey through the creation of a Git-like system from the ground up. Understanding the concepts presented here will be the most valuable thing you can do to prepare yourself to harness the full power of Git. The concepts themselves are quite simple, but allow for an amazing wealth of functionality to spring into existence. Read this parable all the way through and you should have very little trouble mastering the various Git commands and wielding the awesome power that Git makes available to you.
</blockquote>

<p>
For anybody still on the fence about whether version control is worthwhile, give <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3RvbS5wcmVzdG9uLXdlcm5lci5jb20vMjAwOS8wNS8xOS90aGUtZ2l0LXBhcmFibGUuaHRtbA==">The Git Parable</a> a read to find out why most developers consider it a necessity. And even if you&#8217;re already familiar with version control it&#8217;s worth a read to get the basic concepts behind git (like that a commit it not a changeset, as in svn).
</p>

<p>
If it gets you curious to learn git, the free book <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Byb2dpdC5vcmcvYm9vaw==">Pro Git</a> is the one book you should read. It combines straightforward, readable prose with clear diagrams:
</p>

<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDQvZmlsZV9zdGF0dXNfbGlmZWN5Y2xlLnBuZw=="><img src="http://push.cx/wp-content/uploads/2010/04/file_status_lifecycle-300x190.png" alt="" title="File status lifecycle" width="300" height="190" style="float: left" /></a>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvd3AtY29udGVudC91cGxvYWRzLzIwMTAvMDQvbWVyZ2UucG5n"><img src="http://push.cx/wp-content/uploads/2010/04/merge-300x159.png" alt="" title="Merge structure" width="300" height="159" style="float: left" /></a>
<hr class="clear">

<blockquote>
<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE0MzAyMTgzMzkvP3RhZz1wdXNoY3gtMjA="><img src="http://push.cx/wp-content/uploads/2010/04/pro_git.jpg" alt="" title="Pro Git Cover" width="115" height="115" class="decoration" /></a>Because Git uses a simple three-way merge, merging from one branch into another multiple times over a long period is generally easy to do. This means you can have several branches that are always open and that you use for different stages of your development cycle; you can merge regularly from some of them into others.

Many Git developers have a workflow that embraces this approach, such as having only code that is entirely stable in their master branch — possibly only code that has been or will be released. They have another parallel branch named develop or next that they work from or use to test stability — it isn’t necessarily always stable, but whenever it gets to a stable state, it can be merged into master. It’s used to pull in topic branches (short-lived branches, like your earlier iss53 branch) when they’re ready, to make sure they pass all the tests and don’t introduce bugs.
</blockquote>

<p>
This book is the best because Chacon finds the right balance between day-to-day interaction examples and exposing the underlying data model. It finds the right balance between &#8220;Don&#8217;t worry about this magic here&#8221; and &#8220;and now a discourse on directed acyclic graphs&#8221;.
</p>

<p>
And once you&#8217;ve read it, stop. You <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMTAvYWRtaXR0aW5nLWRpbWluaXNoaW5nLXJldHVybnM=">don&#8217;t need to read anything more</a> about git, go forth and code.
</p>

<h2>Also Considered</h2>

<p>
The most common negative here is that a work is out of date: Git went from having almost nothing besides man pages from 2005-2007 to an explosion of introductory stuff in 2008 and early 2009. There were also a few significant UI improvements to git in late 2008 and through 2009 &mdash; so anything from before then will have a few confusing odds and ends, which is a problem when learning a system that&#8217;s already somewhat complex and opaque.
</p>

<dl>
  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Jvb2suZ2l0LXNjbS5jb20v">Git Community Book</a></dt>
  <dd>A close second, the Git Community Book is only slightly less well-structured.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzA1OTY1MjAxMjMvP3RhZz1wdXNoY3gtMjA=">Version Control With Git</a></dt>
  <dd>A little disorganized (there&#8217;s a lot of &#8220;X will be explained a few chapters from now&#8221;), but the O&#8217;Reilly house style you know well.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvdXNlci1tYW51YWwuaHRtbA==">Git user Manual</a></dt>
  <dd>Comprehensive and official, but no handholding, this is largely composed of man pages (<a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAzODA4MTU5MzEvP3RhZz1wdXNoY3gtMjA=">&#8230;</a>&#8220;which read like the terse mutterings of pilots wrestling with the controls of damaged airplanes&#8221;).</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzE5MzQzNTYxNTgvP3RhZz1wdXNoY3gtMjA=">Pragmatic Version Control Using Git</a></dt>
  <dd>Well-written and includes a nice reference to git-svn. There&#8217;s nothing wrong with this book, but Pro Git is newer and has great diagrams.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2xlYXJuLmdpdGh1Yi5jb20v">Learn Git</a></dt>
  <dd>Well-written (it&#8217;s also largely by the indefatigable Chacon) but incomplete.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cHM6Ly9wZWVwY29kZS5jb20vcHJvZHVjdHMvZ2l0LWludGVybmFscy1wZGY=">Git Internals</a></dt>
  <dd>Scott Chacon&#8217;s first excellent introduction, great but less complete than Pro Git. I haven&#8217;t seen the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3BlZXBjb2RlLmNvbS9wcm9kdWN0cy9naXQ=">screencast</a>.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy1jcy1zdHVkZW50cy5zdGFuZm9yZC5lZHUvfmJseW5uL2dpdG1hZ2ljLw==">Git Magic</a></dt>
  <dd>Fairly comprehensive, but it feels a bit too conversational and doesn&#8217;t explain behind-the-scenes fundamentals.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VhZ2Fpbi5uZXQvYXJ0aWNsZXMvZ2l0LWZvci1jb21wdXRlci1zY2llbnRpc3RzLw==">Git for Computer Scientists</a></dt>
  <dd>&#8220;And now a discourse on directed acyclic graphs.&#8221; A short article on git&#8217;s data structures.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5naXRyZWFkeS5jb20v">Git Ready</a></dt>
  <dd>A friendly blog with bite-sized topics, appears defunct.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3ZpZGVvLmdvb2dsZS5jb20vdmlkZW9wbGF5P2RvY2lkPS0zOTk5OTUyOTQ0NjE5MjQ1Nzgw">Randal Schwartz on Git</a></dt>
  <dd>For too long this was the only beginner intro to git; by the Hooter&#8217;s guy.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTRYcG5LSEpBb2s4">Linus Torvalds on Git</a></dt>
  <dd>A fun hour of Torvalds being rude and occasionally awesome, but not any real introduction.</dd>

  <dt>Using Git Without Feeling Stupid <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NtYWxsdGFsay5nbnUub3JnL2Jsb2cvYm9uemluaXAvdXNpbmctZ2l0LXdpdGhvdXQtZmVlbGluZy1zdHVwaWQtcGFydC0x">One</a> <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3NtYWxsdGFsay5nbnUub3JnL2Jsb2cvYm9uemluaXAvdXNpbmctZ2l0LXdpdGhvdXQtZmVlbGluZy1zdHVwaWQtcGFydC0y">Two</a></dt>
  <dd>Brief pair of blog posts giving a basic introduction</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy52aW1lby5jb20vMzY5MDk1">Git with Rails Tutorial</a></dt>
  <dd>Outdated and only about deployment.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5lZWNzLmhhcnZhcmQuZWR1L35jZHVhbi90ZWNobmljYWwvZ2l0Lw==">Understanding Git Conceptually</a></dt>
  <dd>Basic info on branching, merging, remote repositories, but that&#8217;s all.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dpdGNhc3RzLmNvbS8=">GitCasts</a></dt>
  <dd>An outdated and defunct screencast blog.</dd>

  <dt><a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2V4Y2Vzcy5vcmcvYXJ0aWNsZS8yMDA4LzA3L29ncmUtZ2l0LXR1dG9yaWFsLw==">Git the basics</a></dt>
  <dd>A good 130m talk on git, but it&#8217;s all the data structures before the hands-on.</dd>

</dl>

<p>&#8230;and a few dozen other brief blog posts and talks that aren&#8217;t worth linking to.</p>
 <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1316" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/one-fine-git-book-pro-git/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Admitting Diminishing Returns</title>
		<link>http://push.cx/2010/admitting-diminishing-returns</link>
		<comments>http://push.cx/2010/admitting-diminishing-returns#comments</comments>
		<pubDate>Thu, 22 Apr 2010 11:50:40 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Biz]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1305</guid>
		<description><![CDATA[In 2009, I acted like this equation is true: (I chose The 4-Hour Work Week and Hacker News because they&#8217;re two very popular resources, but there&#8217;s dozens I could&#8217;ve chosen.) I read quickly, I&#8217;m endlessly curious, and I have a completionist streak. I wish this formula worked, that somehow the process of absorbing and evaluating [...]]]></description>
			<content:encoded><![CDATA[<p>
In 2009, I acted like this equation is true:
</p>

<img src="http://push.cx/wp-content/uploads/2010/04/equation.png" alt="" title="equation" width="402" height="150" class="content" />

<p>
(I chose <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAzMDc0NjUzNTcvP3RhZz1wdXNoY3gtMjA=">The 4-Hour Work Week</a> and <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL25ld3MueWNvbWJpbmF0b3IuY29t">Hacker News</a> because they&#8217;re two very popular resources, but there&#8217;s dozens I could&#8217;ve chosen.)
</p>

<p>
I read quickly, I&#8217;m endlessly curious, and I have a <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5lc2NhcGlzdG1hZ2F6aW5lLmNvbS9uZXdzL3ZpZXcvOTkwOTUtV2h5LUJlLWEtQ29tcGxldGlvbmlzdA==">completionist</a> streak. I wish this formula worked, that somehow the process of absorbing and evaluating lots of different sources of information would make a successful business appear. I wish it more than you do. Last year I read scores of business books and blogs, screened dozens of hours of podcasts and videos.
</p>

<p>
These things contribute to business success, but there&#8217;s a point of diminishing returns that&#8217;s much nearer than I&#8217;d like to think. I&#8217;m glad I&#8217;ve read about prioritizing, delegating, and goal-setting, but <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5hbWF6b24uY29tL2RwLzAzMDc0NjUzNTcvP3RhZz1wdXNoY3gtMjA=">The 4-Hour Work Week</a> and <a href=http://www.amazon.com/dp/1932156852/?tag=pushcx-20"">No B.S. Time Management for Entrepreneurs</a> are 90% the same material dressed in different writing styles.
</p>

<p>
Reading about a topic I already know something of is seductive. It&#8217;s easier to connect with other concepts in my head, I get the satisfaction of judging whether the author is proficient, I&#8217;ll cross another book off <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMTAvZmluaXNoLWEtcHJvamVjdA==">the list</a> faster. And it&#8217;s sure as hell easier than fishing another case out of the issue tracker to fix a bug, add a feature, follow up with a contact.
</p>

<p>
The equation feels true but is a lie. It doesn&#8217;t much make my work <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5tZXJsaW5tYW5uLmNvbS9iZXR0ZXIv">better</a> to keep reading instead of building. So in 2010 I&#8217;m building more and considering this business &#8216;research&#8217; as the entertainment is is. We&#8217;ll see how it goes.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1305" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/admitting-diminishing-returns/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Finish a Project</title>
		<link>http://push.cx/2010/finish-a-project</link>
		<comments>http://push.cx/2010/finish-a-project#comments</comments>
		<pubDate>Wed, 21 Apr 2010 10:15:17 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[productivity]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[todo]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1299</guid>
		<description><![CDATA[The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time. This annoyingly true aphorism has an important implication: an unfinished project, however close it seems to completion, is worth far less than a completed project. [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.
</blockquote>

<p>
This annoyingly true <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OaW5ldHktbmluZXR5X3J1bGU=">aphorism</a> has an important implication: an unfinished project, however close it seems to completion, is worth far less than a completed project. With that in mind, I&#8217;ve created a useful tool.
</p>

<p>
It is a text file named <kbd>todo</kbd>, and it appears as follows:
</p>

<pre>
small todo:
  research thesauruses
  find a better launcher than fbrun
  finish jQuery Cookbook
  ~/.profile: print a random alias on login

sometime todo:

http://masanjin.net/sup-bugs/issue7

  get bike ready for spring
  tag and caption photos

business ideas:
  blog edit sharing - ask friends to preview a blog post
  online origami database
  ...

project ideas:
  roguelike: vampire in a town, hide and drain mob abilities
  patch MySQL to not allow blank WHERE in update/delete
  ...

purchases:
  bookends
  hat
  standing desk?
  measuring tape
  micrometer
  uninterruptable power supply

tv:
  House s5
  Mad Men s1
  Heroes s1
  Lost s1 (if it ends well)
  ...

games:
  World of Goo
  Dungeoneer (card game)
  ...

music:
  Bat For Lashes
  OK Go
  ...

[For boring historical reasons, the book/movie queue are elsewhere.]
</pre>

<p>
Every time I have a brilliant idea to fix something or research a product to buy or take someone up on a media recommendation, I put it on the list. And every time I have a brilliant idea for a new project, it <em>emphatically</em> goes on the list so I don&#8217;t start working on it. (This is the hard part.)
</p>

<p>
When I&#8217;m going to relax, I&#8217;ll pick something off the list of media to check out. And when I happen to have the file open, I&#8217;ll occasionally move more-interesting items upwards and prune off anything uninteresting.
</p>

<p>
It&#8217;s neat to have the last couple years of game, business, and hobby project ideas collected in one place; the most interesting of them have a text file or a directory for notes and plans. I find that if I let myself spend a few minutes or hours pondering a project and then write it down, I can stop obsessing about it, perhaps because I don&#8217;t need to think of it to keep from forgetting it.
</p>

<p>
Success? Yeah, it helps. It&#8217;s unfortunately not a free Finish Everything You Start Ticket, but I&#8217;m coming to terms with their lack of existence. I&#8217;ve finished more in the five years I&#8217;ve been keeping the file than the five before and I&#8217;m tempted to attribute it to growing wiser and more experienced, except that keeping this file is one of the mechanisms that help me get wiser and more experienced.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1299" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/finish-a-project/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Efficiency Replaces Autonomy</title>
		<link>http://push.cx/2010/efficiency-replaces-autonomy</link>
		<comments>http://push.cx/2010/efficiency-replaces-autonomy#comments</comments>
		<pubDate>Fri, 09 Apr 2010 22:35:11 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Biz]]></category>
		<category><![CDATA[capitalism]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[graphic design]]></category>
		<category><![CDATA[metrics]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1292</guid>
		<description><![CDATA[I&#8217;ve been pondering the rise of metrics-driven game design &#8212; from the sites I follow it sounds like the game industry at large has been as well. The makers of retail games are realizing they can make more money with less risk by careful analysis of how they directly charge gamers in the free-to-play (F2P) [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve been <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAxMC9nYW1lLWluZmx1ZW5jZXMtNzYtd2Fyc3Rvcm0=">pondering</a> the rise of metrics-driven game design &mdash; from the sites I follow it sounds like the game industry at large has been as well. The makers of retail games <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3Nmcm9jay53b3JkcHJlc3MuY29tLzIwMTAvMDQvMDUvbmdtb2NvLWdvZXMtYWxsLWluLXdpdGgtZnJlZS10by1wbGF5LW1vZGVsLw==">are realizing</a> they can make more money with less risk by careful analysis of how they directly charge gamers in the free-to-play (F2P) model.
</p>

<p>
Game designer and thoughtful critic Ernest Adams (his <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2Rlc2lnbmVyc25vdGVib29rLmNvbS9Db2x1bW5zL2NvbHVtbnMuaHRt">Designer&#8217;s Notebook</a> column at Gamasutra is good reading) <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5nYW1hc3V0cmEuY29tL3ZpZXcvZmVhdHVyZS80MzE5L3RoZV9kZXNpZ25lcnNfbm90ZWJvb2tfc2VsbGluZ18ucGhwP3ByaW50PTE=">mused about an F2P developer&#8217;s presentation</a>:
</p>

<blockquote>
Zhan Ye explained in his lecture that in F2P game design, every feature must be measured by two metrics: is it fun, and does it make money? The designer is no longer free to concentrate purely on creating a fun game; the designer must be a businessperson.
[...]
The F2P business model seems a bit weird to me &#8212; it distorts what I think of as the designer&#8217;s main role &#8212; but it&#8217;s not wrong in and of itself, just different.
</blockquote>

<p>
This reminded me a lot of a complaint from a graphic designer <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3N0b3BkZXNpZ24uY29tL2FyY2hpdmUvMjAwOS8wMy8yMC9nb29kYnllLWdvb2dsZS5odG1s">leaving Google</a> a few years ago:
</p>

<blockquote>
Yes, it’s true that a team at Google couldn’t decide between two blues, so they’re testing 41 shades between each blue to see which one performs better. I had a recent debate over whether a border should be 3, 4 or 5 pixels wide, and was asked to prove my case. I can’t operate in an environment like that. I’ve grown tired of debating such minuscule design decisions.
</blockquote>

<p>
The industrial revolution &#8211; and especially the concept of scientific management &#8211; replaced the concept of craftsmanship with the efficiency of repeatable production. You can&#8217;t manufacture the creative work of ad copy, game design, or graphic design, but metrics allow businesses to know with industrial precision what works and doesn&#8217;t.
</p>

<p>
Every formerly creative decision is now an opportunity to be unambiguously wrong. Efficiency replaces autonomy.
</p>

<p>
Where it used to be possible to design things for design&#8217;s sake to meet a designer&#8217;s personal standards for quality, it&#8217;s increasingly easy for businesses to analyze the effects of even very small aspects of those designs. The designer is used to relying on personal taste, gut instinct, or professional standards to deal with the thousand small questions that crop up in every design, and it feels good to intuitively know the right answers.
</p>

<p>
The first thing everyone writes about metrics (like A/B tests) is that you&#8217;re going to be surprised how often your intuition is wrong, even on questions that seem obvious and easy to answer. The new (or newly accessible) metrics are immensely frustrating to designers for three reasons:
</p>

<ol>
<li>Analytics tools are one more damn thing to learn</li>
<li>that often reveal experience to only be assumption</li>
<li>and transform personal decisions into business decisions.</li>
</ol>

<p>
The valid argument I see against the intrusion of metrics is that they&#8217;re short-sighted, eg. a green button may increase sales 8% now but introduces an inconsistency in overall site theme that won&#8217;t be measured in the future. That&#8217;s hard to make when the web&#8217;s cheap distribution can give you millions of new opportunities for revenue in a matter of a few days or hours &mdash; or allow you to earn more than you thought off the very few you do have.
</p>

<p>
Designers are going to have to live with metrics trumping their professional experience and personal taste, at least whenever they work for a boss or investor. it&#8217;s not that this is a new awful trend, it&#8217;s that capitalism is redefining what it means to do design. The pursuit of profit isn&#8217;t strangling creativity, it&#8217;s changing what it means to be creative from achieving a singular artistic vision to experimenting and improving iteratively.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1292" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/efficiency-replaces-autonomy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Competition and Bluffing</title>
		<link>http://push.cx/2010/competition-and-bluffing</link>
		<comments>http://push.cx/2010/competition-and-bluffing#comments</comments>
		<pubDate>Sat, 20 Mar 2010 20:10:09 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[competition]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[game mechanic]]></category>
		<category><![CDATA[poker]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1270</guid>
		<description><![CDATA[Direct competition is when a game is decided by how the opponents interact, how well they stop each other from succeeding. Indirect competition is when opponents can&#8217;t influence each others&#8217; successes, like in a sprint. I love the way that poker straddles the line between the two. The contest of who has the best hand [...]]]></description>
			<content:encoded><![CDATA[<p>
Direct competition is when a game is decided by how the opponents interact, how well they stop each other from succeeding. Indirect competition is when opponents can&#8217;t influence each others&#8217; successes, like in a sprint.
</p>

<p>
I love the way that poker straddles the line between the two. The contest of who has the best hand is indirect, I can&#8217;t take cards out of your hand, you can&#8217;t prevent me from drawing, we make our separate choices and win solely by ranking.
</p>

<p>
But betting is direct competition because players can choose to fold, can drop out rather than risk more resources. It&#8217;s a sprint where the players can&#8217;t see each others&#8217; positions on the track, only claim &#8220;I&#8217;m at 40m&#8221; or &#8220;I&#8217;ve lapped you&#8221; and the truth of the positions are revealed at the showdown. Betting is a proxy for success, and bluffing is signaling a win when you&#8217;re actually losing.
</p>

<p>
Bluffing uses incomplete information to turn indirect competitions into direct competitions. I only know of <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CdWxsc2hpdF8oY2FyZF9nYW1lKQ==">Bullshit</a> and <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaWFyJTI3c19kaWNl">Liar&#8217;s Dice</a> that could be played without bluffing (and would then be simple luck games, like <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XYXJfKGNhcmRfZ2FtZSk=">War</a>).
</p>

<p>
Because I&#8217;ve been thinking so much about bluffing and in/direct competition, I&#8217;m tinkering around with a design for a poker variation that includes direct competition. I suspect it won&#8217;t be as much fun, indirect competition often leaves a losing player feeling they could&#8217;ve done won if they&#8217;d played a little differently. Please leave a comment if you know if any that already do or other games that play with similar mechanics.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1270" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/competition-and-bluffing/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Game Influences (7/6): Warstorm</title>
		<link>http://push.cx/2010/game-influences-76-warstorm</link>
		<comments>http://push.cx/2010/game-influences-76-warstorm#comments</comments>
		<pubDate>Tue, 12 Jan 2010 01:58:52 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[Athenge]]></category>
		<category><![CDATA[business models]]></category>
		<category><![CDATA[game design]]></category>
		<category><![CDATA[game influences]]></category>
		<category><![CDATA[verbs]]></category>
		<category><![CDATA[Warstorm]]></category>
		<category><![CDATA[web games]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1249</guid>
		<description><![CDATA[I thought I&#8217;d finished the six post series on games that influenced Athenge, but I soon saw a game that changed my plans. This post is about how I analyze games by verbs, decision timing, and business concerns. 1. Ikariam 2. WeeWar Tangent: The Farming Genre 3. Tactics Ogre 4. Counter-Strike 5. X-Com 6. Kongai [...]]]></description>
			<content:encoded><![CDATA[<p>
I thought I&#8217;d finished the six post series on games that influenced Athenge, but I soon saw a game that changed my plans. This post is about how I analyze games by verbs, decision timing, and business concerns.
</p>
<ul>
  <li>1. <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvZ2FtZS1pbmZsdWVuY2UtaWthcmlhbQ==">Ikariam</a></li>
  <li>2. <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvZ2FtZS1pbmZsdWVuY2VzLXdlZXdhcg==">WeeWar</a></li>
  <li>Tangent: <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvdGhlLWZhcm1pbmctZ2VucmU=">The Farming Genre</a></li>
  <li>3. <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvZ2FtZS1pbmZsdWVuY2VzLXRhY3RpY3Mtb2dyZQ==">Tactics Ogre</a></li>
  <li>4. <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvZ2FtZS1pbmZsdWVuY2VzLWNvdW50ZXItc3RyaWtl">Counter-Strike</a></li>
  <li>5. <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvZ2FtZS1pbmZsdWVuY2VzLXgtY29t">X-Com</a></li>
  <li>6. <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvZ2FtZS1pbmZsdWVuY2VzLWtvbmdhaQ==">Kongai</a></li>
  <li>Tangent: <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMDkvdGVjaG5vbG9neS10cmVlcw==">Technology Trees</a></li>
  <li>7. <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=LzIwMTAvZ2FtZS1pbmZsdWVuY2VzLXdhcnN0b3Jt">Warstorm</a></li>
</ul>

<h2>Verbs</h2>

<p>
The fundamental difference between games and most other media is interactivity. When I want to understand a game, one step is to list all of the verbs available to the players. For example, the verbs in Super Mario Brothers are:
</p>

<ul>
  <li>Start 1/2 player game</li>
  <li>Walk left/right</li>
  <li>Run left/right</li>
  <li>Duck (when big)</li>
  <li>Jump</li>
  <li>Stomp enemy</li>
  <li>Kick shell</li>
  <li>Break brick</li>
  <li>Open question block</li>
  <li>Go down pipe</li>
  <li>Throw fireball</li>
  <li>Touch Axe</li>
</ul>

<p>
I was thinking of this because I played the browser-based trading card game <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy53YXJzdG9ybS5jb20=">Warstorm</a> and I was astounded when I realized what the available verbs are on the site (ignoring the account management common to any site with user accounts):
</p>

<ul>
  <li>Edit a deck (&#8220;squad&#8221;)</li>
  <li>Auction a card</li>
  <li>Trade cards with a player</li>
  <li>Chat</li>
  <li>Challenge an individual player to a duel</li>
  <li>Enter tournament or league (tourney with restricted rule)</li>
  <li>Redeem loyalty points (given for interaction/marketing) for cards</li>
  <li>Buy Challenge Coins (premium currency)</li>
  <li>Play a duel</li>
</ul>

<p>
The first six verbs are common to any trading card game. The last item is the interesting one: <em>play</em>. It looks like I didn&#8217;t descend into the same level of detail I did for Mario, but I did.
</p>

<p>
The player selects which of their decks they&#8217;d like to use and the duel proceeds like <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XYXJfKGNhcmRfZ2FtZSk=">War</a>. The computer turns up the top card of each deck, applies their effects, and repeats. The only thing the player can do is fast-forward to the end to find out if they won or lost.
</p>

<p>
I was floored when I realized this, I thought the site was hollow. It&#8217;s all about a card game but there&#8217;s no game at its heart. It reminded me of gambling in that nearly every verb you invoke involves paying, but unlike gambling there&#8217;s no chance you&#8217;ll ever get any money back.
</p>

<p>
I babbled about this to my friends for a few days, trying to make sense of it. Eventually I realized I hadn&#8217;t seen where the game was hiding.
</p>

<h2>Decision Timing</h2>

<p>
In real-time games (rugby, StarCraft) players are constantly able to take action (maybe with asymmetrical actions, like the separate roles of offense and defense in American football). In turn-based games (Chess, Scrabble, Civilization) players alternate who is allowed to act.
</p>

<p>
Magic: The Gathering had clever game mechanics that gave players new actions in a preparatory phase called &#8220;deckbuilding&#8221; prior to playing cards (incidentally inventing a business model). The players make decisions about what actions they want available to them in the matchups.
</p>

<p>
Warstorm is designed so that <em>all</em> of the actions are up-front, there is no phase of the game besides deckbuilding. It didn&#8217;t feel to me like a game because no game mechanic involves direct interaction with the opponent, I didn&#8217;t see that I could ever make and change a decision in response to my opponent&#8217;s actions (unless we played multiple duels, I suppose). I didn&#8217;t even see the game because it was too different from what I was expecting.
</p>

<p>
But it made me wonder how business concerns drove the game design of Warstorm, a game where there&#8217;s little to do besides pay more money. 
</p>

<h2>Business Concerns</h2>

<p>
When I turned my attention back to Athenge, I saw that my game design implied a lot of business decisions. I like games that require a lot of thought and analysis. I look at the most popular Facebook games and only see pastimes, idle toys requiring action with little thought, minimal direct competition, and even rarer losses. Oh, and tens of millions of players.
</p>

<p>
Warstorm reminded me that my taste in games is not common. Athenge will be a complex game, lots of instructions and options. It&#8217;ll take a lot of time for me, a lone developer, to build. Plus money to buy art, and more resources in marketing to find its non-mainstream audience. There&#8217;s risk to anything I choose to build, but Athenge looks to be more risk than it&#8217;s worth when I look at the current crop of simple, successful games. I could cut it down more and more, let these business concerns change my game&#8217;s design, but I&#8217;d rather let them replace my game&#8217;s design.
</p>

<p>
Instead of starting the programming of Athenge now, I&#8217;m continuing to improve the successful <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL05lYXJieUdhbWVycy5jb20=">NearbyGamers</a> and starting on a simpler, much more accessible game I&#8217;ve been tinkering with the design of for eighteen months. (Though it&#8217;s simple enough that&#8217;ll sound ridiculous when you see it, that&#8217;s fodder for another blog post). I still plan to build Athenge, but I think it must wait until I&#8217;m solidly in the black, until I&#8217;m not risking quite so much.
</p>
 <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=1249" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/game-influences-76-warstorm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HTML is Your Markup Language Anyways</title>
		<link>http://push.cx/2009/html-is-your-markup-language-anyways</link>
		<comments>http://push.cx/2009/html-is-your-markup-language-anyways#comments</comments>
		<pubDate>Tue, 10 Nov 2009 21:53:24 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[bbcode]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[markdown]]></category>
		<category><![CDATA[markup languages]]></category>

		<guid isPermaLink="false">http://push.cx/?p=297</guid>
		<description><![CDATA[I hate Wiki markup. I hate BBCode. I hate markdown. I hate the million other custom markup languages that have infested the web. When you&#8217;re using one of these markup languages, you&#8217;re using HTML anyways. Because they must be translated to HTML to serve as web pages, at best they&#8217;re poor translations of HTML. A [...]]]></description>
			<content:encoded><![CDATA[<p>
I hate Wiki markup. I hate BBCode. I hate markdown. I hate the million other custom markup languages that have infested the web.
</p>

<p>
When you&#8217;re using one of these markup languages, you&#8217;re using HTML anyways. Because they must be translated to HTML to serve as web pages, at best they&#8217;re poor translations of HTML. A lot of them are &#8220;parsed&#8221; with regular expressions, leading to all kinds of interesting bugs with nested tags. MediaWiki (the engine behind Wikipedia) uses two apostrophes for &#8221;<b>bold</b>&#8221; and three for &#8221;&#8217;<i>italic</i>&#8221;&#8217;, and then just lets you use HTML for all the cases where these things break. Most markup languages have some passthrough like this to deal with ambiguity or complexity &#8212; so while some markups (not BBCode, which is like HTML in brackets) can claim to be easier to start using, users always end up learning HTML in the end.
</p>

<p>
MediaWiki actually has a decent argument for custom markup in its ability to build <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3d3dy5tZWRpYXdpa2kub3JnL3dpa2kvSGVscDpUZW1wbGF0ZQ==">templates</a> and fill in particular fields with data. These custom tags aren&#8217;t available in HTML, but there&#8217;s nothing stopping a site from adding its own tags (which may or may not look much like HTML) that are compiled down to HTML in the exact same fashion.
</p>

<p>
Some will argue security, that allowing raw HTML would allow people to perform cross-site scripting and other attacks, or include obscene images, or break the page layout, etc. I&#8217;m not arguing for letting users use HTML without filtering, it&#8217;s absolutely necessary. It&#8217;s difficult to protect against the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2hhLmNrZXJzLm9yZy94c3MuaHRtbA==">wide variety</a> of attacks, but being difficult doesn&#8217;t mean it shouldn&#8217;t be done. There are excellent whitelisting libraries available that remove any excuse about rolling one&#8217;s own, like Ruby&#8217;s <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2dpdGh1Yi5jb20vcmdyb3ZlL3Nhbml0aXplLw==">Sanitize</a> and PHP&#8217;s <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2h0bWxwdXJpZmllci5vcmcv">HTML Purifier</a>.
</p>

<p>
If you&#8217;re building a site, let your users use HTML. A lot will already know it, there are a million free tutorials out there for them to learn it, and after using your site they&#8217;ll have a useful skill.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=297" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2009/html-is-your-markup-language-anyways/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Inbox Zero</title>
		<link>http://push.cx/2009/inbox-zero</link>
		<comments>http://push.cx/2009/inbox-zero#comments</comments>
		<pubDate>Tue, 10 Nov 2009 02:16:57 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[inbox zero]]></category>
		<category><![CDATA[mutt]]></category>
		<category><![CDATA[sup]]></category>
		<category><![CDATA[to-do]]></category>

		<guid isPermaLink="false">http://push.cx/?p=669</guid>
		<description><![CDATA[A few minutes ago, for the first time in around a decade, I emptied my email inbox. I&#8217;ve been steadily whittling it down (or at least holding the line) for the last few months: catching up on mailing lists, responding to outstanding emails, admitting there&#8217;s some things that are so old I&#8217;m not going to [...]]]></description>
			<content:encoded><![CDATA[<p>
A few minutes ago, for the first time in around a decade, I emptied my email inbox. I&#8217;ve been steadily whittling it down (or at least holding the line) for the last few months: catching up on mailing lists, responding to outstanding emails, admitting there&#8217;s some things that are so old I&#8217;m not going to respond to them, and moving work items onto a proper to-do list. So I have an impressively boring screenshot:
</p>

<img src="http://push.cx/wp-content/uploads/2009/11/sup.png" alt="sup" title="sup" width="490" height="352" class="alignnone size-full wp-image-1229" />

<p>
Watching Merlin Mann&#8217;s <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2luYm94emVyby5jb20vaW5ib3h6ZXJvL3ZpZGVv">Inbox Zero</a> video and reading the <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL2luYm94emVyby5jb20vYXJ0aWNsZXMv">preceeding articles</a> was the impetus for the final push to zero. It&#8217;s not that there&#8217;s anything I didn&#8217;t know in there. But there was the sense that it was not only possible but achievable.
</p>

<p>
So I immediately did what Mann suggested not to do and spent, oh, a full day changing email clients from <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL211dHQub3Jn">mutt</a> to <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3N1cC5ydWJ5Zm9yZ2Uub3Jn">sup</a>. It sounds like an awesome amount of time-wasting, but I read the sup <a href="http://push.cx/wp-content/plugins/feed-statistics.php?url=aHR0cDovL3N1cC5ydWJ5Zm9yZ2Uub3JnL1BoaWxvc29waHkudHh0">philosophical statement</a> a while ago and it resonated:
</p>

<blockquote>
The problem with traditional clients like Mutt is that they deal with individual pieces of email. This places a high mental cost on the user for each incoming email, by forcing them to ask: Should I keep this email, or delete it? If I keep it, where should I file it? I&#8217;ve spent the last 10 years of my life laboriously hand-filing every email message I received and feeling a mild sense of panic every time an email was both &#8220;from Mom&#8221; and &#8220;about school&#8221;.
</blockquote>

<p>
The flip side of this is that once if you&#8217;ve set up automatic filters you have to remember to go check those folders, which is a habit I&#8217;ve never been able to form. And once I&#8217;ve ignored a folder for two weeks, hell, I&#8217;ll leave it another day or two, why hurry to find out if I missed out on something interesting or if I let someone down? Or three days. Or&#8230;
</p>

<p>
And so I&#8217;ve poured all of my email into sup&#8217;s index and started mercilessly hacking away at that last couple hundred messages I hadn&#8217;t yet dealt with. Read and delete, or archive, or note on my to-do list, or suck it up and start another email with &#8220;I&#8217;m sorry it took so long to get back to you&#8230;&#8221; And now it&#8217;s cleaned out, to my pleasant amazement.
</p>

<p>
There is, of course, the terrible chance I&#8217;ve missed something important, but I couldn&#8217;t let that risk of something getting lost in the upheavel continue to paralyze me. Perfect is the enemy of good. If you&#8217;ve been waiting on a reply from me about anything and didn&#8217;t get it in the last few minutes, I&#8217;m sorry, please let me know. And if you&#8217;ve thought about contacting me but haven&#8217;t because I did so poorly with the last few emails, I&#8217;m sorry, I&#8217;m going to keep trying to do better.
</p> <img src="http://push.cx/wp-content/plugins/feed-statistics.php?view=1&post_id=669" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2009/inbox-zero/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
