<?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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>InAnger.com</title>
	<atom:link href="http://www.inanger.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.inanger.com</link>
	<description>Web Development, In Practice</description>
	<pubDate>Tue, 18 Mar 2008 07:47:43 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
		<item>
		<title>Summer of Code 2008</title>
		<link>http://www.inanger.com/development/applications-frameworks/geeklog/summer-of-code-2008/</link>
		<comments>http://www.inanger.com/development/applications-frameworks/geeklog/summer-of-code-2008/#comments</comments>
		<pubDate>Tue, 18 Mar 2008 07:47:43 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Geeklog]]></category>

		<category><![CDATA[soc]]></category>

		<guid isPermaLink="false">http://www.inanger.com/development/applications-frameworks/geeklog/summer-of-code-2008/</guid>
		<description><![CDATA[The Geeklog Project (for which I am a Core Team Member) has been confirmed as a participating organisation in the Google Summer of Code 2008. We have our ideas list up and are recruiting for students.
So, if you are a student at university and interested in a Free Google T-Shirt and Some Money for contributing [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.geeklog.net" target="_blank">Geeklog Project</a> (for which I am a Core Team Member) has been confirmed as a participating organisation in the <a href="http://code.google.com/soc/2008/" target="_blank">Google Summer of Code 2008</a>. We have our <a href="http://wiki.geeklog.net/wiki/index.php/Google_Summer_of_Code" target="_blank">ideas list</a> up and are recruiting for students.</p>
<p>So, if you are a student at university and interested in a Free Google T-Shirt and Some Money for contributing to a PHP Open Source Project, then check it out. I&#8217;ve identified three projects that I will be mentoring on if suitable students are found, and there are a number of other projects available if you hate me <img src='http://www.inanger.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/development/applications-frameworks/geeklog/summer-of-code-2008/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>Perfect Firefox Profiles?</title>
		<link>http://www.inanger.com/opinion/perfect-firefox-profiles/</link>
		<comments>http://www.inanger.com/opinion/perfect-firefox-profiles/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 15:31:04 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Opinion]]></category>

		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://www.inanger.com/opinion/perfect-firefox-profiles/</guid>
		<description><![CDATA[I&#8217;m an obsessive tinkerer. I can&#8217;t install configurable software without spending forever trying to get my personal configuration right instead of using the application.
For a long time I hated &#8220;browser nazis&#8221; who were always telling me that I should switch to [Mozilla&#124;Firefox (pre 1.0)&#124;Opera&#124;Something Else] and eventually I gave in and switched to Maxthon. Then [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m an obsessive tinkerer. I can&#8217;t install configurable software without spending forever trying to get my personal configuration right instead of using the application.</p>
<p>For a long time I hated &#8220;browser nazis&#8221; who were always telling me that I should switch to [Mozilla|Firefox (pre 1.0)|Opera|Something Else] and eventually I gave in and switched to Maxthon. Then Firefox 1.0. Which really did make me feel silly. Once using Firefox 1.0 I realised the others had been right. IE was terrible. Firefox was awesome. But not too silly as Mozilla, Opera and other alternatives before Firefox were pretty rubbish too (Opera is sounding interesting now, but Mozilla and Safari etc still leave me cold).</p>
<p>I still can&#8217;t stand the thought that I might not have an &#8220;optimal&#8221; Firefox extension set enabled, so here&#8217;s what I&#8217;m using, is there anything you think would be best added to this list.</p>
<p>Firstly, I have three profiles. Lite - Need a browser fast. Default - Just for surfing. Developer - for doing web development. I don&#8217;t load firebug/developer&#8217;s toolbar and their overhead <em>just</em> to check my online bank. I&#8217;m most interested in optimising my Default profile, but that builds on my Lite profile.</p>
<p>(All profiles include the British English spell check add on and talk back crash handler)</p>
<p><strong>Lite</strong><br />
This needs to load <em>fast</em> and provide a fast browsing experience. I have only a few extensions in this:</p>
<ol>
<li>Adblock Plus - Remove banner ads, save network time on them.</li>
<li>FilterSet.G Updater - Keep my Adblock Plus filters up-to-date with the excellent FilterSet.G</li>
<li>CS Lite - Prevent those horrible advertising types tracking my surfing patterns with a nice &#8220;AdBlock for Cookies&#8221; style tool.</li>
<li>Del.icio.us Complete - The official Del.ico.us extension to replace per-profile bookmarks. I have access to the same bookmarks in all profiles.</li>
</ol>
<p><strong>Default</strong><br />
This is where I live when not in a rush and not coding. It&#8217;s optimised for surfing experience:</p>
<ol>
<li>Deepest Sender - UI For posting to LJ</li>
<li>Digger - Right click the &#8220;go&#8221; icon to mess with the URL, very, very handy</li>
<li>ErrorZilla - Better than a server not found message</li>
<li>Greasemonkey - Tweak sites my way</li>
<li>Leechblock - Keep me off &#8220;slacking off sites&#8221; when working</li>
<li>TwitterFox - Update Twitter</li>
<li>Google Reader Notifier - Check my RSS feeds</li>
<li>IE View - Open current page in IE, if it&#8217;s not working in firefox (useful for MS sites!)</li>
<li>Customise Google - but thinking of removing this&#8230;</li>
</ol>
<p><strong>Development</strong><br />
Really, this just adds Developer Toolbar, HTML Validator and Firebug to the above.</p>
<p>What essentials am I missing?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/opinion/perfect-firefox-profiles/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>Faster, Easier Wordpress Upgrade</title>
		<link>http://www.inanger.com/anger-management/easywordpressupgrade/</link>
		<comments>http://www.inanger.com/anger-management/easywordpressupgrade/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 21:56:18 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Anger Management]]></category>

		<category><![CDATA[Opinion]]></category>

		<category><![CDATA[Wordpress]]></category>

		<category><![CDATA[automate]]></category>

		<category><![CDATA[process]]></category>

		<category><![CDATA[upgrade]]></category>

		<guid isPermaLink="false">http://www.inanger.com/anger-management/easywordpressupgrade/</guid>
		<description><![CDATA[In the last 38 days there have been two urgent security fix releases of Wordpress. In the last 3 and a tiny bit months there have been three maintenance releases of Wordpress. In the last 4 and a tiny bit months there have been four releases of Wordpress.
Other than the fact I&#8217;m starting to get [...]]]></description>
			<content:encoded><![CDATA[<p>In the last 38 days there have been two <em>urgent</em> security fix releases of Wordpress. In the last 3 and a tiny bit months there have been three maintenance releases of Wordpress. In the last 4 and a tiny bit months there have been four releases of Wordpress.</p>
<p>Other than the fact I&#8217;m starting to get pretty worried about the security and stability of the software in general, it&#8217;s a pain in the rear to have to keep upgrading. So I&#8217;m making it easier for me. Wordpress themselves have helped by having a decent system in place for making it easy to get the latest.</p>
<p>I now have the simplest of shell scripts which:</p>
<ol>
<li>Backs up my database.</li>
<li>Backs up my Wordpress folder.</li>
<li>Gets the latest Wordpress release.</li>
<li>Unpacks that release.</li>
<li>Deploys that release live.</li>
</ol>
<p>Being nice, I&#8217;m going to share it with you:</p>
<p><code>mysqldump --host=localhost --user=wordpress --password=wordpress wordpress &gt; wordpress.sql<br />
tar -zcf wordpress_backup.tgz wordpress_live<br />
wget http://wordpress.org/latest.tar.gz<br />
tar -xzf latest.tar.gz<br />
cp -r wordpress/* wordpress_live/<br />
rm -r wordpress<br />
</code></p>
<p>Of course this assumes that you have a wordpress database in a localhost MySQL instance with username and password wordpress and that your live wordpress folder is wordpress_live so you can cope with a temporary wordpress folder from the unpack. It also assumes that mysqldump, tar and wget are available in your shell.</p>
<p>Also, I don&#8217;t just do this on live. I back up my live, put it on my <a href="http://www.inanger.com/category/development/portable-development/">portable instance</a> and test the new version first. Then I do it on live. Then I update the versions of my plugins.</p>
<p>What an arse. This is why <a href="http://www.inanger.com/anger-management/wordpressvsgeeklog/">I prefer Geeklog</a>. It&#8217;s more secure and doesn&#8217;t change at an alarming rate.</p>
<p>Now I can SSH into my server and type ./upgradewordpress.sh when I&#8217;m ready then hit http://inanger.com/[secretlocationofadmin]/wp-upgrade.php and finish things off. Job done. I still have a pain in the rear as I have to test the release locally first (./upgradewordpress.sh on local instance of course, after restoring a fresh backup of live into it and adjusting the config to refer to my local instance).</p>
<p>And I think this is less risky than tracking Wordpress via SVN on live.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/anger-management/easywordpressupgrade/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>Stretch For Some Breadth</title>
		<link>http://www.inanger.com/opinion/stretchwide/</link>
		<comments>http://www.inanger.com/opinion/stretchwide/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 20:17:21 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.inanger.com/opinion/stretchwide/</guid>
		<description><![CDATA[Jeremy Jarrell is Stretching Out for some Breadth. Here here!
]]></description>
			<content:encoded><![CDATA[<p><a href="http://jeremyjarrell.com/archive/2008/01/29/80.aspx" target="_blank">Jeremy Jarrell</a> is <a href="http://jeremyjarrell.com/archive/2008/01/29/80.aspx" target="_blank">Stretching Out</a> for some <a href="http://www.inanger.com/languages/itsaboutbreadth/">Breadth</a>. Here here!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/opinion/stretchwide/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>Database Change Control</title>
		<link>http://www.inanger.com/development/databasechangecontrol/</link>
		<comments>http://www.inanger.com/development/databasechangecontrol/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 20:12:40 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Methodology]]></category>

		<category><![CDATA[Opinion]]></category>

		<category><![CDATA[change control]]></category>

		<category><![CDATA[database]]></category>

		<category><![CDATA[database change control]]></category>

		<guid isPermaLink="false">http://www.inanger.com/development/databasechangecontrol/</guid>
		<description><![CDATA[K. Scott Allen recently published a five part series on the importance of version control in creating and maintaining the database behind your product. This starts with something pretty important and fundamental, three rules for database work. Rules #2 and #3 are vital. No argument there. Rule #1 I&#8217;ll come to later. Jeff Atwood has [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://odetocode.com/blogs/scott/default.aspx" title="Visit K. Scott Allen's blog." target="_blank">K. Scott Allen</a> recently published a five part series on the importance of version control in creating and maintaining the database behind your product. This starts with something pretty important and fundamental, <a href="http://odetocode.com/Blogs/scott/archive/2008/01/30/11702.aspx" title="View the first article." target="_blank">three rules for database work</a>. Rules #2 and #3 are vital. No argument there. Rule #1 I&#8217;ll come to later. Jeff Atwood has also <a href="http://www.codinghorror.com/blog/archives/000743.html" title="View Jeff's original post." target="_blank">written on the subject before</a>, and <a href="http://www.codinghorror.com/blog/archives/001050.html" title="View the reprise." target="_blank">highlighted</a> his previous post and a few further comments in support of what K. Scott Allen had written in an apparently unscheduled post on his blog. Looking at the trackbacks and comments on the posts, this appears to have generated a lot of interest, and I feel compelled to critique the posts.</p>
<p>Firstly, you <em>must</em> get your database under version control if you <em>ever</em> plan on releasing more than one version. You must have an authoritative source of schema and procedures etc,  you must do versioned releases. This is not in contention. But other points in K&#8217;s series and Jeff&#8217;s unquestioning support for this are.</p>
<p>Secondly, some background,  I&#8217;m a Development Manager for a Microsoft Technology Stack web based application which is maintained and released as a product. We have a lot of tables, a <em>lot</em> of stored procedures and other database entities. And a lot of developers.</p>
<p>Taking the approaches outlined by K in his posts on <a href="http://odetocode.com/Blogs/scott/archive/2008/02/02/11721.aspx" target="_blank">Change Scripts</a> and <a href="http://odetocode.com/Blogs/scott/archive/2008/02/02/11737.aspx" target="_blank">Views, Stored Procedures and the Like</a> on face value, they are hopeless. They&#8217;ll get you into trouble. Fast.</p>
<p>K&#8217;s process is one script for the database schema and one script per stored procedure in the master definition. He then references Phil Haack&#8217;s <a href="http://haacked.com/archive/2006/07/05/bulletproofsqlchangescriptsusinginformation_schemaviews.aspx" target="_blank">Bullet Proof Sql Change Scripts</a> post for an idea of how to provide better change programs than his simplistic ones.</p>
<p>Phil&#8217;s stuff is good in principle, making sure that your SQL Change Scripts can execute many times, but, they are laborious. We&#8217;ve rolled all the checks you could possibly want into a set of functions dbo.ColumnExists(TableName, ColumnName). dbo.IndexExists(IndexName, TableName) etc.</p>
<p>But with a system like ours with thousands of stored procedures (literally) and doing a re-deploy of all sps is painful. So we script only the updates and roll them out. But that will be a lot of updates in a release designed to take any version of our oldest supported version up to our newest major release (iApplication XP Panoramic Web 2.0 Version). Executing each of these individually and tracking the results is a hassle.</p>
<p>The next step is to roll these scripts together into one to make a quick deployment, just get the installer/dba to execute &#8220;Update_1.1.0.1.sql&#8221; on the target database and there you go. *</p>
<p>Only that&#8217;s when it gets really problematic. SQL Query Optimiser pulls the rug out from under your feet. What it will do is <em>change</em> the order of execution to optimise it. It&#8217;ll create new tables, add rows and script stored procedures at times to suit it&#8217;s own optimisation desires. And then everything will fail. Columns won&#8217;t exist, so stored procedures won&#8217;t compile. Views will fail. Commands to add indexes will explode. There will be bits of schema all over the place.</p>
<p>So then you have to wrap every alter table command, every DROP usp_ and CREATE usp_ in sp_executeSQL. Which means you have to escape every &#8216; character correctly. So then you need to write a tool to generate the change scripts cleanly.</p>
<p>Then, you find that if you are executing hundreds of changes in batch in a single change program, you&#8217;ll find that it&#8217;s hard to stop a change logging itself when only part has fallen over, so then you have to wrap each item in a check for @@ERROR to see if anything went wrong. And wrap the whole lot in a transaction and roll that back if any errors happened at all.</p>
<p>Right, so now we have something approaching bullet proof. Now we need to make sure our team of developers do it right every time. We write a process document and run a training session. We explain how each development starts with getting the latest SP/Table definition from Source Control making your changes, generating your change program. That your change program must be tested and shown to execute cleanly leaving the full trace etc, and must contain the right assigned version number.</p>
<blockquote><p>Whoever writes this change script will test it thoroughly and against a variety of test data, then commit the change script into source control. The schema change is officially published. The schema change will start to appear in developer workspaces as they update from source control, and on test machines as new builds are pushed into QA and beyond.</p></blockquote>
<p>That just doesn&#8217;t work. You will despair as even your best guru programmers, the ones who really care about their craft, make mistakes and take short-cuts because the process is onerous and is seen as a tax. So then you need to have a nightly build process that restores a clean database, executes every change against it, checks the results and the database. That runs a parse on the change program beyond the SQL Execution to make sure the rules are adhered to and Change_1_0_1_0_2.sql actually records itself as 1.0.1.0.2 and not 2.0.1.3.4 which is it&#8217;s number on a different branch etc etc. K&#8217;s text is incredibly hand-wavy.</p>
<blockquote><p><strong>    1. Never use a shared database server for development work.</strong></p>
<p>The convenience of a shared database is tempting. All developers point their workstations to a single database server where they can test and make schema changes. The shared server functions as an authoritative source for the database schema, and schema changes appear immediately to all team members. The shared database also serves as a central repository for test data.</p>
<p>Like many conveniences in software development, a shared database is a tar pit waiting to fossilize a project. Developers overwrite each other&#8217;s changes. The changes I make on the server break the code on your development machine. Remote development is slow and difficult.</p>
<p>Avoid using a shared database at all costs, as they ultimately waste time and help produce bugs.</p></blockquote>
<p>So having a single instance per developer on their local machine is a panacea for all your &#8220;shared database&#8221; problems. All those bugs created by people over-writing each other&#8217;s schema changes etc.</p>
<p>What about when a developer neglects to update their local instance and produces a fix based on an out-dated schema or stored procedure? Same thing. How do you ensure all your developers are keeping their local instance sufficiently up to date? Auto-update their instances with each commit as it&#8217;s stabilised? What if that wipes out their changes?</p>
<p>I&#8217;m not saying a shared database solves these issues, or that you won&#8217;t run into the issues he mentions on your shared database. But it&#8217;s only one point to control. We periodically re-stabilise our test and development databases where developers are patching their work for peer testing. We&#8217;re working on improving this process all the time. Some development requires an isolated environment to avoid breaking <em>everyone&#8217;s</em> ability to work, and they do have isolated local environments, but only for the length of that development.</p>
<p>Database version management is an <em>incredibly</em> hard problem to resolve. And although getting people started with it as K and Jeff have done is good, it&#8217;s not enough. You have to go further. And if you&#8217;ve gone further than us, please tell me where we go next!</p>
<p>* - (Using isql with the right voodoo to supress all the line numbers and pointless messages just leaving us the completion state, piping the output to a text file which we can parse to ensure that everything completed AOK and the database is not left in an inconsistent state, prior to us then needing to validate that the database IS actually in a decent state and the scripts haven&#8217;t falsely reported success&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/development/databasechangecontrol/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>It&#8217;s About Breadth</title>
		<link>http://www.inanger.com/languages/itsaboutbreadth/</link>
		<comments>http://www.inanger.com/languages/itsaboutbreadth/#comments</comments>
		<pubDate>Thu, 31 Jan 2008 12:55:48 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Languages]]></category>

		<category><![CDATA[Opinion]]></category>

		<guid isPermaLink="false">http://www.inanger.com/languages/itsaboutbreadth/</guid>
		<description><![CDATA[I was reading a blog entry about hot technology in Java over at Manageability.org. The second paragraph in the entry slapped me out of my non-blogging frenzy with it&#8217;s wrongness.
It&#8217;s been suggested that Polyglot programming be in the list. Even though I do subscribe to the notion that learning other languages are beneficial to one&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading a blog entry about hot technology in Java over at <a href="http://www.manageability.org/blog/stuff/top-five-java-that-did-not-make-the-list" title="Top 5 Java Technologies That DiD Not Make The List" target="_blank">Manageability.org</a>. The second paragraph in the entry slapped me out of my non-blogging frenzy with it&#8217;s wrongness.</p>
<blockquote><p>It&#8217;s been suggested that Polyglot programming be in the list. Even though I do subscribe to the notion that learning other languages are beneficial to one&#8217;s craft, it simply is not pragmatic advice. It is not practical to recommend that someone study Ruby, Groovy, Scala and who knows what other language is vying for your attention. Stick to a couple of languages and do it well. Some languages are better than others for certain tasks. However the biggest fallacy of all is that, a dynamic language is not considerably better than a static one. It&#8217;s no magic bullet.</p></blockquote>
<p>The main thing to note, is the paragraph is not <em>completely</em> wrong. The author does note that &#8220;the notion that learning other languages are beneficial to one&#8217;s craft&#8221;, but unfortunately caveats that with it&#8217;s just not pragmatic or practical and that the reader should stick to a &#8220;couple&#8221; of languages.</p>
<p>I strongly disagree.</p>
<p>As a professional programmer, in your day job you should code in one technology set. Note I say technology set, not language. For some that <em>may</em> be one language. For others that may be several. For me, the last time I was a hands-on-programmer as my day job, that was Javascript, CSS, XHTML, ASP(VBScript), Visual Basic 6 and T-SQL.</p>
<p>You should strive for a <em>deep</em> and <em>complete</em> depth of understanding of that technology set. This should clearly start with a basic competency of the limited set of those technologies that relate to the product/project you are working on. But you should deepen and broaden this understanding as fast and well as humanly possible.</p>
<p>You should know how to do anything that VB6 can do, not just within the context of your web development. You will need to learn the aspects of VB6 programming that can never be used in a web context, but along the way, you will learn many things you would not have otherwise learnt. These things may be things you can directly use in a web context, or things that just improve your approach to problem solving, design and development issues, a fresh perspective on the language.</p>
<p>The next step from here is to take that solid grounding in your primary weapon and mature and expand it with exposure to other languages and technologies.</p>
<p>The development communities around each language are akin to separate nations. Sometimes diplomatic channels are open and citizens freely move between the nations. Other times there is open hostility. Each nation has it&#8217;s own way of life. There is always some common ground between all languages, but, often between them they have vastly differing ways of approaching a common problem. Continual exposure to these different languages opens you up to more ways to solve the problems you are faced with. You will be able to deal with a vastly wider range of problems as a result.</p>
<p>And this is a <em>critical</em> skill to develop.</p>
<p>Do not let yourself become an island nation. Have that deep mastery of a key language/technology set and use it daily, but make sure you are also<em> constantly</em> looking around for other languages and ideas to broaden your understanding of your craft. Travel widely. Use the languages for &#8220;real&#8221; in anger development to really understand the different pain points. Ruby may solve one pain for you at the cost of other deeper pains.</p>
<p>Without you, and people like you, doing this language tourism, building this breadth, there won&#8217;t be a new top 5 interesting technologies in [whatever language] in 2009, because the [whatever language] community will stagnate as it examines it&#8217;s own navel.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/languages/itsaboutbreadth/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>Caching Using Zend</title>
		<link>http://www.inanger.com/languages/php/caching-using-zend/</link>
		<comments>http://www.inanger.com/languages/php/caching-using-zend/#comments</comments>
		<pubDate>Mon, 22 Oct 2007 19:01:42 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Applications &amp; Frameworks]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[cache]]></category>

		<category><![CDATA[framework]]></category>

		<category><![CDATA[zend]]></category>

		<category><![CDATA[zend_cache]]></category>

		<guid isPermaLink="false">http://www.inanger.com/languages/php/caching-using-zend/</guid>
		<description><![CDATA[The Zend Framework provides an interesting set of PHP5 libraries for caching. There&#8217;s a nice architecture to it, providing a number of different backends and frontends for caching. However, I recently found it very frustrating to try and figure out a decent caching strategy for the new version of a site I was working on.
And [...]]]></description>
			<content:encoded><![CDATA[<p>The Zend Framework provides an interesting set of PHP5 libraries for caching. There&#8217;s a nice architecture to it, providing a number of different backends and frontends for caching. However, I recently found it very frustrating to try and figure out a decent caching strategy for the new version of a site I was working on.</p>
<p>And the documentation did not help at all. So, allow me to elaborate for the benefit of the huddled masses.</p>
<p>The <a href="http://framework.zend.com/manual/en/zend.cache.html#zend.cache.introduction" target="_blank">introduction</a> in the caching section of the manual gives a decent enough overview of the basics, if I want to cache a page with a nice simple ID, such as &#8220;Page1&#8243; with a set lifetime I can do so in a few lines of code.</p>
<p>However, another <a href="http://framework.zend.com/manual/en/zend.cache.theory.html#zend.cache.tags" target="_blank">page</a> goes on to mention how you can also &#8220;tag&#8221; records with multiple tags. Another <a href="http://framework.zend.com/manual/en/zend.cache.theory.html#zend.cache.clean" target="_blank">page</a> talks about how to clear the cache by a single tag, or combination of tags.</p>
<p>But nothing explains the relationships between tags and ids, and how the clear works with tags or ids.</p>
<p>Now, I&#8217;m working on a system which has two views of a music catalogue for a radio station. There is the requests system and there is the discography system. They both present differing views of the same data. The request system filters the list of artists, albums and tracks on the station to those that can be requested and displays a &#8220;request optimised&#8221; set of screens with some of the data. The discography section shows everything about an artist, all their albums, all tracks, reviews and so forth, without the cruft needed for the request sub-system.</p>
<p>We cache these screens for obvious reasons. What we need is the ability to clear the cache of an artist, album or track possibly within the requests or the discography, or both. So, I figured on a system of unique keys like artist_123 and album_123 etc then to use the tags to &#8220;lump&#8221; things together. So album_123 would have the artist_123 tag in both discography and request view plus the discography tag in the discography and the requests tag in the requests view. Something like:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$cache</span>-&gt;<span style="color: #006600;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;album_123&quot;</span>, <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;album_123&quot;</span>, <span style="color: #ff0000;">&quot;artist_123&quot;</span>, <span style="color: #ff0000;">&quot;requests&quot;</span>, <span style="color: #ff0000;">&quot;en_GB&quot;</span>, <span style="color: #ff0000;">&quot;album&quot;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>I could then simply invalidate the cache of all albums, request pages, artist_123 pages or British English generated pages or any combination of those items</p>
<p>This does not work.</p>
<p>The first important thing is that the ID is the unique key. Not the combination of the ID and the tag(s). So if you save page1 to the cache with the tags tag1 and tag2, then try and load page1 from the cache with tags tag3 and tag4, you&#8217;ll get the result of saving with tag1 and tag2!</p>
<p>Insane, but true. Try it. The tag has no effect whatsoever it seems on the load code. If it can find an item by ID, then it loads it, irrespective of tags. I&#8217;m not sure if this is behaviour by design, or a bug on my system using the file backend, but it is consistent. I just think it&#8217;s mad.</p>
<p>To get what I desire, I&#8217;m going to have to cache with:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$cache</span>-&gt;<span style="color: #006600;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;requests_artist_123_album_123_en_GB&quot;</span>, <span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;requests&quot;</span>, <span style="color: #ff0000;">&quot;artist_123&quot;</span>, <span style="color: #ff0000;">&quot;album_123&quot;</span>, <span style="color: #ff0000;">&quot;en_GB&quot;</span>, <span style="color: #ff0000;">&quot;albums&quot;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Then I can still do a clear on the appropriate tags, if for example I want to remove all albums from the requests cache:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span style="color: #0000ff;">$cache</span>-&gt;<span style="color: #006600;">clean</span><span style="color: #66cc66;">&#40;</span>Zend_Cache::<span style="color: #006600;">CLEANING_MODE_MATCHING_TAG</span>, <span style="color: #66cc66;">&#40;</span><span style="color: #000066;">array</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;requests&quot;</span>,<span style="color: #ff0000;">&quot;albums&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>It&#8217;s a bit of a pain in the rear, but, once you&#8217;ve figured out the $tags argument on the load method is pointless, it&#8217;s fine.</p>
<p>Of course, figuring all this out was further compicated by the fact that the  examples in the manual often use load() with $key and $tags and save() with no arguments. I assumed therefore that the point of the $tags argument on load() was to set the tags that would be used auto-magically on save(). Only, if you don&#8217;t pass $tags to save() it saves with no tags. Which is also silly, since it does respect the $key used in the load() method.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/languages/php/caching-using-zend/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>The Wrong Answer to the Right Question?</title>
		<link>http://www.inanger.com/development/applications-frameworks/the-wrong-answer-to-the-right-question/</link>
		<comments>http://www.inanger.com/development/applications-frameworks/the-wrong-answer-to-the-right-question/#comments</comments>
		<pubDate>Sat, 29 Sep 2007 07:07:48 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Applications &amp; Frameworks]]></category>

		<category><![CDATA[Opinion]]></category>

		<category><![CDATA[excel]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.inanger.com/development/applications-frameworks/the-wrong-answer-to-the-right-question/</guid>
		<description><![CDATA[I&#8217;m often faced with the need to do a one off crunch of data to provide answers to questions management ask about raw data. Not the kind of thing they&#8217;ll be asking for on a regular basis. Just a need to scratch an individual itch. One off reports on specific aspects of code metrics. Calculate [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m often faced with the need to do a one off crunch of data to provide answers to questions management ask about raw data. Not the kind of thing they&#8217;ll be asking for on a regular basis. Just a need to scratch an individual itch. One off reports on specific aspects of code metrics. Calculate some predictions of data growth in the application across different aspects of it&#8217;s user base.</p>
<p>On these occasions, I either turn to Query Analyser to mine our SQL Server databases directly, or use the data import tool in Excel and try and crunch the data swiftly in that. Sometimes, those needs become a long running need to manage some data, where Excel is often the preferred format, because I can do some initial crunching and manage the data in there and the rest of management can then take a copy and further manipulate it and play with it to get additional information as and when it occurs to them they need it.</p>
<p>The problem I face is that Excel is designed for accountants and management types with no programming knowledge to manage spreadsheets of data they understand. It&#8217;s too damn user friendly. I find it very hard sometimes to find a good way to manage my data in Excel. I often throw my hands up in dispaire and lash up a software tool specifically to manage the data. I&#8217;m talking about a full on database driven web application in most cases. It&#8217;s so much faster for me to work with the data that way, and I can then use the Data Import tool in Excel to shove the data in raw forms into spreadsheets if the people asking for the data want to take it away and play with it.</p>
<p>There has to be a better way. There has to be a more productive way for me to do this. A more developer focussed tool for doing this, that allows you to achieve with scripting/programming what you would achieve in Excel by mucking around with excessively user friendly wizards and obscure dialogue screens.</p>
<p>John Udell <a href="http://blog.jonudell.net/2007/09/27/first-look-at-resolver-an-ironpython-based-spreadsheet/" target="_blank">thinks</a> the answer might look something like Resolver, which is a new spreadsheet application written in Python that allows you to use Python directly in cells and to have full access to .NET and IronPython through the whole application.</p>
<p>This just seems to be the wrong solution to me. With Excel we have a spreadsheet product that is so good it&#8217;s destroyed all competition that non-programmers use and love. It can be extended by programmers with add-ins and macros. You can write .NET code or VBA code (easy for non-programmers to learn) in the Macros etc. However, the formulae are restricted to the old style &#8220;icky&#8221; functions. Stick=if(condition,forumlae,formulae) in, which just makes programmers recoil from the keyboard in horror.</p>
<p>The <em>right</em> answer to the question is to have a simple option to enable direct access to the .NET runtime in cells. Then people can code formulae in any .NET enabled language they choose, including IronPython.</p>
<p>Do not throw the baby out with the bathwater.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/development/applications-frameworks/the-wrong-answer-to-the-right-question/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>Contents of Your Résumé II: Conflicts</title>
		<link>http://www.inanger.com/opinion/contentsofresume2/</link>
		<comments>http://www.inanger.com/opinion/contentsofresume2/#comments</comments>
		<pubDate>Wed, 26 Sep 2007 18:12:58 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Career]]></category>

		<category><![CDATA[Opinion]]></category>

		<category><![CDATA[cv]]></category>

		<category><![CDATA[jobs]]></category>

		<category><![CDATA[recruitment]]></category>

		<category><![CDATA[resume]]></category>

		<guid isPermaLink="false">http://www.inanger.com/opinion/contentsofresume2/</guid>
		<description><![CDATA[Having said only the other week that there is no correct answer to the question of what should go in your résumé, Steve Yegge has chimed in with his article ten tips for a (slightly )less awful resume.
Steve starts out, much like I did by pointing out that what he says only relates to recruiting [...]]]></description>
			<content:encoded><![CDATA[<p>Having said only the other week that <a href="http://www.inanger.com/career/contentsofresume/" title="View article">there is no correct answer</a> to the question of what should go in your résumé, <a href="http://steve-yegge.blogspot.com" title="View Steve's blog" target="_blank">Steve Yegge</a> has chimed in with his article <a href="http://steve-yegge.blogspot.com/2007/09/ten-tips-for-slightly-less-awful-resume.html" title="View Steve's full article." target="_blank">ten tips for a (slightly )less awful resume</a>.</p>
<p>Steve starts out, much like I did by pointing out that what he says only relates to recruiting people for the kinds of places he works, and may not apply outside of the recruitment of technical people for companies that produce their own software, and even within that niche, may not apply to everyone:</p>
<blockquote><p> I&#8217;m just talking about software engineer resumes today, and specifically just the subset intended for applying to companies that build their own software. I have no idea how much (if at all) this stuff applies to resumes for other kinds of positions, or companies. Maybe not much. Sorry!</p></blockquote>
<p>It seems the companies he&#8217;s worked for take a different approach to reviewing CVs to any company I&#8217;ve ever worked for. It seems they have a large CV screening panel, phone screens (possibly multiples) and multiple panel interview sessions. We do it differently.</p>
<p>Steve&#8217;s first point is right, in bullet form, no-one cares about you <em>yet</em>, but he also suggest stripping out anything with personality in it. Which I disagree with strongly. I do want to know what you&#8217;re like other than as a professional software engineer. I recently came across a candidate who was a <a href="http://en.wikipedia.org/wiki/Reiki">Reiki healer</a> and psychic reader. Who offered his services for £25 an hour <em>over MSN or email</em>. This information was gleaned from &#8220;personal interests&#8221; on his CV and listing his personal webpage address. Valuable information saving me from interviewing a total fruit-cake.</p>
<p>Steve&#8217;s point 2 asks for unformatted ASCII CVs. This is because where he works they pump them through automated manglers. That is not true anywhere I&#8217;ve applied for a job or worked in my life. It&#8217;s true that Pimps screw them up, something I was planning on writing about soon, but, in general I&#8217;d prefer to see a nicely formatted word doc, that has had some care and attention lavished on it than a nasty plain .txt file.</p>
<p>Points 3, 4 and 5 have merit. Don&#8217;t set off my bullshit detector with too much weasel and wank talk. Make sure it&#8217;s spelling and grammar checked, if it&#8217;s a word doc, and a UK install f Word has put a red squiggle under anything other than an obscure techie term, you&#8217;re a moron. But, don&#8217;t rely on the spell checked, I&#8217;ve seen far too many CVs with spell-checking mistakes.</p>
<p>However, my biggest contention is point 6, certified looser. If you are a contractor, get certifications, do them in your own time, it shows your skill, gives me more confidence you have at least a basic level of understanding of the subject and technology. A safety net. it&#8217;s also quite common for UK companies to put people through certification courses to ensure their staff have that rounded skillset, that they know the right way of doing things, and to give the employee something back to move their career on. Certification is great.</p>
<p>But, just a few things there, the certifications, the format of the cv, the lack of personal information. Submit a &#8220;perfect for Steve&#8221; CV to me and I&#8217;ll reject you. Submit a perfect for CV to Steve and he&#8217;ll reject you. It&#8217;s impossible to get this right. The single best tip in Steve&#8217;s article?</p>
<blockquote><p> You can apply for 18 jobs, but you should send 18 different resumes, each targeted at that job, and you shouldn&#8217;t send them all at once.</p></blockquote>
<p>Tailor it for the job. It&#8217;s web development? Emphasis your experience in that area, and trim down the references to the Linux Device Driver work you&#8217;ve done. And try and get a feel for the company you&#8217;re applying for. If it&#8217;s a Big One, like IBM, Microsoft, Amazon, Google etc, there is plenty you can find out about what the recruiters are looking for. Talk to the Pimp, ask them what kind of CV the recruiting managers like to see.</p>
<p>Do your research first, it really helps.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/opinion/contentsofresume2/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
		<item>
		<title>Contents of Your Résumé</title>
		<link>http://www.inanger.com/opinion/contentsofresume/</link>
		<comments>http://www.inanger.com/opinion/contentsofresume/#comments</comments>
		<pubDate>Sat, 15 Sep 2007 14:09:21 +0000</pubDate>
		<dc:creator>THEMike</dc:creator>
		
		<category><![CDATA[Career]]></category>

		<category><![CDATA[Opinion]]></category>

		<category><![CDATA[cv]]></category>

		<category><![CDATA[jobs]]></category>

		<category><![CDATA[recruitment]]></category>

		<category><![CDATA[resume]]></category>

		<guid isPermaLink="false">http://www.inanger.com/opinion/contentsofresume/</guid>
		<description><![CDATA[A very popular question people ask is &#8220;what should I put in my C.V?&#8221;, the problem is, there is no correct answer to that question. There are a few consistent formats I see to the documents I see, but no set pattern I can figure out behind what has caused people to use that pattern.
Two [...]]]></description>
			<content:encoded><![CDATA[<p>A very popular question people ask is <em>&#8220;what should I put in my C.V?&#8221;</em>, the problem is, there is no correct answer to that question. There are a few consistent formats I see to the documents I see, but no set pattern I can figure out behind what has caused people to use that pattern.</p>
<p>Two of the guys I&#8217;ve worked with in the past and have equally successful careers, following similar tracks, who are of similar age and position in their career, have totally different approaches. Clive goes for the &#8220;everything in a good level of detail&#8221; approach. Pete&#8217;s CV is two sides, and he thinks it needs trimming down.</p>
<p>I think Pete&#8217;s CV comes from the approach that it seems a number of managers take, they want to get the details quickly and don&#8217;t want to wade their way through a load of self-promoting rubbish to get to them. Clive&#8217;s approach comes from the desire to give all the information so that every base is covered and people won&#8217;t miss any of your brilliant skills.</p>
<p>Personally, as a recruiting manager, I like to see a good level of detail on a CV. I want enough to really know whether it&#8217;s worth seeing the candidate or no. I want to get a feel for the candidate in advance. I want a chance for them to make mistakes.</p>
<p>But not all managers want that. They follow the Pimp Path, they want to find a few keywords, such as 10+ Years C++ experience on Windows Drivers. Or whatever. If they can&#8217;t get this information, they&#8217;ll reject the C.V.</p>
<p>The big problem is you don&#8217;t know what kind of manager your C.V. is going to.</p>
<p>I&#8217;m starting to come down in favour of a hybrid approach. The first page of the C.V. should be a totally lightweight highlights and basic facts page. With detail to follow.</p>
<p>Something that is also important to understand is what information you do need on the C.V., what order and level of detail to present it, and unfortunately that changes based on where you are in your career. For a graduate, clearly education history should come first, it&#8217;s the most relevant information. For an experienced engineer, the education history gradually becomes less and less important. But I still feel it&#8217;s necessary to include that information.</p>
<p>I think a front page should probably detail personal details, in a small contained area, current role and a brief statement of what you&#8217;re looking to achieve in your career. If there is room, a brief summary of key technical skills. Brief please, and the key ones. Not an exhaustive list of everything you&#8217;ve ever worked with.</p>
<p>Then, follow this with a career history, education history and some personal stuff.</p>
<p>With the later part, people are rather conflicted on too. Some people think a bit of &#8220;personal interests&#8221; adds something to a CV, others think it&#8217;s a no-no. Which seems odd, because technical skills are not everything, you also need to know if that person is going to fit in with your team and company. Are they going to have the right attitude to work? All information that can be indicated very roughly from the information given there.</p>
<p>So, summary, and then a set of detail. Attempting to keep as many people happy as possible. Really, an example would help. But I don&#8217;t have one to hand. And this is the worst article I&#8217;ve written ever. I&#8217;ll try and come back to it when I&#8217;m more alert.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.inanger.com/opinion/contentsofresume/feed/</wfw:commentRss>
	<creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/2.0/uk/</creativeCommons:license>
	</item>
	</channel>
</rss>
