﻿<?xml version="1.0" encoding="utf-8" ?>
<content>
  <section id="home" showarticles="3" synopsis="3" scope="global" sidebar="yes">
    <article id="welcome" title="welcome" category="intro">
      <p>
        <strong>This site</strong> is a collection of musings, thoughts and ideas that have
        found their way into my head over the last decade and a half. Hopefully some of
        it will strike a chord and you can find some use for it. I'm passionate about web
        application development and I'd like to think that by sharing our thoughts we raise
        our collective consciousness as a community.
      </p>
	  <p>
        Feel free to check out my musical adventures over at <a href="http://music.gabrielbuckley.com/">http://music.gabrielbuckley.com/</a>
      </p>
    </article>
    <article id="whoareyou" title="who are you again?" category="intro">
      <p>
        I am a web application development professional living in Brisbane, Australia. I have over a decade of experience in developing database-driven,
        web-based applications. My expertise spans consulting, analysis, specification, development, project management, testing, implementation, change
        management and training.
      </p>
      <p>
        For more information head on over to the <a href="Default.aspx?page=about">"about me" page</a>.
      </p>
    </article>
    <article id="current_reading" title="currently reading" category="intro">
      <p>
        <script type="text/javascript" src="http://www.google.com/reader/ui/publisher-en.js"></script>
        <script type="text/javascript" src="http://www.google.com/reader/public/javascript/user/15807730946128841590/state/com.google/broadcast?n=5&amp;callback=GRC_p(%7Bc%3A%22-%22%2Ct%3A%22My%20shared%20items%22%2Cs%3A%22false%22%2Cb%3A%22false%22%7D)%3Bnew%20GRC"></script>
      </p>
    </article>
  </section>
  <section id="articles" showarticles="1" synopsis="3" scope="local" sidebar="yes">
    <article id="lightweight_ajax" title="lightweight ajax" category="technology" tag="front-end">
      <p>
        Often you don’t want to add all the overhead of loading up a big AJAX library like script.aculo.us or YUI just to make a few simple calls back to the server. What you need is a lightweight framework that will able you to make and handle calls back to the server in a simple and consistent manner.
      </p>
      <p>To start with, we’ll take the standard XMLHttp objects common across major browsers and wrap them up in an object:</p>
      <pre>
  function AJAXRequest(){
    this.req = false;
    //Check for a native request object 
    //(IE7+, Firefox etc)
    if (window.XMLHttpRequest) {
      try {this.req = new XMLHttpRequest();}
      catch(e) {this.req = false;}
    }
    //Otherwise we might be dealing with an early IE
    else if(window.ActiveXObject) {
      try {
        this.req = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch(e) {
        try {
          this.req = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(e) {this.req = false;}
      }
    }
  }
</pre>
      <p>Now we have our base object, we’ll need to add in a few features to handle the requests. We will want to be able to supply some data to send to the server, we will need to tell the request where to send the data, how to send it (GET or POST) and what to do with the response.</p>
      <p>To that end, we create the data, url, method and callBack members for our object and allow the object to receive them as parameters. Our object looks like this:</p>
<pre>
  function AJAXRequest(objData, strUrl, strMethod, funcCallBack){
    this.data = objData;
    this.url = strUrl;
    this.method = (strMethod.toUpperCase() != "POST" ? "GET" : "POST");
    this.callBack = funcCallBack;

    this.req = false;
    //Check for a native request object (IE7+, Firefox etc)
    if (window.XMLHttpRequest) {
      try {this.req = new XMLHttpRequest();}
      catch(e) {this.req = false;}
    }
    //Otherwise we might be dealing with an early IE
    else if(window.ActiveXObject) {
      try {this.req = new ActiveXObject("Msxml2.XMLHTTP");}
      catch(e) {
        try {this.req = new ActiveXObject("Microsoft.XMLHTTP");}
        catch(e) {this.req = false;}
      }
    }
  }
  AJAXRequest.prototype.objData;
  AJAXRequest.prototype.callBack;
  AJAXRequest.prototype.url;
</pre>
      <p>And we also want to give it a send() method so that we are able to submit the request to a server, and a method of passing back the response data to our supplied callback function:</p>
<pre>
  AJAXRequest.prototype.send = function(){
    var strURL = this.url;
    // Check for a valid request member
    if(this.req){
      // Define an event handler for the ready
      // state change event
      var _this = this;
      this.req.onreadystatechange = function(){
        _this.handleStateChange(_this.callBack)
      };

      // Open the connection using the supplied
      // parameters
      this.req.open(this.method, this.url);

      // Send the submitted data (if any)
      this.req.send(this.data);
    }
  }

  AJAXRequest.prototype.handleStateChange = function(objCallBackFunction){
    // readyState 4 is "done"
    if (this.req.readyState == 4){
      // Pass the response from the server back to the
      this.callBack.call(this, this.req.responseText);
    }
  }
</pre>
      <p>
        And there we have it, a lightweight <strong>A</strong>synchronous <strong>J</strong>avaScript <strong>A</strong>nd <strong>X</strong>ML object that you can drop into any page you like. Of course, if your project is using JSON then you can use it for that as well.
      </p>
    </article>
    <article id="vwd2008_express" title="visual web developer 2008 express edition" category="tools" tag="editors">
      <p>
        Nice freebie from Microsoft, <a href="http://www.microsoft.com/express/vwd/" target="_new">Visual Web Developer 2008 Express Edition</a> puts an (almost) fully featured .NET development environment at the fingertips of anybody who wants it.
      </p>
      <p>So far I haven't found it lacking in any major way as far as ad-hoc .NET development goes, although J# is definitely missed. One feature I particularly like is the lightweight web server that fires up on a random port number to let you test out your ASP pages. No more having to copy test code over to a server every time you want to see how things are progressing.</p>
      <p>Overall, an excellent choice for anybody that wants to get a toe in the .NET water, or those who only do a little bit of .NET work here and there, but for hardcore .NET developers it is unlikely to supplant Visual Studio any time soon.</p>
    </article>
    <article id="exist_gettingstarted" title="getting started with eXist" category="technology" tag="back-end">
      <p>
        If you haven't had the opportunity to do so yet, pop on over to the <a href="http://exist.sourceforge.net/" target="_new">eXist website</a> and check out their wares.
      </p>
      <p>eXist is an open-source native XML database. Aside from being free, eXist offers a great little playground for developing XML-based applications. It supports XQuery, XPath, XSLT and SOAP just to name a few.</p>
      <p>The main benefit to using eXist is the powerful support for XQuery. Entire applications can be developed just using XQuery Language on the back end. These can then be surfaced using your front-end development environment of choice.</p>
      <p>To demonstrate just how easy it is, we'll run through a little app I knocked up in a few minutes to manage a list of albums.</p>
      <p>Starting with a sample XML file that looks something like:
      <h4>albums.xml</h4>
      <pre>
  &lt;albums&gt;
    &lt;album&gt;
      &lt;id&gt;000001&lt;/id&gt;
      &lt;title&gt;The Essential Hank Williams Collection: Turn Back the Years&lt;/title&gt;
      &lt;artist&gt;Hank Williams&lt;/artist&gt;
      &lt;label&gt;Mercury&lt;/label&gt;
      &lt;year&gt;2005&lt;/year&gt;
    &lt;/album&gt;
    &lt;album&gt;
      &lt;id&gt;000002&lt;/id&gt;
      &lt;title&gt;The College Dropout&lt;/title&gt;
      &lt;artist&gt;Kanye West&lt;/artist&gt;
      &lt;label&gt;Roc-a-Fella&lt;/label&gt;
      &lt;year&gt;2004&lt;/year&gt;
    &lt;/album&gt;
    ...
    ...
  &lt;/albums&gt;
      </pre>
        We can start writing some code to perform specific functions. The functions we will need are:
        <ul>
          <li>Getting a list of albums,</li>
          <li>Adding a new album,</li>
          <li>Deleting an album, and,</li>
          <li>Updating an album's data</li>
        </ul>
      </p>
      <p>
        Starting with the easy stuff, let's look at returning a list of albums:
        <h4>getAlbumList.xql</h4>
      <pre>
        declare namespace xdb="http://exist-db.org/xquery/xmldb";
        let $AlbumList := doc("xmldb:exist:///db/interviewtest/albums.xml")
        return $AlbumList
      </pre>
        Yep, that's it. Three lines, one of which is just a namespace declaration. Get the XML document we're after, return it to the client. How many times have you spent ages stepping through each record in a dataset, carefully wrapping tags around each field?
      </p>
      <p>Ramping it up a little, let's have a look at the insertion code:
      <h4>addAlbum.xql</h4>
        <pre>
  declare namespace request="http://exist-db.org/xquery/request";
  declare namespace xdb="http://exist-db.org/xquery/xmldb";

  let $title	:= request:get-parameter("title","Unknown Title")
  let $artist	:= request:get-parameter("artist","Unknown Artist")
  let $label	:= request:get-parameter("label","Unknown Label")
  let $year	:= request:get-parameter("year","0000")


  let $AlbumList  := doc("xmldb:exist:///db/interviewtest/albums.xml")

  let $lastID := xs:integer($AlbumList//album[last()]/id)
  let $newID  := concat(string-pad("0",6 -string-length(xs:string($lastID + 1)))
                                      ,xs:string($lastID + 1))

  let $NewAlbum	:=  &lt;album&gt;
                      &lt;id&gt;{$newID}&lt;/id&gt;
                      &lt;title&gt;{$title}&lt;/title&gt;
                      &lt;artist&gt;{$artist}&lt;/artist&gt;
                      &lt;label&gt;{$label}&lt;/label&gt;
                      &lt;year&gt;{$year}&lt;/year&gt;
                    &lt;/album&gt;

  let $insert := update insert $NewAlbum into $AlbumList/albums

  return  &lt;result&gt;
            &lt;status&gt;1&lt;/status&gt;
            &lt;message&gt;Record added successfully&lt;/message&gt;
          &lt;/result&gt;
        </pre>
        Again, not a great deal to it. Declare the neccessary namespaces, read in the parameters from the request - giving them some default values if they don't exist, generate a new ID for the record, wrap it all up in an XML node, insert it into the document and return a status message to the client. 
    </p>
      <p>
        The rest of it doesn't get a great deal more complex. The deletion code:
        <h4>deleteAlbum.xql</h4>
        <pre>
          declare namespace request="http://exist-db.org/xquery/request";
          declare namespace xdb="http://exist-db.org/xquery/xmldb";

          let $id 	:= request:get-parameter("id","")

          let $AlbumList := doc("xmldb:exist:///db/interviewtest/albums.xml")

          return
            if ($id != "") then (
              let $Album := $AlbumList//album[id = $id]
              let $result := if ($Album) then (
                  let $update := update delete $Album
                  return  &lt;result&gt;
                            &lt;status&gt;1&lt;/status&gt;
                            &lt;message&gt;Record deleted successfully&lt;/message&gt;
                          &lt;/result&gt;
                ) else (
                  &lt;result&gt;
                    &lt;status&gt;-1&lt;/status&gt;
                    &lt;message&gt;invalid id specified or no album retrieved&lt;/message&gt;
                  &lt;/result&gt;
                )
              return $result

            ) else (
                &lt;result&gt;
                  &lt;status&gt;-1&lt;/status&gt;
                  &lt;message&gt;No id specified&lt;/message&gt;
                &lt;/result&gt;
            )
        </pre>
        Simply reads in the supplied album id and, if found in the collection, deletes it, otherwise it returns one of two error messages. Likewise the update code:
        <h4>updateAlbumData.xql</h4>
        <pre>
  declare namespace request="http://exist-db.org/xquery/request";
  declare namespace xdb="http://exist-db.org/xquery/xmldb";

  let $id 	:= request:get-parameter("id","")
  let $title	:= request:get-parameter("title","")
  let $artist	:= request:get-parameter("artist","")
  let $label	:= request:get-parameter("label","")
  let $year	:= request:get-parameter("year","")

  let $AlbumList := doc("xmldb:exist:///db/interviewtest/albums.xml")

  return if ($id != "") then (
    let $Album := $AlbumList//album[id = $id]
    let $result := if ($Album) then (
      let $update := if ($title != "") then (
        update value $Album/title with $title
      ) else ( )
      let $update := if ($artist != "") then (
        update value $Album/artist with $artist
      ) else ( )
      let $update := if ($label != "") then (
        update value $Album/label with $label
      ) else ( )
      let $update := if ($year != "") then (
        update value $Album/year with $year
      ) else ( )

      return &lt;result&gt;
        &lt;status&gt;1&lt;/status&gt;
        &lt;message&gt;Record updated successfully&lt;/message&gt;
      &lt;/result&gt;
    ) else (
      &lt;result&gt;
        &lt;status&gt;-1&lt;/status&gt;
        &lt;message&gt;invalid id specified or no album retrieved&lt;/message&gt;
      &lt;/result&gt;
    )
    return $result
    
  ) else (
    &lt;result&gt;
      &lt;status&gt;-1&lt;/status&gt;
      &lt;message&gt;No id specified&lt;/message&gt;
    &lt;/result&gt;
  )
        </pre>
      Just walks through the supplied paramaters and inserts their value into the requested album.</p>
      <p>OK, so there's the framework. Obviously you'd want to put some validation and security around it before selling to a customer (you would put validation and security on an application before selling it to a customer wouldn't you?) but it's pretty much done. If only everything were that easy.</p>
    </article>
    <article id="domino_web_services" title="extending domino applications with web services" category="technology" tag="back-end">
      <p>In this article we will examine how it is possible to give your existing Domino applications some exciting new functionality by enabling them as web services. In particular we will look at:
      </p>
      <ul>
        <li>What web services are,</li>
        <li>What benefits they can provide to the organisation over traditional methods, and,</li>
        <li>How we can use web services with Domino.</li>
      </ul>
      <p>Domino is, undeniably, an amazing application development platform providing an organisation with a rich depth of features. Providing the data and functionality inherent in Domino applications to other platforms however, can be the source of headaches for administrators and developers. This article will demonstrate a cost-effective way to deliver Domino functionality in the structured and standardised manner encapsulated in web services.</p>
      <p>What are web services? Simply put, a web service is a method or function that is available to a client over a network. There are a number of formats that can be used to encapsulate a web service request and response, but the most common is the use of the W3C recommended Simple Object Access Protocol (SOAP). </p>
      <p>
        <img src="images/domino_webservices_001.jpg" alt="web service request and response" />
      </p>
      <p>This picture shows the mechanism by which a client application would call a web service over a network. The client forms the request in terms of a SOAP envelope and submits it over HTTP to the server. The server interprets the SOAP request and performs the functionality requested of it before returning the data in the form of a SOAP response envelope.</p>
      <p>The advantages to implementing a web services architecture are myriad:
      <ul>
        <li>Modular – Functions only need to be written once and can then be used anywhere, by any client which is capable of consuming web services.</li>
        <li>Standards Based – SOAP is a W3C recommendation based on XML which eliminates the need for investment in proprietary bridging technologies.</li>
        <li>Secure – The SOAP Protocol provides authentication, security and digital signing. SOAP requests can also be sent over SSL.</li>
        <li>Encapsulated – Only the methods you wish to expose are exposed. There is no need to open up your application architecture to other applications.</li>
      </ul>
    </p>
      <p>
        Looking at the components of a web service, the main transport is the SOAP envelope. All communications between client and server are framed as SOAP envelopes.
      </p>
      <h4>SOAP Request Envelope</h4>
      <pre>
        &lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap/envelope/"&gt;
          &lt;soap:Body&gt;
            &lt;getProductDetails xmlns="http://warehouse.example.com/ws"&gt;
              &lt;productID&gt;827635&lt;/productID&gt;
            &lt;/getProductDetails&gt;
          &lt;/soap:Body&gt;
        &lt;/soap:Envelope&gt;
      </pre>
      <h4>SOAP Response Envelope</h4>
      <pre>
        &lt;soap:Envelope xmlns:soap="http://schemas.xmlsoap/envelope/"&gt;
          &lt;soap:Body&gt;
            &lt;getProductDetailsResult xmlns="http://warehouse.example.com/ws"&gt;
              &lt;productName&gt;Toptimate 3-Piece Set&lt;/productName&gt;
              &lt;productID&gt;827635&lt;/productID&gt;
              &lt;description&gt;3-Piece luggage set. Black Polyester&lt;/description&gt;
              &lt;price&gt;96.50&lt;/price&gt;
              &lt;inStock&gt;true&lt;/inStock&gt;
              &lt;/getProductDetailsResult&gt;
            &lt;/soap:Body&gt;
        &lt;/soap:Envelope&gt;
      </pre>
      <p>
        The client application would supply the required parameter(s) – in this case the product ID – and process the information returned by the web service.
        In order for the client to utilise the web service, it must first be able to ascertain:
        <ol type="a">
          <li>the location of the web service,</li>
          <li>what parameters (if any) are required, and,</li>
          <li>what information the web service will return.</li>
        </ol>
        </p>
      <p>
        To provide this information to the client we must introduce the second component to a web service delivery, the WSDL file. Web Service Description Language is another XML based mark-up language, used to describe web services to a prospective client application.
      </p>
      <h4>Sample WSDL File</h4>
      <pre>
  &lt;definitions&gt;
    &lt;message name="getProductDetailsRequest"&gt;
      &lt;part name="productID" type="xsd:string" /&gt;
    &lt;/message&gt;
    &lt;message name="getProductDetailsResponse"&gt;
      &lt;part name="productName" type="xsd:string" /&gt;
      &lt;part name="productID" type="xsd:string" /&gt;
      &lt;part name="description" type="xsd:string" /&gt;
      &lt;part name="price" type="xsd:decimal" /&gt;
      &lt;part name="inStock" type="xsd:boolean" /&gt;
    &lt;/message&gt;
    &lt;portType name="getProductDetailsPortType"&gt;
      &lt;operation name="getProductDetails"&gt;
        &lt;documentation&gt;
          Get Product Details Given a Product ID
        &lt;/documentation&gt;
        &lt;input message="tns:getProductDetailsRequest" /&gt;
        &lt;output message="tns:getProductDetailsResponse" /&gt;
      &lt;/operation&gt;
    &lt;/portType&gt;
    &lt;binding 
      name="getProductDetailsBinding" 
      type="tns:getProductDetailsPortType"&gt;
      &lt;soap:binding 
        style="rpc" 
        transport="http://schemas.xmlsoap.org/soap/http" /&gt;
      &lt;operation name="getProductDetails"&gt;
        &lt;soap:operation 
          soapAction="urn:getProductDetails#getProductDetails" 
          style="rpc" /&gt;
        &lt;input&gt;
          &lt;soap:body
            use="encoded"
            namespace="urn:getProductDetails"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /&gt;
        &lt;/input&gt;
        &lt;output&gt;
          &lt;soap:body
            use="encoded"
            namespace="urn:getProductDetailsResponse"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /&gt;
        &lt;/output&gt;
      &lt;/operation&gt;
    &lt;/binding&gt;
    &lt;service name="getProductDetails"&gt;
      &lt;port name="getProductDetailsPort" binding="tns:getProductDetailsBinding"&gt;
        &lt;soap:address location="/products.nsf/getProductDetails?openAgent" /&gt;
      &lt;/port&gt;
    &lt;service&gt;
  &lt;definitions&gt;
      </pre>
      <p>
        This shows a simplified WSDL file for the getProductDetails method used earlier. The message tags describe the structure of the input and output SOAP envelopes in terms of their component values and data types. The service tag tells the prospective client application where the web service is located and the binding and portType elements instruct the client to use the SOAP protocol when the service is called and to output a response message when a request message is received as input.
      </p>
      <p>
        Domino 7 provides some inbuilt features to enable developers to deploy LotusScript functions as web services, but deploying web services in a Domino 6 environment is by no means out of the question. To deploy a web service we need to provide both the service itself and the WSDL file that describes it. This can be accomplished using a Domino web agent as the service and encapsulating the WSDL mark-up as a Domino page.
      </p>
      <p>
        <img src="images/domino_webservices_004.jpg" alt="domino web services architecture" />
      </p>
      <p>
        This shows how a web service would be deployed on a Domino platform using standard Domino design elements. The WSDL Page supplies all the information that the client application requires in order to call the web service. The client formulates a request in the form of a SOAP envelope and posts the data to the Domino server. The Domino server extracts the information from the envelope and passes any parameters to the nominated web agent which then returns the result of it’s processing in the form of a SOAP response to the client application. In order to use the web service, a client application needs only to be aware of the location of the WSDL file.
      </p>
    </article>
    <article id="next_generation_internet" title="building the next generation intranet" category="process" tag="Software Development">
      <p>
        Ten years of trial and error has brought us one unassailable conclusion regarding the corporate intranet. For an intranet to be successful it must not only be accepted by users, but driven by them.
      </p><p>Just as the World Wide Web is driven by those who frequent it, the corporate intranet relies on the input and management of those who use it on a daily basis. The history of the corporate intranet has shown that it closely follows trends set by the World Wide Web. Early intranets were static, driven by mission statements and followed a top-down, tiered approach to content dissemination. Intranets of today are following the portal-style information aggregate model popularised by sites such as Yahoo! in the early part of the twenty-first century. Organisations can extrapolate this trend to their own advantage today to pre-empt the next trends in corporate intranets.
      </p>
      <p>
        Looking at the emerging trends on the World Wide Web today there are a number of central themes. Key amongst these is the notion of being driven by the consumer. Blogs, Wikis and folksonomies are replacing the traditional content outlets. The power to contribute content to the internet is no longer solely in the hands of those who can master HTML. Just as current-day internet users host their photo galleries on a flickr.com or photobucket.com account and publish their daily journal on their livejournal.com accounts, next-generation intranet users will demand the same power from the corporate intranet that they come to expect from the web today. Intranets that fail to embrace these technologies – and, by extension, the corporations that manage them – will be perceived as somehow lacking by tomorrow’s technology-savvy intranet user.
      </p>
      <p>
        The challenges faced by an organisation looking to capitalise on these trends involve as much of a cultural shift in the attitudes of knowledge management professionals as they do an acceptance of technological change. Knowledge management professionals must be prepared to exchange the role of information gatekeeper for one of information facilitator. Organisations need to recognise their employees as valuable sources of information instead of potential sources of disinformation. Editorial control can be relaxed for such user-driven information management to the level that an organisation exercises over water-cooler chat rather than the level required for media releases.
      </p>
      <p>
        Folksonomies play a very important part in user driven knowledge management. A folksonomy (or folk-taxonomy) is a classification system that reflects the terminology in use by the user-base rather than that which either the business itself or external subject matter experts may impose on a knowledge management tree. The use of a folksonomy in conjunction with – or even in place of – traditional knowledge taxonomies not only allows users to tag content with categories that make sense to them, but to search corporate knowledge bases using contextually appropriate terms and queries. That the folksonomy can be applied across all facets of the corporate intranet makes it a very powerful tool for not only defining terms within the contextual bounds of the organisation but for aggregating content across disparate systems according to the terminology that is most relevant to employees and their job functions.
      </p>
      <p>
        In practise, facilitating a folksonomy entails allowing users to tag a piece of information with metadata that is relevant to them. Employees of an organisation, as a part of each individual organisation’s culture, share a common vocabulary of vernacular and job-specific terms. A folksonomy plays an important part in firstly capturing, and then leveraging, this information toward a better knowledge management system. Initially this may mean that the same piece of information is tagged with widely differing terms. As more tags are applied to the document – and as more users apply the same tag – the relevance of those tags to the document becomes apparent through attrition and repetition. Unlike a traditional taxonomy, which is devised and imposed, the folksonomy follows an evolutionary path.
      </p>
      <p>
        Blogs (short for web-logs) are a mechanism by which a user can conveniently keep a journal or log of their activities, thoughts, opinions or anything else they feel like articulating. Blog sites are traditionally distinguished by their simple interface. Publishing a post to a blog is usually a single-click process, allowing the user to articulate, format and publish their entry without the use of complex HTML design tools. The browser experience of a blog site is usually similarly uncomplicated. Navigation is limited to simple categorisation by date and category – allowing the folksonomy again to come into play – with the initial view simply being of the most recent entries.
      </p>
      <p>
        The ability to allow other users to comment on blog entries is key to providing the user feedback and encouraging communication across individuals with common areas of interest. The fact that peers are providing feedback on their entries encourages blog authors to maintain the rate and quality of their entries.
      </p>
      <p>
        Forums are another technology available to today’s web user that will be a critical component of the corporate intranet. Forums and associated derivatives such as team spaces provide a collaborative environment for users to discuss issues and ideas while having the outcomes of those discussions remain as a searchable knowledge base for future reference.
      </p>
    </article>
    <article id="aptanastudio" title="aptana studio" category="tools" tag="editors">
      <p>
        <a href="http://www.aptana.com/" target="new">Aptana Studio</a> is a great little IDE that I've been playing with quite heavily over the past couple of years. Built on the Eclipse framework it brings together pretty much everything you would want in an Editor.
      </p>
      <p>
        Code formatting and completion is supplied for HTML, PHP, XML, JavaScript and CSS, as well as the ability to create your own definition files for other languages. 
      </p>
      <p>
        All in all it's a very useful editor, especially having IE and Firefox previews inbuilt.
      </p>
    </article>
    <article id="agileteams" title="agile teams" category="process" tag="project management">
      <p>
        Agile methodologies have been getting a lot of press lately. Falling somewhere between strict waterfall style development and free-for-all cowboy coding they attempt to bring some method to the madness and let programmers do what they do best.
      </p>
      <p>
        Although there are differences in terminology, most agile methodologies have a few things in common. Firstly they do things in small increments. This iterative method of software development has distinct advantages. It allows for changes to be made without significant disruption and always keeps a goal in clear sight. That goal is usually to have some sort of working release at the end of each iteration.
      </p>
      <p>The team size for an Agile project is critical. Between five and nine developers is a good size. Any more and it becomes too difficult to keep track of each developer's progress, any fewer and you run the risk of devolving into an unstructured unit. Team selection is also critical. An agile team is no place for inexperienced developers. Everyone is expected to be accountable to the rest of their team and commit to iteration goals. Likewise there is no room for ivory-tower specialists who do one thing and one thing only. Every team member should have at least one specialisation and a good cross-section of general skills that will enable them to be fully utilised each iteration. Keeping the team constant is important. Moving people in and out of the team interrupts the flow of the project and, as such, specialists should only be brought in when absolutely neccessary</p>
    </article>
    <article id="effective_requirements" title="effective requriements gathering" category="process" tag="project management">
      <p>
        Gathering requirements from stakeholders can be a joy or a nightmare. The key determinant of which it ends up being usually comes back to how you as an analyst go about it. 
      </p>
      <p>
        Initially the requirements-gathering phase starts off as a series of fairly convivial meetings between stakeholders who all have grand visions of what they want the application to look like. Unfortunately a fair number of these visions end up being mutually exclusive and the meetings descend into political squabbles that you want absolutely no part of. The key to preventing this lies in a proactive approach right from the get-go. During the first meeting, sit and listen politely, writing down every feature that is mentioned on a post-it note. Once everyone has laid out their vision, put all the post-it notes up on a whiteboard and get your participants to sort, group and prioritise them.
      </p>
      <p>
        As the sorting process goes on, your application requirements should start to take shape before your very eyes. You will find features that can be combined, as you move through the list, others will become evident that weren't thought of previously as interactions between the different stakeholder's requirements are laid out in a visual format.
      </p>
      <p>
        Once the sorting is done, you have a visual mind-map of the application structure. It is then a fairly easy process to document, take back to the development team and start putting some time estimates against each component. Once the time estimates have been completed you can take the same document (with price tags attached) back to the stakeholders and give them a chance to re-prioritise their desired functionality.
      </p>
    </article>
    <article id="php_proxies" title="cross-domain AJAX with PHP Proxies" category="technology" tag="middleware">
      <p>
        You know the drill, you have this neat little web app you've been working on and the client says:</p> <blockquote>Hey, how about you include this weather service I found, you can use a web service right? It's just XML right?</blockquote>
      
      <p>Initially you think yeah, sure, not a problem. I'll just break out my trusty <samp>XMLHttpRequest()</samp> object and fire off a request, get the XML data back and populate my div tags on the fly. You sit down, write some code and... nothing happens.
      </p>
      <p>
        A little (or perhaps a lot) of debugging later and you realise that the http request code you're firing off from the browser is returning nothing or, at best, a cryptic error message. And then it hits you. Your site is on this domain, that web service comes from a different domain and the browser's security model thinks you're up to no good.
      </p>
      <p>
        Short of going back to the client and telling him his dream of being able to see what the weather is like in Murmansk (cold usually) from the comfort of his employee intranet portal is not going to be a reality, there is a solution. Using a little proxy script you can effectively mask the request to the external server so that the browser sees the request as going to the same domain that the web page was sourced from. 
      </p>
      <p>Proxy scripts are small, lightweight and barely add to response times (which is fine if your other alternative is a response time of well, never). The code below is for a specific example, but it is possible to write one to take any request and pass it on to the appropriate external service provider. The code below is in PHP but any server-side code will do.</p>
      <p>
        <h4>phpProxy.php</h4>
        <pre>
  &lt;?php
  /**
   * @author Gabriel Buckley
   * @copyright 2008
   */
  		
    $ch = curl_init("http://some.otherdomain.com/getUserDetails.xql");
    $strUser = $_POST["username"];
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_POSTFIELDS,"username=".urlencode($strUser));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);      
    curl_close($ch);
    echo $output
  ?&gt;
        </pre>
      </p>
      <p>
        All we're doing is recieving one URL parameter <samp>username</samp> and making a request to another server with the supplied parameter. Once that server replies back with its response, we simply echo the response straight back to the client. So nine lines of code to solve one of the most vexing problems web application developers need to contend with. It works by on one hand, using the server as a client to fetch the required data. Then allowing the same process to act in place of the proxied web function call by echoing exactly the same data which satisfies the browser securtiy model's requirement that requests be submitted only back to the originating domain.
      </p>
    </article>
    
  </section>
  <section id="resume" showarticles="1" synopsis="0" scope="local" sidebar="no">
    <article id="resume" title="resume" category="resume">
      <h3>Programming Languages</h3>
      <ul>
        <li>XML Related Technologies including Schema, XForms, XPath, SVG</li>
        <li>Client-Side Web Development using XHTML, CSS, JavaScript</li>
        <li>Web Services Development including WSDL and SOAP</li>
        <li>Rich Internet Application development using AJAX, OpenLaszlo and Silverlight XAML</li>
        <li>.Net Technologies including ASP.Net, VB and C#</li>
        <li>Web Development using PHP, PHP5 and MySQL</li>
        <li>Java J2EE Development including JSP, EJB and Servlets</li>
        <li>Lotus Domino Development including LotusScript, Java and Formula Language</li>
      </ul>
      <h3>Areas of Expertise</h3>
      <ul>
        <li>Web Content Management</li>
        <li>Document Management including Workflow and Process Management</li>
        <li>Rich Internet Application Development</li>
        <li>Web Services and Service Oriented Architecture, Software as a Service</li>
        <li>Application Framework and API development</li>
        <li>Integration and Online Payment Gateways</li>
        <li>Software Usability</li>
      </ul>
      <div style="float:left;width:33%;">
      <h3>Web Software Platforms</h3>
      <ul>
        <li>Apache, PHP, MySQL</li>
        <li>IIS, ASP.Net, MSSQL</li>
        <li>Jetty, XQL, eXist</li>
        <li>Lotus Domino</li>
      </ul>
      </div>
      <div style="float:left;width:33%">
      <h3>Development Environments</h3>
      <ul>
        <li>Eclipse</li>
        <li>Aptana Studio</li>
        <li>Microsoft Visual Studio</li>
        <li>Domino Designer</li>
      </ul>
      </div>
      <div style="float:right;width:33%">
      <h3>Other Tools</h3>
      <ul>
        <li>Adobe Dreamweaver</li>
        <li>Adobe Photoshop</li>
        <li>SVN Source Code Repository</li>
      </ul>
      </div>
      <div style="clear:both;"></div>
      <div style="float:left;width:48%;">
        <h3>Development Standards and Methodologies</h3>
        <ul>
          <li>Agile / Scrum / Extreme Programming</li>
          <li>Waterfall Software Development Life Cycle</li>
          <li>Joint Application Design / Rapid Prototyping</li>
          <li>Rapid Application Development</li>
          <li>W3C Accessibility Guidelines</li>
          <li>Dublin Core Metadata</li>
          <li>AGLS Metadata Standards</li>
        </ul>
      </div>
      <div style="float:right;width:48%;">
        <h3>Consulting Skills</h3>
        <ul>
          <li>Facilitation of workshops, focus groups and stakeholder interviews to aid the requirements gathering phase.</li>
          <li>Development of proposals, return on investment statements, functional specifications and technical specifications.</li>
          <li>Able to use CASE tools to rapidly map organisational requirements to functional system entities.</li>
          <li>Have written consulting methodologies for a number of specialised activities.</li>
        </ul>
      </div>
      <div style="clear:both;"></div>
      <div style="float:left;width:48%;">
        <h3>Project Management Skills</h3>
        <ul>
          <li>Solid understanding of Structured Design, Joint Application Development and Rapid Application Development methodologies.</li>
          <li>Leadership approach to project management.</li>
          <li>Preparation and communication of interim and milestone reports.</li>
          <li>Familiar with industry best practise tools and methodologies for project management.</li>
          <li>Have undertaken IT specific project management training.</li>
          <li>Exposure to PMBoK and PRINCE2</li>
        </ul>
      </div>
      <div style="float:right;width:48%;">
        <h3>Business Skills</h3>
        <ul>
          <li>Familiarity with a wide range of business types, disciplines and IT requirements.</li>
          <li>Solid understanding of business IT procurement procedures.</li>
          <li>Ability to interact with all levels of business users.</li>
          <li>Staff management experience including conduction performance reviews.</li>
          <li>Excellent written and verbal communication skills.</li>
        </ul>
      </div>
      <div style="clear:both;"></div>
      <div style="clear:both;">
        <h3>Work History</h3>
		<h4>
          December 2010 - Current: Senior Web Developer - <a href="http://www.mcsau.com/" target="_new">Mining Consultancy Services</a>
        </h4>
        <ul>
        	<li>Developing a suite of web-based mining efficiency applications</li>
			<li>Leveraging real-time sensor data and the use of intrinsically safe PDA devices for production usage in underground mining environments</li>
			<li>Development environment is VB.Net, custom AJAX libraries, HTML, CSS and mobile computing platforms</li>
        </ul>
		<h4>
          November 2009 - December 2010: Senior Web Developer - <a href="http://www.digitalinstinct.com.au" target="_new">Digital Instinct</a>
        </h4>
        <ul>
        	<li>Developing rich web client applications and complementary web services</li>
			<li>Provided a web interface to a suite of roster-creation and time-and-attendance software applications.</li> 
			<li>Created a dynamic client-side JavaScript library to facilitate the deployment of highly interactive web applications</li>
			<li>Custom AJAX layer with SOAP-based web services written using the .NET platform</li>
			<li>iPhone and other mobile device interfaces to the applications</li>
        </ul>
	<h4>
          Apr 2009 – November 2009: Project Manager / Business Analysis Team Leader - <a href="http://www.iservices.com.au" target="_new">IServices Consulting</a>
        </h4>
        <ul>
          <li>Project management including resource management and client liaison</li>
          <li>Managing the business analysis consulting team.</li>
          <li>Performing business analysis and strategic consulting services for our clients.</li>
        </ul>
        <h4>
          Sep 2006 – Apr 2009: Lead Developer / Technical Director / CTO - <a href="http://www.puttoo.com" target="_new">Puttoo Limited</a>
        </h4>
        <ul>
          <li>Scoped, designed, developed and implemented our custom built software, including startup web venture puttoo.</li>
          <li>Managed the development process from initial concept through to launch.</li>
          <li>Managed development resources, communicated development progress to the board of directors.</li>
        </ul>
        <h4>
          Jun 2001 – Sep 2006: Senior Consultant / Software Architect - <a href="http://www.eos-solutions.com.au" target="_new">Enable Apps / Eos Solutions</a>
        </h4>
        <ul>
          <li>Scoped, designed, developed and implemented custom built and shrink-wrapped software solutions.</li>
          <li>Onsite client consulting, needs analysis, requirements gathering and preparation of proposals and responses to tenders.</li>
          <li>Management of development and co-development resources.</li>
          <li>Project management and software lifecycle management.</li>
        </ul>
        <h4>
          Oct 1999 - Jun 2001: Senior Consultant - <a href="http://www.powerlan.com.au/" target="_new">Entercorp Solutions / Powerlan Ltd</a>
        </h4>
        <ul>
          <li>Developed and maintained software solutions for clients.</li>
          <li>Prepared and implemented our consulting and development methodology.</li>
          <li>Onsite consulting, needs analysis, requirements gathering and preparation of proposals.</li>
          <li>Liaison with external vendors and suppliers.</li>
        </ul>
        <h4>
          Nov 1998 - Oct 1999: Database Administrator - <a href="http://www.wesleycollege.net/" target="_new">Wesley College Melbourne</a>
        </h4>
        <ul>
          <li>Implemented, maintained and coordinated delivery of database systems to 3000+ users across three campuses.</li>
          <li>Streamlined processes to cater for the dissemination, maintenance and life-cycle of 2500+ college-owned notebook computers.</li>
          <li>Developed interfaces to disparate data sources to improve information flow.</li>
        </ul>
        <h4>
          Feb 1995 - Mar 1996: Junior Programmer - Somerset Systems
        </h4>
        <ul>
          <li>Developed custom software solutions using the Lotus Notes and Microsoft Office platforms.</li>
          <li>Maintained internal systems.</li>
        </ul>
      </div>
      <div style="clear:both;">
        <h3>Education</h3>
        <h4>
          Bachelor of Computing - <a href="http://www.monash.edu.au/" target="_new">Monash University</a>
        </h4>
        <h4>
          Associate Diploma in Computer Technology - <a href="http://www.vu.edu.au/" target="_new">Victoria University</a>
        </h4>
        <h4>
          Certificate of IT Project Management - <a href="http://www.aim.com.au/" target="_new">Australian Institute of Management</a>
        </h4>
      </div>
    </article>
  </section>
  <section id="about" showarticles="2" synopsis="3" scope="local" sidebar="yes">
    <article id="aboutme" title="about me" category="about">
      <p>
        I have a over a decade of experience in the IT industry comprising a wide array of roles and with exposure to a number of disparate industries
        including state and federal government departments. My key focus has been on information and knowledge management, especially with regard to
        document management, systems integration and business process modelling.
      </p>
      <p>
        My web application development experience has focussed on creating standards-driven and accessible web applications using core principles of 
        functional and usable design.
      </p>
      <p>
        I am familiar with a wide range of both development methodologies and platforms and have extensive experience at all stages of the project life 
        cycle. My extensive software development background puts me in the position of being able to adapt to and adopt new technologies quickly and my 
        consulting and analysis experience gives me the ability to rapidly identify innovative methods of utilising technology to enhance business processes.
      </p>
    </article>
    <article id="aboutthis" title="about this site" category="about">
      <p>
        This site is an experiment in presenting XML content. I have an XML document (which you can <a href="content.xml" target="_new">view here</a> in its raw form) providing the whole of the content for the site and it is being presented
        through a lightweight ASP.NET application. Technologies used include XHTML, VB.NET, XML, XPath and CSS.
      </p>
    </article>
  </section>
  <section id="contact" showarticles="1" synopsis="0" scope="local" sidebar="no">
    
      <article id="contact" title="Contact Me" category="contact">
        <p>
         Feel free to get in touch using any of the following methods:
        </p>
		<ul>
			<li>Phone - +61 4 2384 7372</li>
			<li>Email - gb (at) gabrielbuckley (dot) com</li>
			<li>LinkedIn - <a href="http://www.linkedin.com/profile/view?id=11138646" target="_new">http://www.linkedin.com/profile</a></li>
			<li>Google + - <a href="http://gplus.to/gbuckley" target="_new">http://gplus.to/gbuckley</a></li>
			<li>Facebook - <a href="http://www.facebook.com/gbuckley" target="_new">http://www.facebook.com/gbuckley</a></li>
			<li>Twitter - <a href="http://twitter.com/#!/gabrielbuckley" target="_new">http://twitter.com/#!/gabrielbuckley</a></li>
		</ul>
      </article>
    
    
  </section>
  
</content>
