<?xml version="1.0" encoding="UTF-8"?><feed
  xmlns="http://www.w3.org/2005/Atom"
  xmlns:thr="http://purl.org/syndication/thread/1.0"
  xml:lang="en"
  xml:base="http://undefined.com/ia/wp-atom.php"
   >
	<title type="text">Indefinite Articles</title>
	<subtitle type="text">Agile &#38; Open Source Software, Economics, Liberty and Entrepreneurship</subtitle>

	<updated>2008-08-12T15:37:02Z</updated>
	<generator uri="http://wordpress.org/" version="2.5.1">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://undefined.com/ia" />
	<id>http://undefined.com/ia/feed/atom/</id>
	<link rel="self" type="application/atom+xml" href="http://www.undefined.com/ia/index.php?feed=atom" />

			<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Wordpress exploits]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/08/12/wordpress-exploits/" />
		<id>http://undefined.com/ia/?p=386</id>
		<updated>2008-08-12T15:37:02Z</updated>
		<published>2008-08-12T15:37:00Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" />		<summary type="html"><![CDATA[Back in June, someone hacked this site, and added a malware iframe.   
I cleaned it up, upgraded Wordpress, and went on with my life, assuming that someone had just exploited a post.
Well, it was hacked again, the same way.  Since I had upgraded Wordpress, I was more suspicious, and I delved into [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/08/12/wordpress-exploits/"><![CDATA[<p>Back in June, someone hacked this site, and added a malware iframe.   </p>
<p>I cleaned it up, upgraded Wordpress, and went on with my life, assuming that someone had just exploited a post.</p>
<p>Well, it was hacked again, the same way.  Since I had upgraded Wordpress, I was more suspicious, and I delved into my website setup.  </p>
<p>When I went to the User tab, I saw this:</p>
<p><strong>Administrators(2)</strong></p>
<p>(And I expected to only see one)  But when I went to the adminstrators tab, I saw this:</p>
<p><strong>Administrators(1)</strong></p>
<p>hmmm.  That&#8217;s suspicious.  I looked at the page source, and sure enough, there were two entries, but the second one was buried in a morass of javascript and styles.   <em>Egads</em> - someone has not only gained administrative access to my blog, but they have effectively prevented me from removing them via the website.</p>
<p>Luckily for me, I know enough about SQL to be dangerous, so I went into PhpMyAdmin and deleted all the other users except me.   This worked because the only users were random bogus registrations trying to get around my spam filters.   </p>
<p>I&#8217;ve since turned off new registrations, and I suggest everyone else do the following:</p>
<p>1. Check on your users - see if you have more administrators than you expect, and if so, delete them with extreme prejudice.<br />
2. turn off new user registration</p>
<p>Bleah</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/08/12/wordpress-exploits/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/08/12/wordpress-exploits/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Rails to Grails : Database Integration, Part II]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-ii/" />
		<id>http://undefined.com/ia/?p=385</id>
		<updated>2008-08-08T16:26:21Z</updated>
		<published>2008-08-08T16:26:21Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" />		<summary type="html"><![CDATA[I spent most of the last post talking about magic, but what I intended to talk about is the regular occurrence of the database getting out of sync with the domain objects in Grails.
In theory, based on using the Update directive in the database configuration, my database should be updated to match the domain objects. [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-ii/"><![CDATA[<p>I spent most of the last post talking about <a href="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-1/">magic</a>, but what I intended to talk about is the regular occurrence of the database getting out of sync with the domain objects in Grails.</p>
<p>In theory, based on using the Update directive in the database configuration, my database should be updated to match the domain objects.   In my experience, however, Grails regularly fails to properly upgrade the database, and I&#8217;m forced to delete the whole thing in order to get the system sane again.  This doesn&#8217;t happen all the time - generally only when I need to create a new relationship between tables or apply a new constraint (for example, allowing a column/field to be null).</p>
<p>Luckily, since I&#8217;m using Hypersonic SQL, this is straightforward.  Shut down your grails app, and from your grails project top-level directory:</p>
<pre>
cd db
rm devDb.*      # or whatever the name of your database is
</pre>
<p>Then restart grails.  It will regenerate the database (without data) with the latest constraints and structures you&#8217;ve made.   You&#8217;ll need to repopulate, but there are tools for that.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-ii/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-ii/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Rails To Grails: Database Integration (Part 1)]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-1/" />
		<id>http://undefined.com/ia/?p=384</id>
		<updated>2008-08-08T16:21:26Z</updated>
		<published>2008-08-08T16:21:26Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" />		<summary type="html"><![CDATA[In Rails, your domain model objects derive their structure and content from the database layout.  In Grails, however, the database tables are created based on the fields and directives embedded in your .groovy files.
Of the two mechanisms, I find Grails&#8217; approach to be more sensible for greenfield applications (i.e. no legacy database), and for [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-1/"><![CDATA[<p>In Rails, your domain model objects derive their structure and content from the database layout.  In Grails, however, the database tables are created based on the fields and directives embedded in your .groovy files.</p>
<p>Of the two mechanisms, I find Grails&#8217; approach to be more sensible for greenfield applications (i.e. no legacy database), and for legacy applications, it&#8217;s probably a wash, unless the database is already named in a Rails-friendly way.</p>
<p>I like the Grails approach because it does not violate the &#8216;Do No Magic&#8217; directive.<br />
<em>What, pray tell, is the &#8216;Do No Magic&#8217; directive?</em></p>
<p>Good question!  Let&#8217;s consider a software thought experiment.  You&#8217;re a novice programmer, and you&#8217;re assigned to work on an existing project.  You understand the basics of software development, logging, etc, but you&#8217;re not an expert.</p>
<p>Your first job is to fix a bug.  You have access to the source code, you know generally where the bug is, and you have log files that show the bug in action.</p>
<p>So you look at the source, and then look at the log files.  Let&#8217;s say your source looks like this</p>
<pre>    log.debug "About to do Step A"
    step_a()
    log.debug "Completed Step A"
    log.debug "Program Finished
</pre>
<p>And inside step_a() you see:</p>
<pre>    def step_a() {
        log.debug "Starting Step A"
        // biz logic
        log.debug "Completing Step A"
</pre>
<p>But when you look at the log file, you see this:</p>
<pre>1000 : About to do Step A
1001 : Completed Step A
1002 : Program Finished
1003 : Launching Thread
1005 : Activating Queue
1006 : ... other stuff...
</pre>
<p><em>How is this possible?</em> Some of you may ask.  My answer is - in this case - Aspects - which &#8216;intercepted&#8217; step_a() and did something else instead.</p>
<p>But at no point in the code do you see the possibility of said interception.    You have to know ahead of time that Aspects are running, in order to understand this code.  To the uninitiated, this code is magic.</p>
<p>Rails has a similar problem - you have to look at the correct table in the database to discover how the domain objects are structured.    Again, to those who don&#8217;t know that Rails derives models from database columns, this is magic</p>
<p>Let&#8217;s not even speak of <a href="http://en.wikipedia.org/wiki/Monkey_patch" target="_blank">monkeypatching</a>, which might more properly be called duck punching.</p>
<p><strong>Hold Your Flamethrowers</strong></p>
<p>To be clear: the use of database for domain objects in Rails is a relatively benign form of magic - it isn&#8217;t nearly as bad as aspect-injected  asynchronous thread launching and other such mischief.   But it is still more magical than Grails.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-1/#comments" thr:count="1"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/08/08/rails-to-grails-database-integration-part-1/feed/atom/" thr:count="1"/>
		<thr:total>1</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Rails to Grails: Compilation]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/08/08/rails-to-grails-compilation/" />
		<id>http://undefined.com/ia/?p=383</id>
		<updated>2008-08-08T16:06:03Z</updated>
		<published>2008-08-08T16:06:03Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" />		<summary type="html"><![CDATA[One of the interesting things I&#8217;ve had to work with on my Grails project is compilation.  Occasionally, I&#8217;ll get a .groovy file that seems to put Grails into an endless &#8216;compile-load-restart&#8217; loop.   To discover which file is the culprit, I physically stop the server after the compilation, but before the restart, and then go into [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/08/08/rails-to-grails-compilation/"><![CDATA[<p>One of the interesting things I&#8217;ve had to work with on my Grails project is compilation.  Occasionally, I&#8217;ll get a .groovy file that seems to put Grails into an endless &#8216;compile-load-restart&#8217; loop.   To discover which file is the culprit, I physically stop the server after the compilation, but before the restart, and then go into $HOME/.grails/&lt;VERSION&gt;/&lt;Project_Name&gt;/classes/  and look to see which file was most recently compiled.</p>
<p>This tells me a little about what&#8217;s going on, and I was able to remove the .groovy file in this case to stop the endless restarting.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/08/08/rails-to-grails-compilation/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/08/08/rails-to-grails-compilation/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Rails To Grails Tips - Closures and Models]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/07/29/rails-to-grails-tips-closures-and-models/" />
		<id>http://undefined.com/ia/?p=382</id>
		<updated>2008-07-29T23:59:14Z</updated>
		<published>2008-07-29T23:59:08Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" /><category scheme="http://undefined.com/ia" term="Groovy" /><category scheme="http://undefined.com/ia" term="Programming" /><category scheme="http://undefined.com/ia" term="Ruby On Rails" />		<summary type="html"><![CDATA[One frustrating thing I&#8217;ve discovered with Grails is the way data is sent to the view pages.
In Rails, it looks a little like this:


@scenario = Secenario.new
@scenario.title = "New Scenario"
@scenario.description = "Add A Description Here"

render :view => 'create'


This snippet creates a new Scenario object, populates it, and tells Rails to render the create.rhtml file, with the [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/07/29/rails-to-grails-tips-closures-and-models/"><![CDATA[<p>One frustrating thing I&#8217;ve discovered with Grails is the way data is sent to the view pages.</p>
<p>In Rails, it looks a little like this:</p>
<p><code></p>
<pre>
@scenario = Secenario.new
@scenario.title = "New Scenario"
@scenario.description = "Add A Description Here"

render :view => 'create'
</pre>
<p></code></p>
<p>This snippet creates a new Scenario object, populates it, and tells Rails to render the create.rhtml file, with the <tt>@scenario</tt> object in the page&#8217;s model, helpfully known as <tt>@scenario</tt></p>
<p>In Grails, it looks like this:</p>
<p><code></p>
<pre>
def scenario = new Scenario()
scenario.title = "New Scenario"
scenario.description = "Add A Description Here"

render( view: create, model: [ scenario: scenario ])
</pre>
<p></code></p>
<p>and, similarly, Grails knows to render the create.gsp file, and the <tt>scenario</tt> object is available to the page as <tt>scenario</tt></p>
<p>Which isn&#8217;t terribly different, and fairly easy to use.  </p>
<p>The problem comes in because of the way Grails uses closures to provide the action methods on the controllers (edit, create, delete, save, etc). </p>
<p>In Grails, you might have a action method as such:<br />
<code></p>
<pre>
def create = {  // closure of action method here }
</pre>
<p></code></p>
<p>Now, look at the previous Grails code.  Do you see the issue?  Yes - <em>create</em> is now overloaded, and in some cases, Grails will attempt to find a page named Controller_closure_blah_blah_blah.jsp, which is obviously completely wrong.</p>
<p>The fix is simple:</p>
<pre>render( view: 'create', model: [ scenario: scenario ]) </pre>
<p>Basically, make sure you always use quotes for your string values, even though the Groovy language allows you to leave the quotes off.  Otherwise, you&#8217;ll occasionally get frustrating and confusing results.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/07/29/rails-to-grails-tips-closures-and-models/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/07/29/rails-to-grails-tips-closures-and-models/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Rails to Grails Tips - GSP tags and Array Primitives]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/07/24/rails-to-grails-tips-gsp-tags-and-array-primitives/" />
		<id>http://undefined.com/ia/?p=381</id>
		<updated>2008-07-24T16:34:10Z</updated>
		<published>2008-07-24T16:30:47Z</published>
		<category scheme="http://undefined.com/ia" term="Groovy" /><category scheme="http://undefined.com/ia" term="Programming" /><category scheme="http://undefined.com/ia" term="Ruby On Rails" />		<summary type="html"><![CDATA[Interesting issue that left me scratching my head this morning&#8230;
using gsp tags, you can iterate over arrays:


   &#60;g:each in="${myarray}"&#62;
      &#60;p&#62;${it.title}&#60;/p&#62;
   &#60;/g:each&#62;


but if you do something slightly more clever:


   &#60;g:each in="${myarray}"&#62;
      &#60;p&#62;&#60;g:link action='myaction' id='${it.id}'&#62;${it.title}&#60;/g:link&#62;&#60;/p&#62;
   &#60;/g:each&#62;


You&#8217;ll get null pointer [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/07/24/rails-to-grails-tips-gsp-tags-and-array-primitives/"><![CDATA[<p>Interesting issue that left me scratching my head this morning&#8230;</p>
<p>using gsp tags, you can iterate over arrays:</p>
<p><code></p>
<pre>
   &lt;g:each in="${myarray}"&gt;
      &lt;p&gt;${it.title}&lt;/p&gt;
   &lt;/g:each&gt;
</pre>
<p></code></p>
<p>but if you do something slightly more clever:<br />
<code></p>
<pre>
   &lt;g:each in="${myarray}"&gt;
      &lt;p&gt;&lt;g:link action='myaction' id='${it.id}'&gt;${it.title}&lt;/g:link&gt;&lt;/p&gt;
   &lt;/g:each&gt;
</pre>
<p></code></p>
<p>You&#8217;ll get null pointer exceptions.</p>
<h2>Why?</h2>
<p>Because the <tt>&lt;g:link&gt;</tt> tag creates its own instance of the special variable <em>it</em> inside its own &#8216;domain&#8217;.   </p>
<h2>Fix</h2>
<p>add the parameter <tt>var=&#8217;myvar&#8217;</tt> to the &lt;g:each&#8221;&gt; tag: <tt>&lt;g:each in=&#8221;${myarray}&#8221; var=&#8221;myvar&#8221;&gt;</tt>.   Then, use ${myvar.id} and ${myvar.title} in your code:</p>
<p><code></p>
<pre>
   &lt;g:each in="${myarray}" var="myvar"&gt;
      &lt;p&gt;&lt;g:link action='myaction' id='${myvar.id}'&gt;${myvar.title}&lt;/g:link&gt;&lt;/p&gt;
   &lt;/g:each&gt;
</pre>
<p></code></p>
<p>And everything should work again.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/07/24/rails-to-grails-tips-gsp-tags-and-array-primitives/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/07/24/rails-to-grails-tips-gsp-tags-and-array-primitives/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Rails to Grails Tips - Flash Messages/Errors]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/07/23/rails-to-grails-tips-flash-messageserrors/" />
		<id>http://undefined.com/ia/?p=380</id>
		<updated>2008-08-12T14:35:57Z</updated>
		<published>2008-07-23T20:40:39Z</published>
		<category scheme="http://undefined.com/ia" term="Groovy" /><category scheme="http://undefined.com/ia" term="Programming" /><category scheme="http://undefined.com/ia" term="Ruby On Rails" />		<summary type="html"><![CDATA[If you&#8217;ve used Rails, you&#8217;re familiar with the flash, and all the nifty things you can do with it.
In Grails, you have flash, but you also have an entire tag library of &#60;g:hasError&#62;, &#60;g:renderErrors&#62; and so forth.  None of which, as far as I can tell, care one whit about the flash. They&#8217;re all [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/07/23/rails-to-grails-tips-flash-messageserrors/"><![CDATA[<p>If you&#8217;ve used Rails, you&#8217;re familiar with the <em>flash</em>, and all the <a href="http://rubypond.com/articles/2008/07/11/useful-flash-messages-in-rails/">nifty things you can do with it</a>.</p>
<p>In Grails, you have <em>flash</em>, but you also have an entire tag library of &lt;g:hasError&gt;, &lt;g:renderErrors&gt; and so forth.  None of which, as far as I can tell, care one whit about the flash. They&#8217;re all focused on domain objects, and the errors associated with processing them.</p>
<p>(In my opinion, this is one of the frustrations of Grails examples - the tendency to get the domain connected to the view via scaffolding, and then the author changes the subject)</p>
<p>But you can use the <em>flash</em>, in much the same way as Rails.  For example, I put the following in my top-level layout template:</p>
<pre>
<code>
              &lt;g:if test="${flash.error}"&gt;
                 &lt;div class="errorbox"&gt;
                    ${flash.error}
                 &lt;/div&gt;
              &lt;/g:if&gt;

              &lt;g:if test="${flash.message}"&gt;
                 &lt;div class="messagebox"&gt;
                    ${flash.message}
                 &lt;/div&gt;
              &lt;/g:if&gt;
</code>
</pre>
<p>(note that you&#8217;ll have to define the messagebox and errorbox css classes)</p>
<p>Putting information into the flash is straightforward:</p>
<pre>
<code>
     flash.error = "Your error message here."
</code>
</pre>
<p>Hope this helps!</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/07/23/rails-to-grails-tips-flash-messageserrors/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/07/23/rails-to-grails-tips-flash-messageserrors/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[lolcats]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/07/23/lolcats/" />
		<id>http://undefined.com/ia/?p=379</id>
		<updated>2008-07-23T18:41:08Z</updated>
		<published>2008-07-23T18:41:00Z</published>
		<category scheme="http://undefined.com/ia" term="Fun" />		<summary type="html"><![CDATA[Can&#8217;t resist

]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/07/23/lolcats/"><![CDATA[<p>Can&#8217;t resist<br />
<img src="http://undefined.com/ia/wp-content/uploads/2008/07/catshrubbery.jpg" alt="catshrubbery.jpg" border="0" width="290" height="230" /></p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/07/23/lolcats/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/07/23/lolcats/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/07/21/377/" />
		<id>http://undefined.com/ia/2008/07/21/377/</id>
		<updated>2008-07-21T18:09:36Z</updated>
		<published>2008-07-21T18:09:36Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" />		<summary type="html"><![CDATA[Clif Bar Triathlon Start Commercial
Heheheh
]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/07/21/377/"><![CDATA[<p><b>Clif Bar Triathlon Start Commercial</b><br />
<object width="425" height="350"><param name="movie" value="http://youtube.com/v/r3S0wu4Zbfk"></param><embed src="http://youtube.com/v/r3S0wu4Zbfk" type="application/x-shockwave-flash" width="425" height="350"></embed></object><br />Heheheh</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/07/21/377/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/07/21/377/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Interesting]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/07/07/interesting/" />
		<id>http://undefined.com/ia/?p=376</id>
		<updated>2008-07-07T16:27:47Z</updated>
		<published>2008-07-07T16:27:47Z</published>
		<category scheme="http://undefined.com/ia" term="Technology" />		<summary type="html"><![CDATA[My site was &#8220;partially&#8221; down for a week or two, because someone hacked a malware iframe into one of my posts, and Google flagged it.  This cascaded into Firefox 3 refusing to let me visit my site (bleh).  I was able to find the post, remove the offending iframe (and upgrade to the latest version [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/07/07/interesting/"><![CDATA[<p>My site was &#8220;partially&#8221; down for a week or two, because someone hacked a malware iframe into one of my posts, and Google flagged it.  This cascaded into Firefox 3 refusing to let me visit my site (bleh).  I was able to find the post, remove the offending iframe (and upgrade to the latest version of WordPress).</p>
<p>Still, more than a little frustrating to discover accidentally that my website was blocked.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/07/07/interesting/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/07/07/interesting/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[New Heights in self-ass-kickery]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/06/11/new-heights-in-self-ass-kickery/" />
		<id>http://undefined.com/ia/2008/06/11/new-heights-in-self-ass-kickery/</id>
		<updated>2008-06-11T15:30:49Z</updated>
		<published>2008-06-11T15:29:17Z</published>
		<category scheme="http://undefined.com/ia" term="Fun" />		<summary type="html"><![CDATA[8.3 miles running yesterday  (1 hour, 40 minutes)
35.3 miles biking today (2 hours)
Yeah, I know I&#8217;m slow compared to all you uber athletes out there.    I&#8217;m just working with what I have    
]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/06/11/new-heights-in-self-ass-kickery/"><![CDATA[<p>8.3 miles running yesterday  (1 hour, 40 minutes)<br />
35.3 miles biking today (2 hours)</p>
<p>Yeah, I know I&#8217;m slow compared to all you uber athletes out there.    I&#8217;m just working with what I have <img src='http://undefined.com/ia/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   </p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/06/11/new-heights-in-self-ass-kickery/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/06/11/new-heights-in-self-ass-kickery/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Estimation]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/05/29/estimation/" />
		<id>http://undefined.com/ia/2008/05/29/estimation/</id>
		<updated>2008-05-29T18:08:34Z</updated>
		<published>2008-05-29T18:08:32Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" />		<summary type="html"><![CDATA[An interesting comment on estimation:

   1.  Nobody ever does it. In fact, I donâ€™t even know of a process to achieve this. Hollering at people who over/under estimate is not an improvement process.
   2. It assumes you can make developer estimates better. More experienced developers estimate better, that Iâ€™ll take [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/05/29/estimation/"><![CDATA[<p>An interesting <a href="http://agileprogrammer.com/geeknoise/archive/2008/05/29/24360.aspx">comment on estimation</a>:</p>
<blockquote><p>
   1.  Nobody ever does it. In fact, I donâ€™t even know of a process to achieve this. Hollering at people who over/under estimate is not an improvement process.<br />
   2. It assumes you can make developer estimates better. More experienced developers estimate better, that Iâ€™ll take as a given, but can you accelerate this with novice/junior developers or testers?&#8230;<br />
   3. Software is NOT like mechanical engineering. It is a craft. &#8230; So our inability to accurately and precisely estimate shouldnâ€™t be all that surprising.
</p></blockquote>
<p>Personally, I believe that these claims are false.  </p>
<ol>
<li>People estimate all the time - Velocity based on complexity, jellybeans, gummy bears and ideal hours are all fairly rigorous forms of estimation, when they&#8217;re done consistently.</li>
<li>There is plenty of evidence that mechanisms such as the <a href="http://en.wikipedia.org/wiki/Delphi_method">Delphi Method</a> do, in fact, make the general estimate far better, even when you include a mix of junior and senior developers.  I use this extensively, and it has never done me harm yet.   When you have five smart people discussing how hard a particular task is, you find out the different perspectives quite quickly.
<li>While I agree that software is a craft of creativity, no one (that I know of) thinks that estimates have to be train-schedule accurate and/or precise.  When I wear my project manager hat, I just want a general feel about how many tasks will fit into my two week iterations.  </li>
</ol>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/05/29/estimation/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/05/29/estimation/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[The Spam&#8230; It burns!]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/05/29/the-spam-it-burns/" />
		<id>http://undefined.com/ia/2008/05/29/the-spam-it-burns/</id>
		<updated>2008-05-29T17:55:08Z</updated>
		<published>2008-05-29T17:55:06Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" />		<summary type="html"><![CDATA[Insightful commentary on the future of spam.
He (or She) is right - Spam-management is likely to be one of the critical priorities for the future, before the entire Internet crumbles under the tragedy-of-the-commons Spam assault.
There is one &#8220;ideal world&#8221; answer, which would essentially stop spam in every possible permutation - the use of micropayments.
Specifically:

A micropayment [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/05/29/the-spam-it-burns/"><![CDATA[<p>Insightful commentary on <a href="http://blogs.concedere.net:8080/blog/discipline/web/?permalink=Those-Who-Live-by-the-Spam.html">the future of spam</a>.</p>
<p>He (or She) is right - Spam-management is likely to be one of the critical priorities for the future, before the entire Internet crumbles under the tragedy-of-the-commons Spam assault.</p>
<p>There is one &#8220;ideal world&#8221; answer, which would essentially stop spam in every possible permutation - the use of micropayments.</p>
<p>Specifically:</p>
<ul>
<li>A micropayment (by you) each time you post a comment</li>
<li>A micropayment (by you) each time you link to a blog and it generates a trackback</li>
<li>A micropayment (by you) to the recipient of every email you send</li>
<li>A minipayment (by you) each time you sign up for an account, and then a micropayment each time you reach out to someone using that account - facebook wall messages, twitter posts, craigslist ads, /tells in MMOs, etc.  The receiver will receive the micropayment. </li>
</ul>
<p>I know, roll your eyes, micropayments are <em>so played out</em>.   Well, I admit that they have been, and continue to be ahead of their time.  </p>
<h3>Captchas</h3>
<p>Every other solution I&#8217;ve heard proposed involves more complex Captchas.  Captchas are a hurdle, but, by definition, not an insurmountable one (because they have to be simple enough for below-average humans to pass them).  Spammers continue to develop ever-increasingly-sophisticated Turing Machines, and are probably on the cutting edge of some forms of pattern recognition/AI.   Each time we come up with a test, the spammers will eventually beat it.  Unless you believe that computers &#8220;can&#8217;t ever&#8221; be smart enough to pass the Turing test, you have to assume that no Captcha will stand forever.</p>
<p>Essentially, Captchas are like building a wall in front of a horde of oncoming Mongols.  They will eventually get over it.  Once over it, it becomes a useless bit of architecture.</p>
<h3>Micropayments</h3>
<p>Micropayments, on the other hand, create an economic cost for every attempt at communication.  And for most people, who receive communications about as often (roughly) as they send them, this is no big deal.   If I send out 10,000 messages next year, at $0.001/message, that will cost me $10.   And if I receive 10,000 messages from other people, that will reward me with $10 in credits.   If I am a big talker, perhaps I spend a few dollars a year to keep my account balance up.   But the point is, I don&#8217;t spend so much money that it becomes economically meaningful to me.</p>
<p>Spammers, on the other hand, if they send out 10 million messages, are looking at $10,000 in expenses.  That&#8217;s a lot more money, and not something that can be done &#8220;lightly&#8221;.  </p>
<p>The biggest problem in all of this is the starting-up problem.  No one wants to be first website to demand micropayments, and hassle their users with an extra sign-up step.  But referring back to the article - that - the generalized willingness to setup a micropayment solution - is the shape of &#8220;Web 4.0&#8243;</p>
<h3>The Scenario</h3>
<p>Here&#8217;s how I think it could go down - Google, Yahoo, EBay, Amazon, Microsoft and various other major players hash out a <em>protocol</em> for micropayment transfers.   Then, they license the protocol to other organizations to implement, with the rule that every licensee has to accept and reciprocate payments with every other licensee.</p>
<p>My next thought is that once money (yours, mine, etc) goes into the system, it can never come out again - the micropayment universe is essentially a financial black hole <img src='http://undefined.com/ia/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   - Why?  To make it far less attractive as a target for hacking.</p>
<h3>The Business Model</h3>
<p>The Micropayment &#8220;Banks&#8221; would make money when you or I sign up our blogs to accept micropayments - a few dollars a year from a bunch of bloggers and smaller websites, a few more dollars from larger websites, etc, and you have a sustainable business model.    </p>
<h3>Accountability</h3>
<p>The Licensees would be obliged to keep their books transparent - how much cash they received, how much they received in micropayments from others, how much they gave out in micropayments.   That might even be part of the overall software specification.     Someone (or many someones) can audit the books of the various Micropayment Banks, and verify that all the flows check out - that no one is claiming more &#8220;micropayment credits&#8221; than they actually have to give out.  Standard financial audits would verify that the money coming in to each organization was legitimate and clean.  </p>
<h3>Commentary</h3>
<p>This isn&#8217;t the most elegant solution in the world.  Ideally there&#8217;s a solution that just involves the phrase &#8220;leave it up to the market&#8221;, but I can&#8217;t come up with one.  That doesn&#8217;t mean it&#8217;s not out there&#8230;</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/05/29/the-spam-it-burns/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/05/29/the-spam-it-burns/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Perfection]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/05/28/perfection/" />
		<id>http://undefined.com/ia/2008/05/28/perfection/</id>
		<updated>2008-05-28T17:39:00Z</updated>
		<published>2008-05-28T16:59:13Z</published>
		<category scheme="http://undefined.com/ia" term="Agile Software Development" /><category scheme="http://undefined.com/ia" term="Entrepreneurship" /><category scheme="http://undefined.com/ia" term="Programming" />		<summary type="html"><![CDATA[Some feel that software products have to be essentially perfect in order to even have a ghost of a chance to succeed.  People point to the iPhone and the iPod as examples of products that are practically perfect, down to the last detail, and are very successful.
Of course, one can point to a lot [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/05/28/perfection/"><![CDATA[<p>Some feel that software products have to be essentially perfect in order to even have a ghost of a chance to succeed.  People point to the iPhone and the iPod as examples of products that are practically perfect, down to the last detail, and are very successful.</p>
<p>Of course, one can point to a lot of counter-examples - projects that are less than perfect, but still quite successful (MySpace, Facebook, Google Mail, Google Docs, Twitter, etc).   And, the huge pool of unknown projects - things that were never released because they could not achieve this desired perfection, and thus you are not even aware that they existed.</p>
<p>I think the gap here is the definition of &#8220;successful&#8221;.  Some feel that a project is only successful if it has raving fans.   Others focus on being useful to a lot of people, without worrying so much about perfection to the last detail.</p>
<p>I suspect (without statistical evidence) that you have the following kinds of results for projects that focus on perfection, vs. those that focus on &#8220;good enough&#8221;:</p>
<p><img src="http://www.undefined.com/Perfect.png" /></p>
<p><img src="http://www.undefined.com/GoodEnough.png" /></p>
<p><br clear="div" /></p>
<p>(Sorry the scale isn&#8217;t clear, the categories are &#8220;Never Released&#8221;, &#8220;Failure&#8221;, &#8220;Moderate Success&#8221; and &#8220;Huge Success&#8221;)</p>
<p>In reality, these scales are misleading, since the number of &#8220;Never Released&#8221; items is probably 10x as large (on both graphs).   But in general, if you demand perfection, you have a slim increase in the chance that it will be a huge success, and a fairly significant increase in the chance that it will never be released.</p>
<p>Having said that, smooth functionality, elegant design and attention to detail are worthwhile.  But they can be deceiving.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/05/28/perfection/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/05/28/perfection/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>jb</name>
						<uri>http://undefined.com/ia</uri>
					</author>
		<title type="html"><![CDATA[Bile&#8230;]]></title>
		<link rel="alternate" type="text/html" href="http://undefined.com/ia/2008/05/20/bile/" />
		<id>http://undefined.com/ia/2008/05/20/bile/</id>
		<updated>2008-05-20T15:19:20Z</updated>
		<published>2008-05-20T15:19:20Z</published>
		<category scheme="http://undefined.com/ia" term="Programming" />		<summary type="html"><![CDATA[I gave up on Hani Sulemain when I realized that his modus operandi could be described in two steps:

Find something I don&#8217;t like
Announce with great certitude how clueless and incompetent everyone is who disagrees with me.

Alas, the chickens have come home to roost, I guess.
There&#8217;s a certain sense of &#8220;insecurity&#8221; in Hani&#8217;s post.Â  As if [...]]]></summary>
		<content type="html" xml:base="http://undefined.com/ia/2008/05/20/bile/"><![CDATA[<p>I gave up on Hani Sulemain when I realized that his modus operandi could be described in two steps:</p>
<ol>
<li>Find something I don&#8217;t like</li>
<li>Announce with great certitude how clueless and incompetent everyone is who disagrees with me.</li>
</ol>
<p>Alas, the <a href="http://www.bileblog.org/2008/05/java-haters-gtfo/">chickens have come home to roost,</a> I guess.</p>
<p>There&#8217;s a certain sense of &#8220;insecurity&#8221; in Hani&#8217;s post.Â  As if he&#8217;s suddenly lacking in confidence.Â  After all, someone fully confident of their opinions wouldn&#8217;t care what others thought. Â Â  I find that surprising in someone who was once so self-assured <a href="http://www.bileblog.org/2007/06/google-code-ugliness-is-not-even-skin-deep/" target="_blank">he could shower hate down on Google Code</a>. Â  Now it&#8217;s almost like he is tired of being beaten up and just wants people to leave him alone.</p>
<p>Sorry Hani - this is the life you chose when you first decided to call someone else an idiot in public for supporting somethingÂ  you thought was lame.</p>
]]></content>
		<link rel="replies" type="text/html" href="http://undefined.com/ia/2008/05/20/bile/#comments" thr:count="0"/>
		<link rel="replies" type="application/atom+xml" href="http://undefined.com/ia/2008/05/20/bile/feed/atom/" thr:count="0"/>
		<thr:total>0</thr:total>
	</entry>
	</feed>
