Microwave project managing – week 0

I have started my first work orientated project for the year. The plan is to design, build a sell a new microwave design.

As I am currently running solo I have to wear a few more hats than I would normally, some I have never really wanted. One of these is project manager. To ensure I don’t get caught up working on something less critical and blow my time, or at least ensure I am aware of when it happens, I have come up with a plan.

Below is the detailed timeline of phase one, establishing the project’s viability, the plan is to repost this weekly. I don’t expect to keep strictly to the timeline, but at least having a base allows me to see the deviations.

I have actually detailed a fair bit of phases two and three as well but the program I am using to display the timeline struggles a bit with extensive content, I might fix it up some day.

View full screen


I have been playing around with duplicating another program’s web service API. I want to be able to act as a substitute but need to rewrite it in a new language and change a bunch of its features. To do this I have been running the original program’s functional tests against my own code.

Unfortunately it is sometimes difficult to see exactly what is going on. The tests are written in Python, which I am not very familiar with, and are wrapped through various layers adding different headers.

Happily Apache supports logging with mod_dumpio so I can run the tests until they fail and then simply look at the last request. That was the plan at least, but a single call generates sixty lines of log. Much of it looking like the sample below, obviously the middle line is content the other two are noise.

[Thu Jan 15 10:06:08.118940 2015] [dumpio:trace7] [pid 1840] mod_dumpio.c(63): [client ::1:53956] mod_dumpio: dumpio_out (data-HEAP): 1 bytes
[Thu Jan 15 10:06:08.118945 2015] [dumpio:trace7] [pid 1840] mod_dumpio.c(103): [client ::1:53956] mod_dumpio: dumpio_out (data-HEAP): 0
[Thu Jan 15 10:06:08.118952 2015] [dumpio:trace7] [pid 1840] mod_dumpio.c(63): [client ::1:53956] mod_dumpio: dumpio_out (metadata-EOS): 0 bytes

A quick search online threw up dumpio_parser.pl which extracts the requests from log files. However it works for Apache 2.2, not the slightly modified format in Apache 2.4.

So I rewrote the input portion of dumpio_parser.pl.

Then the output was in a marginally useful format, it essentially provided the same content lines in the log. I wanted a format I could throw at curl to retry the request and see if my bug fix had worked.

Fixing that I was still not satisfied. I didn’t like the output structure, it created a collection of tiny files, one for each request. And it ignored the output from the server. AND the structure was weird, first program I have seen using perl -n.

So I rewrote it.

Presenting dumpio2curl.

> tail -n 100 apache.log | perl ../dumpio2curl/dumpio2curl.pl

# Tue Jan 13 10:23:22.729122 2015 - pid 15952 - client 50304
curl -v \
--header "User-agent:" --header "Accept:" \
--request "DELETE" \
--header "Accept-Encoding: identity" \
--header "Content-Length: 0" \
--header "X-Forwarded-For:" \
--header "X-Forwarded-Script-Name: " \
--header "X-Forwarded-Scheme: http" \
--header "X-Wsgiproxy-Version: 0.1" \
--header "X-Forwarded-Server: localhost:88" \
--header "Authorization: Hawk ..." \


# Tue Jan 13 10:23:22.752411 2015 - pid 15952 - client 50304
# HTTP/1.1 200 OK
# Date: Mon, 12 Jan 2015 23:23:22 GMT
# Server: Apache/2.4.10 (Debian)
# X-Powered-By: PHP/5.6.4-1
# X-Weave-Timestamp: 1421105002.7521
# X-Last-Modified: 1421105002.73
# Content-Length: 2
# Content-Type: application/json; charset=utf8
# []

Winning at life – wrapping up the light project

The light installation is complete, I put it in last Saturday. That means I’m no longer a failure at life, well not a complete failure just a 50% failure. And if there’s one thing I learnt from my Engineering degree, 50% is a pass, think about that next time you put your life in an Engineer’s hands (flying in a plane, driving a car, walking over a bridge or switching on a power point).

The design worked a treat and the client was happy. I’m not sure what they were expecting but they seemed a little overwhelmed with a custom solution that perfectly fixed all their problems. It makes me wonder what they thought I was doing when I spent over an hour talking to them about what the issues were and what they needed.

Even the installation went fantastically even though there were a few little things I hadn’t fully thought and maybe a vital tool I forgot. Fortunately Keith agreed to come along and brought his ute full of tradie gear so I got away with it. With him taking the lead on the install it even looked like a really nice professional job. I know I can do most of the things an experienced tradesman can do but it’s like the difference between me cooking out of a recipe book and a professional chef, both end products could be described as food but only one bears any resemblance to the picture.

There was a bit of ironic excitement, I was there installing a light designed to prevent the quadraplegic client from burning himself. While at the same time he decided to burn a letter and managed to set his foot on fire, I heard him calling out and looked out the window to see flames climbing up his leg. I managed to stop him burning with only a little damage to myself, mainly due to the plastic fabrics. Unfortunately he ended up with a huge blister covering most of the top of the foot, at least he couldn’t feel it.

The only think I forgot to do was take some pictures. So this is another boring lump of text, here, have a puppy.

Box of a puppies milk, complete with a picture of the puppy it was stolen from

Milk for sadists, stolen from 100% organic puppies

In praise of Bunnings

I wanted a three bulb halogen light fitting, preferably running at 12V. Beyond that cheaper was more important that pretty and – because I wanted to play with the wiring – often better. I priced a few different options:

  • $100 Southside Lighting, Fyshwick
  • $90 Project Lighting, Tuggeranong (With special TADACT discount)
  • $52.70 Bunnings, Fyshwick (240V)

It ended up being a bit of a no brainer. I understand it’s hard for a specialist to compete with a massive chain like Bunnings and I agree with supporting better service. Frankly though I would have gotten better service from an illustrated catalog than I got from Southside Lighting, maybe even some pretty models too.

The dimmers I used are designed for standing lamps and came from Southside Lighting. Mind you the product I was quoted wasn’t in stock, they did however have an almost identical one that was $15 cheaper. Catalog wins again… if I had known about the cheaper one I could have brought the quote down to $200.

To finish this up and bring it back to Bunnings. I also discovered this weekend that it’s 1/3rd of the price to buy a cheap extension cable than to buy wire and a plug. I love mass production.

Wandering further off topic

I think we are going to see the end of most of these specialist shops and I couldn’t be happier. When a decent webpage can tell me everything I need to know with better service, they’re doing something wrong. The costs are just far too high to justify in the modern age, these are large shops and Project Lighting had four staff working when I last went in, for two customers (including me).

How long until someone moves through and eats their 100% profit margin with a local online warehouse. And why aren’t I doing it?

Maybe that could be October’s project.

Goal – Lighting for a quadraplegic man

My next project is a relatively simple lighting installation for a disabled man.

For a while now I have been involved with TADACT (Technical Aid for Disabled, Australian Capital Territory). Disabled people don’t come off assembly lines and have unique variances within their broad disability category. The standard equipment is targeted at the most common issues but this often isn’t quite what they need. TADACT is a group of volunteers that modify or manufacture specialty equipment for disabled people where there isn’t an adequate commercial solution.

Late last year I visited a quadriplegic man and talked about installing a custom light for him. Due to a vehicle accident he has no control below his chest and only crude movement of his arms and one thumb. He is also unable to exert any force with his arms.

He wanted a light he could control from his bed. The bedside lamps he was using were difficult for him to control due to the small switches. He didn’t like sleeping in the dark at night so it had dim while he slept but be bright enough to read by. He also moves his arms around at night and there’s a risk he could seriously burn himself with the bedside lamps, he had actually burnt himself just before I met him and received third degree burns again last week.

Taking those requirements (and a few more) I came up with a proposal. I would mount three halogen bulbs on the wall, one pointed at the bed and two at the roof with each set independently controllable. The wiring will be secured to the wall. There were two options proposed for the switching, using two sliding foot dimmers or jellybean switches and custom control circuitry. The second option was considerably more expensive, the jellybean switches are specially designed for disabled purposes and cost over $100 for a switch with almost the same functionality as a $2 switch at Jaycar. The almost is of course the slight modifications that make them better for disabled people.

Initially they decided that even the cheap option was too expensive. Yesterday TADACT contacted me and said a local charity had provided funding for the foot switch option. So this month’s project is to complete this for TADACT. The aim is to install it by the weekend of the first or second of May, preferably the weekend before.

This probably won’t take all of my time so I’ll use the rest to clean up some other stuff I should have done a while ago, might even do last year’s tax return…

Tax Project March Wrap up

So I cheated a bit and pushed the deadline out a week. While much of the checklist is done the project overall is nowhere near where I hoped it would be. The issue I think was that I assumed that I would be productive for the whole weekend but it turns out I actually do do social stuff and regular maintenance like cleaning or ironing. Looking back I think I committed about half the time I expected to.

Tax website screenshot showing layout

Tax website screenshot

Target features

  • Templating system

    Check. Using TT2 as described earlier. The templating isn’t complete but I was
    always planning on growing it as I went. Sadly it doesn’t properly implement the
    primatives I’m using but It’s good to start with a win, even if you steal it.

  • Basic layout

    Check. To start off with I had a ghastly colour scheme of different shades of red and roughly the layout I ended up with. I read on one of those innumerable website design blogs that colour schemes are important. All the classic mood stuff, red is firey and aggresive, white is serious, boring and reliable. Reliable seems like a good mood for a tax website but black and white is a bit too hard for someone as inept as I to pull off. So I went with a cream background and a yellow/browny secondary colour.

  • Functional data entry

    Check. This works pretty well actually, change an input box and it’s immediately pushed to the server. Not perfect (none of the code is), notably it’s not fully backgrounded so you get a slight delay.

  • Javascript data checking

    Fail. I didn’t get around to trying this.

  • Serverside storage

    Check. I went with MongoDB and it’s going well so far. Ended up having to write a very simple PHP script to expose the DB to the Javascript, primarily authentication wrapping.

  • Basic calculations

    Partial. I have some calculations working but it’s not a reusable structure.

  • Independent domain name

    Fail. The project isn’t far along enough to be useful yet so the domain isn’t important, so I’m marking this as a fail but don’t care. I also couldn’t find a free name I liked.

  • Public source repository


Maybe features

  • Client side encryption

    Fail. Didn’t start on this.

  • User login system

    Check. Pretty easy to implement with the DB layer in place. I don’t have user
    creation working yet but that is actually a fairly small amount of work.

  • Basic personal tax pack covered

    Fail. I’m nowhere near achieving this, it’s crazy how much they cram into a few pages.

  • Client side PDF generation

    Fail. Didn’t start on this.

Templating system

I knew when I started this project (which was a while ago, I kinda cheated on this one) that I didn’t want to write out all the HTML myself, I’m not THAT masochistic. What I wanted to do was basically say “make a text box to write the address in”.

So I started with a generic preprocessor. I’ve use preprocessors such as CPP, TeX and Make so figured I would take a generic preprocessor like M4 and define a few HTML macros… problem solved. Unfortunately it wasn’t that simple and as I added complexity it got harder to keep it all straight, particularly the quoting.

The basic text box wasn’t too bad.

dnl TEXT_Q(name, label, [length])
define(`TEXT_Q’, `indir(LAYOUT, `$1,
    `<label for="$1_text">$2</label>’,
    `<input id="$1_text" name="$1" ifelse($3, `’, `’, `size="$3"’)>’

But when I tried to create optional groupings it started to get messy. This is a snippit from TABULAR_OPTIONAL_ROWS and calling it.

    dnl Build the heading rows
    <tr class="tabular_optional_rows_heading_row">
    foreach(`XXXXX’, (dquote(shift($@))), `XXXXX’)

    `TEXT_Q(salary_abn, Payers Australian business number, 11), dnl TODO: Should be Payer’s

With TABULAR_OPTIONAL_ROWS I couldn’t figure out how to have a variable number of rows and I couldn’t figure out how to pass it’s options without quoting so I decided to throw in the towel and switch to something else.

I had experimented with Template Toolkit at work using it to inject snippits of Javascript into HTML documents. In the end I stopped using it and had a static HTML page which included a fully generated Javascript file but the short exposure I had impressed me and I tried it here. I found it much cleaner, the named parameters cut out a lot of complexity and the ability to just drop back to Perl if I wanted to do something really hairy was nice.

This is the definition of a text box followed by the calling syntax of a radio box that toggles the visibility of the text box.

<tr class="text" id="[% name %]_row" 
    [%- IF hide -%]
        style="display: none"
    [%- END -%]
<td class="question">
    <label for="[% name %]_id">[% text %]</label>
<td class="answer">
    <input type="text" name="[% name %]" id="[% name %]_id">

[% INCLUDE tax/radio
    name = "surname_changed"
    text = "Has any part of your name changed since completing your last tax return?"
    modify = "previous_surname"
    options = [{name => "Yes", action => "show"}, {name => "No", action => "hide"}]

[% INCLUDE tax/text
    name = "previous_surname"
    text = "Previous surname"
    hide = "true"

The normal syntax for options is simply [“Yes”, “No”], the Perl fallback I mentioned earlier allows me to have more complex syntax when I need it but keeps things simple most of the time. I’ve since discovered there’s a Template Toolkit version three that’s a nice step forward but it’s listed as still in development and in a very Alpha state, it also smelt a bit like it was suffering from classic second project woes. I think I’m playing with enough new stuff not to add experimental Template Toolkit versions to the list.

Goal – Online tax returns

For my first project I am going to make a web based tax return creator for Australian tax returns.

The Australian Tax Office (ATO) produces E-Tax, a program for Windows computers that allows you to produce a tax return and submit it online. Sadly it’s very much Windows only though they suggest exploring running Windows in a virtual machine. They are currently “investigating” supporting other platforms, but they have been doing this for years now and I’ve seen third hand correspondence that suggests the investigation isn’t progressing particularly quickly.

You can also fill in the return by hand on paper, complete with explanatory booklets. In practice the procedure for both is basically the same, the advantage of doing it digitally is that it’s easier to see the calculations and make corrections.

So the goal is to produce a website to help enter tax returns. I’ll base it off the paper tax return and as output produce a PDF that can be printed and posted in directly. The ATO actually accepts printouts from E-Tax so I’m fairly confident that they will accept these.

The secondary goal is to improve my abilities with Javascript. I have toyed around with Javascript a little bit, enough to do small tasks for webpages. In doing this I saw enough to know that Javascript had some fundamental differences but not enough to really understand or work with them. By doing a substantial Javascript project I hope to get over that hurdle and start to see how to properly design with the language.

By April 4th I’ll have a prototype site complete. Not a usable solution, that will probably happen sometime after the new tax returns come out in July. The development site can be seen at http://taxreturn.projects.david.tulloh.id.au/

April 4th features

  • Templating system
  • Basic layout
  • Functional data entry
  • Javascript data checking
  • Serverside storage
  • Basic calculations
  • Independent domain name
  • Public source repository

Maybe features

  • Client side encryption
  • User login system
  • Basic personal tax pack covered
  • Client side PDF generation

Later features

  • General package refactor
  • Complete core tax pack covered
  • Complete supplementary tax pack covered
  • Retrieve prefill information from ATO
  • Electronic submission to ATO
  • Integrate with accounting software
Return top