<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
	
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
<<importTiddlers>>
(Written Tue Sep 8, 2009)

I've been keeping busy, but hadn't had much to write about.  I've got something now, but no particular time before heading off to work.

Instead I'll take a few moments to maintain my ST. cred with a question.

Do you suppose that the Thasians, when they were helpfully returning Yeoman Rand to the bridge in her nightie and undoing all the other depredations that Charlie had done, also changed the real turkeys in the galley back into simulated turkeys?
(Written Sun Aug 23, 2009)

What is pond scum?

It's one of those things where you can't really define it, but &ldquo;I know it when I see it.&rdquo;

When a university's credit union is sold off to a corporation, and this corporation later sends a commercial solicitation which is designed to imitate the university's employee benefits mailings (though the credit union no longer has any connection to the university), well, I feel pretty sure that's pond scum.

I guess I'm looking for another bank here soon.







(Written Monday, 15 Jun 2009)

We had a really pretty dry winter up here in Colorado.  Not drought, but not stellar snowfall totals either.

However, we've been having a drenching springtime.  Afternoon thunderstorms every single day for several weeks.  This is normally what we get later in the summer, which hasn't even started yet.

It's making for a difficult time mowing the lawns, because it's always pretty wet and I have a mulching lawnmower.

You learn some unexpected lessons as well.  Like the fact that it doesn't actually require 5 minutes to disassemble my bike and stow it in the back of my car.  There's nothing like a brilliant flash, a deafening boom and echoing rumbles, accompanied by 2 centimeter droplets of very cold water to encourage you to find elusive efficiencies in your procedures.

But what will be the cost?

''Bzzzzzzt.''

Mosquitos.  T'ousands and t'ousands of mosquitos.

Okay, so I've killed one.  But that's the first I've seen up here in a couple of years.  I'm just predicting the t'ousands.  But you wait and see.  We'll get 'em, you betcha.
(Written Monday, September 20, 2004)

I've started running a [[MythTV|http://www.mythtv.org]] box for my television viewing pleasure.  Specifically, I'm running [[KnoppMyth.|http://mysettopbox.tv]]

~MythTV is a very nice product despite its perpetual alpha state.  But it has one really big flaw &mdash; virtually all the documentation is //installation// instructions.  There is little to no documentation on the user interface.

I admit that most of the idea is fairly straight forward and the UI mostly does sensible things.  But the gap between the sensible things and the other things is severe.

In my case, I really want to understand how the scheduler makes its decisions.  Not because I'm not trusting its behavior, but because I'm spending too much time overriding the decisions.  I ''know'' that you can tune the scheduler with a large variety of priority settings.  But to do that effectively, I need to understand the program.  Otherwise I'll have to learn it by trial and error, which is a slow process at best.

Not being one to just piss and moan (though I'm perfectly willing to do at least that), I've started creating the documentation for the UI.  One weekend of work and I have the Web interface roughed out.  But only for the TV functions, which is my primary interest.  I started with the web interface because I could edit the docs at the same time as I played with the interface.
(Written Wednesday, February 13, 2002)

Here's a belated story from my Christmas trip.  If you've been following along, you know that in December I [[broke|Juggling for the complete klutz]] my foot.

So I got to go through the new security at DIA on crutches.  Well, on one crutch as I figured it would be easier to get around with a suitcase and a carry on if I only had one crutch.

I was right, it was much easier.  But I didn't plan on the security system being cranked up to absurd levels.  Stripped of my carry on, my keys, my coins, ''my crutch'', I still set off the metal detector.  All I had left were my clothes and my wallet.  It turns out there was my emergency car key in my wallet which did the trick, but I'm getting ahead of the story.

So, I've hopped into the box and set off the bleeper.  Security converges and gestures imperiously toward the penalty box, a glassed in tunnel for people unlucky enough to bleep.  I stand my ground and insist that I will wait until they return my crutch to me.  They reluctantly grant that as a reasonable request.

I now pogo my way down the penalty cage which is blocked at the end.  I have to wait for the security people understand that I can't get through without one of them moving the blockage for me.

Finally, I've reached the wanding station.  I'm still trying to be good natured about things and in fact, except for them being a little slow about the problems of moving about on crutches, it's going pretty well.  The guy with the wand briefs me on what he's going to do, then he points ''at my good leg'' and says, "Lift that foot."

There's a couple of moments while I stare at him and then roll my eyes toward heaven.  I finally tell him that I will need a table or something to lean on, since it is pretty obvious that I can't stand on ''just the crutch.''  He laughs and says, "Yeah, I guess that would help."  Support is found and the rest of the wanding goes well.

A final thought about the process-- after they found that my wallet set off the wand, they took it away from me and sent it through the X-ray machine.  So now I'm standing in security with no ID on me.  And now that I'm clean, they make me go back through the upright metal detector, with all the attendent dropping off the crutch and hopping through both ways that that entails.  Why?  Isn't the wand enough?  Then I got to wait while the rest of my things were gathered from the X-ray people and I could finally proceed.

All in all, it only took about 5 extra minutes even with all the contretemps about waiting for the crutch, waiting for help with the blockage and waiting for something to lean on when he wanted me to lift my good foot.
(Written Saturday, March 4, 2000)

So many things claim my attention.  Work to do, errands and tasks around the house, projects that I want to work on.  A seething mass of things to do awaits me every time I stop doing something.

On the other hand, there is that glorious sunshine coming in the windows.  I could lay down on the floor in the sun and bask.  There is no other word for it.

Work or bask?  Bask or work?  No contest.  Picture me flat on my back, eyes closed to the brightness, arms wide.  Picture the stress leaking out of my extremities, puffing away in little clouds of steam.
(Written Monday, January 12, 2004)

Once in the past (about 5 years ago) I had a roof leak which led to some dripping in my kitchen.  It was basically a problem with drainage under snow cover and some minor flashing errors.  But it wasn't fun while it lasted.

So, in the middle of last week I was pretty distressed to find a large puddle of water on the floor in my kitchen.  Particularly since it was ''not'' in the same place as the prior leak.

In fact, this new puddle was strangely out in the middle of the floor.  It was about 8 inches wide and 2 to 3 feet long.  One end of it did run up next to the stove.  That's a lot of water on a night when there wasn't any rain nor much snow cover on my roof anyway.

Here are some more peculiarities.  It was a well defined puddle with no splashes.  Though one end of it reached the stove, there was no water on the stove and none under the stove.  There was no water on the ceiling.

The water was very clean, like ice melt.  But the quantity was at least a whole tray of ice cubes.  Since I don't use ice much, there was plenty available in the fridge, but almost no chance that any got out on the floor.  I'd made pasta, but the pasta water naturally was pretty starchy.

Tony suggested that maybe it was Casper pee.  Ok, he said ectoplasm, but I hear what I want to hear, OK?  Anyway, I cleaned it up and started waiting to see if more would show up.

By the way, at the beginning of the week last week is was dang cold out here.  Daytime temperatures in the singles and as soon as the sun went down sub-zeros.  (Fahrenheit-- I'm in the U.S..)  On my way home from work I had to stop twice to bundle up some more &mdash; and it's only a 5 minute walk to my car from the office.  Then while I was waiting for the car to warm up, I found out that the ~BiteMe valve on my water pack had frozen in those 5 minutes.  I naturally had to quote from &lsquo;Doctor Evil&rsquo; &mdash; &ldquo;It's frickin' freezin' out here, Mr. Biggleworth.&rdquo;

I know that I sometimes ramble in these little stories, but in this case I'm actually still on point.  Get it?
(Written Friday, Jul 03, 2009)

&ldquo;Welcome to the Museum of the History of Computer Torture.

&ldquo;This model is one of the original, armless roll-abouts.  Its curved bottom was designed to maximize the divergence from the actual shape of every possible human buttocks.  Listen to the lovely creaking noises that the unpadded back makes.  It almost makes you believe it will snap off and impale you, should you dare to recline.

&ldquo;And over here is the Swedish Blue.  Said to resemble slightly the comfortable Captain's chair from the original Star Trek's alternative universe, this model claims to have been padded on both seat bottom and back.  (Clonk, clonk.)  It sounds more like cheap lumber, doesn't it?

&ldquo;If you will all come back this way...&rdquo;

I think I really need to throw out some of my older computer chairs.
(Written Wednesday, 03 Jun 2009)

Canker sores -- Drat!  Am I already violating my promise not to detail health problems?

Well, I'll skirt the issue a bit by not detailing the years of suffering the painful irritation of mouth sores.

Instead, what I wanted to say is that since going on the Nexium to treat my acid reflux, I haven't had a canker sore.

That's five months without when I don't recall a period in my life longer than about 2 months without.

I noticed that the picture of my doudenal ulcers looked very similar to my canker sores and I asked my doctor about whether they were related.  He basically gave me a "Hmmm" look and said he would ask a gastric specialist he knew.

Now I'll have to go back and ask him whether it makes any sense that Nexium might reduce or eliminate the occurance of canker sores.
(Written Tuesday, July 30, 2002)

I find something vaguely disturbing about the fact that while I was squeezing the water out of my can of tuna, I mis-read the brand name.  Why would the name "Starkist" turn into "Friskies" when read upside down?

And if I opened the bottom of the tuna can, would I get cat food?
(Written Saturday, May 13, 2000)

After a couple of weeks of comparison shopping, I bought myself a digital camera.  No one had any kind of deal going.  Each store had the same selection of models at the same price down to the penny.  Talk about annoying.  What good does it do to comparison shop if you can't find a deal?

But I found a little bit of a deal.  I ended up buying a little more of a digicam than I really needed because one store had an open box special on a camera that was beyond my range normally.  The special dropped it down to about $30 above my limit and I gritted my teeth and bought it.

Probably the nicest feature of the camera is that it uses Compact Flash memory cards, just like my [[TRGpro PDA.|Hip-holster Geek Time]] Which, by the way, arrived a little over a week ago.  I've already changed the batteries in that sucker once.  Of course, the "Runtime" program that I installed showed that I had run it for 26 hours between Sunday and Thursday.  I sort of had new toy syndrome.

Of course, I now get to play around with moving stuff back and forth to the Compact Flash card.  That should eat my batteries some, too.  I hope that I will eventually tail off on the high usage and my batteries will start lasting something more like the advertisements, as I start using more like the mythical "typical" user.
/***
|Name:|CloseOnCancelPlugin|
|Description:|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{

	handler_mptw_orig_closeUnsaved: config.commands.cancelTiddler.handler,

	handler: function(event,src,title) {
		this.handler_mptw_orig_closeUnsaved(event,src,title);
		if (!store.tiddlerExists(title) && !store.isShadowTiddler(title))
			story.closeTiddler(title,true);
	 	return false;
	}

});

//}}}

(Written Wednesday, January 7, 2004)

It's one of life's little ironies that our decisions are always based on multiple, competing restrictions.  For example, I have a //shload// of projects that I'd like to work on.  Back when I was unemployed and had plenty of time to work on projects (because there is just so much you can do each day toward looking for work) I found that many of the projects that I wanted to work on required a non-trivial initial outlay of moolah.

Now that I'm working again and have the moolah coming, I'm finding that many of the projects also have a large initial investment of personal time, of which there is a significant drought.

Yes, there is no doubt about it.  I'll just have to win the lottery and retire if I ever want to get anything done around the house.

Ok, honest self-examination time here.  I am beginning to catch my breath.  34 months unemployed does things to your work ethics &mdash; something that 4 months employed doesn't quite cancel out.

It didn't prevent me from performing my work duties; in fact, I slipped back into the University mode pretty easily.  I.e. I don't complain about the long hours after 5 p.m. during a week when everyone is trying to get their poster presentations ready at the last minute before flying off to their conference.  I know that I can get that back in short days while everyone is away or in time spent mostly taking it easy or reading back issues of Linux Today.

Where it afflicts you is when you discover just how hard it is to get things done after hours or on the weekends.  It's strange how easy it is to get in a mode where you think, &ldquo;It's dark outside so I ought to be at home winding down for the evening.&rdquo;  And you realize an hour later that it's only 7 p.m. and you could have been getting things done.

It's pretty pitiful that my New Year's resolution has to be something along the lines of &ldquo;I will start working on projects around the house even if the first one has to be building a remote-controlled &lsquo;my own butt&rsquo; kicking machine.
(Written Saturday, 30 May 2009)

Once when I was not updating this blog frequently I said that it wasn't &ldquo;Dear Diary.&rdquo;  Somehow that thought permitted me to decide to write regardless.

But the thought isn't making sense to me.  It seems better to treat it as &ldquo;Dear Diary&rdquo; for a while, and essentially ''require'' myself to write something in it nearly every day.  That way perhaps I will get something approaching a habit of recording thoughts here.

Of course, knowing my own tendency toward scatological humor, it is more likely to end up being &ldquo;Dear Diarhea.&rdquo;

In that vein, I had some medical troubles that started up around the beginning of last November.  The symptoms were a mild fever, fatigue, and well, lower intestinal problems.  But at least I was //regular// for the first time in my life.

After about 3 weeks of it, off and on and mostly on, I decided it wasn't getting better and sought treatment.  The doctor had no clue.  Oh, but they've redfined //fever// -- it's not a fever unless it is over 101&deg; F.  Am I supposed to feel better because one of my symptoms is no longer considered a symptom?

I experienced another month of increasingly unpleasant tests while they dug for things.  They found a few things wrong -- who at 45 doesn't have //something// wrong in their GI tract? -- and prescribed a treatment for acid reflux.  Huh?  I hadn't recognized what they told me should have been almost constant heartburn?  I'm not sure I believed that.

But nothing seemed to account for the //not a fever,// fatigue and GI problems.

I was determined to act as normally as possible, so as ratty as I felt, I still pushed myself to get on exercise machine 3 times a week, only for 5 minutes at first.  I had a good time for about a week, which was the longest I'd felt good for more than 2 months.  Then right back to bad.

After changing my acid reflux medication, the doctor pretty much washed his hands of me.

But that was my last bout that was recognizably the same illness.  I've had single days without intestinal fortitude, but nothing serious.

I continued and increased my exercise to where my 3 sessions were 15, 15 and 30 minutes, covering 3 and 6 Nordic Track kilometers.  Now that the weather has changed I am commuting to work by bike, riding about 3 kilometers in about 8 minutes.  Not fast, not hard, but a lot of it.

So, did I get better on my own?  Was it due to forcing myself to exercise, even though it was very little at first?  Was it the acid reflux medication, and if so, does that mean that I was actually diverting most of that overproduction of acid down into my intestines to cause my unaccountable symptoms?

The world may never know.

(I promise to try not to detail health problems ever again.)
[["Don't help me, you turkeys."]]
[["What am I?"]]
[[Sit and Spin]]
[[Spots on the Roof]]
[[How much wood would a woodchuck chuck?]]
[[Can I charge admission?]]
[[A Blinding Flash and a Deafening Report]]
[[Tongue Tripper]]
[[Popcorn Raindrops]]
[[Tiny Meatballs]]
[[Canker sores -- Drat]]
[[Hide that Dot]]
[[Dear Diarhea]]
[[It's the law]]
[[2004]]
[[2003]]
[[2002]]
[[2001]]
[[2000]]
[[1999]]
(Written Saturday, November 7, 1999)

I'm sick of it.  How many times have I gone in search of a nice, highly recommended piece of software on the net, only to get caught in an endless round of signup forms?  We are beginning to learn the true cost of //free// software-- loss of privacy.

It doesn't matter to me that every one of these sites has a link to their privacy policy.  My privacy is gone the moment I have to answer a lot of impertinent questions.  Sure I can often check the box that says that I don't want to hear from anybody about this software.  But I still have to trust a wide assortment of differing people and policies.  And some sites don't make any such promises.

(By the way, this is one of those moments when I really wish I had a digital camera-- There was a fantastically cool looking reflection from my closet doorknob that I wanted to share with the world.  It is now gone and even if it returns tomorrow, I'm not sure that the magic feeling of seeing that [[brassy semi-circle|http://fafnir.dyndns.org/images/brassyknob.jpg]] of light will still be there.)

And the questions are getting increasingly impertinent!  One site was ''requiring'' both home and work addresses and phone numbers.  I really sure that I'm going to give that information to somebody who needs to have a privacy policy link.  Another site insisted that I give a fax number.  Right.  I don't even ''have'' a personal fax number.  Ok, I could fake it up with mgetty on my Linux box, but why?  This was a piece of software I was downloading.  There was no conceivable reason why these people needed my fax number to enable me to test or use their software.  They didn't want to fax or email me any registration information.

Sun Microsystems wanted my job title before they would let me download their ~Y2K scanning program.  Why?  Is there no one out there running Solaris on their personal machines?  Sun would like us to think that Solaris X86 is a viable home desktop system, but I guess that if you are looking for ~Y2K solutions, you must be doing it for your work.

I'd like to propose a minor revolt against signup forms for free software.

#If you are downloading a trial or evaluation version or free software and they start asking questions, stop immediately.  Add two strikes against the software on your evaluation of that software and consider whether you want to continue.
#If you decide to continue downloading this software, look at the questions they are asking.  Are these questions appropriate to the software itself?  Or are they simply a method for gathering advertising information?  I.e. are these questions impertinent?
#Assuming that you haven't given up on the download yet, decide for yourself which questions are pertinent and answer those honestly.  For every other required question, LIE.
#Make your lies obvious to anyone who reads them.  Make them commentary on your opinion about impertinent questions.  Don't try to deceive, simply give incorrect information which is obvious to any human, but probably acceptable to computerized checking systems.<br> First Name:  A. Noyed<br> Last Name: User<br> Address: 123 ~Forty-Fifth St.<br> City: Townville<br> State: Denial<br> Country: Atlantis<br> Title: Gone With the Wind<br>Business: Not Ure Bus, Inc.
#For any optional information simply don't enter anything.

Naturally, these guidelines are for personal downloads.  For professional downloads you must consider how your answers affect your company.  I'm not saying that there won't be questions that are just as impertinent when you are downloading in a professional capacity.  It is just more important to consider the ramifications of your actions when you are acting as a representative of your company.

And you still have to consider those ramifications when you are doing this for personal downloads, too.  You have to evaluate the pertinence of the questions using your best common sense.  In particular, if you feel that there might be legal ramifications to entering incorrect information in response to any question, then you should obviously consider the question pertinent and answer honestly or refuse to download.

Refusing to download is my prefered advice.  Obtaining free software should never make you feel uncomfortable.  If the process makes you feel uncomfortable, then consider that to be a cost for the software.  In my case, it is almost always far more than I want to pay.
(Written Saturday, November 26, 1999)

Not many thoughts recently.  That's because I've been so busy at work that I simply haven't had the will to work on my home web pages.  And yes, it is a matter of will and nothing else.  There existed plenty of time to do things with my home machine and in fact I did do some //homework,// but anything on my list of things to do that looked like a //project// simply evoked a mild dread that prevented me from considering working on it.

But the holiday occurred.  (Which by the way ''increased'' the workload due to the fact that as of Wednesday noon I still hadn't bought my Thanksgiving turkey.)  I took half a day and elminated the top of my dire chore list.

Thanksgiving tends to be a mild holiday for me.  Cook a turkey, homemade stuffing, homemade gravy, a veggie or two.  Pig out when it is ready or mid-afternoon, whichever comes first.

This Thanksgiving I gave myself an early Christmas present.  While doing those dire chores, I made up my mind and bought a CD ~ReWriter.  This gave me something to do while waiting for the turkey to start producing juice for the gravy and when not talking to family on the phone.

But this was supposed to be about working on the web pages.  So now that I've blathered all over the map, let's get back on topic:

!!!I am going to like ~EmbPerl.

Ok, I'm an old Unix user.  (Circa 1983.)  I've programmed with some level of proficiency in the major Unix scripting languages, sh, csh, awk, sed, etc.  (No, etc is not a programming language, it just looks like it.  I hope no one ever really creates a language named etc.) Then I wrote a huge backup control program in csh which, despite the fact that it was essentially doing a preset sequence of commands, grew into a multi-thousand line, unmaintainable piece of junk.

Then came perl 4.   Aaaahhhh.

A week later I had a 400 line perl script that did 70% of the job and I had redefined the task to elminate another 20%.  A month later I had a 1500 line program that did 73% of the job and was looking really ugly.  I was begining to wonder if I had made a mistake in choosing perl.

But I liked programming in perl.  There's something nice about knowing that there is a kitchen sink available when a bathroom sink just won't do.  So I started completely over.  I was learning that the perl motto- "There's more than one way to do it"- also meant that my way was the wrong way most of the time.

For example, while learning perl, I would frequently get stuck on some really minor thing, and no change to the code would seem to make any change in the behavior.  After a few frustrating hours, I would crack open the camel book.  (O'Reily & Associates, "Programming perl" by Larry Wall and Randal L. Schwarz)  Therein I would almost invariably find a perl function which does exactly what I was trying to make a huge subroutine do.  I got so mystical about it that if I spent more than 10 minutes on a problem, I'd crack the camel expecting to find the answer in Chapter 4.

Back to the backup program.  Two weeks of rewriting left me with 500 fairly clean lines of code that did about 95% of the backup.  And the rest was //human intervention required// anyway.  Perl was going to stay in my arsenal.

(About this time I discovered the Amanda backup program and all my work was moot, since Amanda was more flexible, more easily extensible and had fewer niggling little problems.  On the other hand, Amanda is considerably more than 500 lines of code.)

So awk and sed and to a large extent the shell scripting languages went to dodo-vile for me.  I started churning out 10-line, 20-line, 30-line perl scripts for everything under the sun.

I've wandered away from ~EmbPerl again.  I guess I had other things that wanted to get expressed.  But I'll close with a final thought about programming in general.  It is my belief that the power of a programming language is measured by the ease with which you can do stupid, pointless things in it.  Thus, ~EmbPerl:

{{{
 [- $tim = time % 10 -]
 [$ if ($tim % 2) $]
   <BODY BGCOLOR="lt blue">
 [$ else $]
   <BODY BGCOLOR="red">
 [$ endif $]
}}}

This changes that background color of a web page based on whether the time is in an odd or an even ten second block.  Really pointless, very easy.
/***
|Name:|ExtentTagButtonPlugin|
|Description:|Adds a New tiddler button in the tag drop down|
|Version:|3.2 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ExtendTagButtonPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{

window.onClickTag_mptw_orig = window.onClickTag;
window.onClickTag = function(e) {
	window.onClickTag_mptw_orig.apply(this,arguments);
	var tag = this.getAttribute("tag");
	var title = this.getAttribute("tiddler");
	// Thanks Saq, you're a genius :)
	var popup = Popup.stack[Popup.stack.length-1].popup;
	createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
	wikify("<<newTiddler label:'New tiddler' tag:'"+tag+"'>>",createTiddlyElement(popup,"li"));
	return false;
}

//}}}

(Written Tuesday, November 30, 1999)

Life is strange and fairy godmothers apparently do exist.

Ever had one of those coincidences where you want to call someone and the phone rings and there they are?

Ok, how about this?  You are running around putting out fires at work, putting enough miles on your shoes that you want to turn in a travel voucher and get reimbursed.  Then you find that someone used the last of the supplies for your department's top quality color printer and failed to tell anyone about it.

Naturally, the powers that be consider this to be a disaster of fantastic proportions and there is no way that the department can function for an instant without that color printer, let alone the several days that you ''know'' an order will take.  So you put out your current fire, take a deep breath and prepare to kiss butt and spend dough to get a rush order placed and hopefully get those urgent color prints flowing again.

You walk in to the supply clerk's office and she says, &ldquo;Where do you want these supplies for the color printer?&rdquo;

&ldquo;Oh, yeah, don't forget that it is payday.&rdquo;
(Written Sunday, February 25, 2001)

Sometimes you just gotta go back an fill in a missing something, even if it is trivial.

More than a year ago in my [[Thoughts from 1999|1999]] page, I mentioned in the [[November 7|Download Now!]] entry wishing I had a digicam to take a picture of a brief optical effect.

Well, I have a digicam and the brief optical effect occurred again, so I digi'ed it.  (Ok, I guess there is nothing in the term //photography// that is specific to film, so I'll drop my attempt to make new vocabulary.  "I photographed it."  There, you happy now?)

Here's the [[photo.|http://fafnir.dyndns.org/images/brassyknob.jpg]]
(Written Wednesday, November 24, 2004)

//Konnichiwa.//  It's really too bad that I'm so lousy with languages, because I do like to study them.  I can generally learn the grammers pretty well, but despite having a decent vocabulary in English, I don't seem to be skilled at picking up basic vocabulary in other languages.

//Guten Tag.//  It may be due to a quirk in my personality.  I don't like to appear unconfident, particularly if I have been studying hard and feel as if I ought to be further along.

//Bonan tagon.//  So I end up being reluctant to do exactly the sort of drilling that I need &mdash; actually talking with someone else in the language I'm supposed to be learning.

//Bonjour.// That's what leads me to be able to recognize many more languages than the few that I can stumblingly ask for the time of day.

But I'm fluent in //American war movie// German.  And //my sister took high school// French.  And //I've seen one movie in// Esperanto.  And //I've read through lesson 3// Japanese.
(Written Saturday, March 1, 2003)

I rememebered a dream last night.  That doesn't happen very often with me, so it can sometimes be an important event.  In this case it wasn't the dream itself, but rather it's ending.

(Skip to ending.)

I'm a passenger in a car, back seat.  We are driving on a winding mountain road in a sudden snow storm.  Naturally, the driver loses control and we go over the side and plunge down toward the trees far below.

"Now would be a good time to put my seatbelt back on," I think in the dream.  But I can't move because the acceleration has me pinned in my seat.

Ooops.  My physics training kicks in.  "I should be in free fall."

So I look down at myself to see why I'm pinned.  I actually seem to be on my side...

On my side in bed...

On my side in bed and my eyes are closed...

At this point, the dream imagery, which is still mountainside and trees rushing at me, sort of moves back a bit and fades to black.  But I still have that scared, anticipatory feeling of the impending impact with the trees, even though I'm pretty sure now what is really going on.

I feel confident that if I let myself go back to sleep, I'll finish that plunge into the trees, still un-belted.  But I also still can't move.

I understand that I'm probably just going through sleep paralysis, so I don't struggle to move.  I lay there a moment and think about the situation.  Then I roll over onto my back without even thinking about trying to.

The anticipatory feeling fades away now, but it's 5 in the morning, I have a full bladder and a raging pain in my neck from having watched TV in bed last night.  A trip to the bathroom relieves the first, provides Advil for the second and unfortunately, completes the waking up process.  It took me more than an hour to get back to sleep.

But at least I didn't finish crashing into the trees.  Or if I did-- I slept right through it.
Saturday, August 16, 2003

Much has happened in the intervening time.  It's not that I didn't have thought during this time, just that many of them were bleak.  But the bleakness is lifting and good thoughts are flowing and the bad thoughts don't seem too bleak to mention and mentioning them doesn't raise the bleakness level.

Bleakness first.  You are not reading this note right now because my web page isn't online.  I'm assuming that you are reading this several weeks later at the very least.

The reason is that my ISP merged with another ISP.  And the new people suck.  They've forgotten (or never knew) what the 'S' in ISP means.  Everything that I want to do (and did at my last ISP) makes me, in their eyes, a 'business' level customer who should be paying 10 times what my last ISP charged.  $300 per month because I want to receive my own email as opposed to using their address?

I'm leaving them just as quickly as I can.  (And you won't be reading this until I get the change made.)

The good news is that I get to go back to the mostly unrestricted life of using the University as my ISP.  They hook you up and get out of the way.  Oh, they have acceptable use policies, but they don't impose blanket restrictions to enforce those policies.  They seem to understand that there are acceptable uses for running personal servers on an Internet connection.  Like receiving email directly, or running a simple Web server to provide personal thoughts, family pix, yada, yada.

And how does this miracle of geniality on the part of the University come about?  They don't let just anyone sign up, you know.

It comes about because I got a job.

2 ''years'' and 10 months.  Who could have predicted the tech bubble would pop?  Or that the crater left in the bubbling mud of industry would be quite so deep?

Oh, yeah.  I also wrote a program based on [[gquiz|http://nis.acs.uci.edu/~strombrg/software/gquiz.html]] to do [[flash cards|I Remember When]] on Linux.  I call it gquizleit, because it is obviously inspired by gquiz, even though it shares no code from the original, just the idea.  And it is totally Leitner based flash cards.  And, like gquiz, it uses external programs to present both tests and reviews.  And I thought it was mildly amusing to call it a "lite" version when it actually does //more// than the original.

Gquizleit is slightly more than marginally interesting and has more than served the original purpose for which I created it.  I'm debating whether to clean up the code, add a GUI interface and release it to the unsuspecting world.  (After talking to the author of gquiz to see if s/he'd object to a similar named project.)
(Written Wednesday, April 17, 2002)

It's hayfever season.  Plus in Colorado we get heavy winds in the Spring which amplifies the suffering for me.

So I'm getting ready for bed and I decide to clear my painful sinuses.  Honk.  Honk.  Blot!  Something lands on my leg.  Ewwwww.

I look down and there's this dark thing about an inch long! and it's got legs! and antennae!! and it's moving!!!  Aiyyeee!!!

Needless to say, it startled the crap out of me.  Well, I calm down after flinging it (and my Kleenex) to kingdom come and can sort through my impressions to realize that it was just a [[beetle.|Pinin' for the Fjords]]

Now I just want to know how it got up my nose.
(Written Tuesday, 02 Jun 2009)

One day at work, I got a trouble report from someone who had installed his own version of Google Earth in his home area.  He was having trouble with it not starting because of some library error.

Now we support a system-wide installation of Google Earth.  And I already recognized the library error that he was reporting.  If you are interested it, it is a problem that shows up on at least openSuse linux and is due to the Google Earth included copy of libcrypt being compiled with different options.  Move it out of the way and Google Earth will now start.

But my user reported something else in addition.  He said that when he was in his installation of Google Earth directory "ls -l" gave a similar error, but "ls" with no options didn't.

This was a bit of a head scratcher, as the first thought I had was, "This sounds like a case of having '.' in his ~LD_LIBRARY_PATH."  I couldn't think of any good reason to ever have "." in your ~LD_LIBRARY_PATH.  Worse, I am well aware of the security risk of having "." in your shell's command PATH.  I was afraid that I'd just stumbled on a whole new class of potential security issues with replacement libraries.

So I popped in to check on my user.  I let him know that I'd already fixed the same problem in our version of Google Earth, which he could have just for asking.  But why did he have "." in his ~LD_LIBRARY_PATH?

It turns out that he didn't have "." in his ~LD_LIBRARY_PATH.  What he had was an ~LD_LIBRARY_PATH which ended with a ":".

It's time to short cut this story now.  ":" separated ~PATH-type environment variables interpret empty fields as if they were "."!

Yes, the "!" is deserved.  Having a hanging ":" at either end or a "::" somewhere in the middle of your shell's command PATH variable gives you a "." in your PATH without you meaning it.  Worse, it is hard to see.

I didn't just stumble on a new class of security issues with replacement libraries.  I'd also stumbled onto a stealthy way to sneak a "." into a user's PATH variable, with all the known security problems that entails.

Bash or tcsh.  ~OpenSuse, SLES, Kubuntu, Red Hat, IRIX, Solaris, ~FreeBSD.  Arg!  Was this documented somewhere?  Is this the way it is supposed to be?

So far, no one I've told about this was aware of it.
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.hideWhenLastTest = false;

window.removeElementWhen = function(test,place) {
	window.hideWhenLastTest = test;
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};


merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}},

	hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title == params[0], place);
	}},

	showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title != params[0], place);
	}},

	'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !window.hideWhenLastTest, place);
	}}

});

//}}}

(Written Friday, April 7, 2000)

I succumbed to my geeky nature last weekend.  Though I am not 100% committed to having any good reason to have one, I ordered a PDA.  Specifically, I ordered a [[TRGPro|http://www.trgpro.com]] Palm Pilot compatible PDA.

Now, I have never been a Datebook sort of person and in fact I simply don't have a complicated enough schedule to need a datebook.  But I do have a lot of things that could be organized into task lists.  And there is the fact that, as a System Administrator, I am always being stopped in the halls by people who want to report problems, but haven't learned to send email to our [[trouble queue.|mailto:trouble@casa.colorado.edu]]

Of course, there is always my grocery list, which at the moment I write up on a note pad and carry in my checkbook.  And lose half the time and have to wing it when I get to ''King Soopers.''

I do have another excuse/reason.  I always wanted an RPN scientific calculator.  About the time I stopped being a poor student and could actually afford one, HP stopped making their RPN scientific calculators.  "What do you mean 'they discontinued the ~HP15C?'"

Since then HP has started making RPN scientifics again, but they are all graphing calculators.  I never wanted a graphing calculator.  I've always viewed that as a calculator trying to be a computer and not really doing a good job of it.  To a certain extent, I can visualize equation graphics and when an equation exceeds my visualization abilities, well I jump onto a real computer and use IDL from [[Research Systems, Inc.|http://www.rsinc.com]]

IDL is an interesting programming language that has fantastically optimized array/vector operations and a very simple plotting interface that encourages you to make one-off plots just for the hell of it.  On the other hand, you can work carefully and make publication quality plots.

But getting back to the Palm ~PDAs, there is what appears to be a very good RPN calculator available, [[RPN 2.57|http://www.nthlab.com/software/rpn/index.html]] It's programmable, extensible and who knows, might get graphing functions put into it someday, at a screen resolution better than the HP graphing calculators today.

It's all right.  I do see the inconsistency of objecting to graphing calculators for having pretensions of being a computer, while accepting ~PDAs.  The cases are enough different that I can get by it.  Using a ~PDA as a calculator strikes me as no different from using "xcalc -rpn" under Xwindows on my Linux box.  It's not a case of trying to work at the limit of the PDA's abilities.
(Written Thursday, October 10, 2002)

Those of you who have never juggled and in particular never passed clubs with other jugglers, will probably not understand this missive.  Those who have will recognize the sensation described within.

It is a special feeling- you are passing clubs and Oops! you drop one.  No big deal, you just wait for the right moment to bend down and pick it up.  You pass again as you are standing up and look at your partner.

He is not passing you a club and neither does he have an extra laying around.  And there is something, well, //expectant// about his expression.

Your brain slips into overdrive as you realize that somewhere- where you can ''NOT'' see it- there is a club heading your way, destined to leave a mark.

Exciting, isn't it?
(Written Thursday, Jul 9, 2009)

Wednesday morning I backed out of the garage and noticed a notice taped to my front door -- Code Violation, Remove that downed tree branch.

This was the first I'd heard of a downed tree branch so I looked around and sure enough my Russian olive tree had split at the base and a huge branch was down in the road.  Someone had shoved it to the side so cars could go by, but it was still in the way.

I went off to work and asked around for references for a tree service, since I had about 12 days to get it removed before fines started kicking in.

But when I came home, ready to start dialing up tree services, the downed branch was gone.  Poof!

I knew we had a little bit of a bunny rabbit problem, but I've never seen a beaver dam in the neighborhood.
(Written Tuesday, January 21, 2003)

Rote memorization.  What a sucky thing.  But it turns out there is a whole science to the process of using flash cards to memorize things.  What's more, the process seems ideal for computerized mediation.  In fact, the scientific process would fairly suck if you were doing it by hand with genuine paper flash cards.

Ok, so what's the science?  It comes from a guy name Sebastian Leitner.  According to Leitner, you should separate your flash cards into boxes which you review and test yourself on at different times.  The first box is for cards you don't know at all.  Higher boxes are for cards that you remembered, for example, from yesterday, or last week, or every time you've tested yourself.  So when you are testing yourself on the cards in a box, if you get the card right, you put that card into the next higher box.  If you get it wrong, the card goes back to the first box.

Seems easy and not that much trouble to do with real flash cards, except for the process of making the cards and the boxes and ...

But computers are a real aid for this sort of thing.  A program can keep track of the cards and boxes, and it can tell you when you should review and when to test and select the cards for each, and it can handle present the cards for review or testing in a variety of formats.

That is, if anyone had written a program that does all that.

Oh, there are programs out there.  Hundreds of them.  Perhaps many hundreds of them.  There is even a [[web site|http://anas.worldonline.es/learners/edu/flash2.htm]] devoted just to reviewing the various flash card programs in existence.

Ok, here's where I get picky.  I use Linux.  BZZZT.  There go hundreds of the programs reviewed on that web site.  The vast majority of them are Windows based.

Additionally, I want to learn the Japanese Kana and maybe Kanji.  (I don't have a good reason-- I just do.)  Therefore, I also want a program that allows images on the cards and can also test based on the images.

And I insist on being able to create my own flash cards and want to create them easily.  If it even takes click, type, type, click to create a single card, chances are good that I won't be doing much of that.  I'd far rather create a list in a text editor, then import that list, creating many cards at once.  (More Unix heritage showing here, I guess.)

So far, I've not found anything that fits my bill: Linux, Leitner, images, import to create cards.  There are a few programs that survive all but the Linux cut, though even they feel a little cumbersome while creating the flash cards.  That combined with the fact that I rarely boot into Windows on my home machine and the point of flash card study is not to spend a lot of time studying, but to do so frequently, means that it would take an outstanding program under Windows to actually encourage me to reboot daily for reviewing or testing.

So what am I doing about it?  Writing the ultimate flash card program of my dreams in Python on Linux?  Ha!  I'm not that good a programmer in general nor in Object Oriented Programming in particular.  I can see the general shape of such a program, but the details are not occurring to me.  And it is complicated enough that every start I've made has sucked so badly that I've abandoned all hope, ye who enter.  (For the moment.  Again.)

Currently, I am trying to use [[qvocab|http://www.qvocab.seul.org/index.html]] for the straight text vocabulary learning.  It is Leitner based and can import (and export) from text files for easy flash card creation.  It has no support for images.  (Grrr!)

I am also using a program called [[gquiz|http://nis.acs.uci.edu/~strombrg/software/gquiz.html]] for learning the Kana.  This is a strange little program much in keeping with the ideals of Unix.  It does one portion of the job.  It reads a set of "questions" which are really just files in a directory, then calls an external program to present you with a "test" of that question.  You have to tell gquiz yourself how you did, then gquiz will present you with another question.  It is not Leitner based, but by calling external programs for the questions and using individual files for the questions it is very flexible on what it can test you on.  I begin to have dreams of making a Leitner based program variation on this theme.
(Written Tuesday, November 21, 2000)

Believe this if you dare: This morning I washed last night's dinner dishes, made 2 dozen [[cookies|http://fafnir.dyndns.org/images/cookies.jpg]] //(Mmmm, [[snickerdoodles|http://fafnir.dyndns.org/recipes/snickerdoodles.html]] .)// and washed //those// dishes as well!

Is this just a brief burst of industry, or have I perhaps awakened from my deep slumber of personality?

Don't answer that.

/***
|Name:|InstantTimestampPlugin|
|Description:|A handy way to insert timestamps in your tiddler content|
|Version:|1.0.10 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
!!Notes
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.
***/
//{{{

config.InstantTimestamp = {

	// adjust to suit
	timeFormat: 'DD/0MM/YY 0hh:0mm',
	dateFormat: 'DD/0MM/YY',

	translations: [
		[/^!ts?$/img,  "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
		[/^!ds?$/img,  "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],

		// thanks Adapted Cat
		[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
		[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]
		
	],

	excludeTags: [
		"noAutoCorrect",
		"noTimestamp",
		"html",
		"CSS",
		"css",
		"systemConfig",
		"systemConfigDisabled",
		"zsystemConfig",
		"Plugins",
		"Plugin",
		"plugins",
		"plugin",
		"javascript",
		"code",
		"systemTheme",
		"systemPalette"
	],

	excludeTiddlers: [
		"StyleSheet",
		"StyleSheetLayout",
		"StyleSheetColors",
		"StyleSheetPrint"
		// more?
	]

}; 

TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {

	tags = tags ? tags : []; // just in case tags is null
	tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
	var conf = config.InstantTimestamp;

	if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {

		var now = new Date();
		var trans = conf.translations;
		for (var i=0;i<trans.length;i++) {
			newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
		}
	}

	// TODO: use apply() instead of naming all args?
	return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
}

// you can override these in StyleSheet 
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");

//}}}

(Written Friday, May 29 2009)

By chance I encountered a reference to ~TiddlyWiki on a slashdot discussion.

I don't really like wikis all that much, but there was something that appealed to me about the idea of a single file wiki implemented in entirely javascript so that you didn't have to install any software at all.  So I began experimenting.

I converted the old static html pages that I was using in this pseudo-blog into a standard ~TiddlyWiki file.  In the meanwhile I continued researching the variations on ~TiddlyWiki.  That first conversion process showed me pretty quickly that I wanted ~TagglyTagging, so I changed variants and imported the stuff I had already converted.

Now I've reached the point where I mostly like this presentation as a weblog.  I'm not 100% sold on it, and there is always the serious problem of me not actually wanting to write anything for over 5 years.  That makes for a pretty dull weblog.

So does talking about the software behind the weblog.   But something invariably moves normally //right thinking// people to do it.
(Written Monday, February 5, 2001)

In case you haven't read any of the rest of my web site, I am a [[juggler.|http://fafnir.dyndns.org/juggling.html]] I've been juggling a few years now.  (Since about 1978 or '79.) I do it to entertain myself.  It's fun and it is decent upper body exercise.

I like to learn tricks and push myself to master as much as I can with the equipment I have available.  I think I have a pretty decent repertoire for someone who doesn't juggle for a living.  I can keep 5 balls going for a fair period and I'm trying to learn tricks with 5 balls.  I'm close to getting 4 clubs down.

Well, last Wednesday I got a chance to learn a pattern named "Mill's Mess" from someone that I had been practicing club passing patterns.  He (Matt) showed me two different drills you need in order to learn the "Mess."

Big mistake!  Around 1:30 am that night I was lying in bed moving my hands, trying to figure out how to string together the parts that I'd learned into the whole pattern.  Dang it!  I had to get up in the middle of the night and practice because I just was //not// going to get to sleep otherwise.  A couple of hours later I was not really any closer to stringing the "Mess" together, but I was tired enough that with a little reading to distract my mind I could get to sleep.

The next day I had another meeting to practice club passing, so I didn't drill the "Mess" very much.  Then on Friday I found a way to drill with three balls.  A few minutes of this and suddenly I was trying the "Mess" full on and beginning to "feel" the pattern in my hands.

Saturday morning, after breakfast, I was sitting at my computer, but I was feeling "Mill's Mess" in my hands.  So I got my juggling balls and there was the "Mess" immediately.  I could feel the pattern completely and no longer had to think about it.  Now I could concentrate on what was going wrong.  By the end of Saturday I could shift back and forth between the regular fountain and "Mill's Mess."  That is essentially my definition of "mastery" of a juggling trick.

I've been doing that pattern at odd moments both yesterday and so far today.  It's got a great feeling to it and it really goes well with the Mike Oldfield music that I've been listening to.  For those of you who might want to learn "Mill's Mess" I am writing up a [[description|http://fafnir.dyndns.org/juggling/mills.html]] of the drills.  This is really only suitable for people who already know how to juggle 3 balls.

But if you read over this, you'll see a progression that I've seen in everyone as they learn either [[basic juggling|http://fafnir.dyndns.org/juggling/howto.html]] or add on tricks.  You drill and drill and don't really progress very much.  Take a break, a long one, a day or more.  Come back and drill again and things are suddenly much better.  But it seems that all the progress came during the break.  You are better today, but you don't seem to get much better.  You get tired and start getting worse.  Take another break.  A couple times of this and something snaps.  What you were trying to learn has moved into your limbs and you stop thinking about it and just do it.  Now you can think about other things during your drills, like what is really going wrong.  Mastery is just around the corner.
(Written Saturday, December 8, 2001)

Well, I broke my foot juggling.  Yeah you read that right, I broke my foot juggling.

Here's what happened: We were doing a Shooting Star pattern.  That is a 5 person star pattern with only 4 people.  When you run out of clubs you run through the middle of the pattern to the gap and start receiving new clubs.

I ran through the pattern one time and as I was turning, my shoe caught on the fabric floor covering-- kind of a heavy burlap like material.  My foot rotated 90 degrees to the inside and I put all my weight on it.  Pop!  Not a delightful sound.

Anyway, after a couple of hours of emergency room waiting, I finally got x-rays and it was obvious even to me that a bone was broken.  5th metatarsil, for the morbidly curious out there.

For the even more morbidly curious, I'm going to take a picture of my foot now that it is turning all black and blue, with a fancy racing stripe down the outside and sandal straps across the ankle.  [[Here|http://fafnir.dyndns.org/~veale/footage/footage.html]] are the sporty pics.

Just so you know, it didn't particularly hurt, nor does it hurt much now, though I am living on Advil to try to keep the swelling down.  The moral of the story is that you can't tell if a bone is broken unless it pierces skin or you feel grinding.  Though the livid markings are probably a big clue.  ''So get an X-ray, darn it!''
(Written Monday, October 25, 1999)

Today I am launching a feature in Fafnir's Hoard of an irregular opinion piece.  Ok, so it's not really an opinion piece.  Nor it is a regular rant off page to help me blow off steam.  It's just a page where I will sometimes, hopefully regularly place some thoughts about things that interest, annoy, or just plain occur to me.

Today's Episode:  How early do you know how your day is going to be?

Today I got my first clue on my bike ride into work.  I ride a recumbent (ATP Vision R-40-- pictures to be scanned at some point in the near future.) and I've got these ultra chic fenders for diverting water away from my oh so tender hinney.  I've also got "Power straps" on the pedals because I didn't want to have to wear a particular pair of shoes in order to ride my bike.  On a recumbent your feet stick out in front of you and it is hard to keep them on the pedals without a strap or clips or clipless or something.

Anyway, on my way in to work, I had to stop at a street light.  I took my foot out and put it on the ground.  When the light changed I did something wrong and the strap got caught in the front of the fender and ripped the fender right off.  Joy.

I've been riding this bike for three years and have only had the pedals interfere with the fender or front wheel once, way back when I was still adjusting to having my feet out in front of the front wheel.  These days I don't even think about it.

Ok, so that was the fabu start of my day and it went down from there.  I left work around 6:30 pm solely because I had managed to get the last dire emergency turned into a mere critical problem, which could be put off until tomorrow.
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1 ($Rev: 2320 $)|
|Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second.  So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only.  Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{

var MINS  = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS  = 24 * HOURS;

if (!config.lessBackups) {
	config.lessBackups = {
		// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
		modes: [
			["YYYY",  365*DAYS], // one per year for ever
			["MMM",   31*DAYS],  // one per month
			["ddd",   7*DAYS],   // one per weekday
			//["d0DD",  1*DAYS],   // one per day of month
			["h0hh",  24*HOURS], // one per hour
			["m0mm",  1*HOURS],  // one per minute
			["s0ss",  1*MINS],   // one per second
			["latest",0]         // always keep last version. (leave this).
		]
	};
}

window.getSpecialBackupPath = function(backupPath) {

	var now = new Date();

	var modes = config.lessBackups.modes;

	for (var i=0;i<modes.length;i++) {

		// the filename we will try
		var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
				'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')

		// open the file
		try {
			if (config.browser.isIE) {
				var fsobject = new ActiveXObject("Scripting.FileSystemObject")
				var fileExists  = fsobject.FileExists(specialBackupPath);
				if (fileExists) {
					var fileObject = fsobject.GetFile(specialBackupPath);
					var modDate = new Date(fileObject.DateLastModified).valueOf();
				}
			}
			else {
				netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
				var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
				file.initWithPath(specialBackupPath);
				var fileExists = file.exists();
				if (fileExists) {
					var modDate = file.lastModifiedTime;
				}
			}
		}
		catch(e) {
			// give up
			return backupPath;
		}

		// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
		// June file on disk that's more than an month old then it must be stale so overwrite
		// note that "latest" should be always written because the expiration period is zero (see above)
		var expiry = new Date(modDate + modes[i][1]);
		if (!fileExists || now > expiry)
			return specialBackupPath;
	}
}

// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
	return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
}

//}}}

(Written Sunday, January 16, 2000)

Profundity has completely avoided touching my life for the last several weeks.  It's not that I have been completely without thoughts, but they just haven't seemed to require expression.

I have been reasonably busy both at work and at home and I expect that it will continue for the next few months.  See at work, we have 3 system admins, one of whom is primarily concerned with the PC class machines.  We other two maintain the Unix workstations in the department.  Well, my partner is going on maternity leave starting this week.  So I see myself doing as much of two person's jobs as I can get through each day for the foreseeable future (i.e. several months).

I'm not really worried about it.  I'm far more interested in getting my Wacom Graphire USB tablet working on my ~RedHat 6.1 Linux system.  Perhaps that is an appropriate topic for thoughts: the development cycle under Linux.

In this case, trying to get my tablet working depends on the efforts of at least two separate development groups-- those working on getting [[USB|http://www.linux-usb.org]] support built in to the Linux kernel and those working on adding support for new [[Wacom|http://lepied.com/xfree86]] devices to the ~XFree86 Xwindows server.

Since returning from my [[wonderful Christmas|Merry Christmas]] with my tablet I have discovered that the tablet will never work with Windows 95 since the most recent driver from Wacom won't let you select USB under Windows 95, even though there is some support for it.

Also since my return, there have been at least half a dozen development kernel releases for Linux plus at least two versions of a backport of the latest USB support into the stable kernel.  The latest of the backports has reached the point where when I watch the raw device associated with my tablet, it spews a ton of garbage whenever I wave the stylus over the tablet.  So I know that Linux has found my tablet and is listening to it.

The next task is to see if I can figure out why the xf86wacom driver only reports "tcgetattr: Inappropriate ioctl for device" when I tell it where to find the tablet.

Now your first reaction to this might be to shudder and quake at the prospect of having to keep up with a development cycle that releases stuff every few days.  "Do I really have to live on the bleeding edge just to run Linux?"

The answer is "of course not".  During all that development I downloaded stuff exactly twice.  The first time I grabbed A) the newest stable kernel, B) the current backport of USB from the development kernel, and C) the most recent xf86wacom driver.  After I had determined that this setup was not going to work, I sat back and checked on the development cycle every few days.  I read the documentation they provided on their web pages and after just two weeks I realized that the USB support had reached the point where it had fixed the problem that I was seeing.  So I downloaded A) and B) again.  C) had not been updated yet.

There the matter stands for the moment.  My tablet isn't working yet, but I have an understanding of what needs to be done and I know who is doing it.  I haven't written any drivers myself and I don't expect that I will have to.  I'm not sitting on the bleeding edge of the Linux kernel development cycle, though I've been watching the National Geographic special "Survival in Wilds of the Linux Kernel" so I know who's eating whom.

Say what you want about the development of Open Source software, but understand that the information is there for the interested to dig out.  And the work is going on under your eyes.  If you want you can check up on the builders and make sure that they are using the right mix in the concrete and putting in enough rebar.  If Linux or any other Open Source software project fails it won't be because the building collapsed.
(Written Monday, September 30, 2002)

Hey, it's been a while.  I've been up to no apparent good and not really been thinking about adding stuff to this page.

But today I was encouraged to take a digicam picture of something that I had video taped off the local news here in Denver, Colorado.  That is an important point-- the broadcaster of the following image is in Denver, Colorado.

<html><A HREF="http://fafnir.dyndns.org/images/whatstate.jpg"><IMG SRC="http://fafnir.dyndns.org/images/whatstate_tn.jpg"></A></html>

You may need to load the larger image (by clicking) to be able to see the state lines on the map.  Go on, take a look.  And remember that Fox 31 News is based in Denver, Colorado.
(Written Sunday, February 20, 2000)

Busy, busy.  Yes, my work has been using me up recently.  A really good sign of too much stress at work is waking up at 3 in the morning and not being able to get back to sleep because you are thinking about your task list at work.

Well, contrary to the optimistic prediction in my last installment ([[Jan. 16, 2000|Linux Development]]), I may have to write a driver of some sort myself.  Yikes!

What happened?  Everyone is as busy as I am.  And the guys working on the next version of ~XFree86 have been completely rewriting the input model for X.  This means they aren't too interested in creating a module for the old version of X, since it probably won't work with their new input model.

Here is what I want to do:

*There already exists a USB driver that talks to the Graphire and translates its information onto an input device.
*There already exists an ~XFree86 module that can read from a serial Wacom Graphire.
*I want to write a program with listens to the input device and emulates a serial port Graphire.

Here is what I am capable of doing:

Bit of a mismatch there at the moment.

Well, I have started trying anyway.  I've begun converting xf86Wacom.c into a program which opens a serial device and simply reports to the screen on the data it finds there.  This is solely a test program so that I don't have to bind my X pointer to the output of a program under development.

The reason I opted for this route is because I didn't want to write an X module.  But I am finding that in order to get my test program working, I need to download a huge chunk of the X sources, just to get the defines that xf86Wacom.c uses.  Yuck.  I have ~MITophobia, the irrational fear of the X consortium.  I don't want to dig into their source code.

So doing the dishes and the laundry are looking a lot more attractive and I haven't even begun thinking about the real program yet.  I have a feeling that before this program is done, I will have turned my compost heap.
MPTW is a distribution or edition of TiddlyWiki that includes a standard TiddlyWiki core packaged with some plugins designed to improve usability and provide a better way to organise your information. For more information see http://mptw.tiddlyspot.com/.
(Written Friday, April 14, 2000)

I was stressing out at work yesterday, as usual during this period while my department's other Unix sysadmin is on maternity leave.  I came across something on a newsgroup while taking a brief break to try to relax. (I think that most people would call this lunchtime.)

The posting purported to be a report from Sony about them replacing the Windows error messages on the new Vaio with more user friendly, haiku error messages.

Well, this really tickled me.  It appealed to me to consider the possibility of answering all of the department's trouble mail in haiku.

Unfortunately, my department is slightly humor impaired, so actually instituting such a policy probably wouldn't go over very well.

But the idea persists, so in order to find an outlet for it I decided to add a [[computer haiku|http://fafnir.dyndns.org/haiku]] page.  These are for the most part not deeply meaningful, nor are they necessarily meant to be humorous.
[[2009]]
[[2004]]
[[2003]]
[[2002]]
[[2001]]
[[2000]]
[[1999]]



^^[[edit menu|MainMenu]]^^
(Written Thursday, December 30, 1999)

Merry Christmas, everyone.

He says while managing to stiffle a laugh.  I had to stiffle the laugh because it would have triggered a painful coughing jag.  Influenza ran roughshod through my family during Christmas.  I was the only one sick on Christmas day, but 3 more cases had appeared by Sunday night.

They say that the flu shot can't give you the flu.  Probably true.  But in my case at least, it activates the same defense reactions as the flu.  Thus, I get the sweats and aches and sometimes the headache that I normally associate with the flu.  So I tend to avoid flu shots.

But I normally pay attention to the news.  In some years, the flu strain is so bad that they hold a second round of flu shots.  In these years, I weigh the pros and cons and sometimes decide to take the shot rather than risk the flu.

This year, I got hit by a double whammy.  I've been too busy to follow health news.  Just too dadblasted much to get done before the end of the year and Christmas vacation and &hellip;

So, not only did I miss hearing how serious the flu was doing out in California (where I spent my Christmas), but I was also really beat from long hours at work before vacation.

It's too late to revise my thinking about flu shots for this year.  But spending Christmas in a black haze and watching my Mom throw away the vast majority of the turkey, and dressing, and pie, and cookies, etc., just because no one was hungry for 5 days is definitely going to weigh in heavily in the ''pro'' column next flu season.
Name: MptwBlack
Background: #000
Foreground: #fff
PrimaryPale: #333
PrimaryLight: #555
PrimaryMid: #888
PrimaryDark: #aaa
SecondaryPale: #111
SecondaryLight: #222
SecondaryMid: #555
SecondaryDark: #888
TertiaryPale: #222
TertiaryLight: #666
TertiaryMid: #888
TertiaryDark: #aaa
Error: #300

This is in progress. Help appreciated.


Name: MptwBlue
Background: #fff
Foreground: #000
PrimaryPale: #cdf
PrimaryLight: #57c
PrimaryMid: #114
PrimaryDark: #012
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

/***
|Name:|MptwConfigPlugin|
|Description:|Miscellaneous tweaks used by MPTW|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#MptwConfigPlugin|
!!Note: instead of editing this you should put overrides in MptwUserConfigPlugin
***/
//{{{
var originalReadOnly = readOnly;
var originalShowBackstage = showBackstage;

config.options.chkHttpReadOnly = false; 		// means web visitors can experiment with your site by clicking edit
readOnly = false;								// needed because the above doesn't work any more post 2.1 (??)
showBackstage = true;							// show backstage for same reason

config.options.chkInsertTabs = true;    		// tab inserts a tab when editing a tiddler
config.views.wikified.defaultText = "";			// don't need message when a tiddler doesn't exist
config.views.editor.defaultText = "";			// don't need message when creating a new tiddler 

config.options.chkSaveBackups = true;			// do save backups
config.options.txtBackupFolder = 'twbackup';	// put backups in a backups folder

config.options.chkAutoSave = (window.location.protocol == "file:"); // do autosave if we're in local file

config.mptwVersion = "2.5.2";

config.macros.mptwVersion={handler:function(place){wikify(config.mptwVersion,place);}};

if (config.options.txtTheme == '')
	config.options.txtTheme = 'MptwTheme';

// add to default GettingStarted
config.shadowTiddlers.GettingStarted += "\n\nSee also [[MPTW]].";

// add select theme and palette controls in default OptionsPanel
config.shadowTiddlers.OptionsPanel = config.shadowTiddlers.OptionsPanel.replace(/(\n\-\-\-\-\nAlso see AdvancedOptions)/, "{{select{<<selectTheme>>\n<<selectPalette>>}}}$1");

// these are used by ViewTemplate
config.mptwDateFormat = 'DD/MM/YY';
config.mptwJournalFormat = 'Journal DD/MM/YY';

//}}}
Name: MptwGreen
Background: #fff
Foreground: #000
PrimaryPale: #9b9
PrimaryLight: #385
PrimaryMid: #031
PrimaryDark: #020
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

Name: MptwRed
Background: #fff
Foreground: #000
PrimaryPale: #eaa
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Name|MptwRounded|
|Description|Mptw Theme with some rounded corners (Firefox only)|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|PageTemplate|MptwTheme##PageTemplate|
|StyleSheet|##StyleSheet|

!StyleSheet
/*{{{*/

[[MptwTheme##StyleSheet]]

.tiddler,
.sliderPanel,
.button,
.tiddlyLink,
.tabContents
{ -moz-border-radius: 1em; }

.tab {
	-moz-border-radius-topleft: 0.5em;
	-moz-border-radius-topright: 0.5em;
}
#topMenu {
	-moz-border-radius-bottomleft: 2em;
	-moz-border-radius-bottomright: 2em;
}

/*}}}*/

Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88

|Name|MptwStandard|
|Description|Mptw Theme with the default TiddlyWiki PageLayout and Styles|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
Name: MptwTeal
Background: #fff
Foreground: #000
PrimaryPale: #B5D1DF
PrimaryLight: #618FA9
PrimaryMid: #1a3844
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #f8f8f8
TertiaryLight: #bbb
TertiaryMid: #999
TertiaryDark: #888
Error: #f88
|Name|MptwTheme|
|Description|Mptw Theme including custom PageLayout|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|

http://mptw.tiddlyspot.com/#MptwTheme ($Rev: 1829 $)

!PageTemplate
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
	<div class='headerShadow'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
	<div class='headerForeground'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
</div>
<!-- horizontal MainMenu -->
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<!-- original MainMenu menu -->
<!-- <div id='mainMenu' refresh='content' tiddler='MainMenu'></div> -->
<div id='sidebar'>
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->

!ViewTemplate
<!--{{{-->
[[MptwTheme##ViewTemplateToolbar]]

<div class="tagglyTagged" macro="tags"></div>

<div class='titleContainer'>
	<span class='title' macro='view title'></span>
	<span macro="miniTag"></span>
</div>

<div class='subtitle'>
	(updated <span macro='view modified date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>
	by <span macro='view modifier link'></span>)
	<!--
	(<span macro='message views.wikified.createdPrompt'></span>
	<span macro='view created date {{config.mptwDateFormat?config.mptwDateFormat:"MM/0DD/YY"}}'></span>)
	-->
</div>

<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div macro="else">
	<div class='viewer' macro='view text wikified'></div>
</div>

<div class="tagglyTagging" macro="tagglyTagging"></div>

<!--}}}-->

!ViewTemplateToolbar
<!--{{{-->
<div class='toolbar'>
	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	</span>
	<span macro="showWhenTagged systemTheme"><span macro="applyTheme"></span></span>
	<span macro="showWhenTagged systemPalette"><span macro="applyPalette"></span></span>
	<span macro="showWhen tiddler.tags.contains('css') || tiddler.title == 'StyleSheet'"><span macro="refreshAll"></span></span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler > fields syncing permalink references jump'></span> <span macro='newHere label:"new here"'></span>
	<span macro='newJournalHere {{config.mptwJournalFormat?config.mptwJournalFormat:"MM/0DD/YY"}}'></span>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<div class="toolbar" macro="toolbar +saveTiddler saveCloseTiddler closeOthers -cancelTiddler cancelCloseTiddler deleteTiddler"></div>
<div class="title" macro="view title"></div>
<div class="editLabel">Title</div><div class="editor" macro="edit title"></div>
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>
<!--}}}-->

!StyleSheet
/*{{{*/

/* a contrasting background so I can see where one tiddler ends and the other begins */
body {
	background: [[ColorPalette::TertiaryLight]];
}

/* sexy colours and font for the header */
.headerForeground {
	color: [[ColorPalette::PrimaryPale]];
}
.headerShadow, .headerShadow a {
	color: [[ColorPalette::PrimaryMid]];
}

/* separate the top menu parts */
.headerForeground, .headerShadow {
	padding: 1em 1em 0;
}

.headerForeground, .headerShadow {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight:bold;
}
.headerForeground .siteSubtitle {
	color: [[ColorPalette::PrimaryLight]];
}
.headerShadow .siteSubtitle {
	color: [[ColorPalette::PrimaryMid]];
}

/* make shadow go and down right instead of up and left */
.headerShadow {
	left: 1px;
	top: 1px;
}

/* prefer monospace for editing */
.editor textarea, .editor input {
	font-family: 'Consolas' monospace;
	background-color:[[ColorPalette::TertiaryPale]];
}


/* sexy tiddler titles */
.title {
	font-size: 250%;
	color: [[ColorPalette::PrimaryLight]];
	font-family: 'Trebuchet MS' sans-serif;
}

/* more subtle tiddler subtitle */
.subtitle {
	padding:0px;
	margin:0px;
	padding-left:1em;
	font-size: 90%;
	color: [[ColorPalette::TertiaryMid]];
}
.subtitle .tiddlyLink {
	color: [[ColorPalette::TertiaryMid]];
}

/* a little bit of extra whitespace */
.viewer {
	padding-bottom:3px;
}

/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {
	background-color: transparent;
	color: [[ColorPalette::Foreground]];
}

/* give tiddlers 3d style border and explicit background */
.tiddler {
	background: [[ColorPalette::Background]];
	border-right: 2px [[ColorPalette::TertiaryMid]] solid;
	border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
	margin-bottom: 1em;
	padding:1em 2em 2em 1.5em;
}

/* make options slider look nicer */
#sidebarOptions .sliderPanel {
	border:solid 1px [[ColorPalette::PrimaryLight]];
}

/* the borders look wrong with the body background */
#sidebar .button {
	border-style: none;
}

/* this means you can put line breaks in SidebarOptions for readability */
#sidebarOptions br {
	display:none;
}
/* undo the above in OptionsPanel */
#sidebarOptions .sliderPanel br {
	display:inline;
}

/* horizontal main menu stuff */
#displayArea {
	margin: 1em 15.7em 0em 1em; /* use the freed up space */
}
#topMenu br {
	display: none;
}
#topMenu {
	background: [[ColorPalette::PrimaryMid]];
	color:[[ColorPalette::PrimaryPale]];
}
#topMenu {
	padding:2px;
}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a {
	margin-left: 0.5em;
	margin-right: 0.5em;
	padding-left: 3px;
	padding-right: 3px;
	color: [[ColorPalette::PrimaryPale]];
	font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {
	background: [[ColorPalette::PrimaryDark]];
}

/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {
	visibility:hidden;
}
.selected .toolbar {
	visibility:visible;
}

/* experimental. this is a little borked in IE7 with the button 
 * borders but worth it I think for the extra screen realestate */
.toolbar { float:right; }

/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {
   display:inline;
}

/* makes theme selector look a little better */
#sidebarOptions .sliderPanel .select .button {
  padding:0.5em;
  display:block;
}
#sidebarOptions .sliderPanel .select br {
	display:none;
}

/* make it print a little cleaner */
@media print {
	#topMenu {
		display: none ! important;
	}
	/* not sure if we need all the importants */
	.tiddler {
		border-style: none ! important;
		margin:0px ! important;
		padding:0px ! important;
		padding-bottom:2em ! important;
	}
	.tagglyTagging .button, .tagglyTagging .hidebutton {
		display: none ! important;
	}
	.headerShadow {
		visibility: hidden ! important;
	}
	.tagglyTagged .quickopentag, .tagged .quickopentag {
		border-style: none ! important;
	}
	.quickopentag a.button, .miniTag {
		display: none ! important;
	}
}

/* get user styles specified in StyleSheet */
[[StyleSheet]]

/*}}}*/

|Name|MptwTrim|
|Description|Mptw Theme with a reduced header to increase useful space|
|ViewTemplate|MptwTheme##ViewTemplate|
|EditTemplate|MptwTheme##EditTemplate|
|StyleSheet|MptwTheme##StyleSheet|
|PageTemplate|##PageTemplate|

!PageTemplate
<!--{{{-->

<!-- horizontal MainMenu -->
<div id='topMenu' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<span refresh='content' tiddler='SiteTitle' style="padding-left:1em;font-weight:bold;"></span>:
<span refresh='content' tiddler='MainMenu'></span>
</div>
<div id='sidebar'>
	<div id='sidebarOptions'>
		<div refresh='content' tiddler='SideBarOptions'></div>
		<div style="margin-left:0.1em;"
			macro='slider chkTabSliderPanel SideBarTabs {{"tabs \u00bb"}} "Show Timeline, All, Tags, etc"'></div>
	</div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>

For upgrading. See [[ImportTiddlers]].
URL: http://mptw.tiddlyspot.com/upgrade.html
/***
|Description:|A place to put your config tweaks so they aren't overwritten when you upgrade MPTW|
See http://www.tiddlywiki.org/wiki/Configuration_Options for other options you can set. In some cases where there are clashes with other plugins it might help to rename this to zzMptwUserConfigPlugin so it gets executed last.
***/
//{{{

// example: set your preferred date format
//config.mptwDateFormat = 'MM/0DD/YY';
//config.mptwJournalFormat = 'Journal MM/0DD/YY';

// example: set the theme you want to start with
//config.options.txtTheme = 'MptwRoundTheme';

// example: switch off autosave, switch on backups and set a backup folder
//config.options.chkSaveBackups = true;
//config.options.chkAutoSave = false;
//config.options.txtBackupFolder = 'backups';

// uncomment to disable 'new means new' functionality for the new journal macro
//config.newMeansNewForJournalsToo = false;

//}}}
(Written Monday, November 27, 2000)

Ok, so I am a terrible geek, both computer and Star Trek.

I use those free AOL ~CDroms that I keep getting as coasters.  And when they aren't keeping hot stuff from my computer desk, I fiddle with them, spinning them, flipping them, etc., etc.

Well, I also have a [[TRGpro|Hip-holster Geek Time]] with a ~HotSync cradle.

Suddenly an idea occurred to me.  I [[put|http://fafnir.dyndns.org/images/wotzlibrary.jpg]] the CD into the [[cradle|http://fafnir.dyndns.org/images/pickatime.jpg]] and thought, "Sure, luv.  What's library?"

[[For those with a low Star Trek quotient.|Wot's library?]]
/***
|Name:|NewHerePlugin|
|Description:|Creates the new here and new journal macros|
|Version:|3.0 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#NewHerePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.macros, {
	newHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newTiddler "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	},
	newJournalHere: {
		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			wikify("<<newJournal "+paramString+" tag:[["+tiddler.title+"]]>>",place,null,tiddler);
		}
	}
});

//}}}

/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1 ($Rev: 2263 $)|
|Date:|$Date: 2007-06-13 04:22:32 +1000 (Wed, 13 Jun 2007) $|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{

// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;

String.prototype.getNextFreeName = function() {
       var numberRegExp = / \(([0-9]+)\)$/;
       var match = numberRegExp.exec(this);
       if (match) {
               var num = parseInt(match[1]) + 1;
               return this.replace(numberRegExp," ("+num+")");
       }
       else {
               return this + " (1)";
       }
}

config.macros.newTiddler.checkForUnsaved = function(newName) {
	var r = false;
	story.forEachTiddler(function(title,element) {
		if (title == newName)
			r = true;
	});
	return r;
}

config.macros.newTiddler.getName = function(newName) {
       while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
               newName = newName.getNextFreeName();
       return newName;
}


config.macros.newTiddler.onClickNewTiddler = function()
{
	var title = this.getAttribute("newTitle");
	if(this.getAttribute("isJournal") == "true") {
		title = new Date().formatString(title.trim());
	}

	// ---- these three lines should be the only difference between this and the core onClickNewTiddler
	if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
		title = config.macros.newTiddler.getName(title);

	var params = this.getAttribute("params");
	var tags = params ? params.split("|") : [];
	var focus = this.getAttribute("newFocus");
	var template = this.getAttribute("newTemplate");
	var customFields = this.getAttribute("customFields");
	if(!customFields && !store.isShadowTiddler(title))
		customFields = String.encodeHashMap(config.defaultCustomFields);
	story.displayTiddler(null,title,template,false,null,null);
	var tiddlerElem = story.getTiddler(title);
	if(customFields)
		story.addCustomFields(tiddlerElem,customFields);
	var text = this.getAttribute("newText");
	if(typeof text == "string")
		story.getTiddlerField(title,"text").value = text.format([title]);
	for(var t=0;t<tags.length;t++)
		story.setTiddlerTag(title,tags[t],+1);
	story.focusTiddler(title,focus);
	return false;
};

//}}}

(Written Tuesday, May 1, 2001)

I've been blissfully unemployed for 6 months now, living off savings.  There really haven't been a lot of significant events worth noting down.  But then I remembered that this isn't //Dear Diary.//

I've been juggling a lot.  I mean it.  I'm getting juggling callouses.  Some of that is about to end since this is the last week of classes at the [[University of Colorado|http://www.colorado.edu]] and the students that populate some of my groups will be winging it for parts unknown after finals.  There is a smaller group of grads that I expect will still meet during the summer, so this isn't going to be total withdrawal.

It just means that I will have more time to actually work on some of those projects that I had queued up from the before time when I was employed.  Some time in April I discovered that I had recovered my will-to-work, and could now actually take on a project that required me to make informed decisions again.

My biggest concern right now is that it is allergy season.  I did a massive amount of work to unjungle my front yard yesterday and paid for it last night with a 4 am, hour-long sneezing and nose blowing fit.  The original plan was to do a similar job to unjungle the back yard today, but frankly, though the nasal spigot is turned off, I currently feel as if I have a huge grain of salt under my right eyelid.  I wash my face about once an hour and irrigate that puppy.  Then it doesn't bother as long as I strictly avoid touching my eye for any reason.
(Written Saturday, September 27, 2003)

Yessir, I've been working.  Readjusting to daily life out among people.  Actually supporting someone else's computer.  Having to be careful not to break things while fixing other things.  A lot of adjusting to be done.

Many things are coming back via associative memory, which is good.  A few of the harsher lessons I'm getting to learn over again.  (I'm just talking about procedures to use to ensure that I don't make things worse.)

On the big plus side is that one of the senior sysadmins is making a habit of handing me the stuff that he's having trouble with or just not having the time to do.  So far, with only the exception of a hardware failure, I've handled them all, which is a good sign for me.

I took advantage of having the ~CDs to ~SuSE 8.2 available to upgrade my home machine.  Why, why, why does that have to be so painful?  ''So'' many things broke during the upgrade.  I've got about 50 lines in my &ldquo;problems&rdquo; file, all of which I've taken care of with the exception of printing.

(It's been almost 3 weeks-- shows how much I need to have printing available to me.  Well, at least when I //have// a job.  It was pretty vital when I was //looking// for a job.)
(Written Monday, November 20, 2000)

Ah, life's little vicissitudes.

If you have been following these notes you may have noticed several mentions of work stress.  Well, the bell tolled somewhere around October 6, 2000.  About a week and a half later I was given the final word that no help would be available before February, 2001.  Since I started doing two people's jobs back in January, 2000 and had been asking stridently for help since April, 2000 and had been given the //"3 more months"// routine twice, I decided that it was time to cut my losses.

Since I've had no time for socializing and since I'm an unattached single male with simple tastes, I happened to have a good sized chunk of moola hanging about, so this was an excellent time to take a break.  I'm feeling no pressure to look for work any time soon, which is an amazing luxury.

It was also desperately needed.  I mean just look at the date.  My last day of work was Halloween and it's taken me 20 days to even think about making a note of it on my web page.  Tomorrow marks the end of my third week without work and I am just now becoming a conscious human being again.

And I'm living more like a human now too.  It is true that I haven't washed tonight's dinner dishes yet.  But last night's got done and that's somewhere between 7 and 14 days better than I had been doing.  In point of fact, the week before I submitted my resignation I came home Friday night and I could smell my dishes from across the kitchen.  When did I wash them?  Two ''days'' later.  And only then because I needed something to cook with that night.

I have to admit that that //"unattached single male"// thing means that I am frequently willing to leave the dirty dishes overnight.  But I like to be reasonably clean.  Clean clothes, clean dishes, even the occasional vacuuming of the floors and believe it or not stirring up the dust with a California Duster-- these all happen normally around my house because I do appreciate the resulting environment.  While I was using all of my personal will power to cope with my work environment, I let my personal life degenerate to the point where pigs wouldn't want to live with me.

Today, I made my bed before noon, for the second time this week.  In all of October I made my bed once-- on laundry day.
(Written Saturday, August 4, 2001)

Every summer, when I have the house open and the fan drawing air into my bedroom while the light is on, some species of flying creature tries to adopt my room as its habitat.

For some reason, these invasions seem to be generally limited to a single species per year.  For example, I've had Miller moths, and the local, spiky beetle, mosquitos, and of course wasps once.

This year a strange, pale green insect something like a lacewing has chosen to be my invader.  These beasties are surprisingly hard to kill.  A good whack with the fly swatter only seems to stun them momentarily and I'm forced to crush them by hand with a kleenex.

Until this evening:  I noticed my invader beating his little brain out in the lampshade.  Taking up my weapons, I waited for him to maneuver out of the lamp to a locale where I could get a good swing going.  I never got the chance.  While I watched, my flying friend landed on the inside of the shade, then appeared to try to take a step, stumbled and fell down, apparently unconscious, to the base of the lamp.

I watched him for about a minute, but he never moved even though he was lying on his back.  I applied my standard remedies to make sure of his state, then lay back down to consider the implications.

//I considered claiming, for dramatic effect you understand, "fell down, stone dead, to the base of the lamp" but I suffered a sudden bout of intellectual honesty and had to forgo that.//
(Written Monday, July 26, 2004)

I haven't been doing the updates on here very frequently.  Too bad.  I have a couple of thoughts from the last few weeks.

One of the great unanswered questions: ''What does the inside of your nose smell like?''

I appear to have plumbing gnomes.  My kitchen sink trap recently began to leak.  Multiple trips to the hardware store later, I have all PVC parts under there and a complete replacement of the brass spaghetti mess that the original plumbers left me.  Not that I did much better, since they parts don't line up without a bit of a diversion from a direct run.

Anyway, after conceeding that I'd have to do the funky run, I got things bought and connected together.  But having a 45 bend in there makes it hard to tighten the joints, as turning one end tends to loosen the other.  I gave up for the day and left a bucket under there for the drips, planning on waiting for the weekend to take it apart again and tighten one side out where I could get more hands on it.

This weekend, the bucket was dry.  So I washed my dishes.  Still dry.  So I dumped a gallon container down the sink.  Still dry.  My leak healed.

My dad suggested that if I've got plumbing gnomes, I'd better put out an offering of steak and beer.
(Written Sunday, 07 Jun 2009)

I'm typing this as fast as I can because the thunderbumpers are going on outside.

It's not only because I think that I might lose power and thus my edits, but also because I like to watch thunderstorms.

Say, that's not just rumbling.  There are some mighty hefty sounding droplets.  And they are bouncin', too.
/***
|Name:|PrettyDatesPlugin|
|Description:|Provides a new date format ('pppp') that displays times such as '2 days ago'|
|Version:|1.0 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#PrettyDatesPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Notes
* If you want to you can rename this plugin. :) Some suggestions: LastUpdatedPlugin, RelativeDatesPlugin, SmartDatesPlugin, SexyDatesPlugin.
* Inspired by http://ejohn.org/files/pretty.js
***/
//{{{
Date.prototype.prettyDate = function() {
	var diff = (((new Date()).getTime() - this.getTime()) / 1000);
	var day_diff = Math.floor(diff / 86400);

	if (isNaN(day_diff))      return "";
	else if (diff < 0)        return "in the future";
	else if (diff < 60)       return "just now";
	else if (diff < 120)      return "1 minute ago";
	else if (diff < 3600)     return Math.floor(diff/60) + " minutes ago";
	else if (diff < 7200)     return "1 hour ago";
	else if (diff < 86400)    return Math.floor(diff/3600) + " hours ago";
	else if (day_diff == 1)   return "Yesterday";
	else if (day_diff < 7)    return day_diff + " days ago";
	else if (day_diff < 14)   return  "a week ago";
	else if (day_diff < 31)   return Math.ceil(day_diff/7) + " weeks ago";
	else if (day_diff < 62)   return "a month ago";
	else if (day_diff < 365)  return "about " + Math.ceil(day_diff/31) + " months ago";
	else if (day_diff < 730)  return "a year ago";
	else                      return Math.ceil(day_diff/365) + " years ago";
}

Date.prototype.formatString_orig_mptw = Date.prototype.formatString;

Date.prototype.formatString = function(template) {
	return this.formatString_orig_mptw(template).replace(/pppp/,this.prettyDate());
}

// for MPTW. otherwise edit your ViewTemplate as required.
// config.mptwDateFormat = 'pppp (DD/MM/YY)'; 
config.mptwDateFormat = 'pppp'; 

//}}}

/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {

	dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?

	createTagButton: function(place,tag,excludeTiddler) {
		// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
		var splitTag = tag.split("|");
		var pretty = tag;
		if (splitTag.length == 2) {
			tag = splitTag[1];
			pretty = splitTag[0];
		}
		
		var sp = createTiddlyElement(place,"span",null,"quickopentag");
		createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
		
		var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
                        config.views.wikified.tag.tooltip.format([tag]),onClickTag);
		theTag.setAttribute("tag",tag);
		if (excludeTiddler)
			theTag.setAttribute("tiddler",excludeTiddler);
    		return(theTag);
	},

	miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var tagged = store.getTaggedTiddlers(tiddler.title);
		if (tagged.length > 0) {
			var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
                        	config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
			theTag.setAttribute("tag",tiddler.title);
			theTag.className = "miniTag";
		}
	},

	allTagsHandler: function(place,macroName,params) {
		var tags = store.getTags(params[0]);
		var filter = params[1]; // new feature
		var ul = createTiddlyElement(place,"ul");
		if(tags.length == 0)
			createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
		for(var t=0; t<tags.length; t++) {
			var title = tags[t][0];
			if (!filter || (title.match(new RegExp('^'+filter)))) {
				var info = getTiddlyLinkInfo(title);
				var theListItem =createTiddlyElement(ul,"li");
				var theLink = createTiddlyLink(theListItem,tags[t][0],true);
				var theCount = " (" + tags[t][1] + ")";
				theLink.appendChild(document.createTextNode(theCount));
				var theDropDownBtn = createTiddlyButton(theListItem," " +
					config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
				theDropDownBtn.setAttribute("tag",tags[t][0]);
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag ",
"	{ margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
"	{ border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
"	{ margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
"	{ margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
"	/* looks better in right justified main menus */",
"	{ margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }", 
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		// we fully replace these builtins. can't hijack them easily
		window.createTagButton = this.createTagButton;
		config.macros.allTags.handler = this.allTagsHandler;
		config.macros.miniTag = { handler: this.miniTagHandler };
		config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
		store.addNotification("QuickOpenTagStyles",refreshStyles);
	}
}

config.quickOpenTag.init();

//}}}

/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {

	prompts: {
		rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
		remove: "Remove the tag '%0' from %1 tidder%2?"
	},

	removeTag: function(tag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,tag);
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	renameTag: function(oldTag,newTag,tiddlers) {
		store.suspendNotifications();
		for (var i=0;i<tiddlers.length;i++) {
			store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
			store.setTiddlerTag(tiddlers[i].title,true,newTag);  // add new
		}
		store.resumeNotifications();
		store.notifyAll();
	},

	storeMethods: {

		saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,

		saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
			if (title != newTitle) {
				var tagged = this.getTaggedTiddlers(title);
				if (tagged.length > 0) {
					// then we are renaming a tag
					if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
						config.renameTags.renameTag(title,newTitle,tagged);

					if (!this.tiddlerExists(title) && newBody == "")
						// dont create unwanted tiddler
						return null;
				}
			}
			return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
		},

		removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,

		removeTiddler: function(title) {
			var tagged = this.getTaggedTiddlers(title);
			if (tagged.length > 0)
				if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
					config.renameTags.removeTag(title,tagged);
			return this.removeTiddler_orig_renameTags(title);
		}

	},

	init: function() {
		merge(TiddlyWiki.prototype,this.storeMethods);
	}
}

config.renameTags.init();

//}}}

/***
|Name:|SaveCloseTiddlerPlugin|
|Description:|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
|Version:|3.0 ($Rev: 5502 $)|
|Date:|$Date: 2008-06-10 23:31:39 +1000 (Tue, 10 Jun 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SaveCloseTiddlerPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
To use these you must add them to the tool bar in your EditTemplate
***/
//{{{
merge(config.commands,{

	saveCloseTiddler: {
		text: 'done/close',
		tooltip: 'Save changes to this tiddler and close it',
		handler: function(ev,src,title) {
			var closeTitle = title;
			var newTitle = story.saveTiddler(title,ev.shiftKey);
			if (newTitle)
				closeTitle = newTitle;
			return config.commands.closeTiddler.handler(ev,src,closeTitle);
		}
	},

	cancelCloseTiddler: {
		text: 'cancel/close',
		tooltip: 'Undo changes to this tiddler and close it',
		handler: function(ev,src,title) {
			// the same as closeTiddler now actually
			return config.commands.closeTiddler.handler(ev,src,title);
		}
	}

});

//}}}

/***
|Name:|SelectThemePlugin|
|Description:|Lets you easily switch theme and palette|
|Version:|1.0.1 ($Rev: 3646 $)|
|Date:|$Date: 2008-02-27 02:34:38 +1000 (Wed, 27 Feb 2008) $|
|Source:|http://mptw.tiddlyspot.com/#SelectThemePlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
* Borrows largely from ThemeSwitcherPlugin by Martin Budden http://www.martinswiki.com/#ThemeSwitcherPlugin
* Theme is cookie based. But set a default by setting config.options.txtTheme in MptwConfigPlugin (for example)
* Palette is not cookie based. It actually overwrites your ColorPalette tiddler when you select a palette, so beware. 
!Usage
* {{{<<selectTheme>>}}} makes a dropdown selector
* {{{<<selectPalette>>}}} makes a dropdown selector
* {{{<<applyTheme>>}}} applies the current tiddler as a theme
* {{{<<applyPalette>>}}} applies the current tiddler as a palette
* {{{<<applyTheme TiddlerName>>}}} applies TiddlerName as a theme
* {{{<<applyPalette TiddlerName>>}}} applies TiddlerName as a palette
***/
//{{{

config.macros.selectTheme = {
	label: {
      		selectTheme:"select theme",
      		selectPalette:"select palette"
	},
	prompt: {
		selectTheme:"Select the current theme",
		selectPalette:"Select the current palette"
	},
	tags: {
		selectTheme:'systemTheme',
		selectPalette:'systemPalette'
	}
};

config.macros.selectTheme.handler = function(place,macroName)
{
	var btn = createTiddlyButton(place,this.label[macroName],this.prompt[macroName],this.onClick);
	// want to handle palettes and themes with same code. use mode attribute to distinguish
	btn.setAttribute('mode',macroName);
};

config.macros.selectTheme.onClick = function(ev)
{
	var e = ev ? ev : window.event;
	var popup = Popup.create(this);
	var mode = this.getAttribute('mode');
	var tiddlers = store.getTaggedTiddlers(config.macros.selectTheme.tags[mode]);
	// for default
	if (mode == "selectPalette") {
		var btn = createTiddlyButton(createTiddlyElement(popup,'li'),"(default)","default color palette",config.macros.selectTheme.onClickTheme);
		btn.setAttribute('theme',"(default)");
		btn.setAttribute('mode',mode);
	}
	for(var i=0; i<tiddlers.length; i++) {
		var t = tiddlers[i].title;
		var name = store.getTiddlerSlice(t,'Name');
		var desc = store.getTiddlerSlice(t,'Description');
		var btn = createTiddlyButton(createTiddlyElement(popup,'li'), name?name:t, desc?desc:config.macros.selectTheme.label['mode'], config.macros.selectTheme.onClickTheme);
		btn.setAttribute('theme',t);
		btn.setAttribute('mode',mode);
	}
	Popup.show();
	return stopEvent(e);
};

config.macros.selectTheme.onClickTheme = function(ev)
{
	var mode = this.getAttribute('mode');
	var theme = this.getAttribute('theme');
	if (mode == 'selectTheme')
		story.switchTheme(theme);
	else // selectPalette
		config.macros.selectTheme.updatePalette(theme);
	return false;
};

config.macros.selectTheme.updatePalette = function(title)
{
	if (title != "") {
		store.deleteTiddler("ColorPalette");
		if (title != "(default)")
			store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
					config.options.txtUserName,undefined,"");
		refreshAll();
		if(config.options.chkAutoSave)
			saveChanges(true);
	}
};

config.macros.applyTheme = {
	label: "apply",
	prompt: "apply this theme or palette" // i'm lazy
};

config.macros.applyTheme.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	var useTiddler = params[0] ? params[0] : tiddler.title;
	var btn = createTiddlyButton(place,this.label,this.prompt,config.macros.selectTheme.onClickTheme);
	btn.setAttribute('theme',useTiddler);
	btn.setAttribute('mode',macroName=="applyTheme"?"selectTheme":"selectPalette"); // a bit untidy here
}

config.macros.selectPalette = config.macros.selectTheme;
config.macros.applyPalette = config.macros.applyTheme;

config.macros.refreshAll = { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
	createTiddlyButton(place,"refresh","refresh layout and styles",function() { refreshAll(); });
}};

//}}}

<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
(Written Mon Aug 3, 2009)

I have another sign of the disease that is aging.

I normally exercise by doing part of my commute into work by bicycle.  By selecting my parking spot, I can adjust how far I bicycle up to and rarely including parking in my own garage.  I do this every weekday for 10 rides per week.

I've done this for years, ramping the distance up over a month or so until I hit a goodly amount and a sustainable rate of exercise.  This is usually 2x 15 minute hard rides 5 days per week.

This year, I've been riding since mid-April.  But those Friday commutes have been tough.

Last week, I had a flat tire Wednesday morning and missed a commute.  I fixed it, but Thursday had a dreary rain all day.  Then I took Friday off from work, with the best intentions in the world to make up for missed rides on the weekend.  It didn't happen.

So, bright, sunny and warm this morning and out came the bike.  I cranked like a demon, shaving a full minute off my time from the same parking space, with less apparent effort.  Ahhh.

I just needed more recovery time.  Dang.  I'm going to have to change my exercise habits to build more recovery time into it.  I'm just not bouncing back as well as I used to.

Now I've got to find out whether my body wants a 4-3 pattern or something more complicated like a 2-1-2-2.
an irregular opinion piece
Swimming Upstream of Unconsciousness
(Written Mon Jul 20, 2009)

The honeymoon is over.

I got a canker sore.

On the other hand, it took a flashlight and a magnifying glass to identify it as such.  And it only lasted about 2 days rather than my customary 7 days.  So there is still some sort of effect from the Nexium on my canker sores.

Dang.  Writing about your ills must be a sign of getting old.  If I ever start writing stories that take place mostly in the bathroom like Asimov did, please tell me.
(Written Friday, June 16, 2000)

I haven't the faintest idea what I'm going to type.  If that's not exciting, I don't know what is.

Life has been a long list of troubles and a short list of minor pleasures that I've had to savor with much conscious effort, because there haven't been any major pleasures to savor.

I guess the biggest of the minors is that I've decided I like my [[PDA.|Hip-holster Geek Time]] I spent much time stripping [[PalmGear HQ|http://www.palmgear.com]] of everything I thought was potentially useful.  Out of 4300 listings there, I evaluated 600 and some programs, and kept about 70 of them, nearly all freeware.  Of that 70, perhaps 25 I am still evaluating, most of those being shareware or commercial software.

Here's a hint for you.  Buy one of the good database programs.  Many, many, many of the programs on ~PalmGear fit into similar classes and a lot of these are essentially databases.  I would guess that there are probably more than 100 check register programs available on ~PalmGear.  I bought [[HanDBase|http://www.ddhsoftware.com]] and made a database check register which is better than half the programs out there, as good as another quarter, and though there may be better check registers among the 20 or so more programs, A) mine is tailored to what I wanted to do with it and B) I didn't have to wade through 100 programs to find the 20 really good ones and then evaluate each of them.

I did the same thing with auto mileage programs.  One ~HanDBase database that does only what I want, no added features that I couldn't care less about.

Of course, this scheme doesn't work for everything.  Games, doc readers, stopwatches, clocks, calculators.  There was still a load of things to evaluate.

Well, surprise!  My black mood didn't really dominate today's entry.  I got some really bad news at work today, but a couple of hours relaxation has at least pushed it back off the top of my mind for now.
body {
font-size: 12pt;
}
(Written Friday, October 29, 1999)

This one is dedicated to Tony.  He should recomember (That's a portmanteau word, in the spirit of Lewis Carroll -- recollect and remember merged into one.) a dream experience that he related to me when we were both much younger and living on Beale AFB in California.

I was having a dream last night.  The contents of the dream aren't important.  (No, it wasn't anything that I'm embarassed to relate in a public forum.)  At one point in the dream a tour group showed up at the place where I was working.  The tour guide, whom I never saw-- I could only hear her voice, was describing the machine that I was working with.

Suddenly, there was a loud ''pop'' sound and her voice lost a lot of fidelity and in fact started sounding like she was talking over a cheap radio.  And what she was saying changed too.

It took a few moments for it to sink in, but that ''pop'' sound is my clock radio turning on.  And the tour guide was the woman who does the morning news blurbs on the moldy-oldies station that I have my radio set to.  The day was beginning and I was awake.

This left me with some questions about dream states.

*Did I hear the ''pop'' sound in real time?
*Assuming I heard the pop in real time, why was the radio announcer's voice in my dream before the radio came on?
*If the pop wasn't real time, then I have to assume that I dreamed it.  So was the ending of the dream all engineered for the purpose of cushioning my waking transition?  I.e. I was dreaming when the radio went off and my unconcious fit the sounds I was hearing in my sleep into the dream context so that when I made the waking transition I would already be prepared for the real world environment.
*What are the implications of that last supposition for our psyche's?  It certainly wasn't a danger situation that I needed to be prepared for.  Also, unless the dream were already a fight or flight motif, I'm not sure that I'd want that sort of covering on the transition.  I might wake //''less''// prepared for a dangerous situation.  I think it would be better to be groggy and //''certain''// that I was awake, than needing to make quick decisions and in doubt about whether I was dreaming.
<<allTags excludeLists>>
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<<allTags excludeLists [a-z]>>
<<timeline "created">>
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 6100 $)|
|Date:|$Date: 2008-07-27 01:42:07 +1000 (Sun, 27 Jul 2008) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{

merge(String.prototype,{

	parseTagExpr: function(debug) {

		if (this.trim() == "")
			return "(true)";

		var anyLogicOp = /(!|&&|\|\||\(|\))/g;
		var singleLogicOp = /^(!|&&|\|\||\(|\))$/;

		var spaced = this.
			// because square brackets in templates are no good
			// this means you can use [(With Spaces)] instead of [[With Spaces]]
			replace(/\[\(/g," [[").
			replace(/\)\]/g,"]] "). 
			// space things out so we can use readBracketedList. tricky eh?
			replace(anyLogicOp," $1 ");

		var expr = "";

		var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!

		for (var i=0;i<tokens.length;i++)
			if (tokens[i].match(singleLogicOp))
				expr += tokens[i];
			else
				expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think

		if (debug)
			alert(expr);

		return '('+expr+')';
	}

});

merge(TiddlyWiki.prototype,{
	getTiddlersByTagExpr: function(tagExpr,sortField) {

		var result = [];

		var expr = tagExpr.parseTagExpr();

		store.forEachTiddler(function(title,tiddler) {
			if (eval(expr))
				result.push(tiddler);
		});

		if(!sortField)
			sortField = "title";

		result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
		
		return result;
	}
});

config.taggly = {

	// for translations
	lingo: {
		labels: {
			asc:        "\u2191", // down arrow
			desc:       "\u2193", // up arrow
			title:      "title",
			modified:   "modified",
			created:    "created",
			show:       "+",
			hide:       "-",
			normal:     "normal",
			group:      "group",
			commas:     "commas",
			sitemap:    "sitemap",
			numCols:    "cols\u00b1", // plus minus sign
			label:      "Tagged as '%0':",
			exprLabel:  "Matching tag expression '%0':",
			excerpts:   "excerpts",
			descr:      "descr",
			slices:     "slices",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only",
			noneFound:  "(none)"
		},

		tooltips: {
			title:      "Click to sort by title",
			modified:   "Click to sort by modified date",
			created:    "Click to sort by created date",
			show:       "Click to show tagging list",
			hide:       "Click to hide tagging list",
			normal:     "Click to show a normal ungrouped list",
			group:      "Click to show list grouped by tag",
			sitemap:    "Click to show a sitemap style list",
			commas:     "Click to show a comma separated list",
			numCols:    "Click to change number of columns",
			excerpts:   "Click to show excerpts",
			descr:      "Click to show the description slice",
			slices:     "Click to show all slices",
			contents:   "Click to show entire tiddler contents",
			sliders:    "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		},

		tooDeepMessage: "* //sitemap too deep...//"
	},

	config: {
		showTaggingCounts: true,
		listOpts: {
			// the first one will be the default
			sortBy:     ["title","modified","created"],
			sortOrder:  ["asc","desc"],
			hideState:  ["show","hide"],
			listMode:   ["normal","group","sitemap","commas"],
			numCols:    ["1","2","3","4","5","6"],
			excerpts:   ["noexcerpts","excerpts","descr","slices","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/",
		siteMapDepthLimit: 25
	},

	getTagglyOpt: function(title,opt) {
		var val = store.getValue(title,this.config.valuePrefix+opt);
		return val ? val : this.config.listOpts[opt][0];
	},

	setTagglyOpt: function(title,opt,value) {
		if (!store.tiddlerExists(title))
			// create it silently
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
		// if value is default then remove it to save space
		return store.setValue(title,
			this.config.valuePrefix+opt,
			value == this.config.listOpts[opt][0] ? null : value);
	},

	getNextValue: function(title,opt) {
		var current = this.getTagglyOpt(title,opt);
		var pos = this.config.listOpts[opt].indexOf(current);
		// a little usability enhancement. actually it doesn't work right for grouped or sitemap
		var limit = (opt == "numCols" ? store.getTiddlersByTagExpr(title).length : this.config.listOpts[opt].length);
		var newPos = (pos + 1) % limit;
		return this.config.listOpts[opt][newPos];
	},

	toggleTagglyOpt: function(title,opt) {
		var newVal = this.getNextValue(title,opt);
		this.setTagglyOpt(title,opt,newVal);
	}, 

	createListControl: function(place,title,type) {
		var lingo = config.taggly.lingo;
		var label;
		var tooltip;
		var onclick;

		if ((type == "title" || type == "modified" || type == "created")) {
			// "special" controls. a little tricky. derived from sortOrder and sortBy
			label = lingo.labels[type];
			tooltip = lingo.tooltips[type];

			if (this.getTagglyOpt(title,"sortBy") == type) {
				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
				onclick = function() {
					config.taggly.toggleTagglyOpt(title,"sortOrder");
					return false;
				}
			}
			else {
				onclick = function() {
					config.taggly.setTagglyOpt(title,"sortBy",type);
					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
					return false;
				}
			}
		}
		else {
			// "regular" controls, nice and simple
			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
			onclick = function() {
				config.taggly.toggleTagglyOpt(title,type);
				return false;
			}
		}

		// hide button because commas don't have columns
		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
	},

	makeColumns: function(orig,numCols) {
		var listSize = orig.length;
		var colSize = listSize/numCols;
		var remainder = listSize % numCols;

		var upperColsize = colSize;
		var lowerColsize = colSize;

		if (colSize != Math.floor(colSize)) {
			// it's not an exact fit so..
			upperColsize = Math.floor(colSize) + 1;
			lowerColsize = Math.floor(colSize);
		}

		var output = [];
		var c = 0;
		for (var j=0;j<numCols;j++) {
			var singleCol = [];
			var thisSize = j < remainder ? upperColsize : lowerColsize;
			for (var i=0;i<thisSize;i++) 
				singleCol.push(orig[c++]);
			output.push(singleCol);
		}

		return output;
	},

	drawTable: function(place,columns,theClass) {
		var newTable = createTiddlyElement(place,"table",null,theClass);
		var newTbody = createTiddlyElement(newTable,"tbody");
		var newTr = createTiddlyElement(newTbody,"tr");
		for (var j=0;j<columns.length;j++) {
			var colOutput = "";
			for (var i=0;i<columns[j].length;i++) 
				colOutput += columns[j][i];
			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
			wikify(colOutput,newTd);
		}
		return newTable;
	},

	createTagglyList: function(place,title,isTagExpr) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title,isTagExpr); break;
			case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
			case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
		}
	},

	getTaggingCount: function(title,isTagExpr) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		}
		return "";
	},

	getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
		return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
	},

	getExcerpt: function(inTiddlerTitle,title,indent) {
		if (!indent)
			indent = 1;

		var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
		var t = store.getTiddler(title);

		if (t && displayMode == "excerpts") {
			var text = t.text.replace(/\n/," ");
			var marker = text.indexOf(this.config.excerptMarker);
			if (marker != -1) {
				return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
			}
			else if (text.length < this.config.excerptSize) {
				return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
			}
			else {
				return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
			}
		}
		else if (t && displayMode == "contents") {
			return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
		}
		else if (t && displayMode == "sliders") {
			return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
		}
		else if (t && displayMode == "descr") {
			var descr = store.getTiddlerSlice(title,'Description');
			return descr ? " {{excerpt{" + descr  + "}}}" : "";
		}
		else if (t && displayMode == "slices") {
			var result = "";
			var slices = store.calcAllSlices(title);
			for (var s in slices)
				result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
			return result ? "\n{{excerpt excerptIndent{\n" + result  + "}}}" : "";
		}
		return "";
	},

	notHidden: function(t,inTiddler) {
		if (typeof t == "string") 
			t = store.getTiddler(t);
		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
				(inTiddler && this.config.excludeTags.contains(inTiddler)));
	},

	// this is for normal and commas mode
	createTagglyListNormal: function(place,title,useCommas,isTagExpr) {

		var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);

		if (this.getTagglyOpt(title,"sortOrder") == "desc")
			list = list.reverse();

		var output = [];
		var first = true;
		for (var i=0;i<list.length;i++) {
			if (this.notHidden(list[i],title)) {
				var countString = this.getTaggingCount(list[i].title);
				var excerpt = this.getExcerpt(title,list[i].title);
				if (useCommas)
					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
				else
					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

				first = false;
			}
		}

		return this.drawTable(place,
			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
			useCommas ? "commas" : "normal");
	},

	// this is for the "grouped" mode
	createTagglyListGrouped: function(place,title,isTagExpr) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list = list.reverse();

		var leftOvers = []
		for (var i=0;i<list.length;i++)
			leftOvers.push(list[i].title);

		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (this.notHidden(list[i].tags[j],title)) {

						if (!allTagsHolder[list[i].tags[j]])
							allTagsHolder[list[i].tags[j]] = "";

						if (this.notHidden(list[i],title)) {
							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

						}
					}
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder)
			allTags.push(t);

		var sortHelper = function(a,b) {
			if (a == b) return 0;
			if (a < b) return -1;
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") return sortHelper(a,b);
			else if (!tidA && !tidB) return 0;
			else if (!tidA) return -1;
			else if (!tidB) return +1;
			else return sortHelper(tidA[sortBy],tidB[sortBy]);
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++)
			if (this.notHidden(leftOvers[i],title))
				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

		var output = [];

		if (sortOrder == "desc")
			allTags.reverse();
		else if (leftOverOutput != "")
			// leftovers first...
			output.push(leftOverOutput);

		for (var i=0;i<allTags.length;i++)
			if (allTagsHolder[allTags[i]] != "")
				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

		if (sortOrder == "desc" && leftOverOutput != "")
			// leftovers last...
			output.push(leftOverOutput);

		return this.drawTable(place,
				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
				"grouped");

	},

	// used to build site map
	treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {

		var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);

		if (sortOrder == "desc")
			list.reverse();

		var indent = "";
		for (var j=0;j<depth;j++)
			indent += "*"

		var childOutput = "";

		if (depth > this.config.siteMapDepthLimit)
			childOutput += indent + this.lingo.tooDeepMessage;
		else
			for (var i=0;i<list.length;i++)
				if (list[i].title != title)
					if (this.notHidden(list[i].title,this.config.inTiddler))
						childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);

		if (depth == 0)
			return childOutput;
		else
			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
	},

	// this if for the site map mode
	createTagglyListSiteMap: function(place,title,isTagExpr) {
		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
		return this.drawTable(place,
				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
				"sitemap"
				);
	},

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var parsedParams = paramString.parseParams("tag",null,true);
				var refreshContainer = createTiddlyElement(place,"div");

				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);

				var tag = getParam(parsedParams,"tag");
				var expr = getParam(parsedParams,"expr");

				if (expr) {
					refreshContainer.setAttribute("isTagExpr","true");
					refreshContainer.setAttribute("title",expr);
					refreshContainer.setAttribute("showEmpty","true");
				}
				else {
					refreshContainer.setAttribute("isTagExpr","false");
					if (tag) {
        				refreshContainer.setAttribute("title",tag);
						refreshContainer.setAttribute("showEmpty","true");
					}
					else {
        				refreshContainer.setAttribute("title",tiddler.title);
						refreshContainer.setAttribute("showEmpty","false");
					}
				}
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				var isTagExpr = place.getAttribute("isTagExpr") == "true";
				var showEmpty = place.getAttribute("showEmpty") == "true";
				removeChildren(place);
				addClass(place,"tagglyTagging");
				var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
				if (countFound > 0 || showEmpty) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",
								isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title,isTagExpr);
						if (countFound == 0 && showEmpty)
							createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
					}
				}
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
"	margin-top:0px; padding-top:0.5em; padding-left:2em;",
"	margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
"	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
"	border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
"	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		merge(config.macros,this.macros);
		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
		store.addNotification("TagglyTaggingStyles",refreshStyles);
	}
};

config.taggly.init();

//}}}

/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

// syntax adjusted to not clash with NestedSlidersPlugin
// added + syntax to start open instead of closed

***/
//{{{
config.formatters.unshift( {
	name: "inlinesliders",
	// match: "\\+\\+\\+\\+|\\<slider",
	match: "\\<slider",
	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
	lookaheadRegExp: /(?:<slider)(\+?) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
	handler: function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
			var btn = createTiddlyButton(w.output,lookaheadMatch[2] + " "+"\u00BB",lookaheadMatch[2],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = (lookaheadMatch[1] == '+' ? "block" : "none");
			wikify(lookaheadMatch[3],panel);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
   },
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling;
		n.style.display = (n.style.display=="none") ? "block" : "none";
		return false;
	}
});

//}}}

(Written Thursday, 04 Jun 2009)

I like Swedish meatballs.   I've been buying Marie Callender microwave Swedish meatballs.  And I was disappointed when they decided to make the product a &ldquo;meal&rdquo; and not just because I don't like green beans.

For me the real problem was that originally, the sauce and the noodles came in separate packages.  You could microwave them the right amount for each part.

In &ldquo;meal&rdquo; form the sauce and noodles were mixed together and you either got luke-warm sauce with icy crystals in the meatballs or you got piping hot sauce and crispity-crunchity noodles.  (Plus the problem of not letting those nasty old green beans afflict the taste.)

So I set out to learn how to make them myself.  The Internet, here I come!

After reading a dozen recipes with essentially nothing in common, not even the meat involved, I'm left with a burning question:

//What makes a meatball Swedish?//

It doesn't appear to hamburger or pork or bread crumbs or onions or brown gravy or sour cream or (shudder) grape jelly.

My best guess is that it isn't an ingredient at all.

I think that Swedish meatballs just have to be tiny.
/***
|Name:|ToggleTagPlugin|
|Description:|Makes a checkbox which toggles a tag in a tiddler|
|Version:|3.1.0 ($Rev: 4907 $)|
|Date:|$Date: 2008-05-13 03:15:46 +1000 (Tue, 13 May 2008) $|
|Source:|http://mptw.tiddlyspot.com/#ToggleTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
{{{<<toggleTag }}}//{{{TagName TiddlerName LabelText}}}//{{{>>}}}
* TagName - the tag to be toggled, default value "checked"
* TiddlerName - the tiddler to toggle the tag in, default value the current tiddler
* LabelText - the text (gets wikified) to put next to the check box, default value is '{{{[[TagName]]}}}' or '{{{[[TagName]] [[TiddlerName]]}}}'
(If a parameter is '.' then the default will be used)
* TouchMod flag - if non empty then touch the tiddlers mod date. Note, can set config.toggleTagAlwaysTouchModDate to always touch mod date
!!Examples
|Code|Description|Example|h
|{{{<<toggleTag>>}}}|Toggles the default tag (checked) in this tiddler|<<toggleTag>>|
|{{{<<toggleTag TagName>>}}}|Toggles the TagName tag in this tiddler|<<toggleTag TagName>>|
|{{{<<toggleTag TagName TiddlerName>>}}}|Toggles the TagName tag in the TiddlerName tiddler|<<toggleTag TagName TiddlerName>>|
|{{{<<toggleTag TagName TiddlerName 'click me'>>}}}|Same but with custom label|<<toggleTag TagName TiddlerName 'click me'>>|
|{{{<<toggleTag . . 'click me'>>}}}|dot means use default value|<<toggleTag . . 'click me'>>|
!!Notes
* If TiddlerName doesn't exist it will be silently created
* Set label to '-' to specify no label
* See also http://mgtd-alpha.tiddlyspot.com/#ToggleTag2
!!Known issues
* Doesn't smoothly handle the case where you toggle a tag in a tiddler that is current open for editing
* Should convert to use named params
***/
//{{{

if (config.toggleTagAlwaysTouchModDate == undefined) config.toggleTagAlwaysTouchModDate = false;

merge(config.macros,{

	toggleTag: {

		createIfRequired: true,
		shortLabel: "[[%0]]",
		longLabel: "[[%0]] [[%1]]",

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tiddlerTitle = tiddler ? tiddler.title : '';
			var tag   = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddlerTitle;
			var defaultLabel = (title == tiddlerTitle ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			var touchMod = (params[3] && params[3] != '.') ? params[3] : "";
			label = (label == '-' ? '' : label); // dash means no label
			var theTiddler = (title == tiddlerTitle ? tiddler : store.getTiddler(title));
			var cb = createTiddlyCheckbox(place, label.format([tag,title]), theTiddler && theTiddler.isTagged(tag), function(e) {
				if (!store.tiddlerExists(title)) {
					if (config.macros.toggleTag.createIfRequired) {
						var content = store.getTiddlerText(title); // just in case it's a shadow
						store.saveTiddler(title,title,content?content:"",config.options.txtUserName,new Date(),null);
					}
					else 
						return false;
				}
				if ((touchMod != "" || config.toggleTagAlwaysTouchModDate) && theTiddler)
						theTiddler.modified = new Date();
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}

(Written Wednesday, 10 Jun 2009)

This needs to be back dated to October of 2008, because that's when these events unfolded.

I was sitting in the Programmers' Meeting at work.  We had covered old business and were going around the table bringing up our new business.  I'd had my turn early and my new business had prompted a bit of a discussion.  We wrapped it up finally and went on to the next person.

We reached an old friend of mine in the group.  He started off with, &ldquo;Did you just say, &lsquo;Half of one, six dozen of the other?&rsquo;&rdquo;

''SCORE!''

Some moments in life are just too precious.

Now I have to find some way to start working in the phrase, &ldquo;Running around like a chicken with its legs cut off.&rdquo;
//{{{
readOnly=(document.location.protocol=='http:');
//}}} 
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<div macro="showWhen readOnly">
 <!-- cut-down toolbar for web users -->
 <div macro='toolbar closeTiddler permalink'></div>
</div>
<div macro="hideWhen readOnly">
 <!-- regular toolbar for me  -->
  <div macro='toolbar closeTiddler closeOthers +editTiddler deleteTiddler permalink references jump'></div>
</div>
<!--}}}-->
(Written Thursday, March 16, 2000)

I liked the look of [[Robert Cringely's web page|http://www.pbs.org/cringely]] so when his most recent "Pulpit" announced that the look was going to change, I figured I had better get my thieving done soon.

So here's the new look for Swimming Upstream of Unconsciousness.

Web design, the classical way.  I.e. find something you like, then steal it.
(Written Mar 3, 2001)

I juggled outside today and then sat down under a tree to eat lunch and watch the scenery.  (Classes started on Monday.)  When I sat down I noticed a squirrel up in the tree.

A few minutes later friendly squirrel came down and squirreled around behind the tree and me and started sniffing up to my chips Tupper.  I did your basic, "No!" and covered the bin with my hand and off he scampered.

Then he sniffed around my juggling bag, climbed up on it and sniffed at the sandwich I was eating.  I told him that he wasn't getting any, so he got down and wandered off behind the tree.

And came back to my chips bin.  We repeat the "no", cover, scamper routine, but this time he just ran around my drink and went to sniff the Tuppers that held/hold my sandwiches.  I didn't chase him off since he can't get anything from them, (not while I'm watching anyway) but I kept the chips covered since he's about 6 inches from them.

Then he went right behind my back and up my left side looking for a way to get at the sandwich.  Since the space between me and the juggling bag is barely squirrel wide I chased him out.

It's a good thing that I still had my hand on my chips because I immediately felt his tail run up my forearm.  It was time to repeat the "No" routine, except that he just ran around my tea and went for the chips from that angle.

So I said, "No" and hit him on the nose.
So I said, "No" and hit him on the nose.
So I said, "No" and hit him on the nose.

So I picked up my chips and really swung at him.  He was finally discouraged enough to go off looking for someone else to feed him.

Being unsuccessful, he came back.  I didn't have to hit him this time to get him to go away.  But he came back again when I was eating my cookies.  Since I had sealed up all my Tuppers (and they only had scraps) I let him play with them for a few minutes.  He gave me this look like, "I could really go for some of that cookie," but I told him what I thought of that idea.

He went around my back again and started looking at my cookies closely, so I told him, "No" again.  He ran around my back and in a six foot circle until he was in front of me.  Then he started doing the squirrel stealth walk.  I looked him in the eye and said, "You aren't going to be able to sneak up on me that way."  He walked away again and I finished my cookie and got out of there.
For those of you who couldn't figure out the Star Trek reference, here it is.

In the third season of Star Trek (the original series), there was an episode titled "All Our Yesterdays," in which Kirk, Spock, and ~McCoy beam down to a planet to warn them that their sun is going to go nova and destroy the place. Not that the Feds sent anything like enough ships to help out with the panic that must surely ensue.

Anyway, the only person they meet is Mr. Atoz, a librarian. He urges them to make their selections quickly. The whole library consists of shiny silver disks about 4 inches across.

Anyway, while looking at the pictures stored on one of these disks, Kirk hear's a scream and dashes out the door, where he rescues a street floozie who utters the quoted line, "Sure, luv. What's library?"

Out of gratitude for saving her, she promptly accuses Kirk of being a witch. Hijinks follows.
(Written Friday, August 4, 2000)

What is it with people giving directions these days?  Last summer, in early September, I was being treated to lunch at the [[Boulder Dushanbe Teahouse,|http://www.boulderteahouse.com/]] but because of my work schedule, I was going to have to make my own way there.

I hadn't been there before, so I asked the person treating me for directions.  He told me that it was across from the field where they hold the Flea Market in the Spring.

So, after finding the Teahouse, I would know where the Flea Market would be held next Spring.

Today, we were going to be holding a farewell luncheon at the [[Oasis.|http://www.beerexpedition.com/co/b_02970.shtml]] Again, I asked for directions.

I was told that it was across the street from where the Library used to be.  And it was two blocks down from something else that doesn't exist anymore.

So I looked it up on the map.  For the record, take Broadway north to Canyon.  Turn left on Canyon.  The Oasis is two blocks down on your right.  Parking is just behind the building.

After the luncheon I wasn't in any hurry to get back to work, so I took an alternate path back to work, just to see if it was any nicer than trying to bicycle on Broadway in Boulder.  I took a wrong turn off the creek path and ended up, ''~TA-DA!'' at the Boulder Dushanbe Teahouse.
Monday, November 18, 2002

Remember the days, not so long ago, when if you knew computers, you could write your own ticket?  Ah, the memories.  Then the stock market tanked and ~CEOs started bailing out with million dollar parachutes to avoid any hint of responsibility for thrashing the lives of thousands of employees.  But I'm not bitter.

But I am irritated.  The economy in general seems to be holding right now, with no major trend up or down.  But the tech industry is still in the pits with no sign of a hint of the vaguest intimitation of a dim hope of a slight upturn.

I'm skilled, experienced even.  But I don't have any certifications because I picked up those skills on the job.  And between jobs I have no way to get certifications, even for the stuff I do know, since it would amount to paying Sun Micro for a sheet of paper, with no guarantee that I'd get any return on the investment.  I might as well play Lotto.

On the other hand, the last two months or so of my job hunt, HR departments have discovered that the Unix world has certifications.  If I thought it was hard to get an interview before, it's going to be nigh impossible now.

Looks bleak, doesn't it?