David Artman

Sep 262019


Provide a data model for quantities (a value plus a unit of measure) that is similar to a glossary entry. By defining a quantity once, it can be referenced repeatedly as needed. Content can explicitly reference the quantity and alternative units of measure. Commonly, this would be instances where SI and US customary units must both be provided; for example, “The length of a football (soccer) pitch must be between 90m (100 yards) and 120m (130 yards)”.

Alternately, the element can implicitly call for alternate units of measure and localized output generators can provide the one appropriate one. Further, output generators can be configured to automatically provide conversions, even if alternate units of measure are not expressed in the XML.


<datauom unit="
[picklist]" abbrev="[yes|no]"/>
<mainuom unit="
[picklist]" abbrev="[yes|no]"/>
<altuom unit="
[picklist]" abbrev="[yes|no]"/>

<quantity> Content Model

Doctype Content model Contained by
[Any, all] ( (datauom) (any number) then (value) (one) then (mainuom) (one) then (altuom) (any number) ) [same as <ph>]

<datauom> Attributes

Name Description Data type Default value Required?
unit Indicates an SI or US customary unit. Picklist of the seven SI base units and one each of the underived US customary units, plus temperature units. ( second | meter | m2 | m3 | kilogram | ampere | kelvin | mole | candela | celsius | foot | ft2 | ft3 | nauticalmile | liter | floz | drypint | ounce | troygrain | fahrenheit ) [?] Yes
visible Indicates that the source-data quantity renders in output. ( yes | no ) no No
abbrev Toggles abbreviation of the unit of measure (@unit). ( yes | no ) yes No

<mainuom> Attributes

Name Description Data type Default value Required?
unit Indicates an SI or US customary unit. Picklist of the seven SI base units and one each of the underived US customary units, plus temperature units. ( second | meter | m2 | m3 | kilogram | ampere | kelvin | mole | candela | celsius | foot | ft2 | ft3 | nauticalmile | liter | floz | drypint | ounce | troygrain | fahrenheit ) [?] Yes
abbrev Toggles abbreviation of the unit of measure (@unit). ( yes | no ) yes No

<altuom> Attributes

Perhaps quantities and their conversion might be best constrained by the unit category or type. They would have the same children as above model.

Quantity type Alternative element name Available @unit data types
Length <lenquantity> ( meter | foot |nauticalmile )
Area <areaquantity> ( m2 | ft2 )
Volume1 <volquantity> ( m3 | liter| ft3 | floz | drypint )
Time <timequantity> ( second | [prefix multipliers, like ms?] )
Mass/Weight2 <massquantity> ( kilogram | ounce | troygrain )
Temperature <tempquantity> ( celsius | fahrenheit )


  1. Fluid and dry volumes are combined to keep the model simple; conversion in output would be constrained only to valid exchanges and, if the altuom@unit in a <FOOquantity> has no conversion for the uom@unit, no alternate value+unit pair is rendered in output. [Yes, the XSLT code to do this proposed automatic conversion and insertion is not trivial! 😊]
  2. From a tech-writing perspective, I do not see a case for making a distinction between mass and weight. Aerospace industry uses S1000 (I think) and they can develop their own conversion domain themselves, for quantities in micro- or zero gravity (varied weight, static mass)! 😜
Nov 122018
I vividly recall the smell of a book of memeographs. The tables, the tables, so complex and compelling.
I remember that the games were raw, unpolished. I remember how the publications were so simple in execution but carried a palpable weight of Importance. How to solve these mazes?!
I knew that I was just reading a book or an article, but I could sense the depth of thought behind it, and I could viscerally feel the compulsion to play, play, play. I was ten, and I woulda played all night. Dragon magazine often kept me up thinking about how to use (or, more often, fix) its additions!
Many memories of conventions: the hallways full of crazies, the lounge showing doctor who or something, us sequestered into a banal meeting room to play whatever got pitched by a guy who couldn’t even begin to sort out the rules (multiple sessions I played that weekend began and ended with character creation).
But that was also a big SCA con, and it also had the poor man’s solution (dowels, foam); and as much as we drooled over the armor, we could make boffers for a dollar. This was the same con where I wandered into a side room full of hardcore mini guys, and (a) they were dismissive (I was maybe eleven) and (b) their conversations were so deep into simulation numbers and states that I only now (2014) recognize the shit they was talking about.
Looking back, that was the con that owned me. UNCG gave me more than two Bachelor’s degrees (years later): they gave me a passion I’ll never lose.
Flash forward:
My friends and I routinely played all night at sleep overs. One night in particular, I recall that we played a horror game (well run by Steven) that left us so unsettled that nothing would do but a walk around the neighborhood during sunrise. I checked around corners on that walk. Seriously.
Flash forward:
I recall a convention game at UNCG where they used two DMs to handle multiple players in competition: we ran dungeon tournament simultaneously. We also played Toon. A lot of that Stellar Con is echoed in the photos I see of game masters running from a sort of stage. The dms were using a classroom, and it was so compelling!
My oldest friends (Trent and Steven) ran that game… and to their credit, they didn’t give a shit that they knew me: pure umpires. But this was also still early in the ‘pure dungeon’ times (1984?) and they were young, so they probably came to that rules-purity from first principles.
I recall puzzling over blue book. I recall writing solutions in the margins. I recall playing, being stupified, and spending hours, days, redesigning. I never had the balls to send a letter to Dragon… but I rewrote many AD&D systems (including my own mana system, before Gygax) before the age of thirteen.
The game store, 1980. Flashing back to Day One:
Wow. Chainmail right there in my face. [38 years later, the White Books fetch hundreds from collectors.]
These $3 books just sitting on a low rack with no significance: the proprietors paid bills with train and early R/C hobbiests. And in those days, there was overlap: minis guys used train stuff.
But dad’s wallet and a smart vendor prevented me from buying what I now realize was not a child’s game. Blue book was my Christmas present. Dad, did you have any idea how much you would influence your son with that $10?
Back in the store:
The light through the dusty, poster-plastered windows. The terrain tables and the gorgeous miniatures (for them, the default; for me, staggering).
Dad and I playing D&D on the front patio, sunbathing, rolling dice between the lounge chairs. Top ten happiest moments of my life, and I should let my father know how well he raised me.
But we were talking about the industry.
Those hobby stores were so weird. Stuffy. A plastic bag in a rack, however, might change your worldview so fundamentally that you’d never look back, even as you wondered who put you on this crazy train.
Aug 252018

The following best practices for creating and publishing graphics are application-agnostic and can be done in everything from open source software to top-flight, tools-integrated component content management systems. They work in nearly every common output media; and exceptions are noted when they apply. I employ Microsoft ® Windows® OS terminology and keyboard shortcuts, but nearly every other OS has similar shortcuts or tools that accomplish the same effects.

Capturing screen shots

  • Ensure that you are using a ‘classic’ desktop theme with no gradients, glass effects, or other uncompressible effects applied to the window chrome (title bar, borders, scroll bars, title bar buttons).
  • Set your desktop resolution to the highest it can support for ‘version 1’ of the application; and note that resolution so that you can return to it in later versions.
  • Do not use font scaling.
  • If manually configurable, use font smoothing (almost always enabled automatically, in modern OSs).

This approach ensures that your files will compress efficiently and remain consistent year after year, so that you can update screens selectively instead of in toto.

  • For native applications, use Alt+Print Screen to capture only the active dialog.
  • For web-based applications, use a capture application that allows you to capture only the browser viewport.

Both of these methods eliminate the need to carefully crop to pixel precision in your raster-art image-manipulation program.

  • If you must manually crop, do so to a hard, visible edge whenever possible (rather than a whitespace edge).
  • Avoid using ‘tear’ or ‘fade out’ effects when you must crop to whitespace, because they are hard to consistently apply and they greatly increase final file size. Instead, draw a hard, solid line for it in your image manipulation program; and note the line color and weight for later.

Creating line art

  • No matter what vector-art application you use to generate line art (Inkscape, Microsoft Visio®, LibreOffice Draw), shrink your canvas to the drawing contents prior to saving.
  • Save line art as either SVG or PDF.
    • Exception: If you are generating compiled HTML Help, you must export as raster art. If so, rasterize it to 96 dpi (common screen resolution) to avoid scaling issue in the HTML. In that case, save it to PNG.
  • Always save the typeset file using the same file name as the image-manipulation application’s source file name. If necessary, append a suffix to the source and typeset file names to distinguish them, though if you follow the above best practices, the file extension will also distinguish them and make a suffix redundant.

Applying callouts to captured images or line art

  • Create a library of callout objects in your vector-art application.
  • Always use line art and text (which is itself vector art) to make callouts.
  • Gradient and shadow effects might or might not affect final file size, depending on your vector-art image manipulation application. Use at your own risk. Do not use shadows unless the callouts overlap the image.
  • If you are using overlapping callout and lines, use colors that will consistently contrast with the bulk of the application’s colors. Otherwise, you are almost guaranteed to end up needing to use shadow effects or contrast-increasing callout borders (line around line, container or line around text)
  • Do not use words as callouts:
    • Use alphabetic callouts for pointing out image elements that you intend to define in typeset text below the typeset image.
    • Use numeric callouts for enumerating sequences; and if you use a containing shape, make it a different one than the containing shape for defining callouts. Either set these numerals to the step numbers of the task that will refer to them; or use a different type of numeral system (for example, Roman numerals or Greek alphabet) and set them sequentially.
  • Keep those object in linked layers so that you can easily copy all of their layers, paste them into new layers, and edit the text component of the callout.
    • Exception: If you elect to use only text for callouts, without surrounding circles, squares, shadows, or other offsetting effects, then you will not need more than one text layer and, as such, nothing else linked to it.
  • If you intend to have callouts off to the side of the image rather than completely overtop of the image, you have two options, each with its own consequences:
    1. All side callouts must be on the right side of all images, which can quickly become constraining.
    2. Side callouts require additional attention to detail or a typesetting concession:
      • The leftmost edge of left-side callouts must always be an exact distance from the left edge of the image.
      • You must commit to always centering the image when it is typeset.

      Failure to apply one of these two approaches will lead to the effect of your images seeming to ‘randomly’ slide left and right relative to the page margins.

Saving raster-art images without callouts

  • Always save as PNG.
    • Exception: If an output format does not support PNG… first consider going to a different output format; but if not, then save as 100% quality JPG. If you want a smaller file size in final output, post-processing the output file is a better way to compress than ‘ruining’ your source format right out of the gate.
  • Always save the typeset file using the same file name as the image-manipulation application’s source file name. If necessary, append a suffix to the source and typeset file names to distinguish them, though if you follow the above best practices, the file extension will also distinguish them and make a suffix redundant.

Saving raster-art images with callouts

  • See “Creating line art” above, so that the callouts remain vector art (and both SVG and PDF support embedded raster art).
Apr 232018

Proposal: New internet protocol I’d call “socnet”.

  • Similar to RSS, it’s a subscription protocol delivering data via XML file format.
  • Users can create and host ‘social data’ in any tool and on any server, or using a site like Facebook.
  • Other individuals request to connect to the socnet feed of a user, who then accepts them, but can limit–at the individual level–which feed elements (files and folders) the individual can read.
  • Any tool requiring socnet data is granted it by the reading individual. So your contacts app would point at your socnet aggregator app; your calendar app, too; and so forth.
  • Status updates and media sharing are just like normal RSS, basically: a content category, but based on one entity (user, business, group) instead of a site or search.

Result: A platform-independent social networking protocol that abstracts user data out of sandboxed services.

Major Bonus: Contact data is only maintained in one data store: the user’s! No more obsolete contact details, for those to whom you subscribe. Personal calendars could be similarly driven. Anything you’d need to share and sync that currently requires manual data entry or linking.

Dec 042017

Basic design: a brick in your pocket with a giant battery, all the RAM, CPU, and storage. A Bluetooth earbud with also a giant battery (must last a day always on).

Use cases: Leverage all the voice-activated functions of current chat bots.

User merely speaks all commands, text messages, calendar events, etc.

Bluetooth keyboard and Wi-Fi screen pairing, when you gotta type to configure or install.

End result: A smart device that never dies (if charged daily) and JUST WORKS. Talk to ‘yourself’ and let the system click icons and type on a tiny screen.

Oct 112017


  1. A given quantum of information is sourced in a root language, which could be a single language organization-wide or multiple languages.
  2. Structured markup languages provide metadata and semantics irrespective of eventual output formats.


Continue the abstraction of information in 2 by eliminating 1 above as well: content is divorced from format and language.


  1. Codify grammar into conditions, objects, actions, results, and all other relevant dictional objects. (Consider the constructed language Unker for models of logical, nonlinear grammar diagrams.)
  2. Document conceptual, procedural, and reference information as information maps that diagrammatically describe the information.
  3. Develop Dictional Style Sheets (DSS) that render the information maps into textual, visual, or even multimedia deliverables. (For textual DSS, additional transformation via CSS and such continues as in B above).

Simple Example


“The door-open chime sounds and the door-open dashboard light illuminates when a door is ajar while the key is in the ignition.”

Information Map of Objects and Relationships

COND:[(OBJ:car-door:any)open AND (OBJ:key)inserted]
RES:[(OBJ:door-chime)on AND (OBJ:door-dash-light)on]

COND:[(OBJ:car-door:any)closed AND [ (OBJ:key)inserted OR (OBJ:key)removed] ]
RES:[(OBJ:door-chime)off AND (OBJ:door-dash-light)off]

REL:alert-types(OBJ:door-chime, OBJ:door-dash-light, …)


[Magic happens here. LOTS of object:style mappings, but only need to be done once for each dictional output. Free translation; free infographics; free texts: all from running the information maps through DSSs and then output generators that can handle the renders. A tiny example:]

OBJ:key == “ignition key” | singular-only |


Conceptual Contexts

“The door-open chime sounds and the door-open dashboard light illuminates when a door is ajar while the key is in the ignition.”

“When the door is closed, the door-open chime does not sound and the door-open dashboard light does not illuminate, regardless of whether the key is in the ignition or not.”

Procedural Contexts

“To test the door-open chime and the door-open dashboard light, insert the ignition key into the ignition switch and open a door.”

Troubleshooting Contexts

“If the door-open chime is sounding and the door-open dashboard light is illuminated, one or more doors is ajar. You can stop the alerts by either closing the open door or by removing the key from the ignition.”


[You’d have graphics mapped to objects and relationships in the DSS that, when generated as output, show up like, say, an Ikea or LEGO manual. In fact, see Lego Digital Designer for a great model of a user interface for assembly mapping by sub-assemblies and stages.]

As you can tell if you’ve read this far, this isn’t a new idea: there are conlang folks who’ve thought about this stuff for decades, but not typically from the perspective of one:many translation (rather more like many:one ‘interfaces’ via written and/or spoke languages).

And I also just realized that many of the OBJ-REL information maps could be scraped straight out of software code! *headsplode*

Apr 212017

A live-action (AKA “boffer” or “combat” or “paintball”) role-playing (LARP) system that is designed to be highly modular and therefore customizable for different playstyles, character-power levels, and setting tones. Inspired by HERO System and other influences mentioned in the Credits.
Available only as a PDF due to being too long to easily use as a single web page: Download a print-ready version

May 242014

Memorial Day always puts me into an emotional conflict.

When does respect for honorable and dutiful sacrifice begin to sanction the ill wills and greed that required it? Do we have any more righteous wars left in us? Did we ever?

I find myself thinking that, just like Valentine’s Day, this is another shitty holiday. Love deserves more than one calendar entry, so surely pain and loss does as well. The men and women lost to an aggressive will are remembered daily by their loved ones; why, as a nation, can’t we find time enough every day to do the same?

And maybe, just maybe, in that remembrance decide that throwing more children into the meat grinder won’t work any better than it did millennia ago?

Memorial Day is aptly named. Remember why war is the ultimate failure of everything that makes us human.