Posted on

The Ultraviolet Seafood Extravaganza

The other night the family and I headed out to The Lionleigh for dinner, along with about 10 other people. I hadn’t been for a really long time. Actually, I think the last time I went my parents had to pry me away from my Commodore 64, and I may have worn an ALF t-shirt.

Upon entering we passed through the Ultraviolet Light zone near the pokies and I wondered for a moment if we were being decontaminated, depolarised, or perhaps just being put in the mood for nite-clubbing. I noticed this wasn’t the only entrance so I’m not sure if we came in the wrong way or if every visitor needs checking to see if they’re radioactive.

We found our table, perused the menus and managed to order drinks from the bar and return without any dramas. The kids found the ping pong table and unfortunately I had to advise them that I was the 1987 champion of the universe in ping pong, as awarded to me at the Bajool State School in the 6th grade. Unfortunately I lost the title in the following year due to a technicality (thanks a lot BARRY). However, I was happy enough to come out of retirement and bounce a few balls around. Fortunately the ping pong table had a built in handicapping feature where one end is in almost complete darkness. Being in the top 90% of dads – of course I made the kids play on that end.

Returning to the table and tired of chasing ping pong balls around it was quickly decided that my wife and I would share the seafood platter. At fifty bucks it seemed like pretty good value.

There was some upset as the restaurant seemed devoid of chicken wings, and almost out of ribs. Of course, the dish most in demand was chicken wings and ribs which meant that some of our party had to draw straws and pick a different pub meal.

I noticed the menu had a 1kg steak challenge, although it apparently required 24 hour notice. Bit disappointing, but understandable. My wife did not seem upset, and if I’m to be honest I don’t exactly need my picture on any more walls around town for eating enormous amounts of steak.

After some amount of time equivalent to three quarters of a beer, our platter arrived at nearly the same time as the same platter for somebody else. It actually looked quite loaded, and I was fairly impressed at the volume of fried things on it. There was quite a generous service of salmon, battered fish, calamari, prawns and some crumbed scallops. A large serving of chips and coleslaw was on the platter too, and plenty of tartare sauce.

The salmon was covered in (what I think was) a honey soy sauce that I judged to be “not too bad” but I felt it was an odd combination for the salmon. Three other people agreed, and my wife immediately declared that I had to eat it. The sauce had drifted into contact with a lot of the chips and I was told that it was my job to eat those ones. The couple of fresh prawns were apparently tasteless and disappointing. The calamari, battered fish and the chips were all pretty good. The OTHER platter ordered by the folks next to us had really good looking tartare sauce. Ours looked much yellower, runnier, and maybe a week older. Or perhaps it came out of a different bottle. The couple of scallops were GREAT, although they were covered in a seemingly over-generous amount of crumbs – most people were just eating the insides.

Overall, outstanding value for $50, we were both well fed with quite an amount left over. I asked for scores and received: 5 out of 10, 2 out of 5, and 4.5 out of 17 (I know right?) I give it a solid 5 stars for value and 3 stars in overall quality. I’d go back.

The kids both had no complaints, and I noticed that a nearby kids meal was “chicken nuggets” that looked like pretty decent in-house crumbed chicken pieces. Kudos Lionleigh for not dishing out processed chicken.

The pub restaurant atmosphere was fair, the air conditioning worked great, and the beer was cold. A proper amount of Farnsey and Barnsey was played.

Sadly, I cannot report on the house desserts as we brought our own birthday cake.

This was originally posted over at the Rockhampton Food Rater Facebook page on 3 March 2017.

Posted on

Geckoboard API via VBscript

Geckoboard is a great tool for any organisation that needs to track KPI’s, statistics or other pertinent live information. It is particularly well suited to displaying live information on large screens around the office.

Whilst Geckoboard integrates into a lot of different services already there’s a fair chance you’ll want to display information from other sources too.

Fortunately it features a relatively new API that allows for external data to pushed up to the board in the form of ‘datasets’ which can then be displayed in various ways.

In my case I wanted to use VBscript to pull data out of Microsoft SQL Server and display them on the board. Unfortunately the samples of the site were for other programming environment and did not seem to directly apply to me. It took a friendly soul on the message boards to point out that the API is actually a REST service and the various demo code was just a wrapper for that.

I hadn’t done much using RESTful APIs in the past, although I have done a fair bit using SOAP/XML so I figured this would be straightforward.

I found that this wasn’t too hard, and I will document the various samples. If you already know how to drive node.js or Ruby then those environments might suit you also. In my case I wanted to use VBscript because it’s light and simple, and will run on any Windows computer without having to install any tools or frameworks.

The API Key

In the sample code in the Geckoboard API docs, the API key is specified. A base64 encoded version of the API key actually needs to be sent in the query and I imagine the node.js framework takes care of that part. In my sample code I just send the base64 version of the key. Follow the Geckoboard instructions on how to retrieve your unique key, and then Google for a tool to base64 encode it. Use the encoded version of the string in the samples provided. Obviously I could convert the key to base64 every time but I just don’t see the point because it only ever really needs doing once.

Authentication

The Datasets API only accepts secure connections. So you must make all requests over HTTPS.

You can test your API key is working with the following sample code. Replace the base64 encoded auth key with your own.

Dim restReq, url, authkey

URL = "https://api.geckoboard.com/"
authkeybase64 = "putyourkeyhere-inbase64format!"

Set restReq = CreateObject("Microsoft.XMLHTTP")
restReq.open "GET", url, false
restReq.setRequestHeader "Authorization", "Basic " & authkeybase64

restReq.send ""

WScript.Echo restReq.responseText

You should get a 200 response containing {}

Make sure you have this working before trying to create a dataset, or before updating a dataset!

Creating a new dataset

Edit the URL string and specify the name of your dataset. When you update the dataset later on you’ll specify the same name. Edit the JSONstring to suit your own needs – see the API docs for more info on the various data types and formatting

Dim restReq, url, authkey, JSONstring

Set restReq = CreateObject("Microsoft.XMLHTTP")

url = "https://api.geckoboard.com/datasets/yourdatasetname"
JSONstring = "{""fields"": { ""anamountfield"": { ""type"": ""number"", ""name"": ""Amount""} } }"
authkey = "putyourkeyhere-inbase64format!"

restReq.open "PUT", url, false

restReq.setRequestHeader "Authorization", "Basic " & authkey
restReq.setRequestHeader "Content-Type", "application/json"

restReq.send JSONstring

WScript.echo("Geckoboard responded with: " & restReq.responseText

A response string containing your JSONstring data should come back. The dataset will also be available in Geckoboard, although of course there’s no data in it yet!

Replace all data in a dataset

Of course edit the URL to match a dataset that you want to replace. Also substitute your own API key that has been encoded in base64 format. Your JSONstring will also be your own.

Dim restReq, url, authkey, JSONstring

URL = "https://api.geckoboard.com/datasets/yourdatasetname/data"
authkeybase64 = "putyourkeyhere-inbase64format!"
JSONstring = "{""data"": [ {""anamountfield"": 7} ] }"	

restReq.open "PUT", url, false
restReq.setRequestHeader "Authorization", "Basic " & authkeybase64
restReq.setRequestHeader "Content-Type", "application/json"

restReq.send JSONstring

WScript.echo("Geckboard responded with: " & restReq.responseText)

A response string containing your JSONstring data should come back. The dataset will also be available in Geckoboard, although of course there’s no data in it yet!

The formatting of your JSON string is highly situational – you can test it using plenty of online JSON checkers. Remember in VBscript that you escape a double quote character by using two of them. So replace any instances of “” with a single ” in any checkers.

Appending data to a dataset

This is now possible. Only one small change is needed to the code that replaces the dataset – replace the PUT verb with POST and you’re set. Brilliant!

To be complete, change the appropriate line to

restReq.open "PUT", url, false

 

Hope this helps!

 

Posted on

The NBN is Coming – But Don’t Panic!

The National Broadband Network (NBN) is being offered in some locations in Rockhampton, with increased coverage coming over the coming months to homes and businesses. There seems to be a lot of confusion about NBN, and what changes will occur, and how this will affect homes and businesses.

First, without getting overly and boringly technical, the NBN as we will see it in most areas of Rockhampton is of the Fibre-to-the-Node (FTTN) variety. This means that NBN Co. and their contractors are running optical fibre cables to various “nodes” or cabinets around Rockhampton. If you drive around the CBD at the moment it’s hard to miss them as they seem to be installed on about every second street corner. The fibre cabling ends at the node cabinet and regular copper wiring then continues on, and enters into your home or business. Because the length of the copper wiring is therefore probably shorter than it used to be, greater speeds are possible over the connection.

At some point, NBN will be enabled at your home or business location and notification from NBN Co. should be received, probably along with offers of Internet service from various companies. Once you receive the notification you have the option to talk to any Internet provider that offers NBN in Rockhampton, and then work with them to transition your Internet service and possibly also your phone services over. Note that you probably will NOT have to make any immediate decisions and will have at least 18 months of grace period before any types of services will be switched off. Don’t feel pressured to make any hasty decisions.

Advice for business customers is much the same, although in many cases you may technically not have to even migrate phone services to NBN. Only “analogue” phone lines will be disconnected after 18 months, whereas the digital “ISDN” services will not be disconnected at all. There may well be commercial advantages to migrating from ISDN to NBN telephone services, such as lower call rates, but similarly there should be no pressure to do it for fear of having anything disconnected. Alarm systems, fire panels, medical alarms and other critical services should be discussed with your IT provider or your Internet provider early on in the process.

If I were to distill my advice into a few short points:

  • Don’t panic! Take a deep breath, you have time to do this properly so don’t be pressured into making quick changes.
  • At home, go with your current provider if they aren’t causing you grief, but don’t be afraid to shop around either. The underlying NBN network is exactly the same regardless of Internet provider, although you may well find that the “cheap and cheerful” ones seem a little (or a lot) slower.
  • For businesses, talk to your trusted IT provider and have a plan in place, and be wary of plans that involve buying a lot of new equipment unless there’s substantial benefit for you.
Posted on

Simulating Calculated Fields in Order Porter Templates for QuosalSell

At my work we use a product called QuosalSell to produce quotes that are delivered to customers via a web service. The quotes are viewed in customised templates that are essentially HTML documents with a few product-specific tags inside them that are substituted with data from the quote, and conditionally display various quote elements depending on some conditions.

This is all fine and dandy until i came upon a need to show only the Price+GST (tax) price on line items. There was apparently no “tag” for that value and the knowledgeable Quosal support confirmed that I was essentially out of luck unless I was willing to make significant compromises.

Woe is me. I was a bit annoyed for a few hours. Then it occurred to me that because I had access to the template that I could insert a bit of javascript that runs in the browser that will take the old price, perform a calculation on it, and replace it within the page.

Bwahaha the end user will never know.

So here it is. Try at your own risk, although it works for me just fine. You can very easily break an Order Porter template so I suggest backing it up before you change anything. You can also assume that this will be totally unsupported by Quosal and certainly unsupported by me.

My suggestion would be to create a new copy of an Order Porter template group so you don’t mess up any existing templates. Edit the “EntryPoint” document.

Place the following code in a sensible place AFTER the fields you want to modify. Right down the bottom is probably not a bad idea.

<script>
var x = document.getElementsByClassName('exprice');
var i;

for (i = 0; i < x.length; i++) {
  var exPrice = x[i].innerHTML
  incPrice = Number(exPrice.replace(/[^0-9\.]+/g,"")) * 1.1; 
  var incPrice = incPrice.toFixed(2);
  if (incPrice.length > 6) {
    incPrice = incPrice.slice(0, incPrice.length-6) + "," + incPrice.slice(incPrice.length-6);
  }
  x[i].innerHTML = "$" + incPrice ;
}
</script>

So what happens here? This bit of code executes in the browser and searches for all the elements with a class name of “exprice” and returns them as a collection. The collection is iterated through – and the value is read in, stripped of boring characters, multiplied by 110%, rounded to two decimal places and then formatted with a dollar sign and possibly commas. It is then output back into the “exprice” class and the user knows no difference.

So then… all that is left is to place classes around values in the template that you want to change.

This is a sample of a line that was interesting to me:

<td class="right">#Item.PrintedPrice</td>

We simply need to wrap a DIV tag around the value I want to replace and give it the right class name:

<td class="right"><div class="exprice">#Item.PrintedPrice</div></td>

Save the template and upload template metadata to Order Porter. Create or modify a template ensuring that you choose the new template group on the Publish page.

I hope this helps someone!

Posted on Leave a comment

Saving HTML5 Canvas to a Web Server using Classic ASP.

HTML5 brought a bunch of new features including the canvas. The canvas allows for us to draw on it, create shapes and perform other graphical activities.

Handily, the canvas allows us to access the data that represents what is drawn on it, and sometimes we want to send that back to a web server. One example use for me has been to accept a signature at the end of a document, and save the signature data back to the web server. If you like, the web server code can convert the canvas data back into an image fairly easily.

In my case I had a Windows web server running IIS on Server 2012 R2 and all of the samples I could find involved building web services using Visual Studio. I really just wanted something simple. Here’s what i came up with, and it works. Feel free to improve upon it or do whatever you will.

How it Works

Construct an event that retrieves the data from the canvas using the .toDataURL() function. The result is a Base64 encoded string that represents the image data. you can actually use that string as a target for an image in HTML instead of linking to a physical file. This is very cool.

Check out the documentation for the function to see other options for producing data for a JPEG.

Once we have the data in a variable we can perform an HTTP POST command to submit our data to the web server. You might be familiar with the HTTP GET method of passing data between web pages, where parameters are passed like:

http://mysite/myapp.aspx?user=Barry&age=99

This works well enough for simple applications but the downside is that the data is visible, and has a length limit. Submitting data as a POST (like a form submission would) makes the URL neater, and provides for submissions of any size.

The page we call on the web server can then simply read the HTTP POST variables and deal with the data accordingly. You can also respond back and pass text to the browser (this is essentially one of the main mechanisms for web pages to dynamically update content based on queries or real time events). In this case we’re just going to wait for a simple “OK” text string to come back.

In The Browser

We’re sending a variable called fileData with a string stored in PicData. you can append other variables and values as needed too.

PicData = signaturePad.toDataURL();

// Sending the image data to Server
var formData = new FormData();
formData.append('fileData', PicData);
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4 && xhr.status == 200) {
    if (xhr.responseText == "OK") {
      // received an OK back. You could send other messages back here too and update or reload the page as needed.
    }
  }
}
xhr.open('POST', "/uploadCanvas.aspx", true);
xhr.send(formData);

 

On the Web Server (IIS) End

Create the uploadCanvas.aspx file and place the following text into it. This sample creates a text file and saves the signature into it which is NOT something you would ordinarily do – it’s just an example. Your web server would require permissions to write to the folder, and if you get it wrong people might download your files directly. So please adapt this to your situation.

This is tonnes simpler than building a full blown .NET app with Controllers and other things. If you’re just a bit of a hacker like me then this might suit you too.

I imagine doing the same thing in PHP would be quite simple too.

<%
Dim myFileData, f, FSO
myFileData = Request.Form("fileData")
' If you passed other data you can retrieve them here too

FSO = CreateObject("Scripting.FileSystemObject") 
f = FSO.CreateTextFile("d:\webapp\signatures\example.txt", true)
f.Write(myFileData)
f.Close

' Send a simple OK back. You could send other data, or even HTML back.
Response.Write("OK")
%>

 

And Just One More Thing

It should be quite straightforward to convert the string to a binary file using a Base64 function if you need to do that. For me, I used the data string as the target for an <IMG> tag so that i could build an HTML document on the web server that contained the (signature) image embedded into it. I actually avoided the need to build a PDF document as it suited my needs well enough.

 

Posted on Leave a comment

Minecraft Python Script to Create a Hollow Sphere

For a few years now I casually use a bit of lazy script to do boring things in Minecraft for me. Like, when the kids want to empty out an ocean or dig a big hole. One day I decided to build an enormous sphere just because.

You can read my other article on how to set this up first.

I’ll do this in sections so you know what’s going on. There are definitely many optimisations to make, so be kind. I’m perfectly aware that the distance can be calculated with sqrt(x^2 + y^2 + z^2). Obviously there’s heaps of mods that can do this sort of thing too. But this is more funner.

Can you make some minor changes to build an enormous dome over a city? Or to create an underwater Atlantis?

#!/usr/bin/python

# This script builds a sphere at the specified centre co-ordinates

import pprint
import os
import math

#diameter of sphere - radius is obviously half of this - always make it odd to keep things easy
n = 101

#centre coordinates
Start_X = 200
Start_Y = 130
Start_Z = 300

#sphere material
sphere_block = "stained_glass 3"
inside_block = "air 0"

##########
# START
##########

# the radius is how many blocks radiate from the centre.
# I choose to always make the sphere an odd diameter so that there is always a centre block and then an equal number of blocks radiating out
radius = (n-1) / 2

# when I put my co-ordinates in it is easier to specify where I want the centre to be
# therefore I fudge the co-ordinates a bit to offset this
Start_X = Start_X - radius
Start_Y = Start_Y - radius
Start_Z = Start_Z - radius

# create a massive in-memory 3d array that will contain the sphere
# fill it full of 0s to represent empty air initially
sphere = [[[0 for k in xrange(n)] for j in xrange(n)] for i in xrange(n)]
# iterate through all elements in the array and if the (rounded) distance from the centre to the element is less than or equal to the radius then it must be inside the sphere
# mark all the elements inside as a 1
for x in range(0, n):
for y in range(0, n):
for z in range(0, n):
xradius = abs(radius - x)
yradius = abs(radius - y)
zradius = abs(radius - z)
myradius = math.sqrt((xradius * xradius) + (yradius * yradius))
myradius = math.sqrt((myradius * myradius) + (zradius * zradius))
if round(myradius) <= radius:
# 0 is outside the sphere
sphere[x][y][z] = 1

# iterate through all the array elements and find ones that don’t touch any outside blocks. They are therefore inside blocks
# no need to iterate through the array elects on the “outside” of the cube as by definition they cannot be inside blocks - so that at 1 and loop through to n-1
# note that we only have to check 6 locations for each array element - each of the sides and above and below it
for x in range(1, n-1):
for y in range(1, n-1):
for z in range(1, n-1):
if (sphere[x+1][y][z] != 0) and (sphere[x-1][y][z] != 0) and (sphere[x][y+1][z] != 0) and (sphere[x][y-1][z] != 0) and (sphere[x][y][z+1] != 0) and (sphere[x][y][z-1] != 0):
# 2 is inside the sphere
sphere[x][y][z] = 2

# we are done, now just loop through and output all the elements that equal 1. Remember 0 is outside and 2 is inside.
# you could obviously output the elements equalling 2 as well if you want a solid sphere, or want to fill it with something cool like water or lava.
for x in range(0, n):
for y in range(0, n):
for z in range(0, n):
if sphere[x][y][z] == 1:
cmd = "screen -x minecraft -X stuff '/setblock " + str(Start_X+x) + " " + str(Start_Y+y) + " " + str(Start_Z+z) + " " + sphere_block + " replace\x0D'"
os.system(cmd)

 

Posted on Leave a comment

Scripting Minecraft with Python under Mac OSX

My kids really love Minecraft. They begged me for the game until I relented. Then they played it whenever they could.

I just didn’t get it. It kind of looked a bit crap. Even adults seemed to be completely enamoured by it, which I just didn’t get.

Then, one Good Friday we were sitting around the kitchen table playing games and I picked up my son’s iPad and gave it a try.

Damn. Okay. I can see where the interest is. I was digging underground tunnels, and even in the fairly limited mobile version we had a lot of fun playing together.

Fast forward a little bit and I ended up running up a server for the kids to play on because I didn’t rally like the idea of them out there joining random servers with strangers, and also, TNT. The boy likes to blow things up.

So I set them up with a server on my little Mac mini server at home, and they’d invite their friends on and everything was peachy.

And then one day I was on playing with them and was diligently mining out some tunnels and thought, “Damn this is tiresome, surely there’s a better way to dig these mile long tunnels?”

Turns out there is!

Small disclaimer. Minecraft is so unbelievably hackable  I’m sure there are MANY ways to script, modify and extend it. I’m also sure there’s better code than mine. But it works for me, and might be useful for others too. No hate, bro.

Running the Server

Okay. So this will definitely work under pretty much any version of Mac OSX, and probably also Linux. I don’t know about Windows as I’m using the screen utility to make it possible. There might be a way but I don’t know.

Using this method we’ll be able to add blocks through python code from the server end without anything on the client end. You can log in and watch the blocks as they’re placed, which is kind of mesmerising and cool 🙂

Now then, we need to run the Minecraft application on the server in a screen instance. This will allow us to pass commands into the screen session from our Python script.

Here’s something similar to my Minecraft startup script. It changes into the Minecraft directory and runs screen with a session name of “minecraft” which then runs your typical Minecraft command line to invoke java and load the application.

Create a text file called something like mcstart.command and launch Minecraft similarly to below. You’ll need to substitute for your Minecraft directory – and be careful of the line wrapping (there’s only 3 lines).

#!/bin/bash
cd ~/mcserver
screen -S minecraft java -Xmx1024M -Xms1024M -jar minecraft_server.1.10.jar nogui

You might need to make the file executable with:

chmod +x mcstart.command

 

Cool! So now launch Minecraft from the script which will run inside a screen session called “minecraft”. In OSX you should be able to double click mcstart.command to make it run too. I’ll leave it up to you to add it to your startup items so it launches every time your computer restarts.

Now on the server end also you can create a python script to send commands into the screen session.

Try something like this. Create a file called mcscript.py and edit it. Put something like this in:

#!/usr/bin/python

# Setup our co-ordinates
Start_X = 10
Start_Y = 70
Start_Z = 20

# Define the block to use
Our_Block = "double_stone_slab 4"

cmd = "screen -x minecraft -X stuff '/setblock " + str(Start_X) + " " + str(Start_Y) + " " + str(Start_Z) + " " + Our_Block + " replace\x0D'"

os.system(cmd)

Run the script from the command line by using:

./mcscript.py

You may also need to make it executable.

In the above code we define some co-ordinates. The X co-ordinate in Minecraft increases to the east, Z increases to the north, and Y is the vertical co-ordinate. Note that Y values less than about 65 is probably underground, and cannot go above 255.

The variable Our_Block in the code defines the block and variation. If you search online for something like “Minecraft ID List” you should find plenty of references to the various blocks. Things can be named strangely. Powered rails for example are “Golden_Rail” or something.

Obviously you can use loops to output more than one block. On my modest Mac mini scripts can place about 30-50 blocks per second.

  • Note also that you don’t seem to be able to place blocks that are far away in the world from an active player. An error along the lines of “can’t place block outside of the world” is shown in the screen session.
  • Remember that you can see your current co-ordinate by pressing F3. You can also get close to a particular block and mouse over it to see the co-ordinates while the F3 info is shown
  • The Y co-ordinate seems to be where your head is. For the block under your feet subtract 2.
  • Existing blocks can be replaced with “Air 0” too!

 

I hope this helps!

Posted on Leave a comment

A Sunday afternoon

I woke up this morning at about 5:30am. This is typical for me these days, but not because I’m an early morning person. In fact, the opposite is true. If it were up to me, I’d lay in bed until around the middle of the day and only get out when I really had to. On a good day, I’ll get out of bed and my biggest problem will be whether to skip breakfast or start lunch early. Staying in bed until midday solves that little conundrum nicely.

I’m not exactly the poster child for cosy sleeping either. If you have ever had that image of somebody snoozing soundly whilst rugged up snugly in their bed with the blankets pulled up firmly to the chin, with cute little sleeping noises coming from them, then you have not seen me sleep.

Rather, I tend to sleep sprawled out like a shaved, white sloth, with sheets and blankets scattered about me, and often half-dangling to the floor. Usually I will be snoring loudly, with my mouth open as though I’m a guppie plucked out of water. Most likely I’ll be drooling. Generally it is not a good sight, and children and cats avoid me when sleeping. Trying to wake me up when I’m in this stage is akin to poking a large, sleeping lion with a sharp stick. A stick with meat on the end of it.

Regardless of my usual sleeping patterns, I have recently been waking up early because my wife is a runner. She chooses to get up early and go running for large distances at ungodly times in the dark. I’m actually very supportive of the activity, especially given that my own commitment usually just involves saying, “See you later!” To my relief, when she has gone running, she has always returned to our house. If she ever goes out running with a suitcase and a packed lunch I’ll know I’m in trouble.

Today was a special run. She had been training for a 10 kilometre event in a locally organised activity. 10km seems like a really long way to run. I know that there are people out there that run marathons and I will award you full kudos for doing that. However in this I’m easily impressed because 10km is about a thousand times further away than our front letter box. And I’ve only visited the letter box a couple of times.

She set off this morning to meet with running companions and take on the challenge. I remained at home because standing around with other husbands at finish lines is not my ordinary past time, and I had promised the kids an outing for the day. So, after letting the kids sleep in until a comfortable 8:00am, and with just a quick detour to check that our suitcases were all still present, I managed to drag both kids out of bed and line them both up downstairs. I told both kids that due to me being in the top 75% of parents I was going to take them out for breakfast and to see a movie. My 9 year old son took the opportunity to remind me that I was his second favourite parent, God bless his little heart. Additionally, he pointed out that his sister was his third favourite person, which I thought was rather kind.

We headed off to our favourite breakfast place that is essentially a palace for people with no self control. It’s one of those breakfast buffet places where you help yourself to as much of everything as you like. Unlimited bacon, along with access to ice cream for breakfast are reasons why 25% of parents are ranked higher than me.

During this time my wife rang me and passed on the good news that she had completed 10km in her record time. My bacon consumption record did seem insignificant so I decided not to mention it. I mentioned that we were seeing a movie after breakfast, although she declined due to the apparent fact that X-Men does not contain Iron Man. Or, more specifically, does not contain Robert Downey Jr.

After breakfast we managed to arrive at the local cinema complex and purchased our tickets. During the film I was giving my son tips on who the various new superheroes were. He just nodded and looked at me sadly. Apparently recent cartoon tv shows contain the entirety of the comics universe and all children under the age of twelve have an encyclopaedic knowledge of comicdom. I felt as though I was transported back to an earlier point in time when a nine year old version of myself struggled to teach my parents how to operate a VCR. Damn kids.

We left the cinema to head home, and my daughter, firmly in the midst of teenage angst pointed out that her phone was at 10% battery. I was not prepared for such an emergency I admit, and suggestions that I should fire a flare into the sky to attract the coastguard were not well received. Even now I’m not totally sure what happens when a teenager’s phone gets to 0% battery, but it did seem likely that our lives depended on it not happening. I made the helpful suggestion that not pushing buttons and doing things on the phone would prolong the battery life. The response was enlightening, because apparently if you can’t touch the phone then how will snapchat, iMessage, Instagram and Facebook work? I did not have a good way to deal with this.

Generally, when confronted with really hard questions from women, my tactic is to lay down and pretend I’m dead. “Do I look fat in this?” Sorry honey, I’m laying on the ground dead, ask an alive person.

It was a good day, and much adulting was done.

Posted on Leave a comment

Recollections of Ribs & Rumps

Right after work today I asked the family if they felt like eating out and what they felt like having. My teenage daughter pipes up instantly with, “Italian!” closely followed by my young son with, “What the heck is Italian?”. An education session (i.e., fighting between kids) followed whereupon he advised that the only flavour of Italian he likes is Ham & Pineapple. Or perhaps anything with bacon.

I briefly considered the new Pacinos, but the sounds of the still-squabbling kids in the background motivated me to keep thinking. Keep in mind that I love Pacinos, but I typically save it for special dinners – like when I’ve done something wrong.

The boy then suggested Chinese and I caught myself daydreaming of Malaysia Hut, with bowls of steaming hot oriental wonders, delectable sauces and some of the best spring rolls for two towns over. However my wife immediately vetoed the idea. Crap.

I suggested Ribs & Rumps (R&R from now on) and as far as I recall everyone was in agreement. Possibly they weren’t, but my memory is funny that way.

As a long time believer that salad is just what food eats, I was pleased to hear that R&R was opening up locally. I have driven past the one in Gladstone during early evening and seen the place packed out – so you might say I was really keen to give it a go. My cunning plan was coming together!

The early reviews from foodie pages on Facebook have not been comforting I admit, although I’ve also seen quite a few positives also. The only way to be sure was to check it out myself.

We pulled up out the front at about 6:00PM. Tonnes of parking along the river bank at that time of evening. Externally, the building is just beautiful – it’s so great to see these kinds of developments coming to the river bank. Inside has a fair bit of wow factor too. Thankfully they’ve forgone the typical Aussie rustic steakhouse theme of number plates and tin junk nailed to the walls – and instead decorated in a nice modern timber and wrought iron style. The dining areas are offered both indoors and outdoors, with indoors divided between traditional seating and more intimate style tables with 3 or 4 tall stools around them. We speculated that some people might just gather around those for drinks (close to the bar) or for light dinners. A lot of tables outside too although the chairs are made of some kind of brightly coloured plastic stuff which seemed out of place, and a couple of couches. If it rained, you wouldn’t want to be outside as there didn’t seem to be a lot of protection against the elements. Fortunately the weather was absolutely perfect for us.

We were seated quickly and efficiently, a bottle of water and glasses was brought out and served to all automatically. Nice touch. It occurred to me how many staff were in the place, I think 16 were visible to me and quite probably more.

Menus appeared (they’re quite fancy, but I guess they need to do something with the leftover skins from all the cows). Perusing the menu there’s a decent selection or ribs, steaks, burgers and “other things”. One item stood out to me, and as I write this I’m screaming to myself, DON’T DO IT! But alas I did. I ordered the “Meat your Match Challenge” which consists of a 1kg rump steak, a full rack of ribs and a double serve of fries. INSANE. I knew it was ridiculous. Over the top. Maybe even impossible. But goddam there was a free knife on the line and apparently 10% cash back forever and some kind of elite club to recognise your awesomeness (or gluttony).

I went for it – ordering my steak medium and selecting a mushroom sauce. We also ordered one kids fish and chips, along with a Parmigiania and a Wagyu Steak Sandwich.

Right after the order was placed and my certain doom was ensured the waitress mentioned that only 5 people had attempted it in Rockhampton, and that only 3 of them had completed it successfully. I didn’t want to openly weep in front of the kids.

I passed the next 20 minutes or so nervous. To fill in time I asked the kids how their day went and they both just looked at me with pity in their eyes. I asked the boy if he thought I could beat the steak challenge and he said, “Yeah dad, you sure can eat a lot of dinner!”. I didn’t know whether that was a compliment or not.

My poor wife. I should point out that most ordinary wives would not put up with their husbands betting steak houses that they can eat anything they send out. Only my wife would put up with a grown man putting themselves through torture for a FREE STEAK KNIFE (hey, remember those Demtel ads?).

Pondering the feat before me we discussed my general tactics. From previous research (watching American reality tv shows) I knew that the best strategy is to eat as fast as you can and to save the starches for last. The general plan then was to knock over the kilo rump, attack the rack (I am aware that sounds a little rude) and to then make a run for the finishing line with the chips. The crowd will cheer etc.

However, my plans were apparently buggered when a plate of ribs and chips came out. We immediately thought, “Dang, it’s coming as two separate meals which kind of ruins the plans.” However, an eagle-eyed waitress (a manager I think) spotted the mistake and pointed out that it was actually a different meal altogether and it was quickly transported away. Obviously no beatings were administered as our food delivery person soon after arrived with our correct meals (the food delivery waitress was different to our actual waitress, which were distinct from the other waitresses that seemed to serve as overlords making sure the others delivered all the things correctly). I’m sure a PhD could be done on the waitressing structure here.

The food arrived at the table and all that was missing were guys with trumpets and a ticker tape parade. It was set down and my plate consisted of approximately 18 bags of chips, obscured mostly with a full rack of pork ribs (I was asked which sort of ribs I wanted by the way). The lot was then topped with a kilo steak. Aesthetically it resembled a buffalo turned inside out by a UFO with just it’s horns cut off. SWEET JESUS. Other diners gawked, I felt embarrassed. My wife could have killed me. The kids were impressed.

I set upon the kilo rump and I have to say it’s just about the best damned rump I’d ever had. Absolutely perfectly medium, seasoned well and moist inside. No need for any sauce on this baby. If this is the general quality of a steak out of R&R then I fully endorse its consumption. I managed to make it through in double time and even fancied that I might have broken some kind of record (in reality, it is not timed at all). I was pleased with myself – I was now just left with massive chips and ribs so passers-by stopped double-taking at least.

Unfortunately R&R were out of bibs but they did issue me with a bowl and a moist towelette in a packet. Turns out that the lack of bib was not a problem.

I found the pork ribs to be extremely dry and I’m still uncertain what kind of sauce was on them. I was expecting (assuming?) some kind of BBQ flavour but it was maybe something weakly resembling honey and soy. It was borderline unpleasant and I thought at the time that perhaps it was made wrong, or the chef that devised the master recipe should seek a CAT scan to look for tumours. Other explanations seem far-fetched. I gave up trying to eat the meat from the ribs and ended up “shaving” it off with my knife. My wife observed that it wasn’t even close to falling away from the bone by itself. I don’t know if R&R claim to cook their ribs daily or not but I’m quite certain these were from the past, and reheated.

After the ribs were done I opened up the towelette and covered my hands in smelly chemicals. I had a flashback to baby wipes – that’s what you need ruing a meal.

Our excellent waitress dropped by to see how things were going (she was excited that some chump at one of her tables was trying the challenge I think). I mentioned that it was probably time to give it up. There were a LOT of chips left… I would estimate several serves worth and at this point they were mostly very mushy and squishy and covered in meat and rib juice. Fortunately (or so I thought) I had been saving the mushroom sauce and I dumped it over the chips.

Unfortunately I hated the mushroom gravy and now all my chips were covered in it. DAMN. I really struggled through. I was far past any point of comfort and obviously way beyond what anyone eats (you know, I don’t go eating kilo steaks and whole sides of ribs with any regularity). The taste of the gravy was getting to me and I found that it was actually making me nauseous and sick. This was now beyond cute or interesting, I wanted to just give up.

But then the chips were only half remaining. Can you give up when you’re 90% there? Suddenly this was about more. It was greater than just a guy, and just a plate full of chips. It was about my ability to finish the thing I said I would do, and to not be one of those people that fail at chips. Did my wife and kids, and my waitress deserve for me to give up? HELL NO.

I ate one chip at a time and was actually to the point where I couldn’t swallow anymore. I was food drunk, irritated at the sounds in the background (like an old man, you kids get off my lawn now you hear!). At one point I started resenting the last dozen chips for not falling off the plate on the trip over from the kitchen. I wondered why my cook couldn’t have had smaller hands (I know they probably use a scoop but give me a break, I was not rational), or accidentally cut my steak 1mm thinner. Such a small amount left to go and I was floundering.

As the waitress passed I asked if I could have a little bit of pepper sauce. $3 later (seriously?) it arrived, and tasted pretty damned average too. Honestly, I am not a professional chef but I rate my home cooking skills above R&R as far as mushroom and pepper sauces go.

Nonetheless I added about half the sauce to the stagnant, cold, mushy pond of ex-chips pining for better days on my plate and if anything made it even worse. I thought about asking to swap my chips out for fresh ones but assumed it would be against the rules and/or would require taking out a personal loan.

I made it through, and I was bloody dying inside. The waitress quickly issued me with my free steak knife, photographed me for posterity and then brought us the bill.

I realised later that the menu promised some kind of VIP Challenger card for future discounts (which is different to the normal rewards card) but I didn’t seem to get that. May follow up at a future date.

In other business, the boy enjoyed his fish and chips, my daughter said her parmigiana was really good, but my wife was not so happy with the steak sandwich. It was meant to be on a toasted turkish bun but was actually a different type of bread altogether it seemed, and the overall quality was apparently less than expected.

So, overall I was quite happy and positive. Staff and atmosphere are top notch, a beautiful location that’s very accessible and handy. Absolutely first rate steak in my experience.

A few things to improve. The sauces should be free. Charge me as much as you want for a steak and even charge me for sides if you must but $3 for a tiny pot of (what is probably) bottled catering sauce is a bit poor. The ribs can use improvement. I think the menu said something along the lines of them being famous for their ribs. umm yeah. Even the ones from Sizzler are 3 times better. Perhaps I got the dodgy ribs reserved for the challenge, I would bet that 9/10 times the ribs are left until last and not finished. Pure speculation, but I’m grasping at straws to find a reason for them being as they were.

I also think they should be able to do better than a “wet wipe” for cleaning up after the ribs and I’m still boggling at the idea that you don’t get any sides at all with a steak – they’re all $7 each. Not even a little salad. Or a couple of chips. As a consumer it doesn’t sit well with me. I just bought the most expensive thing on the menu but the thing that sticks in my mind is being charged $3 for a thimble of sauce. Please change this.

We will go again and I will order a normal meal and enjoy it properly.

Do not under any circumstances undertake the challenge unless you’re as stupid as me!

Note: This article originally appeared on the Rockhampton Food Rater Facebook page, and was written by me on 7 January, 2015.

Posted on

Finding Gold in Mount Morgan

Based on positive reviews seen here I managed to peel the kids off the computers this morning and load them along with my significant other into the car and head on up to the Grand Hotel in Mount Morgan.

We had a little trouble working out which entrance to use as we were looking for a blackboard or something with specials on or maybe a sign along the lines of, “Hey stupid, there’s food inside this door”.

No biggie though, as we soon located the entrance to the restaurant and went inside and found a table. The table had an upright menu offering pizzas and a few other items but after looking around we spotted a menu on an adjacent table that seemed to be the full faire so we nicked it.

Now, being the caring parent that I am the first thing I noticed was that there was no kids’ meal section on the menu. Not a huge issue I thought, the meals were fairly priced and guess who gets leftovers anyway? 🙂

Once we interrogated the kids and forced a decision out of them we went up to the ordering area and discovered that there was a full menu displayed there, with kids meals. My wife quickly scaled down one of the kids’ meals in size and I felt a brief moment of sadness.

Our lunches arrived in only 10 minutes or so. Possibly 5 minutes either side to be honest as one of my kids was informing me about his latest Minecraft activities which involved blowing up some chickens or thereabouts. Either way my beer hadn’t run out so it was fast enough.

I had the chicken parmie which was served with a good amount of chips and a nice salad. I would say it was a generous serving without being the ridiculous proportions that these things sometimes arrive in.

The other half had the Reef and Beef which looked spectacular and she was extremely happy with. The prawns and calamari were plentiful. The steak was probably a little over the requested medium although the overall was an emphatic thumbs up. For the $20 it must represent the most astounding value of any meal in CQ that I’ve seen.

My daughter had the twice-cooked pork belly and it was served on a nice bed of vegetables – and what I think were cranberries. It was just spectacular in my view. One comment from her was that the crackling was a little burnt although to put this in total perspective this kid thinks that browned toast is burnt. Indeed there were some blackish areas but I can’t imagine any carnivore passing it up nonetheless.

The younger boy orders a plain and vanilla fish and chips and I didn’t try any but it looked pretty good and zero complaints could be heard (and he’s a fussy eater, so hearing nothing is like hearing THS IS THE BEST EVER). A lot of establishments basically treat kids’ meals like crap, although this appeared to be something I would have been very happy with myself so kudos there guys.

Overall we were all happy with the experience and will go back. My wife (who is not a foodie, but does know what she doesn’t like) is not easily impressed is already planning what to have next time. Possibly this was aided by one of the chefs coming out and mentioning his deep fried chocolate which is new to the menu.

I think all meals and a round of drinks were around $60 which is less than a trip to Sizzler or a couple of pizzas.

TL;DR Pretty darn impressed – I suggest you go for a drive up and try it out.

Note: I originally posted this review on the Rockhampton Food Rater Facebook page on August 16, 2014.