Yak Shaving: VMWare Update Edition.

  1. Review nessus report, see Samba needs patching.
  2. Patch Samba.
  3. While retesting, I notice ESX has a patch that needs implementing.
  4. Find out they released 6.0 today. Rather than upgrading to 5.5.1 then 6.0, I look into upgrading directly to 6.0
  5. While looking to implement that I research updatemanager, which I can’t use since I don’t have a windows server to install it on.
  6. So I look at doing it manually, and find out that I need to upgrade vcenter first, since vcenter can’t manage esx hosts that are a higher version.
  7. I find https://www.youtube.com/watch?v=QXOkUVhIOA8 which seems to be exactly what I need.
  8. Spend half an hour looking for OVA file similar to what was used for 5.5. It does not exist.
  9. identify vcenter appliance download for 6.0. Download 3 gig ISO. Not an exact match, but close.
  10. mount ISO locally. Setup file says “vCenter Server Appliance installer cannot run on Linux. It must be run on Windows.”
  11. Spend half an hour searching for the friggen OVA.
  12. Someone clues me in that “vcsa/vmware-vcsa” on the iso is actually the OVA file. Copy that from readonly ISO to local disk, rename it as vmware-vsca-6.0.ova
  13. go to vcenter server web client, navigate to datastore.
  14. See coworker set off alarms on one datastore for being overused. Need to look into that later.
  15. Find out that I need to install a browser plugin to upload a friggen file to their web interface.
  16. Download plugin, install it.
  17. plugin doesn’t appear, realize that it installed in the wrong place.
  18. research how to uninstall the stupid plugin, then reinstall it to the right place. Still doesn’t show.
  19. Someone suggests using OVAtool. I don’t even remember what that does or if it’ll even help me. I don’t know if it works on linux, if I can install it on my workstation, or where to even find it.
  20. restart chrome; lose half of my tabs when the second window doesn’t reappear. plugin still doesn’t work.

Day two:

  1. retry chrome plugin, it fails to be detected again.
  2. research to find out that the plugin interface that VMware uses is deprecated, and their plugin only works with archaic versions of chrome
  3. Give up, load windows VM
  4. download the *deprecated* vsphere client for windows
  5. attempt to install vsphere. Installer disappears.
  6. try reinstalling, receive error that installer is in progress, then fails, then receive another failure message regarding .net 3.5
  7. installer refuses to run because an installer is already running.
  8. reboot windows
  9. run installer, installer disappears. Task manager shows background process “windows modules installer worker” using 99% of my disk bandwidth. maybe it’s still working?
  10. after 10 minutes, installer reappears. entire install takes 25 minutes.
  11. Upload OVA to datastore1 so it can be deployed.
  12. Attempt to deploy the OVA template through the web interface. Notified that “The CLient Integration Plugin must be installed to enable OVF functionality.”  (note OVA and OVF are interchangeable at this point.)
  13. Unable to COPY said text from web interface because hell, why not. Text is not selectable; maybe it’s an image?
  14. Attempt to create a new virtual machine from OVA template. Datastores inaccessible.
  15. Attempt to deploy OVA from windows client. Am unable to deploy from datastore (i.e. I must reupload 1.8 gig file again).
  16. Upload template, click through menus and get a brand new “fill in the blank” screen that I don’t recall seeing before. Attempt to fill it out to the best of my ability.
  17. Start Appliance, fails due to password needing to be reset. Web interface does not respond.
  18. After 20 minutes of digging, I delete it.
  19. start over, leaving the form empty.
  20. Similar Message: “Root password is not set. vmdir.password is not set; aborting installation.” Web interface does not respond.
  21. review my notes from the 5.5 install.
  22. dry run installation of 5.5 OVA file;  existing form has 5 fields.; Hostname is the only one really required.
  23. 6.0 OVA has 46 fields; It is unclear how many are required. Perhaps all of them.
    1. if host network mode is set to DHCP, ip address and host network prefix are not required. Default gateway, dns servers, and host identity don’t state if they are required.
    2. SSO Configuration talks about a directory password for replication partner. Is this the 5.5 instance I’m planning to mirror? I don’t think so- I’m pretending this is a stand-alone instance so I can follow the migration video later, which presumes the new instance is already installed but not configured. Setting temporary password for administrator.
    3. leaving the rest of the SSO configuration default
    4. leave database config set to Embedded.
    5. Setting root password in System Configuration (which is different than the Administrator account password set 3 steps ago).
    6. Leaving upgrade configuration blank.
    7. Leave networking properties blank
  24. After finally getting the vcenter 6.0.0 installed, it turns out 6.0.0 no longer uses port 5480, as seen in the first video, which was the only one that came up when searching for upgrades yesterday.
  25. Because, why would the upgrade process from 5.1 to 5.5 be the same as 5.5 to 6.0, right?
  26. Start searching again, find this video which appears to cover what I need.
  27. I install the vmware client integration plugin from the ISO I downloaded previously on the windows VM (which is nearly out of space at this point).
  28. run upgrader from ISO.
  29. Walk through all the options and get to step 4 before getting the message: “vCenterServer FQDN vcenter.foo.com does not match DNS servers “localhost.localdom,localhost” and ip addresses “” from VC certificate. Examine the VC certificate and make sure it is valid and point to vCenter Server FQDN.”
  30. Which if I’m reading correctly, means that before I can upgrade, I have to install a properly signed certificate on 5.5 for…. I’m gonna guess the :5480 interface, which may be a totally different cert than the one for :9443.
  31. research and find that I can circumvent this by setting the cert regeneration flag in the :5480 interface and rebooting vcenter.
  32. try the upgrade tool again
  33. realize 3 seconds after clicking OK that I just started a process of unknown length at 2pm on a friday.
  34. process finishes at 3pm, warns me that my license is about to expire for vcenter(!)
  35. re-enter license, am told it is no longer valid.
  36. panic as I realize our license is for vcenter 5, not vcenter 6.
  37. research and am told that it’s a simple upgrade procedure in the vmware portal to get a new license key for 6.0
  38. go through motions, import new key, everything is awesome.


I owe a tremendous debt of gratitude  towards the guys in #VMware on freenode. without their assistance, I’d probably be under my desk sobbing right now.


MONDAY: I’ll continue by upgrading the esx hosts. I’m sure it’ll go smoothly.


wacom Intuos tablet crashes Xorg in Kubuntu

every 1 in 10 times I hook up my Wacom Intuos to Kubuntu, xorg crashes with this lovely message. It’s very irksome.

Linux linwider 3.16.0-28-generic #38-Ubuntu SMP Fri Dec 12 17:37:40 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Kubuntu 14.10

xsetwacom –list devices
Wacom Intuos PT S Pen stylus id: 9 type: STYLUS
Wacom Intuos PT S Finger touch id: 10 type: TOUCH
Wacom Intuos PT S Pen eraser id: 16 type: ERASER
Wacom Intuos PT S Finger pad id: 17 type: PAD


Bus 001 Device 005: ID 056a:0302 Wacom Co., Ltd

[180969.708] (II) config/udev: Adding input device Wacom Intuos PT S Pen (/dev/input/mouse2)
[180969.708] (II) No input driver specified, ignoring this device.
[180969.708] (II) This device may have been added with another device file.
[180969.710] (II) config/udev: Adding input device Wacom Intuos PT S Finger (/dev/input/event16)
[180969.710] (**) Wacom Intuos PT S Finger: Applying InputClass "evdev touchpad catchall"
[180969.710] (**) Wacom Intuos PT S Finger: Applying InputClass "touchpad catchall"
[180969.710] (**) Wacom Intuos PT S Finger: Applying InputClass "Default clickpad buttons"
[180969.710] (**) Wacom Intuos PT S Finger: Applying InputClass "Wacom class"
[180969.710] (II) Using input driver 'wacom' for 'Wacom Intuos PT S Finger'
[180969.710] (**) Wacom Intuos PT S Finger: always reports core events
[180969.710] (**) Option "Device" "/dev/input/event16"
[180969.710] (EE) Wacom Intuos PT S Finger: Invalid type 'stylus' for this device.
[180969.710] (EE) Wacom Intuos PT S Finger: Invalid type 'eraser' for this device.
[180969.710] (EE) Wacom Intuos PT S Finger: Invalid type 'cursor' for this device.
[180969.710] (II) Wacom Intuos PT S Finger: type not specified, assuming 'touch'.
[180969.710] (II) Wacom Intuos PT S Finger: other types will be automatically added.
[180969.710] (--) Wacom Intuos PT S Finger touch: maxX=4096 maxY=4096 maxZ=0 resX=26000 resY=43000 
[180969.710] (II) Wacom Intuos PT S Finger touch: hotplugging dependent devices.
[180969.710] (EE) Wacom Intuos PT S Finger touch: Invalid type 'stylus' for this device.
[180969.710] (EE) Wacom Intuos PT S Finger touch: Invalid type 'eraser' for this device.
[180969.710] (EE) Wacom Intuos PT S Finger touch: Invalid type 'cursor' for this device.
[180969.710] (II) Wacom Intuos PT S Finger touch: hotplugging completed.
[180969.760] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1/input/input46/event16"
[180969.760] (II) XINPUT: Adding extended input device "Wacom Intuos PT S Finger touch" (type: TOUCH, id 14)
[180969.760] (**) Wacom Intuos PT S Finger touch: (accel) keeping acceleration scheme 1
[180969.760] (**) Wacom Intuos PT S Finger touch: (accel) acceleration profile 0
[180969.760] (**) Wacom Intuos PT S Finger touch: (accel) acceleration factor: 2.000
[180969.760] (**) Wacom Intuos PT S Finger touch: (accel) acceleration threshold: 4
[180969.760] (**) Wacom Intuos PT S Finger pad: Applying InputClass "evdev touchpad catchall"
[180969.761] (**) Wacom Intuos PT S Finger pad: Applying InputClass "touchpad catchall"
[180969.761] (**) Wacom Intuos PT S Finger pad: Applying InputClass "Default clickpad buttons"
[180969.761] (**) Wacom Intuos PT S Finger pad: Applying InputClass "Wacom class"
[180969.761] (II) Using input driver 'wacom' for 'Wacom Intuos PT S Finger pad'
[180969.761] (**) Wacom Intuos PT S Finger pad: always reports core events
[180969.761] (**) Option "Device" "/dev/input/event16"
[180969.761] (**) Option "Type" "pad"
[180969.772] (**) Option "config_info" "udev:/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1/input/input46/event16"
[180969.772] (II) XINPUT: Adding extended input device "Wacom Intuos PT S Finger pad" (type: PAD, id 15)
[180969.772] (**) Wacom Intuos PT S Finger pad: (accel) keeping acceleration scheme 1
[180969.772] (**) Wacom Intuos PT S Finger pad: (accel) acceleration profile 0
[180969.772] (**) Wacom Intuos PT S Finger pad: (accel) acceleration factor: 2.000
[180969.772] (**) Wacom Intuos PT S Finger pad: (accel) acceleration threshold: 4
[180969.773] (II) config/udev: Adding input device Wacom Intuos PT S Pen (/dev/input/event15)
[180969.773] (**) Wacom Intuos PT S Pen: Applying InputClass "evdev tablet catchall"
[180969.773] (**) Wacom Intuos PT S Pen: Applying InputClass "Wacom class"
[180969.773] (II) Using input driver 'wacom' for 'Wacom Intuos PT S Pen'
[180969.773] (**) Wacom Intuos PT S Pen: always reports core events
[180969.773] (**) Option "Device" "/dev/input/event15"
[180969.773] (II) Wacom Intuos PT S Pen: type not specified, assuming 'stylus'.
[180969.773] (II) Wacom Intuos PT S Pen: other types will be automatically added.
[180969.773] (--) Wacom Intuos PT S Pen stylus: using pressure threshold of 27 for button 1
[180969.773] (--) Wacom Intuos PT S Pen stylus: maxX=15200 maxY=9500 maxZ=1023 resX=100000 resY=100000 tilt=enabled
[180969.773] (II) Wacom Intuos PT S Pen stylus: hotplugging dependent devices.
[180969.773] (EE) Wacom Intuos PT S Pen stylus: Invalid type 'cursor' for this device.
[180969.773] (EE) Wacom Intuos PT S Pen stylus: Invalid type 'touch' for this device.
[180969.773] (EE) Wacom Intuos PT S Pen stylus: Invalid type 'pad' for this device.
[180969.773] (II) Wacom Intuos PT S Pen stylus: hotplugging completed.
(EE) Backtrace:
(EE) 0: /usr/bin/X (xorg_backtrace+0x56) [0x7fb0bba1ce96]
(EE) 1: /usr/bin/X (0x7fb0bb866000+0x1bb099) [0x7fb0bba21099]
(EE) 2: /lib/x86_64-linux-gnu/libc.so.6 (0x7fb0b959a000+0x36eb0) [0x7fb0b95d0eb0]
(EE) 3: /usr/lib/xorg/modules/input/wacom_drv.so (0x7fb0afed0000+0x103c0) [0x7fb0afee03c0]
(EE) 4: /usr/lib/xorg/modules/input/wacom_drv.so (0x7fb0afed0000+0xe00d) [0x7fb0afede00d]
(EE) 5: /usr/lib/xorg/modules/input/wacom_drv.so (0x7fb0afed0000+0x62cf) [0x7fb0afed62cf]
(EE) 6: /usr/lib/xorg/modules/input/wacom_drv.so (0x7fb0afed0000+0x650e) [0x7fb0afed650e]
(EE) 7: /usr/bin/X (0x7fb0bb866000+0x95638) [0x7fb0bb8fb638]
(EE) 8: /usr/bin/X (0x7fb0bb866000+0xbfcc9) [0x7fb0bb925cc9]
(EE) 9: /lib/x86_64-linux-gnu/libc.so.6 (0x7fb0b959a000+0x36eb0) [0x7fb0b95d0eb0]
(EE) 10: /lib/x86_64-linux-gnu/libc.so.6 (close+0x2d) [0x7fb0b968679d]
(EE) 11: /usr/bin/X (xf86CloseSerial+0x21) [0x7fb0bb925521]
(EE) 12: /usr/lib/xorg/modules/input/wacom_drv.so (0x7fb0afed0000+0x5c25) [0x7fb0afed5c25]
(EE) 13: /usr/lib/xorg/modules/input/wacom_drv.so (0x7fb0afed0000+0x9c79) [0x7fb0afed9c79]
(EE) 14: /usr/bin/X (0x7fb0bb866000+0xa4948) [0x7fb0bb90a948]
(EE) 15: /usr/bin/X (0x7fb0bb866000+0xbb5b9) [0x7fb0bb9215b9]
(EE) 16: /usr/bin/X (0x7fb0bb866000+0xbb8f8) [0x7fb0bb9218f8]
(EE) 17: /usr/bin/X (WakeupHandler+0x6b) [0x7fb0bb8c1f1b]
(EE) 18: /usr/bin/X (WaitForSomething+0x1c7) [0x7fb0bba1a247]
(EE) 19: /usr/bin/X (0x7fb0bb866000+0x56fe1) [0x7fb0bb8bcfe1]
(EE) 20: /usr/bin/X (0x7fb0bb866000+0x5b3d6) [0x7fb0bb8c13d6]
(EE) 21: /lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main+0xf5) [0x7fb0b95bbec5]
(EE) 22: /usr/bin/X (0x7fb0bb866000+0x4576e) [0x7fb0bb8ab76e]
(EE) Segmentation fault at address 0xa9a8
Fatal server error:
(EE) Caught signal 11 (Segmentation fault). Server aborting
Please consult the The X.Org Foundation support 
at http://wiki.x.org
for help. 
(EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information.
(II) AIGLX: Suspending AIGLX clients for VT switch
(EE) Server terminated with error (1). Closing log file.

Please Steal This Idea.

Someone take this idea and run with it; just make sure it’s free to use. I don’t have the time for it and it’s too great not to write down.


The idea? A simple graph paper map maker. Nothing with fancy graphics like campaign cartographer or FantasticMapper, Just a simple graph paper mapper.

The interface consists of two major parts- the map window and the collapsible sidebar.

Main Window

The main window looks like an unblemished minesweeper screen with a giant crosshair segmenting it into 4 parts. There is both a horizontal and vertical scrollbar. only 1/2 of the window is showing according to the scrollbars, meaning you can scroll left or right, up or down. In the bottom corner is a zoom tool similar to google maps.


The sidebar appears as a small button on the left that folds out when clicked. it contains a vertical accordion menu with the following headers:


[S]elect mode will let you click on an object underneath the cursor. multiple clicks will cycle focus on the next item in the stack underneath the cursor. This could be a Feature, Interior Wall, or Path.


[E]xcavate has two main options to toggle between- Excavate (default) and Fill. While these are excavated, clicking on squares in the main window will either be emptied or filled in. Using the shift key reverses the active option- Excavate becomes Fill and vice versa. Excavate is the default tool when the page is loaded.


[W]all would be relatively straight forward. it would only affect existing exterior walls, either in part, whole, or individual lengths. Options would include smooth, rough, and natural.

Interior Wall

[I]nterior Wall has several options and two modes. The primary mode “Snap” would snap the grid between two excavated squares; the secondary mode “Free” would allow straight lines to be drawn between two arbitrary points. Clicking and Dragging will draw out a temporary path until the mouse is released. Using the shift key lets you a rectangle of interior walls.  Options would include walls (default), half walls, engraved walls, magical forcefields, cliffs/ledges, ruined walls, lower level walls, walls with arrow slits, water lines, etc.


[D]oors would have several options, all of which snaps to and highlights a border between two squares. This would work between two dug squares or a dug and filled square (i.e. a fake/useless door). Options would include regular door (default), double door (2 squares long), secret door, portcullis, false door etc.


[F]eatures can be placed and resized on any map, and is layered between the floor tiles and the walls, allowing for things like puddles to be half-covered. This will contain a block of highlightable icons, which will let you draw an item that can be moved, resized, or spun. Icons include stairs (default), circular stairwell, debris, water, pit, pillar, altar, chair, throne, table, crate, barrel, fireplace, statue, well, sarcophagus, dias, bridge, carpet, etc.



[T]rap behavior would be dictated by type, but would mostly act like Features. Options would include pit traps (default), spike traps, blade traps, poison gas, etc.


[P]ath would allow you to draw a simple line from point A to point B. This could be a dispersed “sandy” type line, a dashed, dotted or solid line of configurable width.


[O]ptions would contain:

  • Line color (black, blue, gray)
  • Grid (none, excavated areas, all areas)
  • Grid Fade (100%, 50%, 25%)
  • Grid Color (black, blue, gray)
  • Border (click and drag region to be included in PNGs
  • Show Compass checkbox
  • Show scale checkbox
  • Tile Pattern (none, granite, stone, etc)
  • Fill Pattern (none, stone, line color, black)
  • square scale (5ft, 10ft, other)


[S]ave would give you the option of saving the output (SVG) to google drive, locally, or exporting to PDF if a border is not defined, it will do a best guess.


Right click would drag the map; +/- would zoom, arrow keys would pan. The map will pan infinitely in any direction, based off the centerpoint.

Hotkeys would include:

  • [S]elect mode
  • [E]xcavate
  • [I]nterior Wall
  • [D]oors
  • [F]eatures
  • [T]rap
  • [P]ath
  • [O]ptions
  • [S]ave
  • [ctrl+z] undo
  • [ctrl+shift+z] redo
  • standard copy/cut/paste

So that’s the idea that’s been kicking around in my head. If you’re a UI person and interested in helping me, I’d be glad to help give guidance on functionality, but I don’t have the time to develop it myself.

Geomorph Theory

*Random Crazy Person Thought of the Day: Ultra-specialized Geomorphs and Naming Conventions*

Standard Geomorph

A geomorph has 4 sides, and connects to all for sides via two entryways or “ports.” It looks a little bit like an octothorpe/hash with the center filled in (#).


Base2 Geomorph Sets

While Standard Geomorph tiles are cool, theres no way to close the system. To do this, you need to introduce the concept of a side being open (has two connecting ports) or closed (has no connecting ports).

Since there are only two options per side, we can represent each side with a binary number- 0 for closed, 1 for open. By using binary, we can now represent our tile as a four digit binary number. A four digit binary number has 16 possible states (0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, etc).  If we allow for rotation, we can reduce the total number of unique tiles needed, i.e. 1000, 0100, 0010 and 0001 can all be represented with the same one-sided geomorph by turning it.

With the addition of rotation, we can reduce our 16 down to 6 unique configurations:

0000= Sealed Geomorph
0001= One-sided Cave Geomorph
0011= Two-sided Corner Geomorph
0101= Two-sided Tunnel Geomorph
0111= Three-sided Edge Geomorph
1111= Four-sided Standard Geomorph

Layer #8Layer #4Layer #5 Layer #9Layer #7 Layer

Suppose we wanted to create store hundreds of tiles with these configurations. How would we store them? The most logical way is to create directories based on their configuration, which could be named after the binary number above. if you needed a eastern wall, you could translate it to 1011, which is simply a three-sided Edge geomorph with a 90 degree clockwise rotation. You could then snag a random one-sized edge tile from 1011/ and simply rotate it.

Base4 Geomorph Set

While this is neat, you can take it a step further with segmented geomorphs, which track the state of individual left and right ports:


00= both closed
01= first open
10= second open
11= both open

The addition of these two new states forces us to use 2 bits to represent state per side, or 8 bits total to represent a tile.


This means there are 256 different configurations for tiles. This can be reduced not only by rotation, but by flipping:

10 00 00 00 = Top left open
01 00 00 00 = Top right open (the above tile, flipped on it's Y axis)

(Also note, flipping along the X and Y axis has the same effect as rotating 180 degrees.)

00 10 00 00 = right top open
00 01 00 00 = right bottom open (flipped along X axis)
00 00 00 01 = left top open (flipped along Y axis)
00 00 00 10 = left bottom open (rotated 180 degrees)
00 00 00 10 = left bottom open (flipped along X and Y axis)


By the time you add in flipping and rotating, we end up with significantly less than 256 tiles. How much? I have no idea, the math is beyond me right now without drawing them all out. What I can say is that we can represent them with Base4 notation:

0= both closed
1= first open
2= second open
3= both open

Layer #8Layer #10 Layer #11Layer #4





This allows us to represent every tile category with only 4 digits. Looking at what we’ve represented previously:

0000= Sealed Geomorph
0003= One-sided Cave Geomorph
0033= Two-sided Corner Geomorph
0303= Two-sided Tunnel Geomorph
0333= Three-sided Edge Geomorph
3333= Four-sided Standard Geomorph

But we could also represent things like:

  • a pinwheel configuration: 1111
  • a crooked fork in the road:   0302
  • a narrow corridor  0102

PINWHEEL Layer #3 corridor

Among others.

Base8 Geomorphs

Lets take it another step- lets say that the solid center part between the two ports was changeable, essentially giving us 3 ports; three binary positions giving us a total of 8 combinations per side.

000 = all closed
001 = right open
010 = center open
011 = center and right open
100 = left open
101 = left and right open  (standard geomorph)
110 = center and left open
111 = all three open

With 3 bits per side, that gives us a total of 12 bits to represent a geomorph; If I remember my Base2 properly, that’s 4096 possible configurations (again much less with rotation and flips). We could still represent our standard configurations with only 4 digits if we use octal:

0000= Sealed Geomorph
0005= One-sided Cave Geomorph
0055= Two-sided corner Geomorph
0505= Two-sided Tunnel Geomorph
0555= Three-sided Edge Geomorph
5555= Four-sided Standard Geomorph

In addition we could create neat things like plusses, crosses, Y’s, trees, etc.

onesideelbowLayer #6 Layer #14 Layer #13

treeLayer #2 Layer #1 fatladder ladder

Base32 Geomorphs

If we wanted to take this one last insane step further, we could introduce the idea of ultra-specialized. where the 2 solid edges of each side were turned into ports. This means there are 5 binary areas (open or closed) per side, which translates to 32 configurations per side, meaning we can use base32 to encode each of the four sides with a simple four-letter code.

To this end, you could represent a “regular” geomorph side with the binary representation, i.e. 01010, which is 10 in decimal and A in base32. This means a regular geomorph tile would be encoded as AAAA.

0000=sealed Geomorph
A000= One-sided Geomorph
AA00= Two-sided Corner Geomorph
A0A0= Two-sided Tunnel Geomorph
AAA0= Three-sided Edge Geomorph
AAAA= Four-sided Standard Geomorph

So, the final tally? Five binary on 4 sides is 20 bits of data per tile; That’s over a million different variations. My brain hurts now.

Until I sat down and did the math, I thought 5bit-sided geomorphs were doable. Now I see how wrong I was.


The Key to Creating Good, Tileable Images (in GIMP)

I’m writing this as a general guide both for future reference, and to get feedback from others.

Often when using an image manipulation program such as GIMP or Photoshop, you’ll need to create large swaths of consistent texture. The easiest way to do this is with a pattern fill tool, however most programs only include a small set of patterns. The good news is that you can make your own with relatively little grief.

A quick note- While you may occasionally want an obvious tile (e.g. tiled floors), this discussion will focus on tiles that try to appear seamless.

Choose a Texture


For our example, I took a photo of the dirt outside. As you can see, it’s not perfectly uniform, but we’ll take care of that in a moment.

The first step is obviously to decide what you’d like to have as a texture- dirt, cement, gravel, treebark, marble, and leaves are all good examples of common textures. Your texture should be relatively consistent. While some variation is needed to give it flavor, it needs to be somewhat symmetric (i.e. a baseball in a tile of grass will make tiling obvious), however you may be able to cover that up.







Crop Inconsistencies


Here you can see I cropped out the large flat top right corner and dark bottom left corner. It’s starting to look a lot more consistent, however there’s still a few pesky details that stick out.

Sometimes your source picture will have an anomaly on one side, such as the edge of a sidewalk on a dirt texture, or stick in a field of grass that wasn’t quite out of frame. The simplest way to deal with this is to crop it out. Save as much as you can of the original image, but make sure to completely remove the inconsistency. Judicious cropping can also help you determine your focus- is your pattern a field of grass or blades of grass?









Remove Anomalies


Here you can see I removed quite a few wood chips, the twig, some tree buds, and a small sprout The consistency is coming along nicely at this point.

Should your texture has some type of anomaly (like the baseball mentioned above) that is too far in to safely crop, you can often use a combination of the rubber stamp tool and healing tool to copy a more generic spot over the anomaly and blend it into place.









Offset and Wrap


We were relatively lucky with the dirt; the seams are barely noticeable.

Now that our tile looks fairly consistent, lets examine the seams. For this we’ll need to offset the entire image by half (Layer->transform->offset or ctrl+shift+o) along the X and Y axis. This should give you a nice cross where the edges will meet in the final product. Quite often you will find color variation between the two sides- sometimes you can get lucky and dodge or burn the image to get them closer shades, sometimes it’s far more tricky (and beyond the scope of this document).


Using the four quadrants as a baseline, you can use the rubber stamp and healing tools to cover the seams- with any luck this process will be fairly simple and painless. Remember, the goal is to make the seams disappear, so be sure to feather it in unevenly, and not with a straight line that will still be visible.





This image should be seamlessly tileable at this point.

Once complete, we need to verify we didn’t accidentally damage leave any artifacts need the ends of the seams. To do this, do another offer, but only offset the Y by half; this may reveal a small horizontal seam near the center. Take care of that and perform a final offset, transition X by half. This should leave a small vertical seam. Once it’s resolved, you should have a nice, seamless texture… but we’re not done yet.









Unfortunately we do see some banding along the top and middle of the image; this could be corrected with some dodging and burning, but we’ll call it good for now.

Quadruple It

The phrase “can’t see the forest for the trees” applies here. We’ve seen what one intersection looks like- how about several? If we increase the image canvas size and duplicate time layer 3 more times, we can set them side-by-side and merge them down to identify redundant features that escaped us previously. Things you might see include:

  • That small twig may have been unnoticeable with one tile, but with many tiles it betrays the redundancy
  • There may have been an ever-so slight variation in color that was previously unnoticed
  • The area surrounding the original seams was not as well blended as previously thought
  • A small area that is simply too unique and sticks out just enough to be noticeable.

You have a choice at this point; you can either undo back to the single image, or choose to keep it quadrupled. If you keep it quadrupled, you can ad ever-so-slight modifications to each quadrant to help disperse the redundancy.


The final step is to export (File->export as… or ctrl+shift+e) and save the pattern as a .pat file.  This should be kept in your GIMP patterns folder (on linux ~/.gimp-2.8/patterns/)

The next time you refresh your patterns box, you should see your new texture.

Holy Cow it’s too Big!

Oh, all that work we just put in? It may be worthless; I shoulda mentioned that up front.

Here’s the problem: If your base texture is 2500×2000 pixels, don’t be surprised that your pattern is gigantic when you try to use it. As of right now, GIMP doesn’t have a built-in way to scale patterns (although there are plugins that claim to do it). Your best bet is to scale the image down before exporting it to a pat file, just be warned that the scaled image may have seams reappear from the scaling interpolation, so you may need to run through the offsets again to verify that it’s acceptable.

Final Note…

  • No, I cannot tell you how to do this in photoshop.
  • I despise capitalizing GIMP. it I understand why it’s supposed to be, but it still feels super lame.
  • If you have feedback, please leave a comment below- I’d love to improve my process.
  • If you liked this tutorial, please consider supporting me via Patreon

Fix for Sonar Breaking After Upgrade

Upgrade is not supported. Please use a production-ready database.


If you’ve ever seen this message after a yum update, you know how infuriating it can be. I was sure I was already using mysql rather than the default h2 database, but everything indicated that was the problem.


It turns out the error was caused when they replaced /opt/sonar/conf/sonar.properties with a default configuration. If you vimdiff it against /opt/sonar/conf/sonar.properties.rpmsave you should see the issue.


Let me know if this helps.

Prunecluster’s Stories, Volume 1, Part 1: Cragmaw Cave.

So there we were… Cragmaw Cave. We’d just killed a bunch of goblins and had located their leader, known only as “the big one.” The ranger peeks into the small cavern to appraise the situation, then returns to us. “There’s a Bugbear, a worg, and… a goblin in a jester outfit.”

“Whut whut?” I ask. I take my craft seriously. There’s no way the goblin is a properly trained jester. At best he does some pratfalls and slapstick. He ain’t no artist. I cannot let this travesty stand. I fly into the room alone with a series of cartwheels, leaving my fellow travelers dumbstruck. I demonstrated some dance moves and ended with a challenge.

“I CHALLENGE YOU… TO A JEST-OFF!” I spat at the ugly like hack. The worg starts to get up, but the bugbear stops him, enthralled by my performance, “Proceed,” he tells the goblin.

I bust out my iron golem dance while the goblin goes for the snake. *Pssht*, the snake. Anyone can do the snake- hell, my grandma taught me the snake. Figures that a stupid bugbear would like it better. Realising the brute only valued physical prowess and not nuance, I decided to display my acrobatic skills.  The bugbear was awestruck by my ending flourish.

“You’re fired,” the Bugbear said to the goblin, motioning to the worg, who leapt on to the goblin and ripped out his throat.

“You ready for my next trick?” I asked, and began weaving an intricate version of the Dwarven Aristocrats, with just a tinge of magic. Had it worked, he’d have been doubled over on the floor, laughing uncontrollably… unfortunately, he found dwarven culture too refined for his tastes. The bugbear grew violent, at which point I beat a hasty retreat out of the room with bugbear and worg hot on my heels. Boy were they surprised when they found my friends waiting for them around the corner…


If there’s one thing I hate more than an hack jester, it’s an ungrateful crowd.

Greatest Marketing Pitch Ever

El Monterey, I have the perfect marketing pitch for you:


Scene: Dining room table, happy music plays in the background.

Mother, father and two children walk in door carrying fast food bags

Father opens container to find a smashed, nasty, dried out cheeseburger. Music stops.

Mother opens her fish sandwich to find it swimming in tartar sauce.

Everyone appears grossed out and disappointed when suddenly there is a loud thump

Cut to  refrigerator. *thump* it moves.

Refrigerator door opens and a rainbow spin of colors comes out, revealing someone like the Katamari King. scene cuts change to an old japanese fight movie.

In his hands is a small microwave which shoots burritos out like a tommy gun.

Steaming burritos land on plates that magically appear in front of them.

“Thanks burrito overlord!” the family cheers in unison.

Camera cuts to burrito overlord who gives a two finger salute, before jumping, spinning into a rainbow and zapping back into a freezer.

Happy mexican celebration plays while the family digs in.

Text and voiceover both reinforce:

“Always have a Plan B. El Monterey.”




Curse of the Goat

I’m not sure why the idea hit me, but my brain has focused on it and it won’t let me move on until I write it down.


Curse of the Goat

When afflicted, a goat appears from nowhere and proceeds to follow you around, constantly bleating. The goat is immortal, never sleeps, and cannot be lost. It will keep you awake, give away your position, and generally be annoying. If pushed off a cliff or otherwise separated, it will reappear within minutes, often headbutting the afflicted from behind.

“Maeh-eh-eh-eht…  Maeh-eh-eh-eht.”


Curse of the Golden Goat – The only way to silence the goat is to feed it gold coins; a gold coin will by you 10 minutes of silence.

Curse of the Ghost Goat – The goat is incorporeal. Can’t be locked in another room, can’t be used to wedge a door closed, and spooks living animals.

Curse of the Silent Goat – It doesn’t bleat, it just stares at you and makes you feel bad about your life choices. Seen as an ill omen.


Google+ Comments Widget

Lets see if this cuts down on the random spam.

Go to Top