<!--{{{-->
<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]];}

#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; 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 closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></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 +saveTiddler -cancelTiddler deleteTiddler'></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>>
Well its been fun playing with [[TiddlyWiki|www.tiddlywiki.com]]. Its fun using it to quickly map out a set of ideas as a bunch of tiddlers, then fill out the info latter.
After a fine yum cha with May's parents, we went down the NSW art gallery. There is usually something new worth the trip. The funniest thing I've seen in ages though is the big letters stick on the windows that telling us that banal ideas cannot be saved by good execution. Its about the most banal thing I've seen in ages. The highlight of the trip was when we get some coffees and sat outside to take in the view. There were these two lorikeets going from table to table trying to get sugar from the punters. I know its not good form for wild birds to be dependent on handouts, especially refined sugar! But is was very cool anyway.
[img[http://dpinson.com/20060812.JPG]]
After spending a nice week in Cairns, it was a real shock to get back to Sydney at 16°C, and bluebottles all over the beaches. I guess its time for another tropical holiday....

[img[http://dpinson.com/20070909.jpg]]
It is the Holy Grail of user interface design that you get as close to intuitive as possible. I know that watching end users use my software often exposes all of my internal bias. Mind you, doing anything is another language is fun. I always like trying to use a Laundromat. I mean, these are industrial machines, designed to do one thing and do it OK, but most of all do it in the face of a diverse group of users. At my hotel, they have 4 apparently identical Miele machines. Notes in French, German, and English. The machine itself can be put into LOT of different languages (eventually, as with any interface like this it is never obvious which button to press, witness ~VCRs). The notes of the wall tell me I need 4 euros to wash a load. The icon on the coin box shows 3 coins, but the coin box slot is way too small for either 2 or 1 euro coins.

Ok, I guess we need a token. Now I already know that the lady at reception has no english. But how hard can this be? Ok it uses tokens, but finally we work out that we actually have 2 dryers and 2 washers (they looked identical to me) that must be why the coin slot was different on two of the machines (different price). She kept asking which machine I wanted. Which number. Unhelpfully I was guessing number 1, but it maybe it was supposed to be 0? 

Anyway token in hand I'm done I thought. Make my exit and goodbyes. Oh no, there was more information I needed to give. Some very fast phrase. In the end she finally sounded out "~C-H-A-M-B-R-E". Oh room number. 4-2-5, except I don't know the French numbers yet (well past 3) and she doesn't know the English for 5. Conveniently I've 5 fingers.

Classic. It would have been simple if I knew more French. I can see how Miele want their machines to work in every country in Europe, that's why you can select the language when you start the wash cycle. So it makes sense for Miele to use a token for the coin box since they can use the same coin box in every country. Except, these are new machines, and Euro have been around for a while. So Miele have optimised for the wrong problem. Even if I spoke French I should need to involve Reception to put coins in a slot. Bad user interface.

Now I just have to work out why she needed my room number. In case I break the machine I guess.
!Why?
I had used Autonice on various Osf/Digital Unix/Tru64 Unix boxes over the years, and needed something similar for Linux in a hurry. Hence I tried to port autonice so that I only had one such type of software to document as being in use on the servers.....

!What is Autonice
From the original README file:

This is autonice, a program to automatically lower the priority level of long lived processes for DEC OSF/1 AXP. The latest version of the software used to be obtained from: (this seems dead now...)
ftp://ftp.mrc-bbc.ox.ac.uk/pub/dec_alpha/autonice-x.xx.tar.gz

The principal aim of the program is to give short lived interactive processes more CPU time than long lived batch style jobs. The idea behind this is that those long lived jobs might take a little longer to complete, but if a process is going to run for 24 hours anyway then it does not matter too much if it takes an extra 30 minutes.

The nice level is set according to the following function:
nice = 4 * (int)(log(cputime / 60.0) / log(2.0))

Thus after two minutes of CPU time the process is set to nice 4 and after 32 minutes of CPU time it is set to the minimum priority level of nice 19.

!History
Originally by Ray P. Bellis (MRC Center in Brain and Behaviour, Dept of Experimental Psychology University of Oxford), and latter extended and currently maintained by Massimo Ianigro it has long been a useful way to lower the priority of long lived jobs on Alpha machines under OSF/Dunix/Tru64 Unix.

In 1999 I ported it to Linux since my group has a nice mix of alphas and Linux boxen and I wanted my programmers to see the same behaviour on all of the computers.

!The Linux port
Autonice reads /proc to findout what is going on. So the main thing was to set it up to read a Linux style proc. It was not very hard to do.

At present the code is still hackish awaiting me to find the time to rewrite it. It is about half way towards being able to simple retarget the code that reads /proc and then it should be portable to any /proc based un*x like OS. YMMV.

!Problems
Users who submit multiple jobs. The code treats each job from each user equally. This was fine when all users were treated the same, but when Massimo added support for treating individual users differently, problems cropped up.

for example if user A is set to nice 4 always, and user B to nice 10 always things are fine if they each have equal numbers of jobs. But if User B starts 3 jobs, then each user B job is treated the same and so user B gets much more CPU than user A.

Basically autonice is very simple. BUT these sorts of problems need more care. And were not what Autonice is designed for. If you have a more complex environment, then you really want to look at Pset or something else.

!Download
Usual disclaimers (ie it is all your fault. If you do not look at the source of this daemon, and if you do not understand it, that is your problem. In any case I make no warranties for this code.)

!!!!Wed 6 April 2005
This release fixes a bug reading the config file, and in collecting all of the process and its children's cpu time.

[[autonice-0.75.tar.gz|software/autonice/files/autonice-0.75.tar.gz]]
[[autonice-0.75-1.i386.rpm|software/autonice/files/autonice-0.75-1.i386.rpm]]
[[autonice-0.75-1.src.rpm|software/autonice/files/autonice-0.75-1.src.rpm]]

!Alternatives
* Autonice - confusingly a Perl based program of the same name. This one has no relationship with the Autonice on this page. 
Been a while between updates here. Too many things to see and do. Also trying to do some work (why are vector sums so hard to do correctly in 3D? Sometimes I feel like I have two left hands...).
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};

//--
//-- Crypto functions and associated conversion routines
//--

// Crypto "namespace"
function Crypto() {}

// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
	var be = Array();
	var len = Math.floor(str.length/4);
	var i, j;
	for(i=0, j=0; i<len; i++, j+=4) {
		be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
	}
	while (j<str.length) {
		be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
		j++;
	}
	return be;
};

// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
	var str = "";
	for(var i=0;i<be.length*32;i+=8)
		str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
	return str;
};

// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
	var hex = "0123456789ABCDEF";
	var str = "";
	for(var i=0;i<be.length*4;i++)
		str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
	return str;
};

// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
	return Crypto.be32sToHex(Crypto.sha1Str(str));
};

// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
	return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};

// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
	// Add 32-bit integers, wrapping at 32 bits
	add32 = function(a,b)
	{
		var lsw = (a&0xFFFF)+(b&0xFFFF);
		var msw = (a>>16)+(b>>16)+(lsw>>16);
		return (msw<<16)|(lsw&0xFFFF);
	};
	// Add five 32-bit integers, wrapping at 32 bits
	add32x5 = function(a,b,c,d,e)
	{
		var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
		var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
		return (msw<<16)|(lsw&0xFFFF);
	};
	// Bitwise rotate left a 32-bit integer by 1 bit
	rol32 = function(n)
	{
		return (n>>>31)|(n<<1);
	};

	var len = blen*8;
	// Append padding so length in bits is 448 mod 512
	x[len>>5] |= 0x80 << (24-len%32);
	// Append length
	x[((len+64>>9)<<4)+15] = len;
	var w = Array(80);

	var k1 = 0x5A827999;
	var k2 = 0x6ED9EBA1;
	var k3 = 0x8F1BBCDC;
	var k4 = 0xCA62C1D6;

	var h0 = 0x67452301;
	var h1 = 0xEFCDAB89;
	var h2 = 0x98BADCFE;
	var h3 = 0x10325476;
	var h4 = 0xC3D2E1F0;

	for(var i=0;i<x.length;i+=16) {
		var j,t;
		var a = h0;
		var b = h1;
		var c = h2;
		var d = h3;
		var e = h4;
		for(j = 0;j<16;j++) {
			w[j] = x[i+j];
			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=16;j<20;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=20;j<40;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=40;j<60;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=60;j<80;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}

		h0 = add32(h0,a);
		h1 = add32(h1,b);
		h2 = add32(h2,c);
		h3 = add32(h3,d);
		h4 = add32(h4,e);
	}
	return Array(h0,h1,h2,h3,h4);
};


}
//}}}
[[Oh, is that what it means]]
[[Strasbourg]]
[[Nancy]]
[[Being Slack]]
[[Paris]]
[[Luxembourg]]
[[How to book TGV tickets]]
[[Fun at the supermarché]]
[[Local customs]]
[[It's the little things]]
[[Made it in one piece]]
[[Off to France we go]]
[[I'm going to France to work for 6 weeks]]
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};

//--
//-- Deprecated code
//--

// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
	w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};

// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = function(w)
{
	var lookaheadRegExp = new RegExp(this.lookahead,"mg");
	lookaheadRegExp.lastIndex = w.matchStart;
	var lookaheadMatch = lookaheadRegExp.exec(w.source);
	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
		var text = lookaheadMatch[1];
		if(config.browser.isIE)
			text = text.replace(/\n/g,"\r");
		createTiddlyElement(w.output,"pre",null,null,text);
		w.nextMatch = lookaheadRegExp.lastIndex;
	}
};

// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
	createTiddlyElement(place,"br");
};

// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
	var i = this.indexOf(item);
	return i == -1 ? null : i;
};

// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
	return store.getLoader().internalizeTiddler(store,this,title,divRef);
};

// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
	return store.getSaver().externalizeTiddler(store,this);
};

// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
	return store.allTiddlersAsHtml();
}

// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
	refreshPageTemplate(title);
}

// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
	story.displayTiddlers(srcElement,titles,template,animate);
}

// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
	story.displayTiddler(srcElement,title,template,animate);
}

// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;

// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");

}
//}}}
For some time, I've been using an open source application ([[kludge3d|http://kludge3d.sourceforge.net]]) in my day job. Early on I sent a bunch of patches upstream, mostly because we needed it to work on well on windows and it was Uni*x app. Eventually I changed jobs and while I continued to maintain an internal version of the app, there wasn't the same push to get upstream anymore.

So it was invigorating to check out the app again (looks like no new official versions in the last couple of years), and clean up some of the win32 issues. I guess it is just fun to revisit your old patch...

[img[http://dpinson.com/20080323.jpg]]

Anyhow, if you want to build it, you need a working mingw and msys setup under windows, and a gtk and gtkglext developer set up. Get the patch [[here|http://sourceforge.net/tracker/?group_id=27969&atid=392422]].
[<img[church.png]]This is the start of the long weekend here. Note: that means nothing much is open, so I needed to go shopping, and buy some essentials. Naturally things are really crowded as everyone tries to buy stuff on the way home from work. This would always be a test of my minimal French vocab. Problem 1. They have problems with the till, so credit/debit card only. Problem 2. None of my cards worked. (“Anglais carte” with some disgust was heard). This meant trying to pickup everything and find a working till for a cash transaction. I’m not popular with the other people in the queue. The cashiers were nice and understanding though.

Getting some incidentals in another shop I thought I was doing fine. I thought I got all of the etiquette right, I was getting by with my CD learned shopping phrases. Then I get something unintelligible. She repeats is a couple of different ways, then “No you don’t have one!”. Only then did I realise she was asking about a store loyalty card. 

!a Gtk+ based 3d modeller
Blake E Hegerle (laertes @ stab.gemma.com) gave the world g3d, and then seemed to drop off it. Last time I checked that email address bounces.

The original website is here http://www.stcloudstate.edu/~hebl9901/g3d/.

So, needing a simple 3d editor to bend to my whim, I adopted it have used it to great effect building models for a numerical program I work on.

The upshot of all that is my changes and bug fixes need to get out there. And so here they are. Note: I have bumped the version number to 0.1.0, the original is 0.0.2.

!Download
License: GPL
[[g3d-0.1.0-1.src.rpm|http://www.dpinson.com/software/g3d/files/g3d-0.1.0-1.src.rpm]]
[[g3d-0.1.0-1.i386.rpm|http://www.dpinson.com/software/g3d/files/g3d-0.1.0-1.i386.rpm]]
[[g3d-0.1.0.tar.gz|http://www.dpinson.com/software/g3d/files/g3d-0.1.0.tar.gz]]

!Changes 0.0.2->0.1.0
!!Code
* Fixed some memory leaks.
* Can input point coordinates manually.
* Zoom function.
* Switch to bottom left corner being 0,0.
* Some opengl tweaks (ok lighting is still bad, need to read more).
!!Package
* autoconf/automake reworked.
* included spec for rpms (which will put it in the gnome menus)
* Can build dynamic/static.
* Can build such that binary will run in place.
* reorganised b3d directory structure.
* if installing rpm on a box with GNOME installed, attempt to make a menu entry.

!Screenshot
[img[http://dpinson.com/software/g3d/mainwin.jpg]]
Main window. (showing the "not quite working" gl lighting)
@@color(red):As I guess was becoming obvious, I'm kind of out of steam on this project. Not enough time, and switching to broadband are what really did it in. If you want to take over development, drop me a line. (dp: Jan 3 2005)
@@

!A GNOME Masqdialer client
GMasqDialer is a small GNOME client (that works with plain GTK+ too) for the masqdialer server which you can use to connect to the internet in IP masqueraded/NAT networks without using telnet.
More Gtk2/Gnome2 porting goodness

Now we have a pretty functional app. It mostly does what it should and looks like it should. The user configuration stuff got hammered this version, so let me know if you have trouble there.

Right now the applet portion is still disabled. Basically, send me bug reports and patches.

!Screenshots
The panel applet:
[img[http://www.dpinson.com/software/gmasqdialer/gmasqdialer-panel.png]]

And the main program:
[img[http://www.dpinson.com/software/gmasqdialer/gmasqdialer.png]]

!0.99.13:
[[Download version 0.99.13 sources |software/gmasqdialer/files/gmasqdialer-0.99.13.tar.gz]]
[[Download version 0.99.13-3 srpm|http://www.dpinson.com/software/gmasqdialer/files/gmasqdialer-0.99.13-3.src.rpm]]
[[Download version 0.99.13-3 rpm|http://www.dpinson.com/software/gmasqdialer/files/gmasqdialer-0.99.13-3.i386.rpm]]

Thanks to Buchan Milne, we have a build for Mandrake 9.0
Download gmasqdialer-0.99.13-1mdk.i586.rpm for mandrake (remote link)

!Acknowledgments
Thanks to Timo Sirainen for writing the original GMasqDialer.
[<img[gare_metz.jpg]]When I booked tickets from Australia we had a hard time using the TGV/SNCF website. Since I was going to pickup tickets in France, we selected France as the country to pick them up in. If you do that, you get no language choice after that, French for you. It was quite a trial, including deciphering the confirmation that you need to take with you to pick up your tickets. Is there a better way?

If you want to get TGV tickets, the trick is to say you live in a non French speaking county (be aware Australia is not event listed), then you get a very good English website where you can pick seats etc. then when you go to the ticket machine to pick them up, don’t select “I want to pick up a ticket using my credit card that I used to book online”. Select “you want to pick up a ticket using a reference number” (you got it in the email confirmation). You still stick the credit card in, but this time it just works. Much easier. 
Ok, for the benefit of my extended family, this is probably a bit of a surprise. Obviously a work trip takes time to organise and you are wondering why I didn't tell anyone till now....

Well, this one took a while to get off the ground. A fair bit of back and forth firstly to get approval to make it happen then to get a final date to start. So up until about 3 weeks from leaving, dates were still up in the air (with the strong possibility to just delay by several months).

So with that explained (how ever badly) here is a summary of things so far...
[<img[notqwerty.jpg]]It should be obvious, but it isn't. If future exchange happens, think about how you will handle non-qwerty keyboards. I nearly touch type. I can't tell you how much pain I'm in right now. At least I've managed to get the default locale to not be in French (try working out what compiler error messages are....)

They have no qwerty keyboards in the office, so my choices were learn the French layout, or switch to a qwerty layout. Using a French layout presents some problems, I mostly touch type, so I was reduced to hunt-n-peck typing speeds, also I have my laptop here, so switching between the two was problematic. Of course if you switch, then you _have_ to touch type. Now the key labels don’t match what you type. I guess I’ll be a better touch typist from this adventure. I sympathise with overseas students in our labs so much more now. Of course I might give in and put stickers over the keys…… 
!a 3d polygonal modeller
Before kludge3d came into existance, I had hacked on g3d. But g3d died, and kludge3d carries on from that starting point. So here we are.

Please note: this is win32 native, not via cygwin, and not needing an X server.
[[kludge3d-20021103.zip|software/kludge3d/files/kludge3d-20021103.zip]] 2160 kBytes
[[kludge3d-20021103-src.zip|software/kludge3d/files/kludge3d-20021103-src.zip]] 648 kBytes

!Screenshot
Main window. (oooo, looks just like on unix....)
[img[software/kludge3d/mainwin.jpg]]
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/

//{{{
// Ensure that the LegacyStrikeThrough Plugin is only installed once.
if(!version.extensions.LegacyStrikeThroughPlugin) {
version.extensions.LegacyStrikeThroughPlugin = {installed:true};

config.formatters.push(
{
	name: "legacyStrikeByChar",
	match: "==",
	termRegExp: /(==)/mg,
	element: "strike",
	handler: config.formatterHelpers.createElementAndWikify
});

} //# end of "install only once"
//}}}
[<img[metz_breakwall.JPG]]I’m getting used to some of the French work customs slowly. I had not realised that when you arrive for work you should visit the office of everyone already there shake hands and greet them. I’ve shaken more hands in the last couple of days than in the last year in Australia. I guess the handshake is kinda dying out in Australia, mostly being used for formal occasions now.
[<img[lux_valley.jpg][http://www.dpinson.com/DSC02795.JPG]]On spec I took the TER to Luxembourg. Travelling anywhere by train here seems to be fun. The shear scale of investment in trackwork. Why we thought it was a good idea to unload cars in Port Kembla then truck them up Mt Ousley back to Sydney I don't know. Of course you see endless trains full of German cars heading across the landscape here.

All the industry is clustered along the tracks. So you get a backroom view of a lot of operations. And relics like the abandoned BF site between Thionville and Hagondage. (wish I had my camera out for that one).

Luxembourg itself is pretty interesting after a week in Metz. Lots more languages spoken in the streets. Lots of tourists from everywhere. My favourite were the American bemoaning how expensive everything was. //It was outrageous//. Must be novel for them. 

If you haven't been before, it is an old fortified town straddling a deep river cut valley with shear sides. I'll not try to do a better job summarising what’s there see [[wikipedia|http://en.wikipedia.org/wiki/Luxembourg]]. But the things I enjoyed were the cool of the valley, looking up at the heavily fortified city. I wonder how impressive it must of looked before they dismantled most of the fortifications?

I'll go back with May at some point and do the underground tour of the fortifications. 

[>img[lux_am_hq.jpg][DSC02798.JPG]] I also checked out the ArcelorMittal headquarters. Odd, isn't it. See the tiny logo on the column left of the door (ok, there was a limit to what I could resolve with my camera), but given the choice of building I was surprised by the restraint.




[<img[Gare_de_lEst.JPG]]Lots of hanging around waiting for my train, but TGV is a great way to travel.

It really does leave on time within a second or two of schedule. It stayed slow through Paris, then it really opens it up outside. There is no sensation of speed since you travel through endless fields, everything is a fair way away. Mind you when you pass another TGV at speed going the other way it is quite a physical jolt. While sitting at the one stop we made before Metz, other TGV went past, THAT looked fast.

Sami and I had a miss communication about where to meet. He said “meet a the bank, and just stay there till we find one another”, OK. So looking on the platform for a Bank, no Bank, alright try in the station, nope, what about just outside, nope. OK go and wait at the lobby….That’s where we ran into each other. “Why didn’t you stay at the bank” Um I was looking for a Bank. Bank=platform. Oh. 
''Active''
[[Autonice]]
[[Kludge3d]]

''Unmaintained''
[[GMasqDialer]]
[[Sftp]]
[[G3D]]
!~WikiWords
Forced non-wiki word: {{{~NoWikiWord}}}
Forced wiki word: {{{[[Forced Wiki Word]]}}}

!Headers
{{{!Header1}}}
{{{!Header2}}}
{{{!Header3}}}

!Text Formatting
''Bold'': {{{''Bold''}}}
==Strikethrough==: {{{==Strikethrough==}}}
__Underlined__: {{{__Underlined__}}}
//Italic//: {{{//Italic//}}}
{{{Monospaced}}}: {{{ {{{Monospaced}}} }}}
Super^^script^^: {{{Super^^script^^}}}
Sub~~script~~: {{{Sub~~script~~}}}
@@Hightlight@@: {{{@@Hightlight@@}}}
@@color(red): Red Colored text@@: {{{@@color(red): Red Colored text@@}}}
Horizontal line: {{{----}}} (4 hypens on a line by themselves)
----

<<<
Blockquote:
<<<
{{{
<<<
Quoted text
<<<
}}}


!Links
internal/external: {{{ [[text | WikiWordOrURL]] }}}

Image {{{ [img[alt text | path/to/picture]] }}}
You can also set images to float to the left or the right of the text in your tiddler by using [<img[...] to float left or [>img[...] to float right. 
File {{{ [[text | path/to/file]] }}}

!Tables
You can create a table by enclosing text in sets of vertical bars (||, or shift-backslash on your keyboard). 
|!Headings: add an exclamation point (!) right after the vertical bar.|!Heading2|!Heading3|
|Row 1, Column 1|Row 1, Column 2|Row 1, Column 3|
|>|>|Have one row span multiple columns by using a >|
|Have one column span multiple rows by using a ~|>| Use a space to right-align text in a cell|
|~|>| Enclose text in a cell with spaces to center it |
|>|>|bgcolor(lightgreen):Add color to a cell using bgcolor(yourcolorhere):|
|Add a caption by ending the table with a vertical bar followed by a c|c

{{{
|!Headings: add an exclamation point (!) right after the vertical bar.|!Heading2|!Heading3|
|Row 1, Column 1|Row 1, Column 2|Row 1, Column 3|
|>|>|Have one row span multiple columns by using a >|
|Have one column span multiple rows by using a ~|>| Use a space to right-align text in a cell|
|~|>| Enclose text in a cell with spaces to center it |
|>|>|bgcolor(lightgreen):Add color to a cell using bgcolor(yourcolorhere):|
|Add a caption by ending the table with a vertical bar followed by a c|c
}}}


[<img[nancy_sq.jpg]]The former regional captial. Bigger than Metz, a lot more guilding, older archetecture feel and so on. Went to the school of the arts museum and the art gallery. Both interesting but quirky. (what regional museum isn't).

[>img[peacock.jpg]]Spent a bit of time in the main park. Children's zoo, peacocks roaming wild, stealing food and all that. The macqacs were evil. One managed to catch a sparrow, so we were treated to the sight of it being plucked and torn apart. The scary thing about primates is how easy with anthopomorphise them. So when he first caught the sparrow and it wasn't dead yet, he looks out at the tourists (to make sure we were watching?) before rolling the bird back and forth on the ground like a rolling pin to smouther it.

Watching the heirachy of who gets to eat unmollested was fun. Too easy to see corporate structures at the monkey house.

[<img[fish.jpg]]Thanks to everyone who came to lunch today. I'm off on my French adventure starting tomorrow. New contacts, opportunities and hopefully some good work. Not that I'm going to miss the STI rush season too much!

In any case, with the time differences, real time contact is going to be a little difficult while I'm away. But since we now have sharepoint available remotely, I'm going to try maintaining this blog as I go. (emphasis on try)

bye fish 
[<img[metz_mill_sm.jpg][metz_mill.jpg]]I've been gaining confidence in the whole morning greeting thing. Bonjour, easy enough. When you are working from a script, it all goes well until people start hitting you with the variations.

So this morning as I'm greeting people, I meet the secretary, "bonjour" I say, "something something something" she say in return. I assume its all good and turn to walk out....

Then I get another string of French, this time in a universal tone of voice that tells me I've committed some sort of faux par. Oh no!

Please help me. (ok basic junor high French, but still more than I have...)

Actually I was being asked "Ça va?" (How are you?) But not knowing any better, just ignoring it as a bit of the conversation I didn't understand. How rude!

Oh well, she explained my error. Tomorrow is another day, a day in which I'll have a new canned response ready: Ça va bien!
[<img[sacrecoeur.jpg]]I went back to Paris last weekend to pick May up from the airport. Since I had a few hours to kill before she would arrive it was an excellent chance to go for a long walk around some of the parts I knew from my last visit in 2006: Opera, Montmartre & Scaré Coeur.

After two weeks of excellent weather, of course this weekend had rain periods. So it was overcast for my train trip from Metz, sunny between 9-10am, then it hailed for 10 minutes, then it turned into a warm cloudy afternoon with sunny periods. Sunday was just cold and damp. It is remarkably like Sydney winters.

[>img[obelisk.jpg]]Sunday we went along the canal, ate excellent baguette, eventually ending up at Invalides. There is a large and excellent museum here. Last time we only saw a part of it. This time we went to "the two world wars" or 1870-1945, yes they count differently, just like the Chinese count WW2 from Japanese invasion. I really like this aspect of travelling. Other countries have different perspectives (go to a US Vietnam display sometime) to your own. Having read about how war scholars in other countries complain Australia overstates its contribution (esp WW1) I now have bit more a feel for the French perspective. Having grown up with Australian and British history and movies, its always a surprise to realise a) there was a war in Europe before Australian troops got there, b) that the British forces comprised a single expeditionary force, in conjunction with the 8 French armies already deployed.  

[<img[fountain.jpg]]A big change (for me) was the inclusion of English text information in many of the displays. Its a small thing, but that and the much improved signage and number of street maps makes being a non francophone in Paris that much easier. Remember though, the best way to get around is the metro, BUT you must accept, it doesn't have to make sense! Once you accept that, it is much easier to use. 

Once you accept that, you realise that the NSW govt trying to tell you they have a complex train system to manage is odd. I wonder what they learn on fact-finding missions to other "comparable cities"? Do they use the mass transit systems in them? Having the government compare Sydney to London, Paris, Singapore (and having used all three myself) I think mainly we lack the will to annoy some people to achieve a greater good. Of course I say this as someone hoping to not be annoyed.
Its my shiny thing...

<insertFirstTag Blog reverse>

An sftp-0.9.9 "port" to cygwin on win32

~NOTE-NOTE-NOTE
sftp in this form has reached the end of its useful life. The sftp packaged with openssh is more than adequate. See the full notice at the upstream developer's page.

This page is left here for historical interest only.

Well, not much of a port, cygwin is pretty complete these days. Anyhow, if you just want to use sftp under win32 download sftp-0.9.9-05112001.zip. Read the README.

If you want to setup sftp to allow logins and to ftp INTO your win32 box, then you are going to need the full cygwin setup. Goto sources.redhat.com and try it out. They have links to a nice collection of ports for many (most?) of the interesting opensource unix packages. Makes crossplatform work relatively painless.

Cygwin is now complete enough to not require any patches to the sftp source. 

dpinson.com
/***
|''Name:''|SparklinePlugin|
|''Description:''|Sparklines macro|
***/
//{{{
if(!version.extensions.SparklinePlugin) {
version.extensions.SparklinePlugin = {installed:true};

//--
//-- Sparklines
//--

config.macros.sparkline = {};
config.macros.sparkline.handler = function(place,macroName,params)
{
	var data = [];
	var min = 0;
	var max = 0;
	var v;
	for(var t=0; t<params.length; t++) {
		v = parseInt(params[t]);
		if(v < min)
			min = v;
		if(v > max)
			max = v;
		data.push(v);
	}
	if(data.length < 1)
		return;
	var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160));
	box.title = data.join(",");
	var w = box.offsetWidth;
	var h = box.offsetHeight;
	box.style.paddingRight = (data.length * 2 - w) + "px";
	box.style.position = "relative";
	for(var d=0; d<data.length; d++) {
		var tick = document.createElement("img");
		tick.border = 0;
		tick.className = "sparktick";
		tick.style.position = "absolute";
		tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";
		tick.style.left = d*2 + "px";
		tick.style.width = "2px";
		v = Math.floor(((data[d] - min)/(max-min)) * h);
		tick.style.top = (h-v) + "px";
		tick.style.height = v + "px";
		box.appendChild(tick);
	}
};


}
//}}}
* Euphoria
* Disillusionment
* Search for the guilty 
* Punishment of the innocent
* Praise and glory for the non-participants

(apologies to my work colleagues who have been using this one for years)
[<img[strasbourg_cathedral_sm.jpg][strasbourg_cathedral.jpg]]Off to Strasbourg. Longer trip, 1.5 hours, more interesting countryside and canals. The cathedral here has is undergoing a big clean (there has been a major program all of France it seems). The stone here is not the very pale sand colour of elsewhere, more of a red. The spire is very finely carved and really is impressive. Because the old town still crowds right up close the walls, the height is accentuated. 

Nice things to visit include the astrological clock. Be sure to get there before 11:30 so you can see it go through the full cycle of figure movement (it only does it once a day). The clock is a full analogue computer capable of correctly computing the date for Easter including all of the calendar "issues" (leap years and the like).

[>img[strasbourg_stone_sm.jpg][strasbourg_stone.jpg]]You really have to climb the spire. For me the most interesting things were "graffiti". Visiting army officers and clerics back to the 1500's having added sections. Clearly there was a "buy a stone" type deal at some point judging by the complexity and quality of some of the work.

The archaeological museum is worth a visit. We chose it over the fine arts (not enough time). Because the area is rich in grave history (going back before the iron age) they have a large collection of grave goods and a good discussion of the changing role of death in society. Surprisingly this was told from a very secular point of view which is not that common here.

[<img[strasbourg_sq_sm.jpg][strasbourg_sq.jpg]]Had dinner in a local cafe, tried some local deals, Alsace Hamburger and Tarte Flambe (which is a kind of very thin pizza). Well enjoyed. The down side? We missed our train. The really down side, next train was 5:58, ...AM, and that would not get to Metz till 7:40, which is after the Arcelor bus leaves. So after some hastily found accommodation (French local hotel, you have to try them, rooms smaller than you thought possible...it was pretty good actually, just don't compare on price) we had a good nights sleep and made it back.
 #contentWrapper{
margin: 0 3.4em;
width: 800px;
border-width:thin; 
border-style:solid;
padding-left: 1em;
padding-right: 1em;
padding-top: 1em;

margin: 0 auto;

font-family: Lucida Grande, Tahoma, Arial, Helvetica, sans-serif; 
/* Lucida Grande for the Macs, Tahoma for the PCs */

font-size: 11px;
			line-height: 1.6em;
			color: #666;
}

.header {
 background: #fff; 
			padding-top: 10px;
			clear: both;

border-bottom: 4px solid #948979;
}

.headerShadow {	padding: 4.4em 0em 0.25em 0em; } 


/*
.siteTitle {
			font-family: 'Trebuchet MS' sans-serif;
			font-weight: bold;
			font-size: 32px;
			color: #CC6633;
			margin-bottom: 30px; 
			background-color: #FFF;
}

.siteTitle a{color:#CC6633; border-bottom:1px dotted #cc6633;} 

*/

/*
.siteSubtitle {
	font-size: 1.0em;
        display: block;
        margin: .5em 3em; color: #999999;
}
*/

#mainMenu {
position:relative;
float:left;
margin-bottom:1em;
display:inline;
text-align:left;
padding: 2em 0.5em 0.5em 0em;
width:13em;
font-size:1em;
}

#sidebar{
position:relative;
float:right;
margin-bottom:1em;
padding-top:2em;
display:inline;

}

#displayArea {
	margin: 0em 17em 0em 15em;
        text-align:justify;
}

.tagClear {clear:none;}

#contentFooter {background:#575352; color:#BFB6B3; clear: both; padding: 0.5em 1em;}

		
		#contentFooter a {
			color: #BFB6B3;
			border-bottom: 1px dotted #BFB6B3;
		}
		
		#contentFooter a:hover {
			color: #FFFFFF;
			background-color:#575352;
		}

		a,#sidebarOptions .sliderPanel a{
			color:#CC6714;
			text-decoration: none;
		}

		a:hover,#sidebarOptions .sliderPanel a:hover {
			color:#CC6714;
			background-color: #F5F5F5; 
		}

.viewer .button, .editorFooter .button{
	color: #666;
	border: 1px solid #CC6714;
}

.viewer .button:hover, 
.editorFooter .button:hover{
	color: #fff;
	background: #CC6714;
	border-color: #CC6714;
}

.viewer .button:active, .viewer .highlight,.editorFooter .button:active, .editorFooter .highlight{color:#fff; background:#575352;border-color:#575352;}


		#mainMenu a {
			display: block;
			padding: 5px;
			border-bottom: 1px solid #CCC;
		}

		#mainMenu a:link, #navlist a:visited {
			color:#CC6714;
			text-decoration: none;
		}
		
		#mainMenu a:hover {
			background: #000000 url(arrow.gif) 96% 50% no-repeat;
			background-color: #F5F5F5;
			color:#CC6714;
		}
		
		#mainMenu a:hover, #mainMenu a:active, #mainMenu .highlight, #mainMenu .marked {
			background: #000000 url(arrow.gif) 96% 50% no-repeat;
			background-color: #F5F5F5;
			color:#CC6714;
		}

#mainMenu span {position:relative;}

#mainMenu br {display:none;}

#sidebarOptions a {
			color:#999;
			text-decoration: none;
		}

#sidebarOptions	a:hover {
			color:#4F4B45;
			background-color: #F5F5F5;border:1px solid #fff;
		}

#sidebarOptions {line-height:1.4em;}

		.tiddler {
			padding-bottom: 40px;
			border-bottom: 1px solid #DDDDDD; 
		}
.title {color:#CC6633;}
.subtitle, .subtitle a { color: #999999; font-size: 1.0em;margin:0.2em;}
.shadow .title{color:#948979;}

.selected .toolbar a {color:#999999;}
.selected .toolbar a:hover {color:#4F4B45; background:transparent;border:1px solid #fff;}

.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active{color:#4F4B45; background:transparent;border:1px solid #fff;}

 .listLink,#sidebarTabs .tabContents {line-height:1.5em;}
 .listTitle {color:#888;}

#sidebarTabs .tabContents {background:#fff;}
#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button{color:#999;}
#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover{color:#4F4B45;background:#fff}

#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active{color:#4F4B45;background:#fff}

.tabSelected{color:#fff; background:#948979;}

.tabUnselected {
 background: #ccc;
}

 .tabSelected, .tabSelected:hover {
 color: #fff;
 background: #948979;
 border: solid 1px #948979;
padding-bottom:1px;
}

 .tabUnselected {
 color: #999;
 background: #eee;
 border: solid 1px #ccc;
padding-bottom:1px;
}

#sidebarTabs .tabUnselected { border-bottom: none;padding-bottom:3px;}
#sidebarTabs .tabSelected{padding-bottom:3px;}


#sidebarTabs .tabUnselected:hover { border-bottom: none;padding-bottom:3px;color:#4F4B45}

#sidebarOptions .sliderPanel {
	background: #fff; border:none;
	font-size: .9em;
}
#sidebarOptions .sliderPanel a {font-weight:normal;}
#sidebarOptions .sliderPanel input {border:1px solid #999;}

.viewer blockquote {
	border-left: 3px solid #948979;
}

.viewer table {
	border: 2px solid [[ColorPalette::TertiaryDark]];
}

.viewer th, thead td {
	background: #948979;
	border: 1px solid #948979;
	color: #fff;
}
.viewer pre {
	border: 1px solid #948979;
	background: #f5f5f5;
}

.viewer code {
	color: #2F2A29;
}

.viewer hr {
	border-top: dashed 1px #948979;
}

.editor input {
	border: 1px solid #948979;
}

.editor textarea {
	border: 1px solid #948979;
}

.popup {
	background: #948979;
	border: 1px solid #948979;
}

.popup li.disabled {
	color: #000;
}

.popup li a, .popup li a:visited {
	color: #eee;
	border: none;
}

.popup li a:hover {
	background: #575352;
	color: #fff;
	border: none;
}

.tagging, .tagged {
	border: 1px solid #eee;
	background-color: #F7F7F7;
}

.selected .tagging, .selected .tagged {
	background-color: #eee;
	border: 1px solid #BFBAB3;
}

 .tagging .listTitle, .tagged .listTitle {
	color: #bbb;
}

.selected .tagging .listTitle, .selected .tagged .listTitle {
	color: #666; 
}

.tagging .button, .tagged .button {
		color:#aaa;
}
.selected .tagging .button, .selected .tagged .button {
		color:#4F4B45;
}

.highlight, .marked {background:transparent; color:#111; border:none; text-decoration:underline;}

.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {
		border: none; background:transparent; text-decoration:underline; color:#000;
}

h1,h2,h3,h4,h5 { color: #666; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif; }
h1 {font-size:18px;}
h2 {font-size:16px;}
h3 {font-size: 14px;}

#messageArea {
	border: 4px solid #948979;
	background: #f5f5f5;
	color: #999;
        font-size:90%;
}

#messageArea a:hover { background:#f5f5f5;}

#messageArea .button{
	color: #666;
	border: 1px solid #CC6714;
}

#messageArea .button:hover {
	color: #fff;
	background: #948979;
	border-color: #948979;
}


* html .viewer pre {
	margin-left: 0em;
}

* html .editor textarea, * html .editor input {
	width: 98%;
}

.searchBar {float:right;font-size: 1.0em;}
.searchBar .button {color:#999;display:block;}
.searchBar .button:hover {border:1px solid #fff;color:#4F4B45;}
.searchBar input {			
                        background-color: #FFF;
			color: #999999;
			border: 1px solid #CCC;		margin-right:3px;
}

#sidebarOptions .button:active, #sidebarOptions .highlight {background:#F5F5F5;}

*html #contentFooter { padding:0.25em 1em 0.5em 1em;}

#noticeBoard {font-size: 0.9em; color:#999; position:relative;display:block;background:#fff; clear: both; margin-right:0.5em; margin-top:60px; padding:5px; border-bottom: 1px dotted #CCC; border-top: 1px dotted #CCC;}
#mainMenu #noticeBoard a,#mainMenu #noticeBoard .tiddlyLink {display:inline;border:none;padding:5px 2px;color:#DF9153 }
#noticeBoard a:hover {border:none;}	

#noticeBoard br {display:inline;}

#mainMenu #noticeBoard  .button{
	color: #666;
	border: 1px solid #DF9153;padding:2px;
}

#mainMenu #noticeBoard  .button:hover{
	color: #fff;
	background: #DF9153;
	border-color: #DF9153;
}

.searchbar {position:relative; width:11em;}
.searchbar .button{margin:0; width:11em;}
#header {display:inline-block;}