Weekend Workbench Workbench

I did not finish it until today, but I did start it on Sunday. We needed (or I wanted) a heavy duty workbench for outside projects. Most of the wood has been sitting in the bulkhead this winter and Sunday was the day to start building.

The problem now is that it is so heavy I will need both sons to move it.

Weekend Workbench

This weekend I assembled one of the row-houses I lasercut some weeks ago. The following is a short tutorial for the Wednesday Gamers to assemble their own.

To assemble a row-house you only need white glue and a careful hand. However, having a collection of Lego available for making jigs for ensuring square corners is very helpful.
There are two tools that you will likely need to create. The first tool is used to apply pressure around the perimeter of the house as it is drying.
The second tool is used to apply the window stone work. This will be shown later.

To help keep track of parts, place each part from the polybag on to the parts diagrams. Extra diagrams are available at parts diagram 1 and parts diagram 2. (Note that there are extra parts that were part of the original design and no longer needed.)

First create the roof. Take the gable end and chimney parts and glue them together as shown. Note that all edges face the sides of the building. It is expected that the buildings will be place in a row and so the building's sides will not been seen as much.
The roof is supported by the two gable ends and by two internal rafters. Glue each rafter so that the rafter's peak aligns with the roof's top edge. (The top edge is the one with the notches for the chimneys.) The rafters are placed 1 1/4" from each side.
Once the gable ends are dry then assemble the roof. (Note that chimney parts do not connect well to the roof. This is a design mistake.)
Finish off the chimneys with their tops. (This can be done when assembling the gable ends too.) Note that a couple of coats of white glue over the tops will help hide the seams.
The row-house has three floors. The first floor has 3 windows and a door per side. The second floor has 4 windows per side. The third floor has 4 windows per side. It is important to note that the third floor is shorter than the other floors. So pick your parts carefully.

Each floor is assembled in the same way. A front and a side are glued together.

While these are drying prepare the floor. The floor is raised 1/16" within the walls. Glue to each corner the L-shaped raisers. Note that when the floor is glued to the sides the raises are underneath.
Now glue the two front and side parts together and to the floor. I found it is best to apply a lot of glue to the edge of the floor and the edge of the walls and then push the walls to the floor. The perimeter tool is now used. It surrounds the walls and is angled upwards at a corner so as to apply equal pressure to each wall. 
With the perimeter tool in place your hands are free to adjust the upper parts of the wall so that they align and are square. Again, corner jigs made with Lego are helpful.

Your row-house is will look like this at is point.
Finish assembling the floors. Your row-house is almost complete.
At this point, the building is not stable. The roof and the floors sitting upon the one below and so a small bump to them or the table with topple them.

The reason why the floors were raised is to allow room for the alignment tabs. Add the alignment tabs to the second and third floors.

 Add alignment tabs to the roof.
The last step is to apply the window and door stonework. This task can be very fiddly, but is made less so with a small tool. This tool is assembled from the portion of the window that was cut out, glued to a slightly wider rectangle, and a handle is added to the back. (The window part is in the polybag and has the letter W written on it.)
Now a window's stonework can be place on the tool, glue added to the stonework with a brush, and the stonework is push into the window's opening. A stiff brush is used to push the stonework against the wall.
This is a slightly better design for this tool:
 With the window and door stonework applied the row-house is ready for painting.

Welsh & Vikings completed

And so the now completed armies of the Welsh and the Vikings head off into battle (or, more likely, small boxes for safe keeping).

Weekend Workbench

I am almost done with my Welsh and my Vikings. I only need now to put on a coat of matt varnish to finish them. Unfortunately, I need to wait until the weather warms up and the rains subside. Perhaps by then I may come to prefer their sheen.

While I wait for the weather to change, I have to organize the the parts to my row houses that I laser-cut a few weeks ago. The task is to take a pile of parts and organize them into baggies of parts for my friends to then assemble.
Update: Done. Nine houses with only 3 sets of the same missing part, which, luckily, is optional for construction.

Externalizable needs a serialVersionUID too.

Yesterday I learned that even if your Java class serializes via java.io.Externalizable, so giving the class complete control over the marshaling and unmarshaling of the data, you must still defined a serialVersionUID or Java will create one for you. As methods signatures are included in the calculation of serialVersionUID my newly added method caused the creation of a different version id and so, unexpectedly, the marshaled data on the wire was incompatible. To fix the problem I just needed to define serialVersionUID to be the calculated version prior to my addition of the method. Luckily, the log contained the version number I needed!

Laws for my children to learn sooner than later.

Parkinson's Law: Work fills the time allotted.

Gilmartin's Law: Time taken from work for play will be returned with time taken from play for work at the end of the project.

I need something pithier for Gilmartin's law. Suggestions will be well received.

Weekend Workbench

During the week I prepared the bases with sand glued and mounded around the figure's base. I then painted it. I first made the mistake of preparing with black and then painting with a too dark a green. God, they looked awful. So I asked Chris who is very talented with color for help and she picked out, from the colors I had on hand, Vallejo's 70.605 German Red Brown as a base color and Citadel's Elysian Green for the grass.

The brown was dabbed on with the side of the brush so as to leave some of the prior dark color. Then she dabbed on green in a few areas, again, with the side of the brush. Where there was too much green she dabbed on the brown very lightly. I really like the result.

Also on the workbench are some very small, rough cottages for my son's medieval castle diorama. We will see how far a little spackle, paint, and dried grass stalks will take us!

No stories worth retelling

I enjoy listening to The Moth, I highly recommended to all feeling people, except that I often become glum afterwards as I have no exciting stories to tell. Software development contains no stories worth retelling.

Weekend workbench

Weekend workbench. 8 Strathclyde Welsh, 1 Welsh mounted warlord, 1 "chubby" Welsh warlord, and 4 Jomsvikings. (The horses were painting a few weekends ago.) All figures are Gripping Beast metals.

Menus and vertical space

I have a dream that one day a webapp's drop-down & pop-up menu takes up the full vertical space available. [Old developer now hurriedly searching for reference within Inside Macintosh.]


Thunderplot looks to be a useful tool for quick plots. I copied some log data from a terminal window and pasted it into Thunderplot. There was no need for an intermediate file. Thunderplot found columns of integer numbers. I then plotted two line graphs from two of the columns. Calculations on the columnar data is available.

And today it is priced at $2.

Hanging slashes

This week we updated our production Apache Tomcat installations to 8.0.15 (from 5.5.30). We don't need any of TC8's additional capabilities, but we do need an implementation with ongoing security updates. An unexpected difference between these versions is the handling of trailing slashes on URL paths. TC5 would send any requests that were not mapped to a specific servlet to the the ROOT servlet. For example, when the path "/A/B/" was presented to TC5 it would look for servlet A and, not finding it, send the traffic to ROOT. TC8 does not: It returns an HTTP 404 error.

I tried to solve the problem by coding a TC8 Valve to intercept the request, rewrite the URL without a trailing slash, and then have TC8 restart the request process. And all without losing any request content sent with, for example, a PUT request. I was able to intercept and rewrite the URL, but I never successfully got TC8 to restart the request. I was very close, but time ran out for further exploration. (I was also unsuccessful with a Filter implementation.)

Our services are fronted by haproxy and it does allow for URL rewriting. The following placed in a frontend or a backend definition will remove any trailing slashes in the URL's path:

acl has-trailing-slash path_end /
reqrep ^(HEAD\ )(.*?)(\/+)(\?.*?)?(\ HTTP\/1.[01]) \1\2\4\5 if has-trailing-slash
reqrep ^(GET\ )(.*?)(\/+)(\?.*?)?(\ HTTP\/1.[01]) \1\2\4\5 if has-trailing-slash
reqrep ^(PUT\ )(.*?)(\/+)(\?.*?)?(\ HTTP\/1.[01]) \1\2\4\5 if has-trailing-slash
reqrep ^(POST\ )(.*?)(\/+)(\?.*?)?(\ HTTP\/1.[01]) \1\2\4\5 if has-trailing-slash

One could replace the 4 rewrite rules with just one that handles all the HTTP methods but I chose not to: The leading 2 characters are enough to quickly select the right rule.

"We have certain work to do for our bread..."

John Ruskin, Seven Lamps of Architecture:

We have certain work to do for our bread, and that is to be done strenuously; other work to do for our delight, and that is to be done heartily: neither is to be done by halves nor shifts, but with a will; and what is not worth this effort is not to be done at all.

Thanks to http://www.everymac.com/

Thank you http://www.everymac.com/ for the information and instructions for replacing my 2010 Mac Mini's hard disk.

Copy & Cite Bookmarklet

I don't know why it is such a hard task to create a browser extension for copy & cite. Since none work to my liking, here is a simple bookmarklet. (This posting is mostly so I don't loose the code.)
var selection = "";
var ranges = window.getSelection();
if ( ranges.rangeCount > 0 ) {
   for ( var i = 0; i < ranges.rangeCount; i++ ) {
      if ( i > 0 ) {
          selection += "\n\n";
      selection += ranges.getRangeAt(i);
else {   
   var titles = document.getElementsByTagName("title");
   if ( titles.length > 0 ) {
      selection = titles[0].textContent;
var subject = "FYI:" + selection.substr(0,50) + (selection.length > 50 ? "..." : "");
var body = selection + "\n\n" +window.location.href;

Use the tool at http://mrcoles.com/bookmarklet/ to create your own bookmarklet.