<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Extensible Development &#187; Development</title>
	<atom:link href="http://blog.itwarlocks.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.itwarlocks.com</link>
	<description>Profession blog about Software Engineering, Web, *nix, Processes, Tools and more.</description>
	<lastBuildDate>Mon, 29 Mar 2010 12:20:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pig Latin</title>
		<link>http://blog.itwarlocks.com/2010/02/26/pig-latin/</link>
		<comments>http://blog.itwarlocks.com/2010/02/26/pig-latin/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 13:19:37 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://blog.itwarlocks.com/2010/02/26/pig-latin/">Jeffrey Ridout</span></dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[grid]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.itwarlocks.com/?p=306</guid>
		<description><![CDATA[I&#8217;ve been thinking about creating my own theme for WordPress for a while now — for over 1 year to be honest. —while looking at a few interesting designs to use as a base. I&#8217;m very interested in UX and UI Usability, but lousy at drawing and creating nice graphics. (I can use Photoshop and Fireworks, but the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking about creating my own theme for WordPress for a while now — for over 1 year to be honest. —while looking at a few interesting designs to use as a base. I&#8217;m very interested in <a id="aptureLink_YBcv0TSffH" href="http://en.wikipedia.org/wiki/User%20experience">UX</a> and <a id="aptureLink_oygLyJWPIf" href="http://en.wikipedia.org/wiki/Web%20usability">UI Usability</a>, but lousy at drawing and creating nice graphics. (I can use Photoshop and Fireworks, but the result is never what I had in my head, more like thinking about a Ferrari and ending up with a rusted VW Beetle.)<br />
<span id="more-306"></span>Here are a few designs I found interesting:</p>
<ul>
<li><a href="http://sixrevisions.com/tutorials/photoshop-tutorials/create-a-slick-and-minimalist-web-layout-in-photoshop/">Minimalist</a> by Mahmoud Khaled at <a href="http://sixrevisions.com/">Six Revisions</a></li>
<li><a href="http://sinthux.deviantart.com/art/Wordpress-79151963" target="_blank">Wordpress</a> by <a href="http://sinthux.deviantart.com/" target="_blank">=sinthux</a> at <a href="http://www.deviantart.com/" target="_blank">DeviantArt</a></li>
<li><a href="http://klosdafrau.deviantart.com/art/green-40893982" target="_blank">Green</a> by <a href="http://klosdafrau.deviantart.com/" target="_blank">~klosdafrau</a> at <a href="http://www.deviantart.com/" target="_blank">DeviantArt</a></li>
</ul>
<p>I like gray/dark professional looking styles and just love carbon steel, like iNove has.</p>
<p>As Usability and CSS expert, I like to use CSS grids. But most grids are based on hardcoded &#8216;px&#8217; values or &#8216;%&#8217;. Both have downsided. Using &#8216;px&#8217; makes the design scale badly, even though most modern browsers scale entire pages and not just the text, some browsers make mistakes when &#8216;px&#8217; is used. Using &#8216;%&#8217; will make most part scale better, but it&#8217;s harder to work with. Most Usability experts and guidelines suggest using &#8216;em&#8217;. I&#8217;m not going into the details of the &#8216;px&#8217; versus &#8216;em&#8217; debate, but I too prefer &#8216;em&#8217;. Today I found some time to invest into looking into the issue of CSS frameworks/grids and &#8216;em&#8217; again and found <a href="http://developer.yahoo.com/yui/grids/"><abbr title="Yahoo User Interface">YUI</abbr> 2 Grids CSS</a>. This seems to be a very nice grid system using &#8216;em&#8217;, so I&#8217;m definitely going to try that when creating my new theme.</p>
<p>While reading about YUI 2&#8217;s Grids CSS and took a look att some examples. Using Google Chrome and looking at the examples, my chrome asked if it should translate the examples from Spanish. Since the examples use Lorem Ipsum text, there is no Spanish present, mistake 1. You can tell the automatic language detection in Chrome what language the page is in by selecting the right language from the drop-down menu. Shame there&#8217;s no &#8216;Latin&#8217; in the list, mistake 2. Quite an amusing bug, but also quite astonishing that Latin is not in Google Translate&#8217;s repertoire.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.itwarlocks.com/2010/02/26/pig-latin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pretty tag cloud: Stage 1</title>
		<link>http://blog.itwarlocks.com/2010/01/05/pretty-tag-cloud-stage-1/</link>
		<comments>http://blog.itwarlocks.com/2010/01/05/pretty-tag-cloud-stage-1/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 15:01:45 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://blog.itwarlocks.com/2010/01/05/pretty-tag-cloud-stage-1/">Jeffrey Ridout</span></dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.itwarlocks.com/?p=290</guid>
		<description><![CDATA[Introduction
As mentioned in my previous blog entry, I&#8217;ve been thinking about implementing a wordle/tagul plug-in for Wordpress using CSS3 only. I&#8217;ve just spent about 15 minutes experimenting and have already gotten quite far.
The tags
To make things simple I&#8217;ve taken the HTML from my own tag cloud, although slightly modified. For CSS3 to work, the tags [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>As mentioned in my previous blog entry, I&#8217;ve been thinking about implementing a wordle/tagul plug-in for Wordpress using CSS3 only. I&#8217;ve just spent about 15 minutes experimenting and have already gotten quite far.<span id="more-290"></span></p>
<h3>The tags</h3>
<p>To make things simple I&#8217;ve taken the HTML from my own tag cloud, although slightly modified. For CSS3 to work, the tags need to be divided into groups for colour and size, tag-grp-# and tag-score-#.</p>
<pre class="brush: html; collapse: true">
&amp;lt;div class=&amp;quot;widget widget_tag_cloud&amp;quot; id=&amp;quot;tag_cloud-2&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;Tags&amp;lt;/h3&amp;gt;
	&amp;lt;div&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-13 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/agile/&amp;quot;&amp;gt;agile&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-31 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/apache/&amp;quot;&amp;gt;apache&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-30 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/authentication/&amp;quot;&amp;gt;authentication&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-11 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/blog/&amp;quot;&amp;gt;blog&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-5 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/development/&amp;quot;&amp;gt;Development&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-26 tag-grp-3&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/economy/&amp;quot;&amp;gt;economy&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-21 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/extensibility/&amp;quot;&amp;gt;extensibility&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-15 tag-grp-3&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/filosophy/&amp;quot;&amp;gt;filosophy&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-49 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/gnutls/&amp;quot;&amp;gt;gnutls&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-16 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/gui/&amp;quot;&amp;gt;GUI&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-62 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/http/&amp;quot;&amp;gt;http&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-63 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/https/&amp;quot;&amp;gt;https&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-27 tag-grp-3&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/humanresources/&amp;quot;&amp;gt;humanresources&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-28 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/innovation/&amp;quot;&amp;gt;innovation&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-50 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/javascript/&amp;quot;&amp;gt;JavaScript&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-17 tag-grp-3&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/leadership/&amp;quot;&amp;gt;leadership&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-19 tag-grp-3&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/management/&amp;quot;&amp;gt;management&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-34 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/mod_auth/&amp;quot;&amp;gt;mod_auth&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-35 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/mod_auth_script/&amp;quot;&amp;gt;mod_auth_script&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-32 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/mod_dav/&amp;quot;&amp;gt;mod_dav&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-52 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/mod_gnutls/&amp;quot;&amp;gt;mod_gnutls&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-64 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/mod_ssl/&amp;quot;&amp;gt;mod_ssl&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-36 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/office/&amp;quot;&amp;gt;office&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-68 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/open-source/&amp;quot;&amp;gt;open source&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-53 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/openssl/&amp;quot;&amp;gt;openssl&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-24 tag-grp-3&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/organisation/&amp;quot;&amp;gt;organisation&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-29 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/php/&amp;quot;&amp;gt;php&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-9 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/principles/&amp;quot;&amp;gt;Principles&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-25 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/roi/&amp;quot;&amp;gt;roi&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-18 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/scm/&amp;quot;&amp;gt;SCM&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-14 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/scrum/&amp;quot;&amp;gt;scrum&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-12 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/software/&amp;quot;&amp;gt;software&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-56 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/ssl/&amp;quot;&amp;gt;ssl&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-20 tag-grp-3&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/testing/&amp;quot;&amp;gt;testing&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-23 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/thinktank/&amp;quot;&amp;gt;thinktank&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-65 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/tls/&amp;quot;&amp;gt;TLS&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-57 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/ubuntu/&amp;quot;&amp;gt;ubuntu&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-39 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/vba/&amp;quot;&amp;gt;vba&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-66 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/virtual-hosting/&amp;quot;&amp;gt;Virtual Hosting&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-38 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/visualbasic/&amp;quot;&amp;gt;visualbasic&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;3 topics&amp;quot; class=&amp;quot;tag-score-3 tag-link-33 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/webdav/&amp;quot;&amp;gt;WebDAV&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;1 topic&amp;quot; class=&amp;quot;tag-score-1 tag-link-40 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/windows/&amp;quot;&amp;gt;windows&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-37 tag-grp-1&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/word/&amp;quot;&amp;gt;word&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-86 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/wordpress/&amp;quot;&amp;gt;wordpress&amp;lt;/a&amp;gt;
		&amp;lt;a title=&amp;quot;2 topics&amp;quot; class=&amp;quot;tag-score-2 tag-link-60 tag-grp-2&amp;quot; href=&amp;quot;http://blog.itwarlocks.com/tag/zimbra/&amp;quot;&amp;gt;zimbra&amp;lt;/a&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
</pre>
<h3>The styling</h3>
<p>Using CSS3 techniques like transform and transition (-webkit-transform, -webkit-transition, -moz-transform) you can easily get the tags to change then moused over.</p>
<pre class="brush: css">
/* Generic styles */
body {
	font-family: Arial, Helvetica, Tahoma, sans-serif;
}
a {
	color: #2970A6;
}
/* Wordpress widget style */
.widget {
	padding: 10px 15px 16px;
	width: 400px;
	border: 1px solid #C0C0C0;
}
/* Pretty tag cloud */
.widget_tag_cloud a {
	/* Transform is only applied to block elements, inlineblock preserves the layout: */
	display: inline-block;
	text-decoration: none;
	/* Animate the transitions for color, background and transform: */
	-webkit-transition: color,background,-webkit-transform 1s,1s,0.5s ease-out;
	-moz-transition: color,background 1s ease-out;
}
.widget_tag_cloud a:hover {
	background: #808080;
	color: #FFFFFF;
	/*font-size: 22pt;*/
	padding: 0.5em;
	margin: -0.5em;
	opacity: 0.7;
	-webkit-border-radius: 0.5em;
	-moz-border-radius: 0.5em;
}
/* Tag score determins size.
 * We want the mouse over size to be the same,
 * so different scales for each.
 */
a.tag-score-1 {
	font-size: 0.8em;
}
a.tag-score-1:hover {
	-webkit-transform: scale(2.5) !important; /* 0.8 x 2.5 = 2.0 */
	-moz-transform: scale(2.5) !important;
}
a.tag-score-2 {
	font-size: 1.25em;
}
a.tag-score-2:hover {
	-webkit-transform: scale(1.6) !important; /* 1.25 x 1.6 = 2.0 */
	-moz-transform: scale(1.6) !important;
}
a.tag-score-3 {
	font-size: 2em;
}
a.tag-score-3:hover {
	-webkit-transform: scale(1) !important; /* 2.0 x 1.0 = 2.0 */
	-moz-transform: scale(1) !important;
}
/* Tag groups determine colour. */
a.tag-grp-1 {
	color: #2970A6;
}
a.tag-grp-2 {
	color: #5FC159;
}
a.tag-grp-3 {
	color: #F6872B;
}
/* Some randomly chosen tags to rotate. */
.tag-link-21,
.tag-link-35,
.tag-link-24,
.tag-link-68 {
	-webkit-transform: rotate(90deg);
	-moz-transform: rotate(90deg);
}
</pre>
<h3>The result</h3>
<ul>
<li><a title="Pretty tag cloud, stage 1" href="/lab/wordle/stage-1.html" target="_blank">Pretty tag cloud, stage 1</a><br />
(Only works perfectly in Webkit; Safari, Chrome and partially in Gecko; Mozilla, Firefox.)</li>
</ul>
<h3>Next step</h3>
<p>As can be seen, the layout of the tags is not right. This cannot be done with CSS, so this is where I&#8217;ll be using some jQuery in the next step. The biggest challenges will be the algorithm and font-size/letter calculations in the browser.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.itwarlocks.com/2010/01/05/pretty-tag-cloud-stage-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Advanced charts in Wordpress</title>
		<link>http://blog.itwarlocks.com/2009/12/17/advanced-charts-in-wordpress/</link>
		<comments>http://blog.itwarlocks.com/2009/12/17/advanced-charts-in-wordpress/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 14:11:06 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://blog.itwarlocks.com/2009/12/17/advanced-charts-in-wordpress/">Jeffrey Ridout</span></dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[charting]]></category>
		<category><![CDATA[highcharts]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.itwarlocks.com/?p=257</guid>
		<description><![CDATA[Introduction
I recently came across Highcharts, a great JavaScript library for creating charts. It uses canvas where it can, supports skins (easily changed with CSS). I&#8217;ve been searching/waiting for a decent JavaScript based charting API and it has finally arrived.
Seeing as I&#8217;m a wordpressaholic I&#8217;m of course going to try and get it into Wordpress. Although that [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>I recently <a title="Ajaxian: Highcharts, really nice charting API" href="http://ajaxian.com/archives/highcharts-really-nice-charting-api" target="_blank">came across</a> <a title="Highcharts, Interactive JavaScript Charting Library" href="http://highcharts.com/" target="_blank">Highcharts</a>, a great JavaScript library for creating charts. It uses <a id="aptureLink_taKFFEYWh6" href="http://en.wikipedia.org/wiki/Canvas%20%28HTML%20element%29">canvas</a> where it can, supports skins (easily changed with CSS). I&#8217;ve been searching/waiting for a decent JavaScript based charting API and it has finally arrived.</p>
<p>Seeing as I&#8217;m a wordpressaholic I&#8217;m of course going to try and get it into Wordpress. Although that might turn out to be quite more than I can chew.</p>
<p><span id="more-257"></span></p>
<h3>Data Source</h3>
<p>Highcharts can create charts from different sources; JSON, AJAX and HTML Tables. Each of which are actually scripted, but Highcharts has nice examples. For a Wordpress plug-in the most common source would be an existing HTML table. To be easily used as a source, it would require some structure. As an example I&#8217;ll take the <a title="Browser Statistics 2009" href="http://www.w3schools.com/browsers/browsers_stats.asp" target="_blank">Browser Statistics for 2009 from w3schools.com</a>.</p>
<p>Table:</p>
<pre class="brush: html">
&lt;table width=&quot;100%&quot; cellspacing=&quot;0&quot; id=&quot;chart-1-table&quot;&gt;
	&lt;caption&gt;
		&lt;h2 class=&quot;title&quot;&gt;Browser Statistics 2009&lt;/h2&gt;
		&lt;h3 class=&quot;subtitle&quot;&gt;Source: &lt;a href=&quot;http://www.w3schools.com/browsers/browsers_stats.asp&quot; title=&quot;Browser Statistics at w3schools.com&quot;&gt;w3schools.com&lt;/a&gt;&lt;/h3&gt;
	&lt;/caption&gt;
	&lt;colgroup class=&quot;chart-axis-x&quot;&gt;
		&lt;col width=&quot;16%&quot; align=&quot;left&quot; title=&quot;Month&quot;/&gt;
	&lt;/colgroup&gt;
	&lt;colgroup width=&quot;12%&quot; align=&quot;center&quot; class=&quot;chart-axis-y&quot;&gt;
		&lt;col title=&quot;Internet Explorer 6&quot;/&gt;
		&lt;col title=&quot;Internet Explorer 7&quot;/&gt;
		&lt;col title=&quot;Internet Explorer 8&quot;/&gt;
		&lt;col title=&quot;Firefox&quot;/&gt;
		&lt;col title=&quot;Chrome&quot;/&gt;
		&lt;col title=&quot;Safari&quot;/&gt;
		&lt;col title=&quot;Opera&quot;/&gt;
	&lt;/colgroup&gt;
	&lt;thead&gt;
		&lt;tr&gt;
			&lt;th&gt;2009&lt;/th&gt;
			&lt;th&gt;IE6&lt;/th&gt;
			&lt;th&gt;IE7&lt;/th&gt;
			&lt;th&gt;IE8&lt;/th&gt;
			&lt;th&gt;Firefox&lt;/th&gt;
			&lt;th&gt;Chrome&lt;/th&gt;
			&lt;th&gt;Safari&lt;/th&gt;
			&lt;th&gt;Opera&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;th&gt;November&lt;/th&gt;
			&lt;td&gt;13.3%&lt;/td&gt;
			&lt;td&gt;13.3%&lt;/td&gt;
			&lt;td&gt;11.1%&lt;/td&gt;
			&lt;td&gt;47.0%&lt;/td&gt;
			&lt;td&gt;8.5%&lt;/td&gt;
			&lt;td&gt;3.8%&lt;/td&gt;
			&lt;td&gt;2.3%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;October&lt;/th&gt;
			&lt;td&gt;12.8%&lt;/td&gt;
			&lt;td&gt;14.1%&lt;/td&gt;
			&lt;td&gt;10.6%&lt;/td&gt;
			&lt;td&gt;47.5%&lt;/td&gt;
			&lt;td&gt;8.0%&lt;/td&gt;
			&lt;td&gt;3.8%&lt;/td&gt;
			&lt;td&gt;2.3%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;September&lt;/th&gt;
			&lt;td&gt;12.2%&lt;/td&gt;
			&lt;td&gt;15.3%&lt;/td&gt;
			&lt;td&gt;12.1%&lt;/td&gt;
			&lt;td&gt;46.6%&lt;/td&gt;
			&lt;td&gt;7.1%&lt;/td&gt;
			&lt;td&gt;3.6%&lt;/td&gt;
			&lt;td&gt;2.2%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;August&lt;/th&gt;
			&lt;td&gt;10.6%&lt;/td&gt;
			&lt;td&gt;15.1%&lt;/td&gt;
			&lt;td&gt;13.6%&lt;/td&gt;
			&lt;td&gt;47.4%&lt;/td&gt;
			&lt;td&gt;7.0%&lt;/td&gt;
			&lt;td&gt;3.3%&lt;/td&gt;
			&lt;td&gt;2.1%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;July&lt;/th&gt;
			&lt;td&gt;9.1%&lt;/td&gt;
			&lt;td&gt;15.9%&lt;/td&gt;
			&lt;td&gt;14.4%&lt;/td&gt;
			&lt;td&gt;47.9%&lt;/td&gt;
			&lt;td&gt;6.5%&lt;/td&gt;
			&lt;td&gt;3.3%&lt;/td&gt;
			&lt;td&gt;2.1%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;June&lt;/th&gt;
			&lt;td&gt;7.1%&lt;/td&gt;
			&lt;td&gt;18.7%&lt;/td&gt;
			&lt;td&gt;14.9%&lt;/td&gt;
			&lt;td&gt;47.3%&lt;/td&gt;
			&lt;td&gt;6.0%&lt;/td&gt;
			&lt;td&gt;3.1%&lt;/td&gt;
			&lt;td&gt;2.1%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;May&lt;/th&gt;
			&lt;td&gt;5.2%&lt;/td&gt;
			&lt;td&gt;21.3%&lt;/td&gt;
			&lt;td&gt;14.5%&lt;/td&gt;
			&lt;td&gt;47.7%&lt;/td&gt;
			&lt;td&gt;5.5%&lt;/td&gt;
			&lt;td&gt;3.0%&lt;/td&gt;
			&lt;td&gt;2.2%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;April&lt;/th&gt;
			&lt;td&gt;3.5%&lt;/td&gt;
			&lt;td&gt;23.2%&lt;/td&gt;
			&lt;td&gt;15.4%&lt;/td&gt;
			&lt;td&gt;47.1%&lt;/td&gt;
			&lt;td&gt;4.9%&lt;/td&gt;
			&lt;td&gt;3.0%&lt;/td&gt;
			&lt;td&gt;2.2%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;March&lt;/th&gt;
			&lt;td&gt;1.4%&lt;/td&gt;
			&lt;td&gt;24.9%&lt;/td&gt;
			&lt;td&gt;17.0%&lt;/td&gt;
			&lt;td&gt;46.5%&lt;/td&gt;
			&lt;td&gt;4.2%&lt;/td&gt;
			&lt;td&gt;3.1%&lt;/td&gt;
			&lt;td&gt;2.3%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;February&lt;/th&gt;
			&lt;td&gt;0.8%&lt;/td&gt;
			&lt;td&gt;25.4%&lt;/td&gt;
			&lt;td&gt;17.4%&lt;/td&gt;
			&lt;td&gt;46.4%&lt;/td&gt;
			&lt;td&gt;4.0%&lt;/td&gt;
			&lt;td&gt;3.0%&lt;/td&gt;
			&lt;td&gt;2.2%&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;th&gt;January&lt;/th&gt;
			&lt;td&gt;0.6%&lt;/td&gt;
			&lt;td&gt;25.7%&lt;/td&gt;
			&lt;td&gt;18.5%&lt;/td&gt;
			&lt;td&gt;45.5%&lt;/td&gt;
			&lt;td&gt;3.9%&lt;/td&gt;
			&lt;td&gt;3.0%&lt;/td&gt;
			&lt;td&gt;2.3%&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
</pre>
<p>Style:</p>
<pre class="brush: css">
.chart table {
	margin: 0;
	padding: 0;
	font-size: 0.86em;
}
.chart table tr {
	line-height: 1.5em;
}
.chart table th,
.chart table td {
	padding: 0.5em;
	border-top: 1px solid #999999;
}
.chart table thead {
	background-color: #F0F0F0;
	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#E0E0E0), to(#FFFFFF));
}
.chart table thead th {
	border-bottom: 1px solid #999999;
	border-top: 1px solid #999999;
}
.chart table thead th:first-child,
.chart table tbody th {
	text-align: left;
}
.chart table tbody td {
	text-align: center;
}
.chart table h2.title {
	font-size: 1.2em;
	margin-bottom: 0px;
}
.chart table h3.subtitle {
	font-size: 0.86em;
	margin-top: 0px;
}
</pre>
<h3>Charting</h3>
<p>The Highcharts API has a lot of <a title="Hightcharts: Options Reference" href="http://www.highcharts.com/ref" target="_blank">options</a>, too much to mention here, but a few are key to working successfully with pre-existing tables. The examples don&#8217;t use jQuery to parse the HTML, but since both Wordpress and Highcharts use it, I will too. These properties are static in the examples, but were they&#8217;ll need to be more dynamic; <code>title</code>, <code>subtitle</code>, <code>xAxis</code>, <code>plotOptions.series</code>. These options can be obtained from the table text or structure.</p>
<p><code>title</code> and <code>subtitle</code> can be grabbed from the <code>&lt;caption&gt;</code>:</p>
<pre class="brush: javascript">
title: {
	text: (function(){
		var table = $(&#039;#chart-1-table&#039;);
		var title = $(&#039;caption .title&#039;, table);

		return title ? title.html() : &#039;&#039;;
	}())
},
subtitle: {
	text: (function(){
		var table = $(&#039;#chart-1-table&#039;);
		var subtitle = $(&#039;caption .subtitle&#039;, table);

		return subtitle ? subtitle.html() : &#039;&#039;;
	}())
},
</pre>
<p>Currently the title and subtitle are taken from tags with the &#8216;title&#8217; and &#8217;subtitle&#8217; classes, but just using H2 and H3 (or H1 and H2) would work too of course.</p>
<p><code>xAxis</code> as in the examples:</p>
<pre class="brush: javascript">
xAxis: {
	categories: [
		&#039;Jan&#039;, &#039;Feb&#039;, &#039;Mar&#039;, &#039;Apr&#039;, &#039;May&#039;, &#039;Jun&#039;,
		&#039;Jul&#039;, &#039;Aug&#039;, &#039;Sep&#039;, &#039;Oct&#039;, &#039;Nov&#039;, &#039;Dec&#039;
	],
	title: {
		text: &#039;Month&#039;
	}
}
</pre>
<p>Since we&#8217;ve got an existing table with labels, we can do it more dynamically.<br />
<code>xAxis</code> from existing table:</p>
<pre class="brush: javascript">
xAxis: {
	categories: (function(){
		var table = $(&#039;#chart-1-table&#039;);
		/*
		 * The first column in the table body uses &lt;TH&gt; tags,
		 * to separate them from data.
		 */
		var cats = $(&#039;tbody &gt; tr &gt; th&#039;, table)
			.map(function(){
				return $(this).text();
			});

		return $.makeArray(cats);
	}()),
	title: {
		text: &#039;Month&#039;
	}
}
</pre>
<p><code>map</code> allows you to turn the array with elements into an array with the actual text.</p>
<p><code>series</code> as in the examples:</p>
<pre class="brush: javascript">
series: [{
	name: &#039;November&#039;
}, {
	name: &#039;October&#039;
}, {
	name: &#039;September&#039;
}, {
	name: &#039;August&#039;
}, {
	name: &#039;July&#039;
}, {
	name: &#039;June&#039;
}, {
	name: &#039;May&#039;
}, {
	name: &#039;April&#039;
}, {
	name: &#039;March&#039;
}, {
	name: &#039;February&#039;
}, {
	name: &#039;January&#039;
}]
</pre>
<p>Since we&#8217;ve got an existing table with labels, we can do it more dynamically.<br />
<code>series</code> from existing table:</p>
<pre class="brush: javascript">
series: (function(){
	var result = [];

	var table = $(&#039;#chart-1-table&#039;);
	/*
	 * Get all the columns from the table head.
	 * Some tables have multiple rows in the header.
	 */
	var head = $(&#039;thead &gt; tr:last&#039;, table);
	/*
	 * Skip the first column, it&#039;s the Y-axis label.
	 */
	var columns = $(&#039;th:gt(0)&#039;, head);

	for (var i = 0, iMax = columns.length; i &lt; iMax; i++) {
		result.push(
			{
				name: $(columns[i]).text()
			}
		);
	};

	return result;
}())
</pre>
<p>And lastly the <code>plotOptions.dataParser</code> function:</p>
<pre class="brush: javascript">
dataParser: function(data) {
	var result = [];

	var table = $(&#039;#chart-1-table&#039;);

	/*
	 * The series are defined by names, so we need to check what series we&#039;re in.
	 */
	var head = $(&#039;thead &gt; tr:last&#039;, table);
	var column = $(&#039;th:gt(0)&#039;, head).map(function(){
		return $(this).text();
	}).index(this.options.name);

	/*
	 * Loop through all the data rows for this series.
	 */
	var rows = $(&#039;tbody &gt; tr&#039;, table);
	for (var i = 0, max = rows.length; i &lt; max; i++) {
		/*
		 * The first column (using a &lt;TH&gt; tag) contains the category name.
		 */
		var rowDate = $(&#039;th&#039;, rows[i]);
		if (rowDate.size() &gt; 1) {
			rowDate = rowDate[0];
		}
		rowDate = rowDate.text();

		/*
		 * Grab the cell in the right column for this series.
		 */
		var cell = $(&#039;td&#039;, rows[i])[column];
		cell = $(cell);

		/*
		 * Add an array to the result with the category name and cell value.
		 */
		result.push([
			rowDate,
			parseFloat(cell.text())
		]);
	}

	return result;
}
</pre>
<p>The code for above <code>dataParser</code> is very specific for tables using categories. Tables with a lot more data that use timestamp should use <code>xAxis.type = 'datetime'</code> and convert the value of the row header to a UTC date.</p>
<p>Compete code:</p>
<pre class="brush: javascript">
var chart1 = null;

$(document).ready(function(){
	chart1 = new Highcharts.Chart({
		chart: {
			renderTo: &#039;chart-1-container&#039;,
			defaultSeriesType: &#039;line&#039;
		},
		title: {
			text: (function(){
				var table = $(&#039;#chart-1-table&#039;);
				var title = $(&#039;caption .title&#039;, table);

				return title ? title.html() : &#039;&#039;;
			}())
		},
		subtitle: {
			text: (function(){
				var table = $(&#039;#chart-1-table&#039;);
				var subtitle = $(&#039;caption .subtitle&#039;, table);

				return subtitle ? subtitle.html() : &#039;&#039;;
			}())
		},
		xAxis: {
			categories: (function(){
				var table = $(&#039;#chart-1-table&#039;);
				/*
				 * The first column in the table body uses &lt;TH&gt; tags,
				 * to separate them from data.
				 */
				var cats = $(&#039;tbody &gt; tr &gt; th&#039;, table)
					.map(function(){
						return $(this).text();
					});

				return $.makeArray(cats);
			}()),
			title: {
				text: &#039;Month&#039;
			},
			type: &#039;linear&#039;
		},
		yAxis: {
			title: {
				text: &#039;Percent&#039;
			},
			labels: {
				formatter: function() {
					return this.value + &#039;%&#039;;
				}
			}
		},
		tooltip: {
			formatter: function() {
				return	&#039;&lt;strong&gt;&#039; + this.series.name + &#039;&lt;/strong&gt;&lt;br /&gt;&#039;+
						this.x + &#039;: &#039; + Highcharts.numberFormat(this.y, 1) + &#039;%&#039;;
			}
		},
		plotOptions: {
			line: {
				//stacking: &#039;percent&#039;,
				lineColor: &#039;#ffffff&#039;,
				lineWidth: 1,
				marker: {
					lineWidth: 1,
					lineColor: &#039;#ffffff&#039;
				},
				data: &#039;datatable&#039;,
				dataParser: function(data) {
					var result = [];

					var table = $(&#039;#chart-1-table&#039;);

					/*
					 * The series are defined by names, so we need to check what series we&#039;re in.
					 */
					var head = $(&#039;thead &gt; tr:last&#039;, table);
					var column = $(&#039;th:gt(0)&#039;, head).map(function(){
						return $(this).text();
					}).index(this.options.name);

					/*
					 * Loop through all the data rows for this series.
					 */
					var rows = $(&#039;tbody &gt; tr&#039;, table);
					for (var i = 0, max = rows.length; i &lt; max; i++) {
						/*
						 * The first column (using a &lt;TH&gt; tag) contains the category name.
						 */
						var rowDate = $(&#039;th&#039;, rows[i]);
						if (rowDate.size() &gt; 1) {
							rowDate = rowDate[0];
						}
						rowDate = rowDate.text();

						/*
						 * Grab the cell in the right column for this series.
						 */
						var cell = $(&#039;td&#039;, rows[i])[column];
						cell = $(cell);

						/*
						 * Add an array to the result with the category name and cell value.
						 */
						result.push([
							rowDate,
							parseFloat(cell.text())
						]);
					}

					return result;
				}
			}
		},
		series: (function(){
			var result = [];

			var table = $(&#039;#chart-1-table&#039;);
			/*
			 * Get all the columns from the table head.
			 * Some tables have multiple rows in the header.
			 */
			var head = $(&#039;thead &gt; tr:last&#039;, table);
			/*
			 * Skip the first column, it&#039;s the Y-axis label.
			 */
			var columns = $(&#039;th:gt(0)&#039;, head);

			for (var i = 0, iMax = columns.length; i &lt; iMax; i++) {
				result.push(
					{
						name: $(columns[i]).text()
					}
				);
			};

			return result;
		}())
	});
});
</pre>
<h3>Demo</h3>
<ul>
<li><a rel="nofollow" title="Download version 0.1 of browser-stats.html" href="http://blog.itwarlocks.com/lab/highcharts/browser-stats.html">Browser statistics</a></li>
</ul>
<h3>Next steps</h3>
<p>The above code works great for a single instance, but for use in a plug-in it&#8217;s too scattered. The first thing to do is to create a dataSource Interface or base Class that provides functions for series, categories and dataParser.<br />
For a Wordpress plug-in an advanced GUI for the WYSIWYG editor is needed to allow access to the complex options, not to mention a chart preview inside the editor.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.itwarlocks.com/2009/12/17/advanced-charts-in-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RTFM is dead, long live STFG</title>
		<link>http://blog.itwarlocks.com/2009/10/06/rtfm-is-dead-long-live-stfg/</link>
		<comments>http://blog.itwarlocks.com/2009/10/06/rtfm-is-dead-long-live-stfg/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 14:17:32 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://blog.itwarlocks.com/2009/10/06/rtfm-is-dead-long-live-stfg/">Jeffrey Ridout</span></dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[knowledge]]></category>
		<category><![CDATA[power]]></category>
		<category><![CDATA[RTFM]]></category>
		<category><![CDATA[STFG]]></category>

		<guid isPermaLink="false">http://blog.itwarlocks.com/?p=238</guid>
		<description><![CDATA[Knowledge is power, or for developers it&#8217;s skill. Or is it?
Before the time of Google developers were required to learn, remember and never forget the knowledge they needed to perform their work. I might be a bit of a dinosaur in that way, since I&#8217;d rather simply know than rely too much on Google. The [...]]]></description>
			<content:encoded><![CDATA[<p>Knowledge is power, or for developers it&#8217;s skill. Or is it?</p>
<p>Before the time of Google developers were required to learn, remember and never forget the knowledge they needed to perform their work. I might be a bit of a dinosaur in that way, since I&#8217;d rather simply know than rely too much on Google. The media has reported cases of student relying more and more on Google (or Bing or anyother web search.) No longer is anyone required to know everything, the web answers all questions.</p>
<p>A fun example is something that actually happens around me sometimes. Since I live and work in Sweden many Operating Systems are in Swedish. Everything is in Swedish, even the error messages. That&#8217;s a great feat of the developers to successfully implement <abbr title="Internationalisation">I18n</abbr>, but sometimes other developers can&#8217;t find the solution to their problems because they don&#8217;t know the English version.</p>
<p>A well known expression in the programming world is <abbr title="Read The Fucking Manual">RTFM</abbr>, but this is becoming a relic of an older age, these days a new expression is more valid, <abbr title="Search The Friendly Google">STFG</abbr>.</p>
<p>Unfortunately the expression &#8220;Knowledge is power&#8221; is still very true. Search engines hold more and more knowledge and thus power. Since it&#8217;s all free and open, there is absolutely no problem with that, in fact it&#8217;s great. It means everyone can share the knowledge. The real problem is that the people who are supposed to have the knowledge in their brains are become reliant on web search. What happens if the web is not accessible when they need it, or &#8211; god forbid &#8211; companies like Google and Microsoft start putting a price on that knowledge?</p>
<p>Yes, web search can solve many problems and provide a wealth of knowledge. But don&#8217;t just remember the URL to the knowledge you require, remember the actual knowledge instead. Reading news feeds about new techniques in HTML, CSS, JAVA, .NET, Ruby, etc. is great. But you should remember it, quite easy if you experiment with what you&#8217;ve read. Doing it stores more in the mind than reading about it.</p>
<p>Go ahead, <abbr title="Search The Friendly Google">STFG</abbr>. Experiment, do, develop, extend and <strong>Remember</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.itwarlocks.com/2009/10/06/rtfm-is-dead-long-live-stfg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coming topics</title>
		<link>http://blog.itwarlocks.com/2009/06/18/coming-topics/</link>
		<comments>http://blog.itwarlocks.com/2009/06/18/coming-topics/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 11:51:00 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://blog.itwarlocks.com/2009/06/18/coming-topics/">Jeffrey Ridout</span></dc:creator>
				<category><![CDATA[.this]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[gnutls]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSLint]]></category>
		<category><![CDATA[mod_gnutls]]></category>
		<category><![CDATA[openssl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Rhino]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[virtualmin]]></category>
		<category><![CDATA[webmin]]></category>
		<category><![CDATA[zimbra]]></category>

		<guid isPermaLink="false">http://blog.itwarlocks.com/?p=165</guid>
		<description><![CDATA[
Just a small heads-up about what I’ve been up to…
My old server got hacked, so I had do finish the installation of critical services on my new server. To manage virtual domains I had installed WebMin with VirtualMin on it, but somehow it refused to work for e-mail. Not feeling much for reinstalling VirtualMin I [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>Just a small heads-up about what I’ve been up to…</p>
<p>My old server got hacked, so I had do finish the installation of critical services on my new server. To manage virtual domains I had installed WebMin with VirtualMin on it, but somehow it refused to work for e-mail. Not feeling much for reinstalling VirtualMin I searched for an alternative to manage the e-mail services. I’m now quite happy VirtualMin bugged because now I came across Zimbra. Zimbra is currently running on my new server and it’s just brilliant. The only shame is that it only supports Ubuntu 8.04 LTS and won’t support any other Ubuntu’s until Ubuntu 10 LTS. Installing Zimbra itself is quite easy so I will not be blogging about that, what I will be blogging about is what I did to make it more secure… I added mod_gnutls to my apache to benefit from it’s support for SNI which allows Virtual Hosting of HTTPS domains. With mod_gnutls with my own Root CA, server CA and P12 nobody but me can access the web interface of my Zimbra and with mod_ssl set up as a proxy, my apache provides an easy and secure bridge between Zimbra and the Internet. If this sounds interesting, keep your eye on my blog…</p>
<p>I’ve been planning on creating my own theme for this blog, but as usual work and other tasks mess up my priorities. Never the less, I did get a chance to pratice my theme making skills by creating a Wordpress MU theme at work for internal blogging. This brought me back on track with CSS and JavaScript again. What I started wondering is, is there any support for Continuous Integration with JavaScript. And is there automated Code Revision/Quality Assurance for JavaScript? Turns out there are possibilities… JavaScript Code Review is quite easy with JSLint, there are java ports and there’s Rhino, so getting it into a CI system like Hudson should be quite straight forward. There’s also JSUnit which allows Unit Testing of JavaScript. I’ll be experimenting with JSLint in Rhino and Hudson, but also in PHP! Recently the Mozilla JavaScript engine became available as an extension for PHP, so I’m curious about running JSLint and JSUnit in that.</p>
<p>These are just 2 very exciting topics I’m playing with at the moment, so stay tuned!</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.itwarlocks.com/2009/06/18/coming-topics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Not all days are agile</title>
		<link>http://blog.itwarlocks.com/2009/04/02/not-all-days-are-agile/</link>
		<comments>http://blog.itwarlocks.com/2009/04/02/not-all-days-are-agile/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 08:19:03 +0000</pubDate>
		<dc:creator><span property="dc:creator" resource="http://blog.itwarlocks.com/2009/04/02/not-all-days-are-agile/">Jeffrey Ridout</span></dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.itwarlocks.com/?p=12</guid>
		<description><![CDATA[Last week Åsa, a colleague at Steria Sundsvall, had a link to a great article by Kelly Waters: 3 Reasons Why I Wouldn&#8217;t Do Agile Software Development.
&#8230;
There are some circumstances where an organisation&#8217;s culture is possibly too different to successfully adopt agile. At the moment I can think of only 3 reasons why I wouldn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Last week Åsa, a colleague at Steria Sundsvall, had a <a title="deliciousit - Why he wont go agile" href="http://deliciousit.blogg.se/2009/march/why-he-wont-go-agile.html" target="_blank">link</a> to a great article by <a title="All About Agile" href="http://www.agile-software-development.com/" target="_blank">Kelly Waters</a>: <a title="Agile Software Development: 3 Reasons Why I Wouldn't Do Agile Software Development" href="http://www.agile-software-development.com/2009/03/3-reasons-why-i-wouldnt-do-agile.html" target="_blank">3 Reasons Why I Wouldn&#8217;t Do Agile Software Development</a>.</p>
<blockquote><p>&#8230;<br />
There are some circumstances where an organisation&#8217;s culture is possibly too different to successfully adopt agile. At the moment I can think of only <span style="font-weight: bold;">3 reasons why I wouldn&#8217;t do agile software development</span>:</p>
<p><span style="font-weight: bold;">1.</span> If I was working for an organisation that believed it needed complete clarity about a solution before it could start a project. I believe this is a false positive, and it would be very hard to adopt agile in an environment where key stakeholders insist on this.</p>
<p><span style="font-weight: bold;">2.</span> If I was working for an organisation where the relevant product owners couldn&#8217;t &#8211; or wouldn&#8217;t &#8211; commit to being actively involved throughout the project. I really do believe that <a href="http://www.agile-software-development.com/2007/02/principle-1-active-user-involvement-is.html">active user involvement</a> is the first principle of agile, and imperative for a project to succeed.</p>
<p><span style="font-weight: bold;">3.</span> If I was working with a team that I didn&#8217;t believe could cope with ambiguity, or didn&#8217;t have sufficient <a href="http://www.agile-software-development.com/2007/04/agile-principle-10-no-place-for-snipers.html">communication skills to collaborate</a> effectively with business colleagues or customers.<br />
&#8230;</p></blockquote>
<p>This week I hit number 1. The past 2,5 months I&#8217;ve been working at Statens Pensjonkasse in Oslo Norway.<br />
From now on the team I&#8217;m in will be completely responsible for the production and delivery of new maintenance releases of the main application used by <abbr title="Statens Pensjonkasse">SPK</abbr>. We went through the process of producing, testing and delivering the next version and something very interesting came up&#8230;</p>
<p>A complete new version of the application (front, middle and back-end) is being made by another group &#8211; a quite large group where Steria Norway is also involved &#8211; using Adobe Flex and Java. The project is called Perform and uses modern technologies and techniques, Scrum among others.</p>
<p>When we took over maintenance of SPK&#8217;s current system, they gave an introduction course to Scrum and said it was up to us if we wanted to maintain their application using waterfall or Scrum. As an agile evangelist and ScrumMaster I of course felt the urge to choose Scrum, but was that right?</p>
<p>Until now the entire maintenance period had been quite ad-hoc with lots of Service Desk issues coming in and ad-hoc solutions being needed. (But that&#8217;s another story&#8230;) This meant there was no real opportunity to think about the development process. But now that we&#8217;re taking over as maintenance release team and need to plan more ahead, I had assumed we&#8217;d go Scrum. That however, seems quite impossible, even quite unsuitable.</p>
<p>The way new releases are prepared is quite glued to the waterfall development process that has been used until now and as we see it, that cannot be changed. Yet. (I&#8217;m not giving up hope.) The customer first gives us a list of open issues that need to be a part of the next release, we estimate the time required, they approve, we build. Then the testing starts&#8230; Testing is done in at least 2 phases, system test and acceptance test. We learned that both are done manually and that they&#8217;re identical. During the system test phase a person manually goes through all the tests, if all tests pass someone goes through all the tests again but calls it acceptance phase. This hair raising principle is the main reason for not being able to apply Scrum, since it cannt be changed. It may be possible to change it later, but that might take a year and this version of the application is planned to be superseded by Perform in a few years, so it doesn&#8217;t really feel like it&#8217;s worth the struggle. Just for the experience and sake of Scrum I should try, but probably won&#8217;t.<br />
The reason the production and testing procedures are as is, is because of how the application has designed and written. Almost all of the functional code is written in C and embedded SQL. C is hard to fit into Continuous Integration and the embedded SQL is so complex that we dare not even think about mocking/simulation or automation. (A typical SQL task runs for at least 10 hours before any results/errors can be seen.) Even if we did manage to rewrite the code so it was testable with <abbr title="Continuous Integration">CI</abbr>, the environment the building (make, nmake) run in and the application environment are so hard-coded that it would take weeks to make it more modular and portable (with portable I mean being able to build and run anywhere without breaking dependencies). (The windows client build process has dependencies that are only built in the Unix server process, but that discussion is off-topic.)</p>
<p>It is quite a shame, but Scrum is not the way to go this time. At least we&#8217;ll be able to use Scrum internally while implementing the next release, since Agile/Scrum can always be applied within a waterfall (or other) wrapping.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.itwarlocks.com/2009/04/02/not-all-days-are-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced) (user agent is rejected)

Served from: blog.itwarlocks.com @ 2010-07-29 14:48:02 -->