<?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>Elf Sternberg</title>
	<atom:link href="http://www.elfsternberg.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.elfsternberg.com</link>
	<description>Done, and gets things smart.</description>
	<lastBuildDate>Tue, 03 Apr 2012 18:31:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>If you don&#8217;t have a mobile strategy, you&#8217;re probably doomed.</title>
		<link>http://www.elfsternberg.com/2012/04/03/mobile-strategy-doomed/</link>
		<comments>http://www.elfsternberg.com/2012/04/03/mobile-strategy-doomed/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 18:31:49 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1287</guid>
		<description><![CDATA[Last night, I was at a local geek event and talking to a guy who&#8217;s writing a small start-up package. When I asked him about his project, he described is as a &#8220;dating site for World of Warcraft players.&#8221; He laughed self-deprecatingly, then went back to describing it as a place where newbies could learn [...]]]></description>
			<content:encoded><![CDATA[<p>Last night, I was at a local geek event and talking to a guy who&#8217;s writing a small start-up package. When I asked him about his project, he described is as a &#8220;dating site for <em>World of Warcraft</em> players.&#8221; He laughed self-deprecatingly, then went back to describing it as a place where newbies could learn how to play the game, join leagues, and generally assist one another. I asked him about his mobile strategy. &#8220;Oh, I don&#8217;t have one.&#8221; I asked him if he&#8217;d thought about it. &#8220;Thought about it? Yeah. But that&#8217;s for later.&#8221; I said, &#8220;Have you ever heard of <em>Warhammer</em>?&#8221;  He admitted that he had.  &#8221;<em>Warhammer, </em>along with its game component, has an amazing collection of novels, some in the fantasy universe, some in its science-fiction universe.  These all sell really well.  And do you know why they sell really well?  Because they give <em>Warhammer</em> fans something to do when they can&#8217;t play the game.  You can&#8217;t play the game on a bus.  You can&#8217;t play it while waiting in line at the bank or the deli.  You can&#8217;t play the game for ten minutes between meetings.  But you can sneak a few pages from a book.  That&#8217;s what your mobile solution has to do: make them feel attached to the game, and to the other players, and to the whole sense that they <em>belong</em> to something, that sustains them between their opportunities to play the game.&#8221; He sighed a little and said, &#8220;Okay.  One more thing for the list.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/04/03/mobile-strategy-doomed/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Two releases.  What have I learned?</title>
		<link>http://www.elfsternberg.com/2012/04/02/releases-learned/</link>
		<comments>http://www.elfsternberg.com/2012/04/02/releases-learned/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 17:57:59 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1283</guid>
		<description><![CDATA[I recently released two web-based products, RightNow and HTML5 Fridgemagnets, both of which exist to showcase some of my skills as a front-end web developer.  The biggest lessons of both products was simple: continual integration works. I like Makefiles.  This probably comes from my time as a server developer for CompuServe back in the 1990s, when [...]]]></description>
			<content:encoded><![CDATA[<p>I recently released two web-based products, <em><a title="Right Now!" href="http://rightnow.elfsternberg.com/" target="_blank">RightNow</a></em> and <em><a title="HTML5 Fridgemagnets" href="http://html5magnets.elfsternberg.com/" target="_blank">HTML5 Fridgemagnets</a></em>, both of which exist to showcase some of my skills as a front-end web developer.  The biggest lessons of both products was simple: continual integration works.</p>
<p>I like Makefiles.  This probably comes from my time as a server developer for CompuServe back in the 1990s, when I was actually writing a variety of back-end servers in C and C++.   Coffeescript, HAML, and Less are all compiled languages, but their compilation phases are usually quite quick.  I also like Fabric (Fabric is a deployment script manager written in Python, much like Capistrano for Ruby).   So for me, the lesson has become:</p>
<pre>watch:
    while inotifywait src/*.less src/*.haml src/*.coffee ; do make all &#038;&#038; fab deploy; done</pre>
<p> This Makefile recipe watches my source tree, and whenever a source file changes it builds the executables and pushes them out to the server.  Instant gratification just got more instant.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/04/02/releases-learned/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REST is not SOA is not JSON</title>
		<link>http://www.elfsternberg.com/2012/03/29/rest-soa-json/</link>
		<comments>http://www.elfsternberg.com/2012/03/29/rest-soa-json/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 16:15:55 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[chat]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1274</guid>
		<description><![CDATA[The other day I received an interview offer from a recruiter, who forwarded me the usual list of requirements.  The fifth line of the required skills irked me: - Knowledge of SOA (REST, JSON, etc.) Let&#8217;s start with the fundamentals. JSON is a protocol of data exchange. You can do data exchange in just about [...]]]></description>
			<content:encoded><![CDATA[<p>The other day I received an interview offer from a recruiter, who forwarded me the usual list of requirements.  The fifth line of the required skills irked me:</p>
<pre>- Knowledge of SOA (REST, JSON, etc.)</pre>
<p>Let&#8217;s start with the fundamentals. JSON is a protocol of data exchange. You can do data exchange in just about anything: XML, YAML, HTML, JSON, BSON, IDL, even some tragic home-grown mess that only your client and server understand. But that&#8217;s all it is: a way of marshaling data at one end of an exchange between two independent programs such that at the other end it will be parsed, understood, and acted on appropriately. These are all designed to be transmitted over some mediated electronic network such as the Internet, but carrier pigeon would work.</p>
<p>SOA and REST are architectural decisions about how to organize your client/server software project. More than that, they are <em>opposite</em> decisions: choosing one means you are choosing not to use the other.  SOA (&#8220;Service Oriented Architecture&#8221;) concentrates on the service delivered, on <em>how data is handled</em>, whereas REST is concerned about <em>the data being handled.</em>  One is verb-oriented, the other is noun-oriented.</p>
<p>If you think this is an academic distinction, you&#8217;re right.  But it&#8217;s an important one that people screw up all the time.  Consider this analogy: going to the movies.  In a noun-oriented word, you trade <em>money</em> for a <em>ticket</em>; you trade the <em>ticket</em> for <em>access</em>; you use the <em>access</em> to find a <em>seat</em>; you use the seat to watch a <em>movie.</em>  That what REST does: it trades coarse documents back and forth between the client and the server describing the various records that need to be kept to accomplish a goal, which ultimately results in the client and the server agreeing on what each needs.  In a verb-oriented world, you&#8217;re not writing software dealing with money, tickets, access, seats and movies: instead, you end up writing software about the kid <em>selling</em> tickets, the kid <em>taking </em>tickets, the kid who <em>ushers</em> you to your seat, and the <em>projection </em>of the movie.  That&#8217;s what SOA does: it describes the services with which you&#8217;re provided, not the actual products you intend on handling.</p>
<p>I can fairly be described as a REST partisan, but then my world is full of concrete items: <a href="http://spiralgenetics.com">gene sets</a>, stories, <a href="http://rightnow.elfsternberg.com/">to-do items</a>, gardens, potlucks, cards, <a href="http://html5magnets.elfsternberg.com/">poems</a>, games.  When I program, I care about what the client and the server exchange.   In every case, the software must validate and ensure the integrity of the exchange,  but in the case of REST the medium of exchange describes <em>what is being exchanged</em>, not <em>how to exchange it,</em> and for me that makes a big difference.  When you say you want &#8220;SOA using REST,&#8221; you&#8217;re telling me you don&#8217;t really understand either.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/03/29/rest-soa-json/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New Project: Fridgemagnets poetry!</title>
		<link>http://www.elfsternberg.com/2012/03/27/project-fridgemagnets-poetry/</link>
		<comments>http://www.elfsternberg.com/2012/03/27/project-fridgemagnets-poetry/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 04:53:21 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1268</guid>
		<description><![CDATA[I love poetry magnets, those silly little tiles with words on them that end up scattered across your refrigerator door.  You kids play with &#8216;em and eventually start to make strange, esoteric-sounding phrases that might be poems.  So I was pleased to see that PlusGood, one of my favorite design houses, had written TwitterMagnets, a [...]]]></description>
			<content:encoded><![CDATA[<p>I love poetry magnets, those silly little tiles with words on them that end up scattered across your refrigerator door.  You kids play with &#8216;em and eventually start to make strange, esoteric-sounding phrases that might be poems.  So I was pleased to see that PlusGood, one of my favorite design houses, had written <a href="http://twittermagnets.com/">TwitterMagnets</a>, a lovely little toy that simulates those wonderful literary devices.  Unfortunately, it lacks a few things: it doesn&#8217;t resize at all, it&#8217;s Flash (ugh!), and it allocates a portion of the screen to &#8220;the poetry region.&#8221;</p>
<p>But magnetic poetry doesn&#8217;t have allocated portions of your refrigerator.  A magnetic poem is just a collection of tiles assembled in a deliberate and meaningful way.  So I decide to write my own equivalent.</p>
<h3>Behold: <a title="HTML5 Magnets!" href="http://html5magnets.elfsternberg.com" target="_blank">HTML5 Magnets!</a></h3>
<p>It resizes when you resize (proportionally, too!), it&#8217;s not Flash, it <em>still</em> allows you to send your poem as a Tweet (so long as it&#8217;ll fit), and it detects a poem by the deliberate placement of words(i.e. you moved them) into meaningful patterns (i.e. they&#8217;re touching).</p>
<p>There&#8217;s a lot of fun stuff in the code: HTML5 Audio, the separate axis theorem (used to determine collisions in game mechanics, here used to create the &#8220;is-a&#8221; poem graph), a desperate (and somewhat unsuccessful) attempt to marry some functional and OO designs, a ton of Coffeescript (I <em>love</em> Coffeescript, gods, please don&#8217;t ever ask me to write straight JS again), a little application of the &#8220;write-only DOM&#8221; theory, and a nifty chunk of proportionality that lets the zoom feature work its magic.  I wrote this for fun, and it <em>is</em> fun.</p>
<p>Bug reports, patches, and the like, are very welcome, as always.</p>
<p>As usual, the HTML5 Magnets <a href="https://github.com/elfsternberg/fridgemagnets" target="_blank">source code is available</a> at GitHub.  Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/03/27/project-fridgemagnets-poetry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boarding the &#8220;Anti-if&#8221; bus</title>
		<link>http://www.elfsternberg.com/2012/03/22/boarding-antiif-bus/</link>
		<comments>http://www.elfsternberg.com/2012/03/22/boarding-antiif-bus/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 15:21:39 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[chat]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1259</guid>
		<description><![CDATA[The &#8220;Anti-If&#8221; campaign seeks to educate programmers about the dangers of the if statement, which seems on its face to be absurd.  How can your program actually do anything without being able to make decisions about the data? The focus of the Anti-If folks seems to be Java: there&#8217;s a lot of talk in the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antiifcampaign.com/">The &#8220;Anti-If&#8221; campaign</a> seeks to educate programmers about the dangers of the <strong>if statement</strong>, which seems on its face to be absurd.  How can your program actually do anything without being able to make decisions about the data?</p>
<p>The focus of the Anti-If folks seems to be Java: there&#8217;s a lot of talk in the Java community about whether or not the Anti-If people are nuts, or silly, or on to something, or just on something.  However, I&#8217;ve been focusing recently on my code and trying to &#8220;anti-if&#8221; it as much as possible, and here&#8217;s what I&#8217;ve discovered:</p>
<p>First, if <em>statements</em> and if <em>expressions</em> are two different beasts.  An if <em>statement</em> creates two possible code paths; an if<em> expression</em> returns one of two possible values based upon an evaluation, and if you&#8217;re a good programmer, the values will always be of the same type.  (Yes, I know, I work primarily in Javascript and Python, a pair of weakly typed languages.  This doesn&#8217;t mean you can ignore typing.  If anything, you should be paying more attention to it.)  You can argue that there are still two code paths, and I agree with you, but the important consideration here is that both code paths have the same type as the ultimate result, so the testing burden is down to &#8220;does this function return what we expect it to return under all circumstances?&#8221;  By narrowing the issue down to an if <em>expression</em>, you constrain your test to one value of one value type.</p>
<p>Secondly, the use of <em>if expressions as guard conditions</em> is good practice; it&#8217;s basically insuring that your function meets the needs of the caller before returning the anticipated value, which is just Programming by Contract 101, and if you&#8217;re a Haskell programmer you&#8217;ll recognize a great place to use the <em>Maybe</em> pattern in place of null values or exceptions as signals to the caller that the function failed in some way.</p>
<p>Third, lots of excellent self-documenting programming techniques exist that allow you to avoid massive &#8216;ifs&#8217; trees in the first place.</p>
<p>Recently, I was using Backbone to create an editor for the gene sequence alignment DSL we use at <a href="http://www.spiralgenetics.com/">Spiral</a>.   We therefore had three possible code options: create a new Aligner, edit an existing Aligner, or run an existing Aligner.  Each of these has a concrete URL associated with it, so it was possible to have separate method calls for each url by building a route association.</p>
<p>Instead, I had an uncomfortable mash-up of routes, all going to a single PipelineView full of if statements about &#8220;is this a launch&#8221; and &#8220;is this a new Aligner&#8221; and whatever.  I spend two days refactoring, and came out with a rock-solid concrete collection of subclasses, each of which does one thing and does it well.   There are still if expressions in there, and even a few if statements&#8211; they&#8217;re all in the code that manipulates the DOM, making visual decisions, what Haskell calls the &#8220;side effects.&#8221;  But for the most part, the risky code is now gone, replaced with a dispatch table that <em>up front</em> tells exactly what the code will do, and what results you will get back.</p>
<p>The replacement of &#8216;if&#8217; statements with modern language constructs such as filters, maps, dispatch tables, routing tables, and factory functions that deliver polymorphic subclasses makes a more rich, better-documented, smaller and more powerful code base.  Like my study of Haskell, this discipline has contributed to making me a better programmer.  I recommend you try it, if only for practice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/03/22/boarding-antiif-bus/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Coffeescript deconstruction of arrays</title>
		<link>http://www.elfsternberg.com/2012/03/21/coffeescript-deconstruction-arrays/</link>
		<comments>http://www.elfsternberg.com/2012/03/21/coffeescript-deconstruction-arrays/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 23:19:21 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[coffeescript]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1256</guid>
		<description><![CDATA[Most people who&#8217;ve been using Coffeescript for the past year are probably aware by now of argument deconstruction for objects.  This is a nifty feature of Coffeescript that lets us take this: myfunc = (options) -&#62; @foo = options.foo @bar = options.bar ... And instead say this: myfunc = ({@foo, @bar}) -&#62; ... In both [...]]]></description>
			<content:encoded><![CDATA[<p>Most people who&#8217;ve been using Coffeescript for the past year are probably aware by now of argument deconstruction for objects.  This is a nifty feature of Coffeescript that lets us take this:</p>
<pre>myfunc = (options) -&gt;
    @foo = options.foo
    @bar = options.bar
    ...</pre>
<p>And instead say this:</p>
<pre>myfunc = ({@foo, @bar}) -&gt;
    ...</pre>
<p>In both cases, <tt>foo</tt> and <tt>bar</tt> will automagically be bound to the <em>this</em> operator and set to the corresponding values in the <tt>options</tt> object, if they exist.</p>
<p>A couple of weeks ago I posted <a href="http://www.elfsternberg.com/2012/01/15/coffeescript-gateway-drug-haskell/">Coffeescript is a gateway drug to Haskell</a>, which showed how the quicksort algorithm as apparent in Haskell could almost completely be reproduced in Coffeescript. The Haskell function looked like this:</p>
<pre>quicksort [] = []
quicksort (x:xs) =
       let smallerOrEqual = [a | a  x]
       in quicksort smallerOrEqual ++ [x] ++ quicksort larger</pre>
<p>My function was a little uglier; I was disassembling the array into <em>car</em> and <em>cdr</em> components in the function, my comprehensions weren&#8217;t lazy, and the pattern had to be moved into the function as a guard condition.</p>
<p><a href="http://programmers.stackexchange.com/questions/139650/how-is-coffeescript-influenced-by-haskell/139976">Linus Thiel</a> and I had a couple of go-rounds on this, and he taught me something fascinating, and at the end, this is what we had:</p>
<pre>quicksort = ([x, xs...]) -&gt;
    return [] unless x?
    smallerOrEqual = -&gt; (a for a in xs when a &lt;= x)
    larger = -&gt; (a for a in xs when a &gt; x)
    (quicksort smallerOrEqual()).concat(x).concat(quicksort larger())</pre>
<p>The guard condition is still there, but it&#8217;s much more readable. I made the list comprehensions lazy. But Linus showed me how the deconstruction operator for Coffeescript can be used to achieve <em>car</em>:<em>cdr</em> effectively in Coffeescript, and that just blows my mind, because now it means that yet another common transformation is part of my toolkit.</p>
<p>Coffeescript continues to amaze me as it grows and matures into a full-fledged language.  The more I work with it, the more I realize I may not write in raw Javascript ever again if I can avoid it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/03/21/coffeescript-deconstruction-arrays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fridgemagnets 0.4</title>
		<link>http://www.elfsternberg.com/2012/03/12/fridgemagnets-04/</link>
		<comments>http://www.elfsternberg.com/2012/03/12/fridgemagnets-04/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 05:19:02 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1248</guid>
		<description><![CDATA[Following hot on the release of Right Now!, I&#8217;ve now finished the first draft of the Fridgemagnets client.  This is a very (very!) rough draft with significant performance problems, especially under Firefox, a lack of rotational filters under IE, and is missing some major features: The ability to tweet your poem, the ability to reshuffle [...]]]></description>
			<content:encoded><![CDATA[<p>Following hot on the release of <a title="Right Now!" href="http://www.elfsternberg.com/projects/rightnow/" target="_blank">Right Now!</a>, I&#8217;ve now finished the first draft of the <a title="Fridge Magnets" href="http://www.elfsternberg.com/projects/fridgemagnets/" target="_blank">Fridgemagnets</a> client.  This is a very (very!) rough draft with significant performance problems, especially under Firefox, a lack of rotational filters under IE, and is missing some major features: The ability to tweet your poem, the ability to reshuffle the word list, the ability to choose alternative word lists, the ability to bookmark your poem, the ability to put utility words back into the &#8220;play&#8221; list with a shuffle (&#8216;a&#8217;, &#8216;an&#8217;, &#8216;the&#8217;, &#8216;-ed&#8217;, &#8216;-ing&#8217;, &#8216;-s&#8217;, &#8216;-r&#8217;), knowing the difference between words and suffixes, tracking words by their reference and not the word itself (this confuses that &#8216;is a poem&#8217; algorithm still).  Also, I want to put some decorative flash on the page (credits, etc.), and I want it to be phone-ready responsive.</p>
<p>Fridgemagnets attempts (and mostly succeeds) at implementing a write-only DOM layer: once objects are on the board, I tried hard not to ask the DOM for positions or direction.  Only under certain circumstances, such as a drag/stop event, do I need to ask the DOM &#8220;Where did that land?&#8221;  Otherwise, I <em>tell</em> the DOM what I want it to know.  This was mostly done for learning; I&#8217;ve read several different responsive design blogs where querying the DOM is the biggest time-eater in an app.</p>
<p>That doesn&#8217;t mean this program is at all efficient.  There&#8217;s huge CPU wasteage in repeatedly querying and shuffling the lists of words and their bounding boxes in order to determine which ones are in proximity to other ones, which ones constitute &#8220;the poem,&#8221; and so forth.  I expect to be looking hard at the way these features are used, and fixing them as I can.  Coffeescript isn&#8217;t Haskell, and doesn&#8217;t have Haskell&#8217;s marvelous internal caching mechanisms.</p>
<p>One thing I am very proud of is my solution for the <a href="http://www.metanetsoftware.com/technique/tutorialA.html" target="_blank">Separating Axes Theorem</a>, which is a space-and-time efficient way of telling if an object is in collision with other objects.  I&#8217;d never written anything quite like that before, and it was a pleasure to stretch my brain around a seemingly arbitrary geometry where everything is in the 2D plane, but the axes of projection are abstracted and their distance to the measured objects irrelevant.  (It&#8217;s also annoying that game programmers use the word &#8220;axis&#8221; for what is generally just a &#8220;line.&#8221;)</p>
<p>I&#8217;m happy with the algorithmic description of &#8220;a poem,&#8221; but not with some of the underlying querying of the list of words and their bounding boxes to determine what is and is not part of the poem.  That&#8217;s gonna take some more think.  All in all, though, a very nice start.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/03/12/fridgemagnets-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Right Now 0.5</title>
		<link>http://www.elfsternberg.com/2012/03/03/05/</link>
		<comments>http://www.elfsternberg.com/2012/03/03/05/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 20:46:44 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1246</guid>
		<description><![CDATA[I&#8217;m really itching to get to one of two other projects currently in my personal queue, code-named Ptah or Magnets (you&#8217;ll see what they are eventually), but bug reports for Right Now have been coming in fairly quickly, and there have been some quite obvious problems in the code.  The whole &#8220;release early, release often&#8221; and &#8220;your users [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m really itching to get to one of two other projects currently in my personal queue, code-named <em>Ptah</em> or <em>Magnets </em>(you&#8217;ll see what they are eventually), but bug reports for <em><a title="Right Now!" href="http://elfsternberg.com/projects/rightnow/" target="_blank">Right Now</a> </em>have been coming in fairly quickly, and there have been some quite obvious problems in the code.  The whole &#8220;release early, release often&#8221; and &#8220;your users will remind you of what needs fixing&#8221; mantras are really working for it.</p>
<p>First, some people have complained that the download is really hard to find, since I <em>don&#8217;t</em> recommend you use the copy off my site.  It&#8217;s here: <a href="https://github.com/elfsternberg/rightnow/downloads" target="_blank"><em>Right Now</em> on Github</a>.  That&#8217;s guaranteed to be the latest, greatest, up-to-date reminder.</p>
<p>Secondly, the &#8220;Here&#8217;s how to use it&#8221; feature obscured the buttons on pages less that 1200pixels wide (so much for responsive design; this was a learning experience), so I&#8217;ve provided a control allowing you to delete the help panel.  It&#8217;s at the bottom of the panel.</p>
<p>And finally, it didn&#8217;t work under IE8.  Too many people still use IE for me to ignore it (18.86% of the world uses IE8 as of January 2012), and to make it work I had to replace Zepto with jQuery.  Zepto doesn&#8217;t provide some of the CSS read capabilities that I used.  That raises the post-UglifyJS size from 45K to 101K (approximately), which is still small, but doubling in size is just not attractive.</p>
<p>To test with IE8, I had to install a really old copy of Windows95 (which I had the CD for) into VirtualBox on my Gentoo Linux laptop, then upgrade it to XP SP2 (which, again, I had the CD for), then upgrade to IE8.  Oddly enough, this works really well.  For the longest time, I had an ancient box under my desk that I would turn on and VNC into whenever I wanted to do IE testing.  Now, I can do it anywhere, and can even fork and automate the process, and once I&#8217;ve got an establishement that I like I can snapshot it, and reset it should it ever become infested.  This is a major win, since IE testing is always a pain.</p>
<p><em>Right Now </em>is meant for modern(ish) browsers; it obviously doesn&#8217;t push the envelope the way <em>HTML5 Tones</em> or the <em>Arc Experiments</em> did, but it is supposed to be useful for 95% of the world (those above IE6 and Firefox 3.6) and IE8 compatibility <em>almost</em> makes that happen.   If I were developing for a customer in the real world, I&#8217;d use <em>Express.js</em> and have both client-side and server-side rendering, as was possible, but this isn&#8217;t a server-based application, and it does its jobs well.</p>
<p><em>Right Now</em> is also supposed to be a reminder tool.  It doesn&#8217;t need bells and whistles.  Someone suggested, and I understand the wish, that it had a search bar in it, so that instead of replacing &#8221;The Google&#8221; as your home page, it only supplements it.  This is an admirable suggestion, but <em>Right Now</em>&#8216;s purpose is to <em>prevent</em> you from immediately haring off on whatever idea distracted you in the first place.   It&#8217;s an anti-procrastination device, and adding procrastination-enhancing distractions to it would be contrary to its purpose.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/03/03/05/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A new little software toy: Right Now!</title>
		<link>http://www.elfsternberg.com/2012/02/27/software-toy/</link>
		<comments>http://www.elfsternberg.com/2012/02/27/software-toy/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 02:53:58 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1241</guid>
		<description><![CDATA[Quick, what web page do you look at most often in your day-to-day life? Not the one you spend the most time on&#8211; that&#8217;s probably Facebook or Twitter or something like that. It&#8217;s the page you see on a regular basis but pay very little attention to. For me, that page is the &#8220;New Tab&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Quick, what web page do you look at most often in your day-to-day life? Not the one you spend the most time on&#8211; that&#8217;s probably Facebook or Twitter or something like that. It&#8217;s the page you see on a regular basis but pay very little attention to.</p>
<p>For me, that page is the &#8220;New Tab&#8221; page on Chrome. It&#8217;s the page that comes up when you first start the browser, and every time you open a new tab with the Ctrl-T keystroke, or by clicking on the [HOME] button with the middle mouse button. I see that page every day, often many times in the day.</p>
<p>I decided I didn&#8217;t want the basic utility offered by Chrome, and replaced it with a static home page, a kind of memento mori. It&#8217;s based on an idea by Merlinn Mann, I think&#8211; it was a long time ago&#8211; and the idea is that every time you pull up that page it shows you a list of the things you ought to be concentrating on. It is emphatically <em>not</em> a to-do list; it&#8217;s more like a project list, and it has categories to let you describe different &#8220;realms&#8221; in which you have your projects. Mine looks like this:</p>
<p><strong>Wouldn&#8217;t you rather be:</strong></p>
<ul>
<li>Programming:
<ul>
<li>A better Facebook</li>
<li>The next Pinterest</li>
</ul>
</li>
<li>Writing:
<ul>
<li>The great American novel</li>
<li>The great Martian novel</li>
</ul>
</li>
<li>Playing:
<ul>
<li>With your kids</li>
<li>In your garden</li>
</ul>
</li>
</ul>
<p>The problem with this set-up is that it was <em>static</em>. Sure, I&#8217;m a fine HTML monkey myself, but I wanted something that I could change without having to pull up an editor and look at a ton of HTML every day. So I hacked together this:</p>
<p><strong><a href="http://elfsternberg.com/projects/rightnow/">Right Now!</a></strong></p>
<p>Okay, it&#8217;s a blank page. But if you click on the &#8220;Wouldn&#8217;t you rather be&#8221; header on the right, you&#8217;ll get an opportunity to create a new category, and then under that add a list of projects.</p>
<p>Here&#8217;s the (somewhat) nifty part: <em>Your data is entirely stored on <strong>your</strong> computer</em>. I taught myself to use <a href="http://zeptojs.com/">Zepto</a> and <a href="http://westcoastlogic.com/lawnchair/">Lawnchair</a>, a micro-DOM framework and a toolkit that uses the new &#8220;local storage&#8221; engines. There&#8217;s no server. There&#8217;s no off-line storage. <em>Nobody else can see your data. </em></p>
<p>And it&#8217;s <em>fast</em>. You don&#8217;t even notice the post-download draw. There are still some tics, but on the whole, this is what I wanted to achieve: when I change or abandon a project, the next time I see it, I can make it go away. And when I start a new project, I can put it on the list.</p>
<p>Even better, since I used Zepto and Lawnchair, I was able to write it without using Backbone. As much as I love Backbone, this didn&#8217;t need it, and figuring that out necessitated a re-write. So although the tag is &#8220;v0.2&#8243;, it&#8217;s more like &#8220;v0.4&#8243;, but that&#8217;s git for ya.</p>
<p>Anyway, go ahead and enjoy it. The code isn&#8217;t gorgeous, but for 140K, it&#8217;s a nice, sweet hack. And it means that my project list is now updatable. I&#8217;m no longer looking at an outdated list.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/02/27/software-toy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apropos of nothing but my past and future opportunities&#8230;</title>
		<link>http://www.elfsternberg.com/2012/02/15/apropos-future-opportunities/</link>
		<comments>http://www.elfsternberg.com/2012/02/15/apropos-future-opportunities/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 17:25:07 +0000</pubDate>
		<dc:creator>Elf Sternberg</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.elfsternberg.com/?p=1232</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://www.youtube.com/embed/eaoIsPZAgck" frameborder="0" width="420" height="315"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.elfsternberg.com/2012/02/15/apropos-future-opportunities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

