<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>without an e</title>
  <link rel="self" href="http://withoutane.com/feed.atom"/>
  <link rel="alternate" href="http://withoutane.com/"/>
  <updated>2009-10-25T10:20:18-05:00</updated>
  <author>
    <name>Michal Wallace</name>
  </author>
  <id>http://withoutane.com/</id>
  <subtitle>The continuing saga of a mad supergenius entrepreneur born without an e...</subtitle>
  <generator>rantelope</generator>

<entry>
  <title>squeaking by</title>
  <id>http://withoutane.com/rants/2009/04/squeaking-by</id>
  <link href="http://withoutane.com/rants/2009/04/squeaking-by" rel="alternate"/>
  <updated>2009-04-14T07:23:58-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The past couple weeks have been one of the most stressful periods in my life. Sort of an <em>out of the frying pan and into the fire</em> situation as I finally recovered from the all-consuming client work period, where I had plenty of money and no time, to struggling to make ends meet in my business.</p>

<p>The economic problems in the world have not been kind to cornerhost. Lots of people are suddenly finding personal web hosting to be a luxury. Combine the general trend with  poor support when I was swamped with client work, and escalating performance problems during the early part of the year (which persisted until I did a huge upgrade of all my servers), and things are looking pretty grim.</p>

<p>I missed two or three paychecks in a row there, and even wound up unable to afford my ADD meds for a couple weeks, which I basically spent in a complete fog.</p>

<p><em>But...</em> I still have a roof over my head, and I still have a trick or two up my sleeve.</p>

<p>My hard drives are packed full of half-finished projects, many of which could easily be turned into commercial products if I could just <em>finish</em> them. Of course, many of those are web apps, and my <a href="http://withoutane.com/rants/2009/03/rails-won">decision </a> to abandon my 10-year-labor-of-love web framework in favor of rails removed one of the major constraints on my performance, for the price of a learning curve that isn't even that steep after all.</p>

<p>Even now, though, back on Vyvanse and armed with a clear goal and deadline (for the bodyblog.com redesign), I'm struggling to stay on task and make the best use of my time.</p>

<p>I've been working steadily on <em>The Flake Effect</em> since November, to the point where I'm going to have to start looking for a system to manage and organize it all. I actually have a pretty clear idea of what an attention management software system would look like. It would combine sensors (such as checking email) with schedules, logical inference, metrics, planning algorithms, time constraints, chronobiology, and even a little NLP. Basically, it would create an immersive mental environment that turned productivity into an addicting video game.</p>

<p>I keep wanting to make the dang thing but it's too big and too complex to build, so I wind up building a little app here, a little script there. Plus there's the whole bootstrapping problem - my efforts to build a productivity tool are hampered by my poor productivity.</p>

<p>Time and time again, I find myself wishing that I could just leave my whole system running, and that I could tie pieces together more easily. Like, it's easy to make a daily checklist in a spreadhseet, but to hook that up to a timer requires all kinds of nasty cross-process communication. So I have a little bit that's in a web app, a little bit on the command line, another piece that's a custom GUI app, and none of the pieces ever talk to each other.</p>


<p>Things would be so much easier if I could run all these apps in a single process, modify them while they're running, and connect bits and pieces of them together on the fly.</p>

<p>The thing is, I don't have to sit around wishing for a development system like that, because it already exists. It's called <a href="http://squeak.org/">Squeak</a>.</p>

<p>I've resisted using squeak for basically the same two reasons I resisted rails: culture shock and the learning curve.</p>

<p>Squeak uses its own cartoony looking UI, has a completely alien concept of source code control (all the source code is inside the running squeak instance, rather than stored on separate files on disk), and is basically its own self-contained little world. Those are just a couple examples of culture shock.</p>

<p>By learning curve, I just mean that it's frustrating to have to look up every little concept, and then deal with the surprise when <em>they don't have a word for what you want to say</em> and you have to find a completely different way of expressing it. It really is like trying to express yourself a foreign language: you know exactly what you want to say, but you have to go word by word with the translating dictionary in hand, and even then you wind up with a jumbled <a href="http://en.wikipedia.org/wiki/Patois">patois</a> of the grammar from the language you know and the vocabulary from the language you're trying to speak.</p>

<p>Prior to rails (and maybe drupal on the previous project), I always enjoyed reading about new and esoteric programming languages, and even tinkering with toy examples, but when it comes time to make a new application, I'm generally tempted to stick with what I know best.</p>

<p>Having pushed through the culture shock and learning curves a couple times, now, though, I'm starting to see the error of my ways.</p>

<p>In fact, it can be sort of fun. Yesterday, for example, I found myself reaching for a familiar python idiom, ran into some minor ruby culture shock, and wound up learning a different way to think about the issue, and a slightly better concept of object-oriented design.</p>

<p>I won't go into too much detail, but my goal was to map a symbol to a member of an object, so if you gave it a <code>Person</code> object and a variable <code>field="name"</code>, it would return <code>person.name</code>. I python you say <code>getattr(instance, field)</code> but in ruby you say <code>instance.method(field).call</code>. There are like three or four huge conceptual differences highlighted in just those two lines of code, but in a sense it comes down to culture: in python, what's mine is yours, so you're free to take what you want, but in ruby you have to ask me nicely if I have what you want, then ask if you can borrow it, and then if I say yes, I give it to you in a little box and you have to take it out yourself.</p>

<p>Who knows? Maybe that reflects the difference between the Dutch approach to manners and the Japanese. :) </p>

<p>Squeak reflects more American ideas. It's a fast paced melting pot with a lot of innovative ideas, sometimes thrown together with duct tape. It gets the job done its own way and it doesn't care too much about appearances.</p>

<p>With most programming languages I feel a bit like a general organizing my troops and planning my attack. There's an overall strategy for where I'm going and many small tactical battles with the problem.</p>

<p>With squeak, even with the brief experience I've had with it, I feel more like a mad genius tinkering away on my latest invention in a workshop full of tools and gadgets. If I need a part, I can just cannibalize some other contraption, and if I need to hook two things together, then I've got all kinds of wires and duct tape to make that happen.</p>

<p>Or in other words, squeak jives well with my ADD.</p>

<p>Obviously, learning a new programming language or two isn't enough to turn my business around, but between rails and squeak, I really think I can remove some of the major constraints that were holding back the flow of ideas from    my brain to the marketplace.</p>

<p>If my gamble pays off, then I can finally start delivering on my huge backlog of half-baked website and software ideas. Even if none of them make any money on their own, they might at least direct enough attention my way to get my little hosting business back on its feet.</p>

<p>So... Here goes nothing!</p></div></content>
</entry>
<entry>
  <title>rails won</title>
  <id>http://withoutane.com/rants/2009/03/rails-won</id>
  <link href="http://withoutane.com/rants/2009/03/rails-won" rel="alternate"/>
  <updated>2009-03-20T06:04:48-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>My friend Zach has this old ASP site over at <a href="http://bodyblog.com">bodyblog.com</a>. Back in the day, it was a pretty active community of bodybuilders and regular people just getting in shape.</p>

<p>A couple months ago, I agreed to help him dust it off and get it working again, and since the code was pretty bad and ASP is a dead technology (replaced by ASP.net), I advised him to port it to a newer technology.</p>

<p>Then the question was, which one? I've been tinkering with my own little python web framework for years now, and while I'm proud of it, I couldn't in good conscience advise Zach to build his business around it.</p>

<p>If you're building a business you want something approaching an industry standard, because the more people working on and with a technology, the more developers you have available to hire, and the more tools they have to help them work faster.</p>

<p>Java and ASP.net were certainly viable options, but given my own areas of expertise, and the fact that I'd be doing most of the work, it came down to three choices:</p>

<ul>
 <li>drupal</li>
 <li>django</li>
 <li>rails</li>
</ul>

<p>Of the three, I had extensive experience with drupal, no experience with django (but over a decade of python experience) and only a vague familiarity with rails (having worked through a book a couple years ago and not touching it since)</p>

<p>It wasn't much of a contest.</p>

<p>Drupal is impressive, but it's a case of bright people making the best of a pretty clunky technology (PHP).</p>

<p>Django is... Well, it's written in python, lots of people seem to like it, and I can't think of one bad thing to say about it. Django is OK.</p>

<p>Rails, on the other hand... Rails sucks. In fact, rails sucks <em>hard</em>. The Railiens make a big fuss about favoring convention over configuration, and of course they picked the most bone-headed, moronic conventions imaginable, like coupling data objects to the database, using pluralized table names, and... and...</p>

<p>And none of those choices make the slightest bit of difference in the long run.</p>

<p>Rails is something people either love or hate with a passion. It has a personality. It's <em>opinionated software</em>, as they say, and it turns out that was a pretty brilliant marketing move.</p>

<p>A year or two when I worked through that rails book, the system I saw left me wondering "so what?" But what rails has going for it is a network effect. It drew in this core of very passionate users (especially corporate users) and they contributed their passion, and their resources, and it just kept growing.</p>

<p>We picked rails because it's reached its tipping point. The industry is behind it, there's a huge freelance developer population, and there's plenty of really great tool support.</p>

<p>Once I got past the culture shock and accepted that the conventions are just a matter of taste, and once I got past all the hassles of installing and configuring the dang thing (I finally gave up trying to get ruby talking to MySQL on my home windows box and just moved everything over to linux) I noticed that I was actually getting a hell of a lot done in not much time at all.</p>

<p>For the longest time, I held on to this idea that I could become some kind of tech leader. Some kind of Prometheus complex, maybe: part of me really wanted to be the one stealing fire from the gods and leading everyone into enlightenment.</p>

<p>But for the past few months... I dunno. I just don't care about that anymore. I don't feel like I have to leave my mark on the world. At least, not as a web framework developer.</p>

<p>So yeah. Long story short: rails won.</p></div></content>
</entry>
<entry>
  <title>arlo: generic combinators for python</title>
  <id>http://withoutane.com/rants/2008/12/arlo-generic-combinators-for-python</id>
  <link href="http://withoutane.com/rants/2008/12/arlo-generic-combinators-for-python" rel="alternate"/>
  <updated>2008-12-20T23:23:54-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><strong>python that looks like haskell:</strong></p>
<pre><code>from arlo import declare, _
exec declare(&#39;sig let Ord a where y xs x &#39;)
qsort = [
    sig. qsort == Ord.a &gt;&gt; [a] &gt;&gt; [a] ,
    let. qsort (  []     ) == [] ,
    let. qsort ( _[x:xs] ) == ( _.qsort.lesser + [x] + _.qsort.greater ,
                              where (
                                  _.lesser  == [ y | y &lt;&lt; xs , y &lt; x  ],
                                  _.greater == [ y | y &lt;&lt; xs , y &gt;= x ])) ]


</code></pre>


<p>The first line imports a function (<code>declare</code>) and an object (<code>_</code>). from the module <code>arlo</code>.</p>

<p>The second line calls <code>declare</code> to convert a string of identifiers into a string of python variable declarations, and then runs the generated code.</p>

<p>The remaining lines create a list of three objects, and assign it to a new variable called <code>qsort</code>.</p>

<p>The point of this program isn't to emulate haskell in python, or even to implement quicksort, but rather to demonstrate how <code>arlo</code> lets you hack the python syntax to express interesting ways.</p>


<p><strong>expressions that look like statements:</strong></p>
<pre><code>from arlo import declare, _
exec declare("CLASS YIELD RETURN SET DEF SELF INIT")
print repr(
CLASS. MyClass ( _.object ) [
    DEF. INIT (SELF, _.name ) [
        SET. SELF.name == _.name ],
    DEF. hello (SELF, _.name) [
        YIELD.  _("hello %s") % SELF.name ]])


</code></pre>


<p>The first two lines are the same as before,
except for the names being declared.</p>

<p>The rest of the program builds up a single object and then prints out a string representation of that object.
It looks like this (except scrunched together on one long line):
</p>

<pre><code>

_.CLASS.MyClass(_.object)[&#39;_.DEF.INIT(_.SELF,_.name)
[&#39;(_.SET.SELF.name == _.name)&#39;],_.DEF.hello(_.SELF,
_.name)["(_.YIELD._(_(&#39;hello %s&#39;)) % _.SELF.name)"]&#39;]


</code></pre>

<p>What's interesting is that if you loaded that output into a python string, evaluated it with python's <code>eval()</code> function, and then printed the resulting representation, you'd get that same output 
<em>again</em>.</p>

<p><strong>the reification rule:</strong></p>
<pre><code><em># for any arlo.Expr object s:</em>
assert repr(eval(s)) == s


</code></pre>

<p>In other words, <code>arlo</code> lets you create 
python expressions that model the syntax used to create them.</p>

<p>Why would you want to do this? Well, as you can see from the examples above, by stripping the meaning from the various python operators, you can create your own mini-languages on the fly, without needing to write your own parser.</p>

<p><strong>arlo at the prompt:</strong></p>

<p>You can also combine these expression objects directly at the python prompt, and switch back and forth between the expression language and pure python. For example, notice how python immediately evaluates 2 + 3 in the fourth line below, whereas the other addition operations get quoted into the expression object.</p>

<pre><code>
&gt;&gt;&gt; x = _.x
&gt;&gt;&gt; x
_.x
&gt;&gt;&gt; x + 1
(_.x + _(1))
&gt;&gt;&gt; x * ( 2 + 3 ) + 2
((_.x * _(<strong>5</strong>)) + _(2))
&gt;&gt;&gt; x.y() + _.z
(_.x.y() + _.z)

</code></pre>

<p>Another way of saying this is that <code>arlo</code> 
is a generic <a href="http://en.wikipedia.org/wiki/Combinatory_logic">combinator library</a> for building expressions.</p>

<p>Combinator libraries are common in functional
languages like haskell, but they're not exactly
new to python. For example,  <a href="http://pyparsing.wikispaces.com/">pyparsing</a> uses the approach to build parsers, while <a href="http://python.net/crew/mwh/nevowapi/nevow.stan.html">Stan</a> overrides method invocation (<code>x(y)</code>) and subscripting (<code>x[y]</code>) to provide a pure-python syntax for building XML documents,
and the <a href="http://www.sqlalchemy.org/docs/05/sqlexpression.html">SQLAlchemy expression language</a> uses the combinator concept for building SQL queries.</p>


<p>What <em>is</em> new (at least as far as I know) is
the idea of creating a generic combinator library for expressions.</p>

<p>We've already seen that calling <code>repr()</code> on
these objects produces the python syntax necessary to recreate them. But if you call <code>str()</code>, you get the equivalent python expression, which you can then pass to <code>eval()</code>:</p>

<p><strong>Sort of like a <code>lambda</code>:</strong></p>
<pre><code>&gt;&gt;&gt; y = _.m * _.x + _.b
&gt;&gt;&gt; y <em># repr()</em> 
((_.m * _.x) + _.b)
&gt;&gt;&gt; print y <em># str() </em>
((m * x) + b)
&gt;&gt;&gt; m, x, b = 1, 2, 3
&gt;&gt;&gt; eval(str(y))
5
&gt;&gt;&gt; x = 4
&gt;&gt;&gt; eval(str(y))
7

</code></pre>

<p>As you can see, you can use <code>arlo</code> and <code>eval()</code> as an alternative to defining named functions or using <code>lambda</code>.</p>

<p>About two years ago, I wrote a post called "<a href="http://withoutane.com/rants/2007/what-python-looks-like-naked">what python looks like naked</a>" that demonstrated how you could remove all of python's control structures from a program and replace them with functions and delaying every expression by wrapping it in a <code>lambda</code>.</p>

<p>If you can replace python's control structures, that
means you can create your <em>own</em> control structures. For example, you could use the technique to add a prolog-style inference engine to python. Then, in addition to simple propositional logic (<code>if</code>/<code>elif</code>/<code>else</code> and the boolean operators), your program could make choices based on logical deduction from a set of facts and rules.</p>

<p>Of course you can implement these things in python
already, or call foreign libraries, but it would be nice
to have these things as first-order objects in the language, and that's what a reification technique like wrapping everything in <code>lambda</code> gives you.</p>

<p>The only problem is, <code>lambda</code>fied python is an ugly, ugly mess.</p>

<p>The combinator appproach goes a long way to solving the syntax problem, and with <code>arlo</code>, python developers can now use a generic syntax for building combinator libraries.</p>

<p>Anyway, this is an idea I've been kicking around for a long time, and now that it's working, I'd love to hear what other folks have to say about it.</p>

<p><strong>try it out!</strong></p>
<p>(it's open source under a python-style license)</p>
<p>You can browse or download the code from the Trac links below:</p>
<ul>
<li><a href="https://secure.sabren.com/trac/workshop/browser/trunk/code/arlo.py">arlo</a></li>
<li><a href="https://secure.sabren.com/trac/workshop/browser/trunk/specs/arlo.spy">test cases</a></li>
</ul>

<p>You might also want to look at <a href="https://secure.sabren.com/trac/workshop/browser/trunk/code/wherewolf.py">wherewolf</a>, a simple language
for building expressions for matching against tables of data. Thee expressions can either be evaluated directly in python for querying against data in memory, or compiled down to SQL <code>WHERE</code> clauses (like a very tiny version of SQLAlchemy).</p>

</div></content>
</entry>
<entry>
  <title>flake affected</title>
  <id>http://withoutane.com/rants/2008/12/flake-affected</id>
  <link href="http://withoutane.com/rants/2008/12/flake-affected" rel="alternate"/>
  <updated>2008-12-11T19:56:00-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I&#39;ve been sick in bed with the flu all week. Last week I was in Texas with my family. Given past history, my world should basically be upside down right now.</p>

<p>I do have a larger-than-normal backlog of stuff to do right now, but I actually feel like I&#39;m on track. Once I was finally able to breathe and sit up this morning, I got to work, and I expect to be caught up completely within the next day or two.</p>

<p>That&#39;s a big change. In years past, the backlog (especially with email) would persist for days or even weeks.</p>

<h3>status of the book</h3>

<p>Forcing myself to sit down and write <em>The Flake Effect</em> last month was one of the smartest things I&#39;ve ever done. I didn&#39;t really come up with a book so much as a long, rambling journal focused on productivity. But I covered a lot of ground, and I verbalized, clarified, or outright solved a bunch of problems that had been holding me back for years.</p>

<p>It&#39;s going to be a <em>long</em> time before I have a second draft worthy of showing off to anyone, but I do want to share some of the key insights I gained, especially in the context of planning the next year.</p>

<p>First off, I hit the official nanowrimo wordcount in the first week. I thought I was aiming for 100,000 words but it turns out it was only 50,000. It&#39;s not really a novel. More like narrative nonfiction.</p>

<p>Second, part of the way I was attempting to handle &quot;characters&quot; was to talk about ideas with my friends in chat and upload the logs (I stripped out the repeating names from my wordcount totals). That was really the first time I tried to explain my ideas to my friends directly... At least in a long time, and when they weren&#39;t explicitly asking for help with something. It made for some interesting conversations and I think it helped me understand my friends a little better too.</p>

<h3>productivity insights</h3>

<p>Did I actually learn anything new about productivity and getting things done?</p>

<p>I feel like I did, but right now it&#39;s hard to explain concisely. I certainly compiled a bunch of techniques, like:</p>

<ul>
<li>solve problems at the mental / paradigm level before attempting to build a system (because it&#39;s much easier to change a belief than to build a software application or design a taxonomy)</li>
<li>use logical trees (the theory of constraints thinking processes) to determine what to change</li>
<li>achieve and maintain equilibrium or steady states of change (for example, through daily checklists) before taking on project -related tasks or fun time</li>
<li>use focused and TIME-limited bursts of attention to attack problems</li>
<li>optimize your down time, not your task time (because most of your wasted time/effort probably comes BETWEEN tasks - at least if you&#39;re like me)</li>
<li>harvest old ideas before creating new ones</li>
</ul>

<h3>attention is fractal</h3>

<p>I also am going to have quite a bit to say about attention management in general, especially with regards to the idea that <em>attention is fractal.</em></p>

<p>The fractal metaphor is only going to go so far, but there are a lot of parallels between the questions &quot;<em>how long is a coastline?</em>&quot; and &quot;<em>how much attention can you pay to something in an hour?</em>&quot; In both cases, the answer keeps increasing the closer you look.</p>

<p>In other words, attention isn&#39;t really measured in time directly but something like details per second, square-inch-seconds of brain activity, or maybe flops if you&#39;re talking about a cpu. We don&#39;t really have tools to measure it outside of MRI lab (though several portable consumer EEG machines are close to market, and they come a little closer), but the point is attention management and time management are two totally different things.</p>

<p>Also, you can&#39;t make more time but you can create more attention through the miracle of neuroplasticity.</p>

<p>But anyway... There&#39;ll probably be a whole chapter on that, so no point rewriting it here.</p>

<h3>deep problems vs wide problems</h3>

<p>The other major insight that came to me is the distinction between two types of problems. This kind of fits in with the fractal idea, though at the moment, the idea is still very fuzzy in my mind. In fact, it may not even be a distinction between problems but between problem solving methods.</p>

<p>When I say &quot;deep&quot; I&#39;m picturing a deep canyon that has been carved by millions of years of water flowing over the same course. An example would be mastering a specific skill like aikido or playing poker or painting a picture, or developing a framework to solve a particular programming problem. Or building a fully automated business.</p>

<p>Or for example, I sometimes make the distinction between writing to explain things to myself. It doesn&#39;t matter if I ramble and take 10 pages to get there because the only thing that matters is that the problem winds up solved in my own head. It&#39;s like casting a wide net and hoping to catch something good.</p>

<p>But if I want to explain the idea to someone in particular, I need to go back and harvest that idea. Rewriting it, simplifying the mental path for my audience and filling in the intuitive leaps.</p>

<p>Anyway, I&#39;m a whole lot better at the &quot;wide&quot; approach than at the &quot;deep&quot; approach. I wind up knowing a little bit about a lot of different things, but I don&#39;t have any real expertise.</p>

<p>That means I can look at a new problem from a bazillion different points of view, and come up with a solution rather quickly, but then I have trouble actually implementing a solution. (Which, when combined with a tendency to follow lots of little tangents means I wind up with a whole slew of unimplemented ideas - the very definition of the flake effect.)</p>

<p>Anyway, so I see now that I could benefit tremendously from working on the &quot;deep&quot; habits - daily practice, refinement, continuous improvement, etc.</p>

<h3>What are my plans for the book?</h3>

<p>Well, first of all, I want to put the ideas into practice in my own life. I&#39;ve made a start on that, but these are things that need to be habits, not just one-time exercises. </p>

<p>Since this is &quot;deep&quot; stuff and I suck at that, there will probably be a lot more to write along those lines. In fact, I may wind up writing enough for a second book before I figure out how to tame the first book.</p>

<p>But I do want to tame the book. Go back and refactor the ideas. Create an actual organizing structure. </p>

<p>And then what? I don&#39;t know. Blog about it. Maybe sell it as an ebook. Maybe work with some clients or start an online community so I&#39;m sure I have a system that works for other people too.</p>

<p>I feel like I&#39;ve got a complete idea now, and it could be a book as-is, but I don&#39;t really know if it&#39;s useful to anyone besides me, and I also don&#39;t know if it&#39;ll continue to be useful to me in the months ahead without further improvement. (I need to test it against a requisite variety of situations, as my friend Leslie might say.)</p>

<p>Anyway, my immediate goal is to use the tools I have now to get caught up on my various responsibilities, and then start working on some goals and plans for next year.</p>

</div></content>
</entry>
<entry>
  <title>writing the flake effect</title>
  <id>http://withoutane.com/rants/2008/11/writing-the-flake-effect</id>
  <link href="http://withoutane.com/rants/2008/11/writing-the-flake-effect" rel="alternate"/>
  <updated>2008-11-05T17:10:17-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Well, I'm finally doing it.</p>

<p>I didn't want to say anything because I didn't really know whether or not I'd I'd follow through, and I sort of felt guilty about spending time on this when there's so much else I'm supposed to be doing for other people.</p>

<p>But it turns out I am following through (in fact, I'm way ahead of the already aggressive schedule I set for myself)...</p>

<p>And also, it's helping me sort through the problems that have kept me from delivering for my clients, customers, and even myself.</p>

<p>Long story short: I signed up for <a href="http://nanowrimo.org">NaNoWriMo</a>, and I'm finally writing <em>The Flake Effect</em> - the book about getting things done that I promised myself I'd write some day, whenever I figured out how to get things done.</p>

<p>Since I don't really know how to get things done (despite reading countless books and struggling with the problem for years), that's the central conflict of the book. It's about problem solving, bootstrapping, neuro-linguistic programming, creativity, the theory of constraints, running a business, and basically all the stuff I normally write about anyway. :)</p>

<p>I posted the rough first chapter. It's 10,000 words and full of my usual rambling. It doesn't really fit with the rest of what I've written, and I'm not planning on posting any more text until it's done, but you can read it and my little status blog on the writing effort over at <a href="http://flakeeffect.com">flakeeffect.com</a>.</p>
</div></content>
</entry>
<entry>
  <title>stereostenanography</title>
  <id>http://withoutane.com/rants/2008/09/stereostenanography</id>
  <link href="http://withoutane.com/rants/2008/09/stereostenanography" rel="alternate"/>
  <updated>2008-09-25T22:26:51-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><img src="/media/2008/09/stereostenanography.png" alt="stereostenanography" title="stereostenanography" width="550" height="214" />

<blockquote>
<p>"There's way too much information to decode the Matrix.
You get used to it, though. Your brain does the translating. I don't even see the code. All I see is blonde, brunette, redhead. Hey uh, you want a drink?"</p>
<cite>--Cipher</cite>
</blockquote>

<p>This is the kind of thing my brain comes
up with when I forget to take my vyvanse.</p>
</div></content>
</entry>
<entry>
  <title>cheerfully</title>
  <id>http://withoutane.com/rants/2008/09/cheerfully</id>
  <link href="http://withoutane.com/rants/2008/09/cheerfully" rel="alternate"/>
  <updated>2008-09-19T00:31:56-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><blockquote><strong><em>I will live each day cheerfully and with a sense of adventure...</em></strong></blockquote>

<p>Thus begins my <a href="/mission/">personal mission statement</a> - the document designed to guide my every decision.</p>

<p>And yet... I have to admit I have not been very cheerful lately.</p>

<p>If you (like me) [ <a href="http://dougobrien.blogspot.com/2008/07/embedded-commands.html">heh heh heh</a> ] need a reminder of what it means to be cheerful, please direct your attention to the following lecture by rock star and particle physicist, <a href="http://en.wikipedia.org/wiki/Brian_Cox_(physicist)">Dr. Brian Cox</a>:</p>

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="432" height="285" id="VE_Player" align="middle">
  <param name="movie" value="http://static.videoegg.com/ted2/flash/loader.swf"/>
  <PARAM NAME="FlashVars" VALUE="bgColor=FFFFFF&amp;file=http://static.videoegg.com/ted/movies/BrianCox_2008_high.flv&amp;autoPlay=false&amp;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&amp;forcePlay=false&amp;logo=&amp;allowFullscreen=true"/>
  <param name="quality" value="high"/>
  <param name="allowScriptAccess" value="always"/>
  <param name="bgcolor" value="#FFFFFF"/>
  <param name="scale" value="noscale"/>
  <param name="wmode" value="window"/>
  <embed src="http://static.videoegg.com/ted2/flash/loader.swf" FlashVars="bgColor=FFFFFF&amp;file=http://static.videoegg.com/ted/movies/BrianCox_2008_high.flv&amp;autoPlay=false&amp;fullscreenURL=http://static.videoegg.com/ted/flash/fullscreen.html&amp;forcePlay=false&amp;logo=&amp;allowFullscreen=true" quality="high" allowScriptAccess="always" bgcolor="#FFFFFF" scale="noscale" wmode="window" width="432" height="285" name="VE_Player" align="middle" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/>
</object>
</div></content>
</entry>
<entry>
  <title>work without end</title>
  <id>http://withoutane.com/rants/2008/09/work-without-end</id>
  <link href="http://withoutane.com/rants/2008/09/work-without-end" rel="alternate"/>
  <updated>2008-09-18T22:36:41-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I'm just rambling here. You can tell by the way there's no little hand drawn picture on this post.</p>

<p>Which is actually funny, because what I'm rambling about is Quality, which is largely a byproduct of having a Process (love the capital letters) and the real gist of this post is that by sticking to your Process your quality goes up and your headaches go down.</p>

<p>So I've been doing client work, and part of what I'm doing is trying to help fix the broken development process in an otherwise awesome company.</p>

<p>I've been working <em>long</em> hours. I have the dark circles under my eyes. It's 10:47pm right now and there's stuff I ought to be doing for the morning and it's probably not going to get done.</p>

<p>Basically, a product got launched before there was any e-commerce software to back it up. The shopping cart wasn't finished.  The code to talk to the fulfillment center hadn't been written. There were no automated tests to be found. I spent several hours the first night manually diffing and merging files into a new CVS repository because there were multiple people working on the site and they didn't even have version control set up.</p>

<p>No... Actually it was worse than that. The company has a version control system but the developers in charge <em>refused to use it</em>.</p>

<p>Anyway, I've been doing a lot of inter-department diplomacy the past couple weeks. Everything's in
subversion now, but we're still putting out fires on a daily basis.</p>

<p>I found out today I started one of those fires. I rushed some code out the door because we were in <em>such</em> a hurry and it had to be done <em>right now</em> and so I wrote this really fancy SQL query.</p>

<p>The first time it came back, I found out it was grouped wrong, so I fixed that. Only it was a quick fix because I was overwhelmed with all the other fire-fighting work.</p>

<p>That was a week ago. Today it comes back again, after people have <em>acted</em> on the data, and it turns out there was a massive bug in my SQL:</p>

<pre>select if(some_string, use_this, else_this) ...</pre>

<p>Do you see the bug? I sure didn't. And I read the <a href="http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if">if() docs</a> right before I wrote the query.</p>

<p>Turns out that strings are evaluated as false, regardless of their content. (In python and many other languages, the empty string "" is false and all other strings are true)... So basically the "use_this" value never got used.</p>

<p>I'm not ashamed of that mistake. The dang query <em>still</em> looks right to me.</p>

<p>But I <em>am</em> ashamed that I let myself get caught up in the frenzy and shipped mission-critical code with only a cursory visual inspection.</p>

<p>All along, I've been thinking: <em>Let's just get through this launch, and then we can start doing things right.</em></p>

<p>But after today?</p>

<p>After today, I'm honestly worried that these problems are just going to keep on going. We're so busy fighting fires that we're not doing anything to prevent new ones.</p>

<p>Hell, I'm already worried about the <em>next</em> launch slipping. Everyone seems to think we have plenty of time. But I think we're three weeks late unless we make some massive changes <em>NOW</em>, and this is a project we haven't even started yet.</p>

<p>What's really funny is that on everything else - like the ability to change processes and fix communications problems - I've been scoffed at for being overly optimistic. :)</p>

<p>Anyway, I made the decision today that this has to end. From now on, we write unit tests for <em>every</em> line of production code we create.</p>

<p>That is absolutely the right decision.</p>

<p>And yet I felt like a complete jerk today, telling the guy that just worked overtime 4 days in a row on a poorly spec'd app we absolutely had to have <em>right now</em> that no, we can't ship this after all until we go back and build unit tests.</p>

<p>So this is management, huh?</p>

<p>Actually, I'm having fun.</p>

<p>It's stressful and time consuming, but everyone's been remarkably understanding that it's the process at fault, not individual people. It really is a neat company.</p>

<p>Anyway, I just needed to vent here... I guess I cheered myself up. Optimism comes in handy sometimes. :)</p>

<p>Back to work.</p></div></content>
</entry>
<entry>
  <title>Your Documentation Sucks</title>
  <id>http://withoutane.com/rants/2008/09/your-documentation-sucks</id>
  <link href="http://withoutane.com/rants/2008/09/your-documentation-sucks" rel="alternate"/>
  <updated>2008-09-14T20:38:55-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Guys, I'm really trying.</p>

<p>Yeah, I know you've already solved my problem.</p>

<p>Yeah, I know it's more work to write my own code than
to use yours.</p>

<p>But the thing is... <strong>Your documentation sucks.</strong></p>

<p>It may be more work to write my own code, but it's 
<strong>far less frustrating</strong> than reading your docs.</p>

<p>Let's name some names here.</p>

<p>Hey Glyph Lefkowitz! The <a href="http://twistedmatrix.com/projects/core/documentation/howto/index.html">twisted documentation</a> sucks!</p>

<p>Hey Ian Bicking! The <a href="http://pythonpaste.org/">paste documentation</a> sucks!</p>

<p>Hey Richard Jones! The <a href="http://roundup.sourceforge.net/doc-1.0/index.html">roundup documentation</a> sucks!</p>

<p>Hey Phil Eby! <del>I honestly don't know whether</del> The <a href="http://peak.telecommunity.com/DevCenter/EasyInstall">EasyInstall documentation</a> <del>sucks or not because I've usually given up by the time the page loads.</del> <ins>is pretty darn good</ins>. But your page load time sucks!</p>

<p>Hey Armin Rigo! The <a href="http://codespeak.net/pypy/dist/pypy/doc/index.html">PyPy documentation</a> sucks!</p>

<p>Hey Kay Schluehr! The <a href="http://www.fiber-space.de/EasyExtend/doc/main/EasyExtend_Main.html">EasyExtend documentation</a> sucks!</p>

<p>You guys are responsible for some of the <strong>coolest, smartest python projects out there</strong>. I'm sure they're all worth the learning
curve... If only I had time to decipher your documentation.</p>

<p>I'm not unreasonable. I ditched the home-grown template system that I used for years in favor of <a href="http://genshi.edgewall.org/">genshi</a>. Genshi solved my problems, and it's got fantastic documentation.</p>

<p>In fact, other than PyPy and EasyExtend, I use all the above tools in my company - some of it on a daily basis.</p>

<p>But the simplest, one-line tasks take me hours and hours to accomplish (or just don't get done) because I can't understand your documentation.</p>

<p>I would be happy to sponsor a rewrite. You're wasting my time and costing me money so a rewrite would almost certainly have a positive ROI. Heck, I'd be happy to rewrite the docs myself.</p>

<p>The only problem is... I don't know enough about your apps to explain it to anyone, and I don't know how to obtain that knowledge.</p>

<p>Can you guess why?</p>

<p>It's because your documentation sucks. :/</p>
</div></content>
</entry>
<entry>
  <title>APB Relaunch</title>
  <id>http://withoutane.com/rants/2008/09/apb-relaunch</id>
  <link href="http://withoutane.com/rants/2008/09/apb-relaunch" rel="alternate"/>
  <updated>2008-09-02T13:25:39-05:00</updated>
  <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Here's a screenshot of the client site I've been working on:</p>

<a href="http://www.apbspeakers.com/"><img src="/media/2008/09/apb-relaunch.png" alt="screenshot: www.apbspeakers.com" style="border:none"
title="screenshot: www.apbspeakers.com" width="550" height="569" /></a>

<p>The site is <a href="http://www.apbspeakers.com/">American Program Bureau</a>. They manage the speaking engagements for lots of big name celebrities. So if you want Dan Rather or Alan Alda to drop by your next meeting, they're the guys to call.</p>

<p>I wish I could take credit for the design, but I didn't have much to do with that. I built the drupal backend, cleaned up and extended some actionscript for the various flash widgets, and got their old data into the system.</p>

<p>Anyway, we just brought it live, so I figured I'd share. :)</p></div></content>
</entry>
</feed>


