<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Notations, scribblings and other gibberish</title>
	<atom:link href="http://frugalprogrammer.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://frugalprogrammer.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Tue, 08 Sep 2009 21:16:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='frugalprogrammer.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Notations, scribblings and other gibberish</title>
		<link>http://frugalprogrammer.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://frugalprogrammer.wordpress.com/osd.xml" title="Notations, scribblings and other gibberish" />
	<atom:link rel='hub' href='http://frugalprogrammer.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Tidy, PHP and Mac</title>
		<link>http://frugalprogrammer.wordpress.com/2009/09/08/tidy-php-and-mac/</link>
		<comments>http://frugalprogrammer.wordpress.com/2009/09/08/tidy-php-and-mac/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 21:16:00 +0000</pubDate>
		<dc:creator>frugalprogrammer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frugalprogrammer.wordpress.com/?p=41</guid>
		<description><![CDATA[Oh, how you don&#8217;t play well together. In case anybody else has this problem, it is typified by: /private/tmp/pear/download/tidy-1.2/tidy.c:463: warning: pointer targets in initialization differ in signedness /private/tmp/pear/download/tidy-1.2/tidy.c: In function 'zif_tidy_parse_file': /private/tmp/pear/download/tidy-1.2/tidy.c:490: warning: pointer targets in passing argument 2 of 'tidyBufAttach' differ in signedness make: *** [tidy.lo] Error 1 ERROR: `make' failed To fix it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=41&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Oh, how you  don&#8217;t play well together. In case anybody else has this problem, it is typified by:</p>
<p><code><br />
/private/tmp/pear/download/tidy-1.2/tidy.c:463: warning: pointer targets in initialization differ in signedness<br />
/private/tmp/pear/download/tidy-1.2/tidy.c: In function 'zif_tidy_parse_file':<br />
/private/tmp/pear/download/tidy-1.2/tidy.c:490: warning: pointer targets in passing argument 2 of 'tidyBufAttach' differ in signedness<br />
make: *** [tidy.lo] Error 1<br />
ERROR: `make' failed<br />
</code></p>
<p>To fix it (thanks to dams at PHP):</p>
<p>&#8220;Get the libtidy from the CVS on their project. Compile and install it, then modify /usr/include/tidy/platform.h:</p>
<p>on line 530 comment [out] the line:</p>
<p>typedef unsigned long ulong;&#8221;</p>
<p>After this, tidy should install properly.</p>
<p>References:</p>
<p><a href="http://bugs.php.net/bug.php?id=36164&amp;edit=1">http://bugs.php.net/bug.php?id=36164&amp;edit=1</a></p>
<p><a href="http://aspn.activestate.com/ASPN/Mail/Message/php-dev/3390328">http://aspn.activestate.com/ASPN/Mail/Message/php-dev/3390328</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frugalprogrammer.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frugalprogrammer.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frugalprogrammer.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frugalprogrammer.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frugalprogrammer.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frugalprogrammer.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frugalprogrammer.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frugalprogrammer.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frugalprogrammer.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frugalprogrammer.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frugalprogrammer.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frugalprogrammer.wordpress.com/41/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frugalprogrammer.wordpress.com/41/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frugalprogrammer.wordpress.com/41/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=41&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frugalprogrammer.wordpress.com/2009/09/08/tidy-php-and-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3dd483af194a929f3fc1075bd5e6b6be?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">frugalprogrammer</media:title>
		</media:content>
	</item>
		<item>
		<title>Framework auto-updates</title>
		<link>http://frugalprogrammer.wordpress.com/2009/09/07/framework-auto-updates/</link>
		<comments>http://frugalprogrammer.wordpress.com/2009/09/07/framework-auto-updates/#comments</comments>
		<pubDate>Mon, 07 Sep 2009 02:21:23 +0000</pubDate>
		<dc:creator>frugalprogrammer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frugalprogrammer.wordpress.com/?p=34</guid>
		<description><![CDATA[One of the more annoying things about web frameworks I&#8217;ve used is that if you started a project and you suddenly need a feature and need to update or slide back a version, it&#8217;s a pain in the posterior. In ploof I&#8217;m trying to solve this problem with diffs and patches for the core files. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=34&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of the more annoying things about web frameworks I&#8217;ve used is that if you started a project and you suddenly need a feature and need to update or slide back a version, it&#8217;s a pain in the posterior. </p>
<p>In <a href="http://code.google.com/p/ploof">ploof</a> I&#8217;m trying to solve this problem with diffs and patches for the core files.</p>
<p>The ploof command, available on the command line, provides this functionality. Even though ploof doesn&#8217;t have any releases (proper), you can tell your ploof export to update to a particular revision:</p>
<p><code>./ploof update trunk</code></p>
<p>or</p>
<p><code>./ploof update 1.0</code></p>
<p>(note that as of this writing there is no 1.0 version, so trunk is all you get)</p>
<p>The essential strategy is to export another version in the resource subdirectory, run a diff against what you currently have installed, and patch it automatically. </p>
<p>Here&#8217;s the code:</p>
<p><code></p>
<pre>
function generate_patch($version= "trunk")
{
    if (opendir("resource/updates"))
        exec("rm -rf resource/updates");

    // export a copy of the code off the server:
    exec("mkdir resource/updates");
    if ($version != "trunk")
        $version= "branches/".$version;

    exec("svn export http://ploof.googlecode.com/svn/$version ./resource/updates/svn");

    // build patch files:
    exec("diff -rupN -x .svn ./core ./resource/updates/svn/core &gt; ./resource/updates/core.patch");
    exec("diff -rupN -x .svn ./config/config.default.php ./resource/updates/svn/config/config.default.php &gt; ./resource/updates/config.patch");
    exec("diff -rupN -x .svn ./ploof ./resource/updates/svn/ploof &gt; ./resource/updates/ploof.patch");
}

function patch()
{
    // apply the patches:
    exec("patch -p1 &lt; ./resource/updates/core.patch&quot;);
    exec(&quot;patch -p1 &lt; ./resource/updates/config.patch&quot;);
    exec(&quot;patch -p1 &lt; ./resource/updates/ploof.patch&quot;);
}
function update($version= &quot;trunk&quot;)
{
    generate_patch($version);
    patch();
}
</pre>
<p></code></p>
<p>I separated the update() method into patch() and generate_patch() for testing purposes.</p>
<p>This isn&#8217;t perfect (it needs to address core <a href="http://code.google.com/p/ploof/issues/detail?id=3">CSS/HSS/JS merging</a>, and needs to ignore other VCS&#8217;s), but it&#8217;s a start toward better framework integration into our normal development workflow.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frugalprogrammer.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frugalprogrammer.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frugalprogrammer.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frugalprogrammer.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frugalprogrammer.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frugalprogrammer.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frugalprogrammer.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frugalprogrammer.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frugalprogrammer.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frugalprogrammer.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frugalprogrammer.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frugalprogrammer.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frugalprogrammer.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frugalprogrammer.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=34&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frugalprogrammer.wordpress.com/2009/09/07/framework-auto-updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3dd483af194a929f3fc1075bd5e6b6be?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">frugalprogrammer</media:title>
		</media:content>
	</item>
		<item>
		<title>Using Make for server maintenance (part 1)</title>
		<link>http://frugalprogrammer.wordpress.com/2009/08/05/using-make-for-server-maintenance-part-1/</link>
		<comments>http://frugalprogrammer.wordpress.com/2009/08/05/using-make-for-server-maintenance-part-1/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 17:01:53 +0000</pubDate>
		<dc:creator>frugalprogrammer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frugalprogrammer.wordpress.com/?p=25</guid>
		<description><![CDATA[I admit it. I like Make. Mostly because it allows you to enter command line entries directly into a build script. Here&#8217;s a simplistic introduction. First of all, you&#8217;ll want to download all the proper versions of the utilities you want to use and move them onto a file share somewhere which easily mountable. I [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=25&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I admit it. I like Make. Mostly because it allows you to enter command line entries directly into a build script. Here&#8217;s a simplistic introduction.</p>
<p>First of all, you&#8217;ll want to download all the proper versions of the utilities you want to use and move them onto a file share somewhere which easily mountable. I just got a <a href="http://www.engadget.com/2009/04/06/netgear-rolls-out-4-bay-readynas-nvx/">NetGear ReadyNAS</a> which I like a lot. You&#8217;ll want to keep copies of the exact versions you use because a lot of folks are hiding their older versions.</p>
<p>Now, about that Makefile. I use Fedora Core, and when I create a clean server it doesn&#8217;t have much on it. So let&#8217;s define a macro for dependencies that&#8217;s easy to maintain:</p>
<p><code>DEPS=openldap.i386 gcc gd.i386 gd-devel libjpeg.i386 libjpeg-devel.i386</p>
<pre>
$(DEPS) :
	if test -z `yum list | grep ^$@ | grep installed | sed -e "s/ //g"`; then\
		yum -y install $@; \
	fi;

installdeps: $(DEPS)
</pre>
<p></code></p>
<p>Now calling <code>make installdeps</code> will loop through find and install your dependencies.</p>
<p>How does this work? Let&#8217;s take a look:</p>
<p><code>DEPS=[a list]</p>
<pre>
$(DEPS):
        [some command line entries]

installdeps: $(DEPS)
</pre>
<p></code></p>
<p>Make sees your list (called a macro) assigned to DEPS. Just below that, if it sees your exact list of dependencies (dereferenced in Make via $(variable)), it will run the command line entries for each item in your list (that&#8217;s the cool part) &#8212; this is called the target. But you don&#8217;t want to type all those dependencies again (a la <code>make openldap.i386 gcc etc etc...</code>), so we make a second target that invokes the first: <code>installdeps</code>. </p>
<p>Note the formatting, Make can behave like Python &#8212; if it&#8217;s on the same line as the target, it will be called prior to running anything below the target (you can also list as many dependencies as you need). The commands below the target must be indented with tabs.</p>
<p>In part 2 I&#8217;ll go over some conditional syntax and (what I believe to be) some best practices.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frugalprogrammer.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frugalprogrammer.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frugalprogrammer.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frugalprogrammer.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frugalprogrammer.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frugalprogrammer.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frugalprogrammer.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frugalprogrammer.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frugalprogrammer.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frugalprogrammer.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frugalprogrammer.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frugalprogrammer.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frugalprogrammer.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frugalprogrammer.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=25&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frugalprogrammer.wordpress.com/2009/08/05/using-make-for-server-maintenance-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3dd483af194a929f3fc1075bd5e6b6be?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">frugalprogrammer</media:title>
		</media:content>
	</item>
		<item>
		<title>ploof &#8211; PHP Lightweight Object Oriented Framework</title>
		<link>http://frugalprogrammer.wordpress.com/2009/08/03/ploof-php-lightweight-object-oriented-framework/</link>
		<comments>http://frugalprogrammer.wordpress.com/2009/08/03/ploof-php-lightweight-object-oriented-framework/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 17:40:32 +0000</pubDate>
		<dc:creator>frugalprogrammer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frugalprogrammer.wordpress.com/?p=19</guid>
		<description><![CDATA[So I decided I&#8217;m going to go ahead and make a framework. I know, just what the world needs is another framework, let alone one that will probably have poor documentation (I&#8217;ll try to PHPDoc it). So why bother? Mostly because I don&#8217;t like a lot of the frameworks out there. I use a custom [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=19&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So I decided I&#8217;m going to go ahead and make a framework. I know, just what the world needs is another framework, let alone one that will probably have poor documentation (I&#8217;ll try to PHPDoc it).</p>
<p>So why bother? Mostly because I don&#8217;t like a lot of the frameworks out there. I use a custom rolled framework at AirAdvice that I built from the ground up, so I have some experience, and we, as developers, are always looking to build a better mousetrap. But what finally sent me over the edge is that I have enough of a backlog of personal projects that it makes sense to build something to expedite that process. I want something that is easy for designers, and something that allows me to get projects off the ground as efficiently as possible.</p>
<p>Here&#8217;s some things I plan on building into ploof (and there will probably be more, but these are the things I could think of that I wanted as we were driving home from Bandon, Oregon this weekend):</p>
<ul>
<li>CSS framework</li>
<li>PHP 5.3 compatible</li>
<li>Migrations</li>
<li>Rapid build out from a database (auto creation of classes and relationships)</li>
<li>Namespaces for partials</li>
<li>Record and view caching</li>
<li>Tuple HABTM</li>
<li>Form handling that makes sense</li>
<li>PHPUnit</li>
</ul>
<p>I haven&#8217;t checked anything in yet, but it&#8217;s hosted on <a href="http://code.google.com/p/ploof/">Google Code</a>. More to follow.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frugalprogrammer.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frugalprogrammer.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frugalprogrammer.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frugalprogrammer.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frugalprogrammer.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frugalprogrammer.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frugalprogrammer.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frugalprogrammer.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frugalprogrammer.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frugalprogrammer.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frugalprogrammer.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frugalprogrammer.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frugalprogrammer.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frugalprogrammer.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=19&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frugalprogrammer.wordpress.com/2009/08/03/ploof-php-lightweight-object-oriented-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3dd483af194a929f3fc1075bd5e6b6be?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">frugalprogrammer</media:title>
		</media:content>
	</item>
		<item>
		<title>The Voice of the Customer</title>
		<link>http://frugalprogrammer.wordpress.com/2009/07/27/the-voice-of-the-customer/</link>
		<comments>http://frugalprogrammer.wordpress.com/2009/07/27/the-voice-of-the-customer/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 23:37:04 +0000</pubDate>
		<dc:creator>frugalprogrammer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frugalprogrammer.wordpress.com/?p=13</guid>
		<description><![CDATA[Somehow, some way, you&#8217;ve got to get your customer&#8217;s input. I&#8217;ve tried to do formalized processes on obtaining VOC, but have never been very happy with them. Looking back at the formalized documents after going through a couple of revisions with a product can&#8217;t justify the time and expenditure to create them &#8212; it is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=13&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Somehow, some way, you&#8217;ve got to get your customer&#8217;s input.</p>
<p>I&#8217;ve tried to do formalized processes on obtaining <a href="http://en.wikipedia.org/wiki/Voice_of_the_customer">VOC</a>, but have never been very happy with them. Looking back at the formalized documents after going through a couple of revisions with a product can&#8217;t justify the time and expenditure to create them &#8212; it is truly the blind leading the blind if you are trying to break into a new market. Not that there is a lot of choice there, but rapid prototyping may be a less all or nothing proposition, especially for a small team with limited resources vs. teams that have people devoted to <a href="http://www.isixsigma.com/vc/">six sigma</a> and the like.</p>
<p>I&#8217;ve also constructed round-tables of various &#8216;expert&#8217; users to provide feedback, but the feedback from experts usually ignores the fact that most users are &#8216;perpetual intermediates&#8217;. And while the feedback is usually useful, it isn&#8217;t always easily enacted. Doing a round-table at the end of a product means that you can do a few tweaks, but no major overhauls, and doing continuous round-tables is difficult to arrange if your clients are busy.</p>
<p>There is another option, although it also has a few sticking points: utilize your sales and support teams. They talk to your customers daily. Sales should know what people are asking for; support should know what customer&#8217;s pain points are. Again, this only really works with an existing product. And the other downfall can be one of self-service instead of customer service. It may be in the support person&#8217;s best interest to limit how much support they have to give, so instead of fixing a fundamental product problem they may advise patching a work around instead. Sales may advocate building something peripheral because people are asking for it, while missing the boat on how it fits into the total package.</p>
<p>VOC is more art form than science, but that&#8217;s what makes it such an interesting topic, and certainly one open for debate.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frugalprogrammer.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frugalprogrammer.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frugalprogrammer.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frugalprogrammer.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frugalprogrammer.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frugalprogrammer.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frugalprogrammer.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frugalprogrammer.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frugalprogrammer.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frugalprogrammer.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frugalprogrammer.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frugalprogrammer.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frugalprogrammer.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frugalprogrammer.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=13&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frugalprogrammer.wordpress.com/2009/07/27/the-voice-of-the-customer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3dd483af194a929f3fc1075bd5e6b6be?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">frugalprogrammer</media:title>
		</media:content>
	</item>
		<item>
		<title>Versioning and rollback&#8230; with a variety of systems.</title>
		<link>http://frugalprogrammer.wordpress.com/2009/07/23/versioning-and-rollback-with-a-variety-of-systems/</link>
		<comments>http://frugalprogrammer.wordpress.com/2009/07/23/versioning-and-rollback-with-a-variety-of-systems/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 22:01:53 +0000</pubDate>
		<dc:creator>frugalprogrammer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frugalprogrammer.wordpress.com/?p=9</guid>
		<description><![CDATA[We have a variety of home built systems at AirAdvice that provide a variety of services &#8212; building custom and dynamic reports, calculating energy usage, evaluating Energy Star scores, translating calculations for various energy types, etc etc. (and hopefully someday I&#8217;ll be allowed to provide an API for people to get at these systems&#8230;) So [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=9&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We have a variety of home built systems at AirAdvice that provide a variety of services &#8212; building custom and dynamic reports, calculating energy usage, evaluating Energy Star scores, translating calculations for various energy types, etc etc. (and hopefully someday I&#8217;ll be allowed to provide an API for people to get at these systems&#8230;)</p>
<p>So what happens if you need to, er, want to roll all these interconnected systems back?</p>
<p>Obviously we use source code control for, well, source code and tack version numbers onto our other apps. But usually they are inextricably linked. A database migration might blow away an equipment type by renaming it, and the new energy modeling software will only recognize this new equipment type. What version was the version of the modeling software that matches the rolled back source code? Quickly now. Your servers are down.</p>
<p>On the one hand it seems like this would be a simple thing to solve. We already track what migration we are on in the database. We could track the application versions of the compiled with the migration numbers, a tag or commit number, and a date stamp for a release date.</p>
<p>This is handy as a reference for the tech when the proverbial monkey poo hits the proverbial fan, but he would <em>still</em> have to reference this table by hand when doing a manual rollback.</p>
<p>Is there a way to automate these types of references, other than some amalgamation of Windows batch and *nix makefiles? I suppose ant could be used across both; we already use it for PhpUnderControl to see when I break unit tests, and watch our code coverage grow. But that doesn&#8217;t really centralize command and control if, for example, in one keystroke I wanted to roll back a variety of systems, and make sure that all systems were rolled back together.</p>
<p>Anybody know of such a system or a homegrown procedure that can handle it?</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frugalprogrammer.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frugalprogrammer.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frugalprogrammer.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frugalprogrammer.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frugalprogrammer.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frugalprogrammer.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frugalprogrammer.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frugalprogrammer.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frugalprogrammer.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frugalprogrammer.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frugalprogrammer.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frugalprogrammer.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frugalprogrammer.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frugalprogrammer.wordpress.com/9/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=9&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frugalprogrammer.wordpress.com/2009/07/23/versioning-and-rollback-with-a-variety-of-systems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3dd483af194a929f3fc1075bd5e6b6be?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">frugalprogrammer</media:title>
		</media:content>
	</item>
		<item>
		<title>Frameworks</title>
		<link>http://frugalprogrammer.wordpress.com/2009/07/22/frameworks/</link>
		<comments>http://frugalprogrammer.wordpress.com/2009/07/22/frameworks/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 21:26:31 +0000</pubDate>
		<dc:creator>frugalprogrammer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frugalprogrammer.wordpress.com/2009/07/22/frameworks/</guid>
		<description><![CDATA[I really want something in between CodeIgniter and CakePHP. I don&#8217;t like CakePHP&#8217;s overuse of arrays &#8212; while faster, it isn&#8217;t always obvious whether you get back an object or an array &#8212; and I don&#8217;t like CodeIgniter&#8217;s template system. Maybe I&#8217;ll release my own like everyone else has, and stop complaining (maybe it&#8217;s a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=7&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I really want something in between CodeIgniter and CakePHP. I don&#8217;t like CakePHP&#8217;s overuse of arrays &#8212; while faster, it isn&#8217;t always obvious whether you get back an object or an array &#8212; and I don&#8217;t like CodeIgniter&#8217;s template system. </p>
<p>Maybe I&#8217;ll release my own like everyone else has, and stop complaining (maybe it&#8217;s a good chance to learn all the new widgets in PHP5.3&#8230;.)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frugalprogrammer.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frugalprogrammer.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frugalprogrammer.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frugalprogrammer.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frugalprogrammer.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frugalprogrammer.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frugalprogrammer.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frugalprogrammer.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frugalprogrammer.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frugalprogrammer.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frugalprogrammer.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frugalprogrammer.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frugalprogrammer.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frugalprogrammer.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=7&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frugalprogrammer.wordpress.com/2009/07/22/frameworks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3dd483af194a929f3fc1075bd5e6b6be?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">frugalprogrammer</media:title>
		</media:content>
	</item>
		<item>
		<title>Some simple gettext</title>
		<link>http://frugalprogrammer.wordpress.com/2009/01/28/some-simple-gettext/</link>
		<comments>http://frugalprogrammer.wordpress.com/2009/01/28/some-simple-gettext/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 02:51:54 +0000</pubDate>
		<dc:creator>frugalprogrammer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://frugalprogrammer.wordpress.com/?p=3</guid>
		<description><![CDATA[First, variables need to be swapped out with printf or one of its derivatives: sprintf(_(&#8220;The value is: %s&#8221;), $value); You can compile in comments which will show in your output file: xgettext &#8211;add-comments=/// Static items in PHP can be problematic: class foo { static $bar = _(&#8220;translate&#8221;); } will produce a parse error. For static [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=3&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>First, variables need to be swapped out with printf or one of its derivatives:</p>
<p>sprintf(_(&#8220;The value is: %s&#8221;), $value);</p>
<p>You can compile in comments which will show in your output file:</p>
<p>xgettext &#8211;add-comments=///</p>
<p>Static items in PHP can be problematic:</p>
<p>class foo {<br />
static $bar = _(&#8220;translate&#8221;);<br />
}</p>
<p>will produce a parse error. For static items, we&#8217;ve moved them below the class so they are still set upon file inclusion:</p>
<p>class foo {<br />
static $bar;<br />
}<br />
foo::$bar = _(&#8220;translate&#8221;);</p>
<p>Another related problem: default method parameters will also produce a parse error.</p>
<p>function upgrade($upgradable = _(&#8220;default&#8221;)) { return true; }</p>
<p>These will also need to be moved to defaults inside the method for PHP to play nicely with gettext.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frugalprogrammer.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frugalprogrammer.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frugalprogrammer.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frugalprogrammer.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frugalprogrammer.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frugalprogrammer.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frugalprogrammer.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frugalprogrammer.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frugalprogrammer.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frugalprogrammer.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frugalprogrammer.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frugalprogrammer.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frugalprogrammer.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frugalprogrammer.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frugalprogrammer.wordpress.com&amp;blog=6188404&amp;post=3&amp;subd=frugalprogrammer&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frugalprogrammer.wordpress.com/2009/01/28/some-simple-gettext/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/3dd483af194a929f3fc1075bd5e6b6be?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">frugalprogrammer</media:title>
		</media:content>
	</item>
	</channel>
</rss>
