<?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 &#187; Twitter</title>
	<atom:link href="http://push.cx/tag/twitter/feed" rel="self" type="application/rss+xml" />
	<link>http://push.cx</link>
	<description>A traveling geek&#039;s blog on development, games, and the web</description>
	<lastBuildDate>Thu, 19 Apr 2012 20:39:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Twitter</title>
		<link>http://push.cx/2010/twitter</link>
		<comments>http://push.cx/2010/twitter#comments</comments>
		<pubDate>Sat, 13 Nov 2010 16:58:02 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[handle]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://push.cx/?p=1495</guid>
		<description><![CDATA[I&#8217;ve starting using Twitter as @pushcx. I&#8217;ve been reading a few people for a while, but not really contributing. Any longtime readers will know I&#8217;ve been thinking about usernames. A little while ago I realized that, while it doesn&#8217;t include my name, &#8216;pushcx&#8217; is a decent enough handle that can be dereferenced uniquely. Twitter users, [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve starting using Twitter as <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL3B1c2hjeA==">@pushcx</a>. I&#8217;ve been reading a few people for a while, but not really contributing.
</p>

<p>
Any longtime readers will know I&#8217;ve been <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwOC9waWNraW5nLWEtdXNlcm5hbWU=">thinking</a> about <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwOC91c2VybmFtZS1zaG93ZG93bg==">usernames</a>. A little while ago I realized that, while it doesn&#8217;t include my name, &#8216;pushcx&#8217; is a decent enough handle that can be dereferenced uniquely.
</p>

<p>
Twitter users, please leave your username in a comment with a tip for getting the most out of Twitter. I&#8217;d like to avoid as many newbie mistakes as I can. :)
</p> <img src="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1495" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2010/twitter/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Worthy of Praise</title>
		<link>http://push.cx/2009/worthy-of-praise</link>
		<comments>http://push.cx/2009/worthy-of-praise#comments</comments>
		<pubDate>Sun, 22 Feb 2009 16:28:33 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[IMVU]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[snark]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://push.cx/?p=702</guid>
		<description><![CDATA[I&#8217;ve really enjoyed Timothy Fitz&#8217;s new blog, he&#8217;s sold me on Continuous Deployment, named the benefits automation I never put my finger on, and more. Jeff Atwood (writer of the very popular Coding Horror) snarked about the posts, though, because Fitz works at IMVU, a social virtual world that looks to be aimed at kids [...]]]></description>
			<content:encoded><![CDATA[<p>
I&#8217;ve really enjoyed <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3RpbW90aHlmaXR6LndvcmRwcmVzcy5jb20v">Timothy Fitz&#8217;s new blog</a>, he&#8217;s sold me on <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3RpbW90aHlmaXR6LndvcmRwcmVzcy5jb20vMjAwOS8wMi8xMC9jb250aW51b3VzLWRlcGxveW1lbnQtYXQtaW12dS1kb2luZy10aGUtaW1wb3NzaWJsZS1maWZ0eS10aW1lcy1hLWRheS8=">Continuous Deployment</a>, named the <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3RpbW90aHlmaXR6LndvcmRwcmVzcy5jb20vMjAwOS8wMi8xMS9jeWNsZS1lYXRlcnMv">benefits</a> <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3RpbW90aHlmaXR6LndvcmRwcmVzcy5jb20vMjAwOS8wMi8xMy9jb250aW51YWwtYXV0b21hdGlvbi8=">automation</a> I never put my finger on, and more.
</p>

<p>
Jeff Atwood (writer of the very popular <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2NvZGluZ2hvcnJvci5jb20=">Coding Horror</a>) snarked about the posts, though, because Fitz works at <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL2ltdnUuY29t">IMVU</a>, a social virtual world that looks to be aimed at kids and teens.
</p>

<blockquote>
<b><a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL2NvZGluZ2hvcnJvcg==">codinghorror</a></b>: If I worked on &#8220;IMVU: 3D Avatar Chat Instant Messenger &amp; Dress Up Game&#8221;, I&#8217;d be too embarrassed to blog about it, frankly.</p>
<p><b><a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL2NvZGluZ2hvcnJvcg==">codinghorror</a></b>: He&#8217;s like &#8220;our deployment is sweet!&#8221; I&#8217;m like &#8220;dude, you&#8217;re deploying a 3d chat game for tweens.&#8221; Congratulations, I guess http://is.gd/j4Bh</p>
<p><b><a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL2FudHVtYnJhbA==">antumbral</a></b>: @codinghorror Feel free to ignore the lessons learned by industry leaders like Nexon just because their customers are younger than you.</p>
<p><b><a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL2NvZGluZ2hvcnJvcg==">codinghorror</a></b>: @antumbral well, let&#8217;s just say 3d chat avatar dress-up software was not the cure for cancer I had hoped it would be.</p>
</blockquote>

<p>
I guess that would sting more, if not for this rhetorical piledriver from <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3d3dy5lZ29tZXRyeS5jb20vdGVjaC9pbXZ1LWlzLTNkLWF2YXRhci1jaGF0LWl0cy1hbHNvLWEtcHJpZGUtaW5kdWNpbmctcGllY2Utb2Ytc29mdHdhcmUtZW5naW5lZXJpbmcv">another proud IMVU engineer</a>:
</p>

<blockquote>
<p><b><a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL1ByZXN0ZW1vbg==">Prestemon</a></b>: Guy whose &#8220;About me&#8221; page says &#8220;I currently work full time on my blog&#8221; mocked the place I work for not being a cure for cancer. Speechless.</p>
</blockquote>

<p class="aside">
 (Atwood went on to make himself look worse by calling IMVU <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL2NvZGluZ2hvcnJvci9zdGF0dXMvMTIxMTU3NzYwMQ==">less honest than porn</a>; I can see it&#8217;s intended as an insult, but I can&#8217;t see how it makes any sense.)
</p>

<p>
I think Atwood&#8217;s hangup is that work is <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3RoZWRhaWx5d3RmLmNvbS9BcnRpY2xlcy9Qcm9ncmFtbWluZy1TdWNrcyEtT3ItQXQtTGVhc3QsLUl0LU91Z2h0LVRvLS5hc3B4">supposed to be boring</a>:
</p>

<blockquote>
t’s not easy to reconcile the fact that the software we write each and every day is, for all intents and purposes, mind-numbingly boring. &#8230; As unexciting as it may be, it’s our job to do work *exclusively* to benefit our employer, not for own personal satisfaction. That’s just what it means to be a professional. <b>Tedium is Inescapable.</b>
</blockquote>

<p>
I can&#8217;t even count the ways <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvMjAwOC9kb250LXBsYXktaHVydA==">this attitude is wrong</a>. If you think most programming is a boring slog, you&#8217;re not programming. You need to automate, abstract, and choose better tools. If you don&#8217;t have the imagination to work at a level where you&#8217;re solving problems instead of typing out getters and setters, you don&#8217;t have the imagination to be a developer, you&#8217;re just a typist.
</p>

<p>
Alex, the DailyWTF owner who wrote the post, spends time every day looking at some of the worst code ever written and he&#8217;s reacting to that: people who incompetent or over-complicate because they don&#8217;t realize that programming can be simple and straightforward. They reinvent every wheel because they either fail to realize the wheel exists or fail to recognize how it&#8217;s the solution to their problem.
</p>

<blockquote>
And needless to say, business applications are borrrring! Nothing about the programming is stimulating. It&#8217;s all a question of managing requirements, priorities, and figuring out how to cram ninety hours worth of work into a seventy hour week to stave off the outsourcing.
<cite>Raganwald, who only thought <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3dlYmxvZy5yYWdhbndhbGQuY29tLzIwMDYvMDkvYnVzaW5lc3MtcHJvZ3JhbW1pbmctc2ltcGx5LWlzbnQtdGhhdC5odG1s">he was writing parody</a></cite>
</blockquote>

<p>
A virtual dress-up world is not unworthy of quality work from software professionals. I&#8217;ve never understood that this idea that work shouldn&#8217;t be fun, that some jobs are not worth doing well. Fitz and the rest of the IMVU team are doing the us a favor by blogging about the good work they&#8217;re doing, and that&#8217;s worthy of praise.
</p> <img src="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=702" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2009/worthy-of-praise/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Twitter and Ruby&#8217;s Open Classes</title>
		<link>http://push.cx/2009/twitter-and-rubys-open-classes</link>
		<comments>http://push.cx/2009/twitter-and-rubys-open-classes#comments</comments>
		<pubDate>Mon, 12 Jan 2009 13:19:43 +0000</pubDate>
		<dc:creator>Peter Harkins</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Habber]]></category>
		<category><![CDATA[metaprogramming]]></category>
		<category><![CDATA[open classes]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://push.cx/?p=416</guid>
		<description><![CDATA[For a few years I&#8217;ve been using weird, funny, outrageous, bizarre, or just offensive quotes as IM status messages. They used to appear at the bottom of this site, but the Jabber bot that fetched them has been offline for a while. I hooked them up to a Twitter account with a short Ruby script, [...]]]></description>
			<content:encoded><![CDATA[<p>
For a few years I&#8217;ve been using weird, funny, outrageous, bizarre, or just offensive quotes as IM status messages. They used to <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3B1c2guY3gvamFiYmVyLXN0YXR1cw==">appear at the bottom</a> of this site, but the Jabber bot that fetched them has been offline for a while. I hooked them up to a <a href="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?url=aHR0cDovL3R3aXR0ZXIuY29tL2RvdGZvcnR1bmVyYw==">Twitter account</a> with a short Ruby script, and I wanted to talk about it a little.
</p>

<pre>&nbsp;
<span style="color: #808080; font-style: italic;">#!/usr/bin/ruby</span>
&nbsp;
FILE_FORTUNE = <span style="color: #ff0000;">'/path/to/.fortunerc'</span>
FILE_USED = <span style="color: #ff0000;">'/path/to/.used-fortunes'</span>
TWITTER_USERNAME = <span style="color: #ff0000;">'username'</span>
TWITTER_PASSWORD = <span style="color: #ff0000;">'seekrit password'</span>
GAP = <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span> * <span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span>..<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">26</span> * <span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;"># gap between tweets in minutes:</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># A cron job runs the script every minute with the word 'cron' </span>
<span style="color: #808080; font-style: italic;"># as an argument. It exits immediately unless enough time has passed</span>
<span style="color: #000066;">exit</span> <span style="color: #b1b100;">if</span> ARGV<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#93;</span> == <span style="color: #ff0000;">"cron"</span> <span style="color: #b1b100;">and</span> Time.<span style="">now</span> &lt; File.<span style="">mtime</span><span style="color: #66cc66;">&#40;</span>FILE_USED<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #000066;">require</span> <span style="color: #ff0000;">'rubygems'</span>
<span style="color: #000066;">require</span> <span style="color: #ff0000;">'digest/sha1'</span>
<span style="color: #000066;">require</span> <span style="color: #ff0000;">'twitter'</span>
<span style="color: #000066;">require</span> <span style="color: #ff0000;">'yaml'</span>
&nbsp;
&nbsp;
class Array
  def <span style="color: #000066;">rand</span>
    self<span style="color: #66cc66;">&#91;</span>Kernel.<span style="">rand</span><span style="color: #66cc66;">&#40;</span><span style="color: #000066;">length</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
  <span style="color: #b1b100;">end</span>
end
&nbsp;
class Range
  def <span style="color: #000066;">rand</span>
    Kernel.<span style="">rand</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">last</span> - first<span style="color: #66cc66;">&#41;</span> + first
  <span style="color: #b1b100;">end</span>
end
&nbsp;
class String
  def sha1
    Digest::<span style="color: #006600;">SHA1</span>.<span style="">hexdigest</span><span style="color: #66cc66;">&#40;</span>self<span style="color: #66cc66;">&#41;</span>
  <span style="color: #b1b100;">end</span>
end
&nbsp;
module YAML
  def self.<span style="">save_file</span> filename, obj
    File.<span style="">open</span><span style="color: #66cc66;">&#40;</span>filename, <span style="color: #ff0000;">'w'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> |f| f.<span style="">write</span><span style="color: #66cc66;">&#40;</span>obj.<span style="">to_yaml</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">end</span>
end
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;"># load fortunes, loop to pick one randomly</span>
fortune = nil
used = YAML::<span style="color: #006600;">load_file</span><span style="color: #66cc66;">&#40;</span>FILE_USED<span style="color: #66cc66;">&#41;</span>
fortunes = <span style="color: #000066;">open</span><span style="color: #66cc66;">&#40;</span>FILE_FORTUNE<span style="color: #66cc66;">&#41;</span>.<span style="">read</span>.<span style="">split</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">"<span style="color: #000099; font-weight: bold;">\n</span>%<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #66cc66;">&#41;</span>
loop <span style="color: #b1b100;">do</span>
  fortune = fortunes.<span style="">rand</span>
  break <span style="color: #b1b100;">if</span> fortune.<span style="">length</span> &lt;= <span style="color: #cc66cc;">140</span> <span style="color: #b1b100;">and</span> !used.<span style="">include</span>? fortune.<span style="">sha1</span>
<span style="color: #b1b100;">end</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># post it to Twitter</span>
Twitter::<span style="color: #006600;">Base</span>.<span style="">new</span><span style="color: #66cc66;">&#40;</span>TWITTER_USERNAME, TWITTER_PASSWORD<span style="color: #66cc66;">&#41;</span>.<span style="">post</span><span style="color: #66cc66;">&#40;</span>fortune<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># save that this fortune was used</span>
used<span style="color: #66cc66;">&#91;</span>fortune.<span style="">sha1</span><span style="color: #66cc66;">&#93;</span> = Time.<span style="">now</span>
YAML::<span style="color: #006600;">save_file</span><span style="color: #66cc66;">&#40;</span>FILE_USED, used<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># set time of next tweet</span>
next_tweet_at = Time.<span style="">now</span> + GAP.<span style="">rand</span> * <span style="color: #cc66cc;">60</span>
File.<span style="">utime</span><span style="color: #66cc66;">&#40;</span>next_tweet_at, next_tweet_at, FILE_USED<span style="color: #66cc66;">&#41;</span></pre>

<p>
A short, single-purpose script like this doesn&#8217;t cry out for seemingly-fancy techniques like adding to builtin classes. But when you get to the core of the script, it&#8217;s obvious. Instead of the noise of a procedural calls for randomness and generating sha1s, the intention is the implementation. The reusable bits of the code are already explicitly extracted, making them easier to reuse.
</p>

<p>
Now that I&#8217;ve been doing this sort of thing in Ruby for a while I keep wishing I could do it in Python. With open classes I can add to the Strings and Arrays that other code returns to mine. I can&#8217;t subclass objects I don&#8217;t instantiate, the best I could do is write a delegating wrapper class.
</p> <img src="http://push.cx/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=416" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://push.cx/2009/twitter-and-rubys-open-classes/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

