<!--{{{-->
<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>>
As you probably don't know, I'm trying this blog thing for one year to see whether anyone gains anything decent from it, mainly me. Well I guess at least now you know why I'm writing. Anyway. So far I've not felt completely comfortable with the idea and found myself squabbling in my head over subjects to write about; 'should it be comical' I thought, 'should it be focussed on technical' was another or 'perhaps I should just give up' was in there too. After much soul searching, web-hunting and chatting I've come to a conclusion. That is, I personally, have come to a conclusion. Now I'm not going to rant about the million and one points of being a good blogger, that's what [[this|http://tinyurl.com/2ffz64]] is all about. No, instead you'll just see a few changes around here.

I am going to try and write one post a day though... and include pictures... somehow...
<<options>>
So, I wrote this post once on IE at work and, well, I'm never going to post from work again, else this little bit wouldn't be here. So it begins. In light of [[Jon Lister|http://www.jaybyjayfresh.com]] posting his Christmas 2008 desires over [[here|http://jaybyjayfresh.com/2008/01/08/what-i-want-for-xmas-2008/]] I thought I'd follow suit... I dunno, seemed like a good idea at the time. Here goes, oh and don't worry, Im not as complex as Jay:
*Firstly I'd like to see an on-demand television service that works. I value my time and often miss things because I refuse to have my habits dictated by a snotty BBC scheduling executive. The recent [[AppleTV|http://store.apple.com/Apple/WebObjects/ukstore/?family=AppleTV&cid=OAS-EMEA-KWG-UK_TV-UK&aosid=p202&esvt=GOUKE100819837&esvadt=999999-0-1014022-1&esvid=100619]] upgrade in the US has interested me. If only they could arrange a rental contract for the rest of the world.
* Secondly, and in full awareness that I'm following [[Jon Lister|http://www.jaybyjayfresh.com]] very closely on this, is that I'd like to see decentralised social networking come unstuck. However I think Jay missed a bit here. The way I see it, in order to have a successful, open social networking platform you need three things;  an open identity management system, standardisation of the interfaces between open social platforms and (potentially) computer friendly semantics. Now I realise that, in order to keep a social network alive you need to include your users, but this is a Christmas list, and who ever got what they really wanted when they were ten? I sure as well didn't get 'Blossom' to stay at a sleep over now, did I?
* Finally, and most importantly, I'd like to see WiFi take off. I'm sick of all this Mickey Mouse WiFi hotspot madness. I think I must hop in and out of about ten networks on my way to work. I hear [[WiMax|http://www.wimaxforum.org/home/]] making big noises over in there garden but, there are a few physical barriers to be overcome, for instance concrete. I could be very boring on this subject for a very long time so I'll leave it at that. All I'll say for now is this; Analog television spectrum up for auction next month... interesting?
So that's it really, three things, can't be hard can it? It's not like I'm asking for a solution to the P=NP? problem am I?
Oh here we go then. Yes I use a Mac. Yes I love it. No I try not to blab on about it too much. In here you'll find all the things I think other people should know about Apple and the Mac. If you're not interested, or you can't see past your Windows platform, the door's over there. For the rest of you; the kettle's on, mines a coffee, no sugar or milk.
/***
| Name:|AutoCorrectPlugin|
| Created by:|SimonBaird|
| Location:|http://simonbaird.com/mptw/#AutoCorrectPlugin|
| Version:|1.0.0 (06-Apr-2006)|
| Requires:|~TW2.x|
!Description
Auto-corrects a list of mistyped or misspelled words. The list of words can be in any tiddler tagged with autoCorrectWords
!History
* 06-Apr-06, version 1.0.0
** split off from InstantTimestamp
** read translations from a tiddler instead of javascript array
!Notes
* See also InstantTimestamp, BigListForAutoCorrect, MyAutoCorrectWords
!Code
***/
//{{{

version.extensions.AutoCorrectPlugin = { major: 1, minor: 0, revision: 0, date: new Date(2006,4,6),
	source: "http://simonbaird.com/mptw/#AutoCorrectPlugin"
};

config.AutoCorrectPlugin = {
	wordListTag: "autoCorrectWords",
	excludeTags: [
		"noAutoCorrect",
		"CSS",
		"css",
		"systemConfig",
		"zsystemConfig",
		"Plugins",
		"Plugin",
		"plugins",
		"plugin",
		"javascript",
		"code"
	],
	excludeTiddlers: [
		"StyleSheet",
		"StyleSheetLayout",
		"StyleSheetColors",
		"StyleSheetPrint"
	]
}; 

if (!Array.prototype.contains)
	Array.prototype.contains = function(item) {
		return (this.find(item) != null);
	};

if (!Array.prototype.containsAny)
	Array.prototype.containsAny = function(items) {
		for (var i=0;i<items.length;i++)
			if (this.contains(items[i]))
				return true;
		return false;
	};

String.prototype.upperCaseFirst = function() {
	return this.substr(0,1).toUpperCase() + this.substr(1);
}

TiddlyWiki.prototype.saveTiddler_mptw_autocorrect = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags) {

	tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
	var conf = config.AutoCorrectPlugin;

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

		var wordListTiddlers = store.getTaggedTiddlers(conf.wordListTag);
		for (var i=0;i<wordListTiddlers.length;i++) {
			var lines = wordListTiddlers[i].text.split(/$/m);
			for (var j=0;j<lines.length;j++) {
				if (lines[j].indexOf("->") > 0) {
					var replacer = lines[j].trim().split("->");
					newBody = newBody.replace(new RegExp(
						"\\b"+replacer[0]+"\\b","g"),replacer[1]);
					newBody = newBody.replace(new RegExp(
						"\\b"+replacer[0].upperCaseFirst()+"\\b","g"),replacer[1].upperCaseFirst());
				}
			}
		}
	}

	return this.saveTiddler_mptw_autocorrect(title,newTitle,newBody,modifier,modified,tags);
}

//}}}
Now I'm a man that is concerned, on a daily basis, about his privacy, or lack thereof. So forgive me if I'm not as forthcoming as you may wish... Here we go:

* My name is Ben and I'm from the UK. 
* I work for a large, international, communications company.
* I currently work in ICT & research, particularly computer network automation, voice over internet protocol (VoIP) and network security.
* I'm interested in photography, extreme sports, technology and mathematics.

Feel free to drop me a line on [[twitter|http://twitter.com]]... Icon's up there dear. No, no, there, yes, on the left.
/***
|''Name:''|BenJamTheme|
|''Author:''|Ben Nickolls|
|''~CodeRepository:''|http://svn.TiddlyWiki.org/Trunk/association/themes/BleachTheme.tiddler |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.4.1|
|''~PageTemplate:''|##PageTemplate|
|''~tabs:''|##tabs|
|''~OptionsPanel:''|##OptionsPanel|
|''~StyleSheet:''|##StyleSheet|
|''~taskViewTemplate:''|##taskViewTemplate|
|''~taskEditTemplate:''|##taskEditTemplate|
|''~EditTemplate:''|##EditTemplate|
|''~ViewTemplate:''|##ViewTemplate|
|''~wizardViewTemplate:''|##wizardViewTemplate|
***/


!PageTemplate
<!--{{{-->
<div class='backgroundHeader'></div>
<meta name = "viewport" content = "width = 600">
<div class='header' macro='gradient vert [[ColorPalette::background]] [[ColorPalette::background]]'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span></span><div id='mainMenu' refresh='content' tiddler='MainMenu'></div>

</div>
<div id='bodywrapper'>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay' width=100%></div>
</div>
<div id='contentFooter'  macro='gradient vert [[ColorPalette::ls_mid]] [[ColorPalette::ls_background]]'></div>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<!--- http://MonkeyPirateTiddlyWiki.TiddlySpot.com/#MptwEditTemplate ($Rev: 1829 $) --->
<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 macro="showWhenExists EditPanelTemplate">[[EditPanelTemplate]]</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>
<!--}}}-->

!ViewTemplate
<!--{{{-->
<!--- http://MonkeyPirateTiddlyWiki.TiddlySpot.com/#MptwViewTemplate ($Rev: 2247 $) --->

<div class='toolbar'>
	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	</span>
	<span macro="showWhenTagged palette">
		<span macro="setPalette"></span>
	</span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +permalink > editTiddler deleteTiddler fields syncing references jump'></span> <span macro='newHere label:"new here"'></span>
</div>

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

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

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

<div macro="showWhenExists ViewPanelTemplate">[[ViewPanelTemplate]]</div>

<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer' macro='view text wikified'></div>
</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="showWhenExists ViewDashboardTemplate">[[ViewDashboardTemplate]]</div>
<div class="tagglyTagging" macro="tagglyTagging"></div>
<!--}}}-->

!wizardViewTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!OptionsPanel
[[help|Help]] <br />[[settings|AdvancedOptions]]<br />

!tabs
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>

!SideBarOptions
<<search "search...">><<closeAll>><<newTiddler label:"new task" text:"New Task" title:"New Task" tag:"task">><<newTiddler>><<slider chkSliderOptionsPanel lifestreamTheme##OptionsPanel 'options »' 'change TiddlyWiki Options'>><<saveChanges>><<slider 'chkLoginStatus' 'LoginStatus' '  status »' 'Login to make changes'>><<slider chkSliderTabs lifestreamTheme##tabs 'contents »' 'View TiddlyWiki Tabs'>>

!StyleSheet
/***
General
***/
/*{{{*/
.tiddler .button:hover {
	background-color:[[ColorPalette::ls_mid]];
}
.tiddler .button {
//	border:1px solid black;
	line-height:4;
	margin:5px;
	padding:8px;
}

body .chkOptionInput {
	width:auto;
	float:right;
}

#contentWrapper .wizard .txtOptionInput {
	width:7em;
}

body{
	color:[[ColorPalette::ls_foreground]];
	background-color:[[ColorPalette::ls_background]];
}

#backstageCloak {
	opacity:0.9; filter:'alpha(opacity:90)';
	background:[[ColorPalette::ls_mid]];
}

#messageArea {
	border:0px;
	color:white;
	background-color:[[ColorPalette::ls_mid]];
}

#messageArea .button{
	background:none;
}

#mainMenu br {
	display:none;
}

h1 {
	color:white;
}

#contentWrapper{
	position:relative;
	margin: 2.5em auto;
	width:600px;
	line-height: 1.6em;
	border:1px solid [[ColorPalette::ls_background]];
	font-size: 11px;
	font-family: Lucida Grande, Tahoma, Arial, Helvetica, sans-serif;
	height:1%;
	background-color:[[ColorPalette::ls_mid]];
}

.clearAll{
	clear:both;
}

.tagClear{
	clear:none;
}
/*}}}*/

/*{{{*/

.siteTitle {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight: bold;
	position:relative;
	top:20px;
	left :20px;
	font-size: 32px;
	color:#eee;
}

.siteSubtitle {
	padding-top:15px;
	font-size: 1.0em;
	display:block; 
	color: #999; margin-top:0.5em !important; margin-top:1em; margin-left:3em;
}

#displayArea {
	width:96%;
	margin-left:1.35em;
	margin-right:16.3em;
	margin-top:0;
	padding-top:1em;
	padding-bottom:10px;
}

.tabUnselected {
	background:[[ColorPalette::ls_light]] none repeat scroll 0%;
	color:#111;
	padding-bottom:0px;	
}

#sidebar {
	position:inherit;
	float:right;
	display:inline;
}

#tiddlerDisplay .tagging, #tiddlerDisplay .tagged {
	background-color:[[ColorPalette::ls_mid]];
	border:none;
	float:none;
}

.sliderPanel .tabsetWrapper .tabContents {
	border-right:none;
	border-color:#999;
	background-color:[[ColorPalette::ls_background]];
}

#sidebarOptions .sliderPanel a{
	padding:3px;
	margin:0px;
	border:2px;
	background-color:[[ColorPalette::ls_background]];
}

.tabsetWrapper {
	position :relative;
}

#sidebar {
	padding-left:0.5em;
	background-color:[[ColorPalette::ls_mid]];
	padding-top:1em;
}

#sidebarOptions a {
	margin:17px;
	display:block;
	margin:0.5em 0em;
	padding:0.3em 0.6em;
}

.popup li a {
	padding:12px;
}
.toolbar {
	z-index:2;
	padding-right:34px;
}
#tiddlerDisplay .toolbar a.button, #sidebarOptions a, .toolbar .popup li a, #mainMenu a, #sidebarOptions .sliderPanel input {
	background-color:[[ColorPalette::ls_background]];
	color:#999;
	border:1px solid [[ColorPalette::ls_background]];
}

.wizard  .txtOptionInput {
	text-align:right;
}

a:hover {
	background-color:[[ColorPalette::ls_mid]];
	color:#eee
}

#tiddlerDisplay .toolbar a.button:hover, #sidebarOptions a:hover, #mainMenu a:hover, #sidebarOptions .sliderPanel input:hover {
	border:1px solid #000;
	background-color:[[ColorPalette::ls_background]];
	color:white;
}

#mainMenu a {
	padding:8px 15px 8px 15px;
	margin:10px;
	line-height:40px;
	border:1px solid [[ColorPalette::ls_background]];
}

#contentWrapper #mainMenu { 
	position:static;
	width:100%;
	float:left;
	text-align:left;
	padding-top:20px;


}





.editor textarea, .editor input,  input, body select {
	border:1px solid [[ColorPalette::ls_mid]];
	background-color:[[ColorPalette::SecondaryDark]];
	color:#999;
	padding:3px;
	margin:3px;
}

textarea {
	height:20em;
}

#sidebarOptions input {
	border:1px solid #999;
	background-color:#00000;
	width:10em;
}

#sidebarTabs {
	margin:0px;
	padding:0px
}

#sidebarTabs .tabContents {
	color:#eee;
	background:[[ColorPalette::ls_background]];
}
.tagged li
{
	display: inline;
}
#sideBarOptions .searchButton {
	display:none;
}

#sidebar .sliderPanel {
	border-color:-moz-use-text-color [[ColorPalette::ls_mid]] -moz-use-text-color -moz-use-text-color;
	border-style:none solid none none;
	border-width:0 1px 0 0;
	margin-bottom:0.8em;
	margin-left:5px;
	padding:0;
	margin-left:0px;
}

#sidebarOptions .searchButton {
	display:none;
}

.title {
	color:#C0C0C0;
}

.subtitle, .subtitle a {
	color: #999;
	font-size: 1em;margin:0.2em;
	font-variant: small-caps;
}

.wizard .button:hover{
	background-color:[[ColorPalette::SecondaryDark]];
	border:1px solid #444;
	color:white;
}
.selected .toolbar a {
	color:#999;
}

.selected .toolbar a:hover {
	color:[[ColorPalette::ls_mid]];
	background:transparent;
	border:1px solid #fff;
}

.viewer pre {
	background:[[ColorPalette::ls_background]]111 none repeat scroll 0 0;
	border:1px solid #FFEE88;
}

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

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

a,#sidebarOptions .sliderPanel a, #topMenu a, #topMenu .button {
	color:[[ColorPalette::ls_high]];
	background-color:transparent;
}

#sidebarOptions .sliderPanel a:hover, #topMenu a, #topMenu .button:hover {
	background-color:transparent;
	border:0px;
}

#topMenu a, #topMenu .button, .wizard .button {
	padding: 5px 15px;
	margin:9px;
	border:1px solid #999;
	font-weight:bold;
	line-height:40px;
	top:1em;
	color:#eee;
	background-color:[[ColorPalette::ls_mid]];
}

#topMenu br {
	display:none;
}

#topMenu a:hover, #topMenu .button:hover {
	background-color:[[ColorPalette::ls_mid]];
}

.tagging, .tagged {
	border: 1px solid #eee;
}

.highlight, .marked {
	background:transparent;
	color:[[ColorPalette::ls_background]];
	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:[[ColorPalette::ls_mid]];
}

.tiddler {
	padding-bottom: 5px;
}

.viewer th, thead td {
	background: [[ColorPalette::ls_mid]];
	border:none;
	color: #fff;
}

.viewer table {
	border:1px dotted [[ColorPalette::ls_mid]];
}

table.twtable {
	border-collapse:separate;
}

.viewer pre {
	border: 1px solid #999;
}

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

.tabSelected {
	background:[[ColorPalette::ls_background]] none repeat scroll 0%;
	border:1px solid [[ColorPalette::ls_background]];
	border-bottom:1px solid black;
	color:#999;
}

.tabContents {
	background:#f7f7f7;
	border:0px;
}

.viewer code {
	background:#[[ColorPalette::ls_mid]] none repeat scroll 0%;
color:#999;
}

h1,h2,h3,h4,h5 {
	color: #555; border-color:[[ColorPalette::SecondaryDark]]; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif;
}

h1 {
	font-size:18px;
}

h2 {
	font-size:16px;
}

h3 {
	font-size: 14px;
}

#contentFooter {
	background:#999;
	clear: both;
	padding: 0.5em 1em;
}

.wizard input {
	border:1px solid [[ColorPalette::SecondaryDark]];
}
#sidebarOptions input {
	border: 1px solid [[ColorPalette::ls_mid]];
}

.button {
	border:1px solid #999;
	padding:3px 9px;
	margin:3px 9px;
	background:[[ColorPalette::ls_background]];
}

.annotation {
	background-color:white;
	border:1px solid white;
	color:white;
}

.wizardFooter .button{
	background:[[ColorPalette::ls_mid]];
	margin:3px;
	padding:0.5em;
	padding-left:1.5em;
	padding-right:1.5em;
	color:white;
	border:1px solid [[ColorPalette::SecondaryDark]];
}
table, .viewer td, .viewer tr, .twtable td, .twtable tr {
	border:0px solid #666666;
}

.tagging .listTitle, .tagged .listTitle, .txtMainTab .tabContents li {
	color:white;
}

body .wizardFooter {
	padding : 0em 0px 0px 5px;
	background:none;
	font-weight:bold;}

.wizardStep {
	border:none;
	background-color:none;
}

body .wizard {
	width:80%;
	padding:10px;
	border:1px solid #EBE6F5;
}

.wizard  th{
	background:[[ColorPalette::ls_mid]];
	color:#888;
	padding:3px;
	margin:40px;
};

.wizard, listView twtable {
	border:0px;
};

.wizard {
	padding : 4px 14px 4px 14px;
	font-weight:bold;
	color:#292929;
	border:solid 0px #292929;
	margin-top:1px;
}

.viewer .wizard, body .wizard{
	background:[[ColorPalette::ls_background]];
	margin:2em;
	border:0px;
	border:1px solid [[ColorPalette::SecondaryDark]];
	color:#777;
}

.wizard h1{
	color:#999;
}

.wizard h2{
	padding:4px;
	color:white;
}

body .wizardStep{
	color:#999;
	border:0px;
	margin:0m;
	background:none;
}

body select {
	border:0px;
	padding:3px;
	margin:4px;
}

#backstagePanel {
	border:0px;
	background:none;
	width:60%;
	position:fixed
	padding:0px;
	margin:0px;
	margin-top:-36px;
}

#sidebar .sliderPanel {
	background-color:[[ColorPalette::ls_mid]];
	font-size:1em;
}

.viewer .wizardStep table {
	border:0px;
}

.viewer th, .viewer td, .viewer tr, .viewer caption, .twtable th, .twtable td, .twtable tr, .twtable caption {
	border:0px;
	padding:0px;
	margin:0px;
}

.viewer .sortable td  {
	padding:12px;
	margin:21px;
}

.title {
	color:#C0C0C0;
	padding:10px;
}

.viewer table, table.twtable {
	border-collapse:seperated;
	border:0px;
}

.viewer th, .viewer thead td, .twtable th, .twtable thead td {
	border:0px;
	color:white;
}

.twtable th{
	background-color:[[ColorPalette::SecondaryDark]];
	padding:15px;
	margin:15px;
}

table.sortable td.sortedCol {
	background-color:[[ColorPalette::SecondaryDark]];
}

#backstageArea a:hover, #backstageArea a.backstageSelTab {
	background-color:[[ColorPalette::ls_background]];
	color:white;
}
.backstageArea {
	display:none;
}

#contentWrapper .backgroundHeader {
	
	height:140px;
	position:absolute;
	width:100px;
	float:right;
	z-index:9000;
	background-repeat:no-repeat;
	left :440px;
	background-position: top right;
	background-color:transparent;
	
}

.header {
padding-left:31px;
}

div.tiddler .tab {
 border:1px solid #444;
padding-bottom:1px;
border-bottom:0px;
}

a.tabUnselected:hover, a.tabSelected:hover {
background-color:transparent;
}

.tiddler .button, .tiddler .button:hover {background-repeat:no-repeat;  margin:1px;background-color:[[ColorPalette::SecondaryDark]];line-height:1.5; }
.stream {  padding:2px; margin:1px ; width750px;  min-height:53px;}
.slider { margin-left:20px; margin-top:-2px; padding:2px 10px 10px 30px; width:435px;border:0px solid [[ColorPalette::ls_background]]; padding-left:30px;border-top:0px; color:white; background-color:[[ColorPalette::ls_mid]]; }
.textSpace {padding-left:40px; line-height:1.5; padding-top:13px}
.tiddler .button:hover,.tiddler .button	 { background-color:[[ColorPalette::ls_background]]; color:white;background-repeat:no-repeat; border:0px solid  [[ColorPalette::ls_mid]];}


/*}}}*/

[[StyleSheet]]

</pre>
</div>
	
So, I'm going to give this blog thing a go in 2008. Enjoy.
<html><a href="http://benjam.TiddlySpot.com/#Blog"><img src="http://www.ambientbuzzsaw.co.uk/benjam/Blogspot.gif" alt="B"></a></html>
/***
| Name|CloseOnCancelPlugin|
| Description|Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://mptw.tiddlyspot.com/#CloseOnCancelPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
merge(config.commands.cancelTiddler,{

	handler_orig_closeUnsaved: config.commands.cancelTiddler.handler,

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

});

//}}}
Background: #fff
Foreground: #000

PrimaryPale: #fff
PrimaryLight: #ff8f1f
PrimaryMid: #ff491f
PrimaryDark: #000

SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #000

TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666

Error: #f88
//{{{
config.options.chkHttpReadOnly = false; // means web visitors can experiment with your site by clicking edit
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 
//}}}
[[Recent Activity]]
[[Blog]]
<!--{{{-->
<!--- http://MonkeyPirateTiddlyWiki.TiddlySpot.com/#MptwEditTemplate ($Rev: 1829 $) --->
<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 macro="showWhenExists EditPanelTemplate">[[EditPanelTemplate]]</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>
<!--}}}-->
/***
| Name:|ExtentTagButtonPlugin|
| Description:|Adds a New tiddler button in the tag drop down|
| Version:|3.2 ($Rev: 2406 $)|
| Date:|$Date: 2007-08-08 22:50:23 +1000 (Wed, 08 Aug 2007) $|
| 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");
	// 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;
}

//}}}
Facebook is the social networking facility that has become ubiquitous throughout wester culture. Many thanks to Mark Zuckerberg (or whatever his name is) for giving us yet another monolithic system on which many people's lives now rely.
So here goes my first little hint, I tried to post this on [[OSXHints|http//www.osxhints.com]] but, for the life of me, I just can't find out how to. Anyway. If you find yourself religiously checking your facebook in order to see if anyone has posted on your wall then you have one option:

a) Sign up for email when you get a post on your wall.

Which is irritating at best. In order to alleviate this problem, which when combined with the usual amount of email that we all get is ridiculous, I've found a neat little trick using the new 3.0 'web-clip' function of Safari on OS X Leopard, giving us another option:

b) Create a web-clip of your wall from [[iphone.facebook|http://iphone.facebook.com]] and ensure that the cookie which keeps your login is kept somewhere safe.

So that's that, dashboard facebook updates as quick and easy as you like. Equally you could do this with your home screen but I would advise you to use the iPhone version of Facebook as you'll have to log back in with the regular version, thus defying the point of a quick update. 

As an aside you amy want to put your computer's screen saver on password lock to mitigate some of the security problems...
<html><a href="http://flickr.com/photos/iambenjam"><img src="http://www.ambientbuzzsaw.co.uk/benjam/Flickr.gif" alt="Flickr"></a></html>
Firstly, credit where credit is due: [[Mike Arthur|http://mikearthur.co.uk/]] you the man. 

It appears that anyone on [[BT Total Broadband|http://www.productsandservices.bt.com:80/consumerProducts/displayCategory.do?categoryId=CON-TOTAL-BB-R1&s_cid=con_FURL_broadband]] can bag themselves a free [[Flickr|http://www.flickr.com]] Pro account, which would usually set you back $25 per annum. All you need is your '@btinternet.com' address and password. Sign into [[Flickr|http://www.flickr.com]] using it and you'll be prompted to either create a new account or merge with an existing one. Of course there is a small setback... If you cancel your [[BT Total Broadband|http://www.productsandservices.bt.com:80/consumerProducts/displayCategory.do?categoryId=CON-TOTAL-BB-R1&s_cid=con_FURL_broadband]] you'll have to start paying for it again. But who would ever want to change their ISP these days anyway?

//Note: I had a bit of a problem merging but if you start a new account then change the address over from your old, non-pro account it'll have the same effect.//
A group identifier.
I've been doing a bit of catching up on the blog-reading front of late and I came upon a post by my good friend [[Jon Robson|http://www.jonrobson.me.uk]] who has recently picked up [[Osmosoftian|http://www.osmosoft.com]] fame. He has written recently about the state of beer in this country which you an read [[here|http://http://www.jonrobson.me.uk/#%5B%5BBritain%20loves%20bad%20beer%3F%5D%5D]] which I'd like to build upon.

Now I (and Jon for that matter) are avid travelers and I've noticed that in 90% of the worlds countries (with the exception of Muslim states) there is a sense of national identity when it comes to beer, that is there is one beer which is usually the most widely available and famed. I for one love sniffing out such a beverage and assigning it 'treat' status on the shoestring budgets that I usually encounter.

So for the benefit of others and for my own personal reference here are a list of the countries I've travelled in and the beers I deem to represent the nation.

England - Carling
Wales - Brains (taken on advisement)
Scotland - Tenants (taken on advisement)
France - Kronenberg
Spain - Estrella
Italy - Peroni
Greece - Mythos
Slovenia - Lasko Pivo
Czech Republic - Pilsner Urquell
Tanzania - Tusker (brewed by the Tanzanian government)
Kenya - Tusker (brewed by the Kenyan government)
United States of America - Budweiser
Mexico - Corona
Belize - Belikin
Guatemala - Gallo
Honduras -Salva Vida
Nicaragua - La Victoria
Costa Rica - Imperial
Panama - Cerveza Pananma
India - Sand Piper (the one with the Glycerol)

Ahh that has filled my head with good memories, if you care to argue over my selection then feel free to do so on twitter. I'm over [[here|http://twitter.com/benjam]].

''Update:'' After careful deliberation and poking from [[Kerry|http://twitter.com/kerryb]] and [[Andrew|http://twitter.com/9600]] I have removed the taint of Carling from the likes of the Welsh and the Scotish.
/***
| Name|HideWhenPlugin|
| Description|Allows conditional inclusion/exclusion in templates|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| 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.removeElementWhen = function(test,place) {
	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);
	}}

});

//}}}
I've just seen something uber-interesting over [[here|http://tinyurl.com/28e4st]] but I need a shower so give me a sec... Right there we go. Ok I think I'm ready. No, wait. I think I may stall on this post till I consider the implications of my words...

Ok so after a bit of digging I've come to the conclusion that somone, somewhere (Cupertino or Redmond) must have this in development. If not I've a couple of well placed emails and I've written it on a newspaper and taken a photo and all that crazy stuff! First off, a little background:

Interface design is interesting. Fact. After all, most of us use a computer. I personally became interested in this field with the release of the [[iPhone|http://www.apple.com/iphone/]]. Now it's no secret that I went and got one of these little numbers (in fact I turned out being the first person in the UK to win one, courtesy of [[The Cloud|http://www.thecloud.net]]) the day of release, and I was amazed. The interface is pretty much the most intuitive and natural thing I've ever seen. I truly believe that in five years time we'll all be sitting about thinking 'remember using a mouse, how weird was that?'. however I saw a recent blip on the scanner, Apple released the [[MacBook Air|http://www.apple.com/macbookair/]]. It features the same multi-touch technology in the iPhone but on the famously large Apple trackpad. Now I've not tried one of these bad-boys yet but I'm pretty damned sure the thing that makes the multi-touch interface work is the premise that you're getting the instant feedback from the screen under your finger or 'touching your music' as Jobs puts it. Seeing as you're looking up at the screen on the [[MacBook Air|http://www.apple.com/macbookair/]] I imagine a lot of the magic there is lost. Now, onto the interesting bit.

As previously mentioned [[here|http://tinyurl.com/28e4st]] lies a very interesting guy with an interesting idea: Take the worlds most successful console, featuring the worlds most interesting piece of hardware, and run with it. However I think we're missing out on something here. I propose we build on this multi-touch concept... and I think that it's only a short stop from the now.

Apple laptops have, for years now, been fitted with an [[iSight|http://www.apple.com/imac/technology/isight.html]] camera. Apple are also pioneering multi-touch user interfaces. In fact they've allegedly given the thumbs up to the MacBook Touch R&D as reported [[here|http://gizmodo.com/341007/is-the-apple-macbook-touch-a-realistic-possibility]]. I suggest a competitor, and intend to come up with a prototype soon, here we go...
* Higher resolution [[iSight|http://www.apple.com/imac/technology/isight.html]] camera.
* Two additional infra-red [[LEDs|http://www.ledtronics.net/product_news/aa_article_120602.htm]] in the corners of the top case.
* A few changes to OS X in order to use the existing multi-touch interface on the [[MacBook Air|http://www.apple.com/macbookair/]].
...and boom! There we have it, an all singing, all dancing, truly responsive multi-touch user interface that would be minimal cost for Apple (or other vendors) and can be incorporated into their product line as it stands. Steve Jobs: where's my R&D contract?
Continuing with the travel theme this week I'd like to share two rules that have kept me well fed in Africa, Central America, India and more they are:
* Neon lights? Don't Eat (with the possible exception of Indo-asia, but I've not been)
* Pictures of the food? Don't Eat
These two simple rules can guide your snap judgement, avoiding the onslaught of any over-zealous waiter or night-crawler waiting in the wings. Lets have a look at some examples:
* ~McDonalds
* Wimpey
* Benidorm
These are the facts, don't agree? Fistycuffs over [[here|http://twitter.com/benjam]].
So, my first 'proper' blog entry, and it's a doozey. Intel have, [[allegedly|http://news.bbc.co.uk/1/hi/technology/7171201.stm]], dropped their contract to supply processing to the One Laptop Per Child ([[OLPC]]), aka the XO, aka the $100 laptop.

This is somewhat of a mojor blow and, personally, somewhat upsetting. I realise that the XO has had it's troubles; inital production was well above $100, which is expected and the only order I know of is 100 thousand from Paraguay, which is well below the inital 250 thousand per order suggested batching. But... comon!

I think that the OLPC initiative is one of the most important initernational projects of our time. Yes it's true there are bigger problems that laptop distribution but, at least it shows that, given a problem, the international community can band together and make a go of it.

So please... comon guys!
/***
| Name|LessBackupsPlugin|
| Description|Intelligently limit the number of backup files you create|
| Version|3.0 ($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 code by by Saq Imtiaz.
!!!Code
***/
//{{{
window.getSpecialBackupPath = function(backupPath) {

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

	// comment out the ones you don't want
	var 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).
	];

	var now = new Date();

	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 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_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
	return getSpecialBackupPath(getBackupPath_orig(localPath));
}

//}}}
Links are... well, they're just links, aren't they? Go work it out.
Designed for use with AutoCorrectPlugin. Tag with autoCorrectWords to enable these translations.
{{{
JonLister->[[Jon Lister|http://www.jaybyjayfresh.com]]
PhilHawksworth->[[Phil Hawksworth|http://www.hawksworx.com]]
SimonMcManus->[[Simon McManus|http://simonmcmanus.com]]
CraigCook->[[Craig Cook}http://boycook.wordpress.com/about/]]
JeremyRuston->[[Jeremy Ruston|http://jermolene.wordpress.com/]]
AndrewBack->[[Andrew Back|http://www.carrierdetect.com/]]
FakeSteve->[[Fake Steve|http://fakesteve.blogspot.com/]]
LinkMe->[[BenJam|http://benjam.tiddlyspot.com]]
BruceSchneier->[[Bruce Schnier|http://www.schneier.com/blog/]]
SimonHailstone->[[Simon Hailstone|http://www.ambientbuzzsaw.co.uk/]]
AmbientBuzzsaw->[[Ambient Buzzsaw|http://www.ambientbuzzsaw.co.uk/]]
}}}
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
 major: 1, minor: 1, revision: 0, 
 date: new Date("mar 17, 2007"), 
 source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};

if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};

bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
 if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){ 
  url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
 }
 return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
<<search>>
[[Admin|adminBar]]
[[BlogRoll|RollCall]]
[[About|BenJam]]
[[MonkeyPirateTiddlyWiki|http://mptw.TiddlySpot.com/]] is an extension of the original TiddlyWiki concept by Simon Baird with a new tagging system called TagglyTagging. You can grab the alternate distribution over his neck of the [[woods|http://mptw.TiddlySpot.com]].
URL: http://MonkeyPirateTiddlyWiki.TiddlySpot.com/empty_nolayout.html
URL: /proxy/http://MonkeyPirateTiddlyWiki.TiddlySpot.com/empty_nolayout.html
Well, it appears people enjoy the lighter side of life here at [[BenJam]] so I'll indulge you in my latest lifetime fascination; Undertaking people on speed cameras. I love it! It sends two clear messages:
* You're in the wrong lane.
* You don't score life-points for going through a camera 10 miles an hour slower.
I'm not sure whether this is classed as dangerous driving. If it is then I don't endorse it. But I think I'll continue for a while, because it makes me smile. Now I really must get those comments working...
In here you'll find all my little thoughts on computer networks. You may find a lot of overlap with the [[security|Security]] section so please, try to stay with me. 
/***
| Name:|NewHerePlugin|
| Description:|Creates the new here and new journal macros|
| Version:|3.0 ($Rev: 1845 $)|
| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| 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.0 ($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|
***/
//{{{

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.getName = function(newName) {
       while (store.getTiddler(newName))
               newName = newName.getNextFreeName();
       return newName;
}


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

	title = config.macros.newTiddler.getName(title); // <--- only changed bit

	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");
	story.displayTiddler(null,title,template,false,null,null);
	var tiddlerElem = document.getElementById(story.idPrefix + 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;
};

//}}}
The One Laptop Per Child program is an international initiative to get Laptop computers to the developing contries of the world. The XO as it's called is a small, durable, sub-notebook computer capable of withstanding many of the elemets. It has no moving parts and comes with a selection of chargers including a foot pump.

All in all I love the XO, I've played with a couple of the development models and find the 'dohnut' interface to be reasuringly simple. However. It has been claimed, reasonably reliably, by the BBC, that the XO's processor manufacturer, Intel, have dropped their contract to produce the units. This represents a massive hurdle... read more [[here|Intel Drops the XO]]. 
T'other week I went to a conference, it was about open source, it was all very well and good. [[Doc Searls|http://doc-weblogs.com/]] was there, I had a salad for lunch and spoke to interesting  people all day. However. I noticed that one point simply didn't come up. So I bided my time, thinking 'surely someone has to drop the TCG bomb at some point' yet no one did. So at the Q&A session the mic came my way. I didn't like the response because I think the speakers lost track, it was the end of the day and all that. But still it bugs me. I work for an (unnamed) communications company which pushes open source development very heavily, yet our main workstation partners, [[HP|http://www.hp.com/]], sit there researching usage and application for trusted computing and trusted platform modules. If you need to bone-up on the issues read the necessary materials down there. All I can say is, I'm still not happy, so I can't wait till the next one... Which I'll instigate.
In this area you'll find all sorts of crap about Open Source development. For those of you in the know; go right ahead, the door's open. For those of you that don't; Open Source is about free software. To use the classic quote 'it's free as in freedom' not free as in 100% cheap.

<<search>>

[[Osmosoft|http://www.osmosoft.com]] is tasked with being the bridge between BT and the open source community. They are under the direction of Jeremy Ruston, the inventor of TiddlyWiki.
<html><img src="http://www.ambientbuzzsaw.co.uk/benjam/misc.png" alt="Misc."></html>
<html><img src="http://www.ambientbuzzsaw.co.uk/benjam/Pontification.png" alt="Pontification"></html>
<html><img src="http://www.ambientbuzzsaw.co.uk/benjam/Tomfoolery.png" alt="Tomfoolery"></html>
<!--{{{-->
<div class='header' macro='gradient vert #fff #fff'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTags' refresh='content' tiddler='Tags'></div>
<!--<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>-->
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
So, I left work today knowing damned-well that the Macworld Expo Keynote was about to begin. 'Ahh that thin [[MacBook|http://www.apple.com/mac/]], ah the iPhone upgrade' I thought. I'm in the midst of trolling through [[MacRumours|http://www.macrumours.com]] and [[apple.com|http://www.apple.com]] but I've something more pressing on my mind. Now what could that be? 

I live in London and participate daily in a rain-sodden walk from the tube to my office, but today was a day like no other, oh no, today the pavement had it in for me. I stepped on at least five paving stones only to have the sodden content beneath squelch up my suit trousers. Up!? How the hell does that happen!? Ken Livingston, pull your finger out. Now I'm off to the dry cleaners...

Anyway. On with the show.
So, as you may have seen over [[here|iPhone]] on the Apple musings, I became the first person to win an iPhone in the UK. I've also been given the opportunity to try out a penetration testing tool under the guise of some of my work with my employer... do you see where I'm going with this? The result should be posted here once I get around to giving it a good poking. I'm doing similar over with OS X 'Leopard' over [[here|Penetration Testing OS X 'Leopard']].
I've had a passing interest in Photography since I took Graphic Design GCSE, all those years ago, well... obviously it's not that long ago. I'm mainly interested in [[travel|Travel Photography]], [[extreme sports|Sports Photography]], [[HDR|High Dynamic Range]] and [[macro|Macro Photography]]. In here you'll find some of my thoughts and ghastly photography, perhaps you should wear sunglasses, just to be safe...
/***
| Name|QuickOpenTagPlugin|
| Description|Changes tag links to make it easier to open tags as tiddlers|
| Version|3.0.1 ($Rev: 2342 $)|
| Date|$Date: 2007-07-05 10:57:49 +1000 (Thu, 05 Jul 2007) $|
| 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 to <<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();

//}}}
<html><a href="feed://benjam.TiddlySpot.com/index.xml"><img src="http://www.ambientbuzzsaw.co.uk/benjam/RSS.gif" alt="RSS"></a></html>
<<lifeStream>>
/***
| Name:|RenameTagsPlugin|
| Description:|Allows you to easily rename or delete tags across multiple tiddlers|
| Version:|3.0 ($Rev: 1845 $)|
| Date:|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| 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) {
			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);
		},

		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();

//}}}
Right, lets get this over with, I've not blogged in a very long time... There are various reasons why this is so but I think there's as little reason for me to spit them out as there is for you to rub you eyeballs on them. Lets just get one thing straight. I'm back.

So, whagwarnin' you may think? Well I've finally broken myself into the security forum of which I have warned to be a part of for some time, in the guise of risk management. Admittedly it's not the romantacised vision of [[Swordfish|http://www.imdb.com/title/tt0244244/]] that I may have imagined but it's one of the ten key areas in the CISSP exam so I'll take it as it comes. I've also installed myself back in London after a six month stint back in Birmingham, which I'm happy to say goodbye to.

So what am I likely to be talking about these days, well, take your pick from the usual: [[Open Source|OpenSource]], [[Photography]], [[TiddlyWiki]] and the ever-cool [[iPhone]] but you'll probably see a lot more on [[Security]], predictably on risk management, compliance and governance. If you don't like that then, expect a lot more in this [[Blog]] space about life's irritations and suchlike and, coming up, some more travels! Hope to see you'll back here soon, look for a insolent look at the simple matter of risk management in my mind soon enough...

''PS'' For the meantime check out [[Paul Downey|http://blog.whatfettle.com]] of [[Osmosoft|http://www.osmosoft.com]] fame and his latest psychobabble/mastermind graphic [['The URI is the Thing'|http://www.flickr.com/photos/psd/2918889380/]].
[[JayFresh|http://jayfresh.wordpress.com/]] technological musings from Jon Lister.
[[SimonMcManus|http://simonmcmanus.com/]] technological ranting from Simon Mcmanus.
[[HawksWorx|http://www.hawksworx.com]]  technological playground of Phil Hawksworth.
[[CarrierDetect|http://www.carrierdetect.com/]] Andrew Back, brain-fried. 
[[WhatFettle|http://blog.whatfettle.com/]] moral guidance from Paul Downey.
[[FindingMyFeet|http://www.jonrobson.me.uk]] Jon Robson managing knowledge nuggests.
[[BoyCook|http://boycook.wordpress.com/]] ideas big and small from Craig Cook.
[[Ambient Buzzsaw|http://www.ambientbuzzsaw.co.uk]] visual stimulation courtesy of Simon Hailstone.
[[BenTown|http://abitofben.blogspot.com/]] Ben Waterhouse: your friendly neighborhood biologist.
/***
| Name|SaveCloseTiddlerPlugin|
| Description|Provides two extra toolbar commands, saveCloseTiddler and cancelCloseTiddler|
| Version|3.0 ($Rev: 2134 $)|
| Date|$Date: 2007-04-30 16:11:12 +1000 (Mon, 30 Apr 2007) $|
| 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(e,src,title) {
			config.commands.saveTiddler.handler(e,src,title);
			config.commands.closeTiddler.handler(e,src,title);
			return false;
		}
	},

	cancelCloseTiddler: {
		text: 'cancel/close',
		tooltip: 'Undo changes to this tiddler and close it',
		handler: function(e,src,title) {
			config.commands.cancelTiddler.handler(e,src,title);
			config.commands.closeTiddler.handler(e,src,title);
			return false;
		}
	}

});

//}}}
Security in this context means all the clever mathematical and social engineering involved to undermine or protect a system, this may or may not involve a big guy in a leather jacket named 'Clive'. I have both a professional interest and an academic background in the subject and hope to wade my way through a myriad of problems (and maybe solutions) right here, effectively I'll just try to put the world back on the straight and narrow.
<<search>><<closeAll>>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
Technological Tomfoolery & Pontification...
BenJam: Technological Tomfoolery & Pontification...
Designed for use with AutoCorrectPlugin. Tag with autoCorrectWords to enable these translations. Sourced from http://www.actwin.com/rwmack/spelling.htm.
{{{
absense->absence
acceptible->acceptable
accessable->accessible
accidently->accidentally
accomadate->accommodate
accompanyed->accompanied
accross->across
acheivement->achievement
achievment->achievement
acomplish->accomplish
acquiantence->acquaintance
acquited->acquitted
actualy->actually
acuracy->accuracy
addmission->admission
adolecent->adolescent
adress->address
adviced->advised
agian->again
agina->again
agravate->aggravate
agressive->aggressive
ahev->have
ahppen->happen
ahve->have
alomst->almost
almsot->almost
alotted->allotted
alreayd->already
alusion->allusion
alwasy->always
alwyas->always
amature->amateur
amke->make
amking->making
anbd->and
anual->annual
anytying->anything
aquiantance->acquaintance
aquire->acquire
aquitted->acquitted
arangement->arrangement
arguement->argument
athat->that
audeince->audience
aveh->have
avhe->have
awya->away
bakc->back
baout->about
barin->brain
bcak->back
becasue->because
becuase->because
befoer->before
begining->beginning
beleive->believe
bera->bear
boaut->about
busness->business
casion->casino
ceratin->certain
chari->chair
chasr->characters
claer->clear
claerer->clearer
claerly->clearly
clera->clear
comittee->committee
comming->coming
commitee->committee
constatn->constant
coudl->could
coudln->couldn
cpoy->copy
cxan->can
dael->deal
definit->definite
deram->dream
deside->decide
devide->divide
diea->idea
doens->doesn
doign->doing
donig->doing
dreasm->dreams
drnik->drink
dyas->days
efel->feel
eles->else
embarass->embarrass
embarassing->embarrassing
embarras->embarrass
embarrasing->embarrassing
ened->need
enxt->next
erally->really
esle->else
ethose->ethos
eveyr->every
exagerate->exaggerate
exagerated->exaggerated
exagerating->exaggerating
existance->existence
eyar->year
eyars->years
eyasr->years
fianlly->finally
fidn->find
fiel->file
fiels->files
financialy->financially
firends->friends
firts->first
fomr->from
forfiet->forfeit
forhead->forehead
foriegn->foreign
foudn->found
fourty->forty
freind->friend
frist->first
fulfilment->fulfillment
garanteed->guaranteed
gaurd->guard
generaly->generally
gerat->great
godo->good
gogin->going
gonig->going
goign->going
goverment->government
governer->governor
grammaticaly->grammatically
grammer->grammar
greif->grief
grwo->grow
graet->great
grat->great
greta->great
guage->gauge
guidence->guidance
hace->have
haev->have
hapened->happened
harras->harass
herad->heard
hera->hear
herat->heart
heroe->hero
heros->heroes
hieght->height
hismelf->himself
horus->hours
housr->hours
hten->then
htere->there
htey->they
hting->thing
htikn->think
htink->think
htis->this
humer->humor
hvae->have
hvea->have
hvaing->having
hwihc->which
hwile->while
hwole->whole
hypocracy->hypocrisy
hypocrasy->hypocrisy
hypocrit->hypocrite
idae->idea
idaes->ideas
idesa->ideas
ilogical->illogical
imagenary->imaginary
imagin->imagine
imediately->immediately
imense->immense
immitate->imitate
incidently->incidentally
incredable->incredible
independant->independent
indispensible->indispensable
inevatible->inevitable
inevitible->inevitable
infinit->infinite
inocence->innocence
intelectual->intellectual
inteligence->intelligence
inteligent->intelligent
interpet->interpret
interupt->interrupt
intrest->interest
irelevent->irrelevant
iresistable->irresistible
iresistible->irresistible
iritable->irritable
iritated->irritated
irresistable->irresistible
inot->into
iwll->will
iwth->with
jeapardy->jeopardy
jstu->just
jsut->just
knowlege->knowledge
konw->know
konws->knows
knwo->know
knwos->knows
kwno->know
labatory->laboratory
labratory->laboratory
leanr->learn
legitamate->legitimate
leran->learn
lerans->learns
levle->level
liason->liaison
libary->library
lible->liable
lief->life
lieing->lying
liek->like
liekd->liked
liesure->leisure
lightening->lightning
litature->literature
literture->literature
littel->little
liuke->like
liev->live
livley->lively
loev->love
lonelyness->loneliness
lonley->lonely
lonly->lonely
lsat->last
lveo->love
lvoe->love
maintainance->maintenance
maintainence->maintenance
maintenence->maintenance
makse->makes
manuever->maneuver
mariage->marriage
marrage->marriage
mathamatics->mathematics
mear->mere
medacine->medicine
mena->mean
menas->means
messanger->messenger
minature->miniature
mischeivous->mischievous
misile->missile
mkae->make
mkaes->makes
mkaing->making
mkea->make
moent->moment
moeny->money
moer->more
morgage->mortgage
movei->movie
mroe->more
muscels->muscles
mysefl->myself
mysterous->mysterious
naturaly->naturally
naturely->naturally
neccessary->necessary
necesary->necessary
neice->niece
nickle->nickel
nineth->ninth
ninty->ninety
nkow->know
nkwo->know
noticable->noticeable
noticeing->noticing
nuculear->nuclear
nuisanse->nuisance
nusance->nuisance
oaky->okay
obstacal->obstacle
ocasionally->occasionally
occassionally->occasionally
occurance->occurrence
occured->occurred
occurence->occurrence
occurr->occur
occurrance->occurrence
ocurr->occur
ocurrance->occurrence
ocurred->occurred
ocurrence->occurrence
oging->going
omision->omission
omited->omitted
omre->more
onot->onto
onyl->only
oponent->opponent
oportunity->opportunity
oposite->opposite
oppinion->opinion
optomism->optimism
orgin->origin
orginal->original
orginize->organize
otehr->other
owrk->work
owudl->would
paide->paid
palce->place
pamplet->pamphlet
paralel->parallel (500)
parrallel->parallel (700)
pasttime->pastime
payed->paid
peculure->peculiar
peice->piece
peom->poem
peoms->poems
peopel->people
peotry->poetry
performence->performance
perhpas->perhaps
perhasp->perhaps
permanent->permanent
permissable->permissible
perphas->perhaps
personel->personal
planed->planned
plesant->pleasant
poisin->poison
posess->possess
posession->possession
possable->possible
possably->possibly
possesion->possession
practicaly->practically
practicly->practically
prairy->prairie
preceed->precede
prefered->preferred
prepair->prepare
prepartion->preparation
presense->presence
prevelant->prevalent
priviledge->privilege
probablly->probably
probelm->problem
proceed->proceed
proceedure->procedure
profesion->profession
profesor->professor
proffesion->profession
proffesor->professor
prominant->prominent
prophacy->prophecy
propoganda->propaganda
psycology->psychology
publically->publicly
pumkin->pumpkin
pwoer->power
qtuie->quite
quantaty->quantity
quizes->quizzes
qutie->quite
raelly->really
reacll->recall
realy->really
realyl->really
reciept->receipt
recieve->receive
recieving->receiving
recomend->recommend
recrod->record
rediculous->ridiculous
refered->referred
refering->referring
referrence->reference
regluar->regular
rela->real
relaly->really
releive->relieve
rememberance->remembrance
repatition->repetition
representive->representative
restraunt->restaurant
rewriet->rewrite
roomate->roommate
russina->russian
rwite->write
rythm->rhythm
rythem->rhythm
sacrafice->sacrifice
saftey->safety
salery->salary
sargant->sergeant
sasy->says
schedual->schedule
scirpt->script
scripot->script
secretery->secretary
seperate->separate
severley->severely
sherif->sheriff
shineing->shining
shoudl->should
shoudln->shouldn
sieze->seize
simpley->simply
sincerley->sincerely
sinse->since
smae->same
smoe->some
snese->sense
soem->some
sohw->show
sophmore->sophomore
soudn->sound
soudns->sounds
sotry->story
sotyr->story
sould->soul
soulds->souls
speach->speech
sponser->sponsor
stroy->story
stoyr->story
stopry->story
storeis->stories
storise->stories
stnad->stand
stpo->stop
strat->start
stubborness->stubbornness
successfull->successful
suceed->succeed
suer->sure
sumary->summary
supercede->supersede
superintendant->superintendent
supose->suppose
supress->suppress
surley->surely
suround->surround
suseptible->susceptible
swiming->swimming
syas->says
taeks->takes
tahn->than
taht->that
tath->that
talek->talk
talekd->talked
tehy->they
temperment->temperament
temperture->temperature
tendancy->tendency
thgat->that
tghe->the
ther->there
theri->their
thge->the
thier->their
thign->thing
thigns->things
thigsn->things
thikn->think
thikns->thinks
thikning->thinking
thiunk->think
thna->than
thne->then
thnig->thing
thnigs->things
thsi->this
thsoe->those
thta->that
tiem->time
tih->with
tihkn->think
tihs->this
timne->time
tiome->time
tje->the
tjhe->the
tkae->take
tkaes->takes
tkaing->taking
tlaking->talking
tobbaco->tobacco
todya->today
tommorrow->tomorrow
tongiht->tonight
towrad->toward
trafficed->trafficked
trafic->traffic
transfered->transferred
truely->truly
turnk->trunk
twon->town
tyhat->that
tyhe->the
tyrany->tyranny
unconcious->unconscious
unecessary->unnecessary
unmistakeably->unmistakably
untill->until
useage->usage
usefull->useful
useing->using
usualy->usually
vaccum->vacuum
valuble->valuable
vegtable->vegetable
venemous->venomous
vengance->vengeance
veyr->very
vigilence->vigilance
villin->villain
visable->visible
vrey->very
vyer->very
vyre->very
waht->what
warrent->warrant
watn->want
wehn->when
weild->wield
wendsay->Wednesday
wensday->Wednesday
whcih->which
whereever->wherever
whic->which
whihc->which
wholy->wholly
whta->what
wief->wife
wierd->weird
wiht->with
wintery->wintry
wirting->writing
withdrawl->withdrawal
wiull->will
wnat->want
wnats->wants
wnated->wanted
wohle->whole
wokr->work
worshipped->worshiped
woudl->would
wriet->write
wrok->work
wroking->working
wroet->wrote
wtih->with
yeild->yield
ytou->you
yera->year
yeras->years
yersa->years
yeasr->years
}}}
I'm quite enjoying this less serious approach to blogging. This week/month/point at which I have time to jabber on about the finer things in life, I'd like to share with you a killer recipe for Spicy Butternut Squash Soup. The recipe is a little on the hot side as I like my Chilli so you may want to reduce it a bit there. Anyways here it is:

!!!Ingredients

1 tbsp olive oil

1 onion, chopped

1 red chilli, chopped (optional)

1 clove garlic, crushed

2 butternut squash, flesh cubed

1 tbsp medium curry paste

300ml/½ pint good vegetable stock

200ml/7fl oz coconut milk

2 tbsp fresh coriander, chopped

!!!Method

#Heat the oil in a non-stick pan. Add the onion, chilli and the garlic, and fry for 4-5 minutes until softened.
#Add the squash and continue to fry for 5 minutes. Stir through the curry paste and fry for a further minute. Pour over the stock and coconut milk, bring to the boil, and cover and simmer for 15-20 minutes, until the squash is tender. 

#Transfer to a food processor or blender and blend until smooth. Return to the pan, add the coriander, and season well. Serve with plenty of crusty bread.
<<allTags>>
<<tabs txtMoreTab "Tags" "All Tags" TabAllTags "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed>>
<<allTags>>
//{{{
version.extensions.tagCloud = {major: 1, minor: 0 , revision: 1, date: new Date(2005,8,16)};
//Created by Clint Checketts, contributions by Jonny Leroy and Eric Shulman

config.macros.tagCloud = {
 noTags: "No tag cloud created because there are no tags.",
 tooltip: "%1 tiddlers tagged with '%0'"
};

config.macros.tagCloud.handler = function(place,macroName,params) {
 
var tagCloudWrapper = createTiddlyElement(place,"div",null,"tagCloud",null);

var tags = store.getTags();
for (t=0; t<tags.length; t++) {
  for (p=0;p<params.length; p++) if (tags[t][0] == params[p]) tags[t][0] = "";
}

 if(tags.length == 0) 
   createTiddlyElement(tagCloudWrapper,"span",null,null,this.noTags);
 //Findout the maximum number of tags
 var mostTags = 0;
 for (t=0; t<tags.length; t++) if (tags[t][0].length > 0){
  if (tags[t][1] > mostTags) mostTags = tags[t][1];
 }
 //divide the mostTags into 4 segments for the 4 different tagCloud sizes
 var tagSegment = mostTags / 4;

  for (t=0; t<tags.length; t++) if (tags[t][0].length > 0){
 var tagCloudElement = createTiddlyElement(tagCloudWrapper,"span",null,null,null);
 tagCloudWrapper.appendChild(document.createTextNode(" "));
 var theTag = createTiddlyLink(tagCloudElement,tags[t][0],true);
 theTag.className += " tagCloudtag tagCloud" + (Math.round(tags[t][1]/tagSegment)+1);

//  theTag.setAttribute("tag",tags[t][0]);
 }

};

setStylesheet(".tagCloud span{height: 1.8em;margin: 3px;}.tagCloud1{font-size: 1.2em;}.tagCloud2{font-size: 1.4em;}.tagCloud3{font-size: 1.6em;}.tagCloud4{font-size: 1.8em;}.tagCloud5{font-size: 1.8em;font-weight: bold;}","tagCloudsStyles");
//}}}
/***
| Name|TagglyTaggingPlugin|
| Description|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
| Version|3.1 ($Rev: 2351 $)|
| Date|$Date: 2007-07-12 10:18:02 +1000 (Thu, 12 Jul 2007) $|
| 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
***/
//{{{
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':",
			excerpts:   "excerpts",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only"
		},

		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",
			contents: "Click to show entire tiddler contents",
			sliders:  "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		}
	},

	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","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/"
	},

	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(),null);
		// 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.getTaggedTiddlers(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) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title); break;
			case "normal": return this.createTagglyListNormal(place,title,false); break;
			case "commas": return this.createTagglyListNormal(place,title,true); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title); break;
		}
	},

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

	getExcerpt: function(inTiddlerTitle,title,indent) {
    if (!indent)
			indent = 1;
		if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "excerpts") {
			var t = store.getTiddler(title);
			if (t) {
				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 (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "contents") {
			var t = store.getTiddler(title);
			if (t) {
				return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
			}
		}
		else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "sliders") {
			var t = store.getTiddler(title);
			if (t) {
				return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
			}
		}
		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) {

		var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));

		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) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = store.getTaggedTiddlers(title,sortBy);

		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) {

		var list = store.getTaggedTiddlers(title,sortBy);
		if (sortOrder == "desc")
			list.reverse();

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

		var childOutput = "";
		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);

		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) {
		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"));
		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 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);
        			refreshContainer.setAttribute("title",tiddler.title);
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				removeChildren(place);
				if (store.getTaggedTiddlers(title).length > 0) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",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);
					}
				}
			}
		}
	},

	// 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]]; }",
"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; }",
"/*}}}*/",
		""].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

***/
//{{{
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[1] + " "+"\u00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = "none";
			wikify(lookaheadMatch[2],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;
	}
});

//}}}
!!!Tags
<<tagCloud excludeLists autoCorrectWords html noAutoCorrect systemServer systemConfig Links Plugins>>
Interested in Technology? mainly computer related? Got a T-shirt from [[ThinkGeek|http://www.thinkgeek.com]]? Read on...
Apologies for my recent absenteeism, I've been away, to India if you'd like to know. In short: nice place but a shame about the money grabbing guys in Delhi. Anyway enough about that, more of this. 

My recent trip was the first time out for for me to utilise my new Digital SLR (a Nikon D80 if you must know) I was very excited about getting some travel piccies on a decent camera with a good resolution, for the walls of my new flat. However I discovered that traveling and travel Photography, are not the match made in heaven that one would imagine... 

Firstly there is the issue of luggage. I pride myself on traveling relatively light, I pack a 35-40 ltr bag with some of my oldest clothes and laugh at the Americans with their 80+ ltr 'Rucksacs' as they worry about them sitting on the roof of the cranky old bus we're on, in monsoon season. Now, although an SLR is reasonably small (in that you can fit it in a small case) it is a heavy piece of equipment, and when paired with the paraphernalia  that surrounds the use of such a camera (hard drive, tripod, filters etc) it all adds up. These trinkets collude to ruin your back over the course of weeks, comparative to a compact anyway.

Secondly there's the obvious problem of theft. Although SLRs are designed to appease those with more traditional views of what a camera should be they still come with a ruddy great screen on the back screaming 'digital' at the small street urchins that you'd love to photograph. This results in a great internal dialog along the lines of 'do I risk it or should I wait until there are less people about' or 'is it going to get dark before I can go home and hide my wares'. By the time this thought process has occurred the opportunity has gone and the street urchins have begun eying up the next guy. On top of all that you now have to look over your shoulder until you can offload, though you can play the 'secret spy' game in your head, deciding who's trying to follow you. Which is sad, but fun.

Note: Some of you, if you had the ability, would comment about getting decent insurance. I can assure you I'm insured to the hilt, in fact I'm almost willing someone to rob me as I've over-insured and could get a full frame DSLR with the return on a claim. My problem is that, from that point, you have no camera. Worse still if they nick your bag they get your backups and all your pictures! FYI I'm looking to move this blog somewhere more traditional, just until [[Osmososft|http://www.osmosoft.com]] get TiddlyWiki up to speed with a few things. 

Finally, and this one's the killer, where the hell do you draw the line between travel and travel photography? I'm a fan of both of these things but they just can't ever fit together.  When I see a lovely moment I either feel that I should be capturing it in a photo or I should be enjoying it. Inevitably I make the wrong decision and either waste my time getting my camera out (and missing the moment once the above internal discussion has settled) or I 'enjoy' it by imagining how cool it'd look on my wall or similar. Either way I end up feeling robbed of any satisfaction and thoroughly deflated. Worse still post-trip I look through my photos thinking 'ahh yeah that was just before I, oh, no, I 'enjoyed' that bit'... It's a double punkd! Worse STILL aside from deciding this is a holiday/photography trip I can't see a resolution to my predicament! In particular I cannot see a point where a trip purely for photography is a viable option.

So I'm left with this great internal struggle... In the meanwhile check out my progress over on my <<tiddler FlickrIcon>>. Comments are welcome, criticism is encouraged.
So TiddlyChatter, sounds cool? You haven't got a clue what it's about yet! Lets rectify that shall we? Stay with me. So, you know this facebook thing? The one that everyone loves to hate, me included. Well. The thing is, there are a LOT of areas it fails to capitalize on (and by that I don't mean money). However, there is one little gem which, given a little cutting down and buffing up, could be a diamond. The home screen. All the information you need, one place, decentralised and relevant. This is the idea behind TiddlyChatter, brainchild of [[Jon Lister|http://jaybyjayfresh.com/]] and it looks to be going places. Look to subscribe here using it soon. If anyone, actually, ever, reads this... who knows! Meanwhile check out Jon's blog for more information.
!!!Update
Development on this has stalled, personally I request a reasoning? Lets get it moving again Jay!
Ok so I'm going to limit myself at one blog entry a day but, as some of us TiddlyWiki fans well know, TiddlySpot experienced seasonably technological problems recently. I think Santa must have spilt his bourbon all over the TiddlySpot fireplace. But it's ok, all cleared up now. On with the show.

I'm looking at solving a few problems over at the [[Tomfoolery]] pages but just thought I'd add a point. I'd like comments on my page a la Wordpress... I've had words with [[Jon Lister|http://www.jaybyjayfresh.com]] about this and I dont think there's something that enables me to do this. So I'll jump headfirst into the darkness of JavaScript. Not that I really enjoy this sort of thing but, as the classic Open Source cliche goes, I'e got an itch. See what's happening over [[here|TiddlyPress]].
Designed for use with AutoCorrectPlugin. Tag with autoCorrectWords to enable these translations. Sourced from http://www.actwin.com/rwmack/spelling.htm.
{{{
tiddlywiki->TiddlyWiki
tw->TiddlyWiki
tiddlypot->TiddlySpot
tiddlyspot->TiddlySpot
ts->TiddlySpot
tiddlyvault->TiddlyVault
tiddlychatter->TiddlyChatter
teamtasks->TeamTasks
TT->TeamTasks
monkeypiratetiddlywiki->MonkeyPirateTiddlyWiki
mptw->MonkeyPirateTiddlyWiki
}}}
[[TiddlySpot|TiddlySpot]] is the hosted extension of TiddlyWiki on which this particular TiddlyWiki is based. for more information check out their website [[here|http://www.TiddlySpot.com]] and get yourself one!
Ok so I tried writing this post on my iPhone and it crashed while saving so... can we get that sorted? Check [[here|TiddlyWiki on iPhone]] for more on that, Anyway. TiddlyWiki is a self-contained platform originally developed for wiki/blog stuff, like this site. It's written in [[JavaScript|http://www.w3schools.com/js/default.asp]] by a very clever chap called [[Jeremy Ruston|http://jermolene.wordpress.com/]]. It's essentially wikipedia with the openness of facebook, minus all the bullshit applications. All configuration and functionality is coded in Tiddlers, in fact this is a Tiddler too, now I think about it this IS a TiddlyWiki page. Amazing. Also this is another TiddlyWiki page at [[Osmosoft|http://www.osmosoft.com]]; the Open Source subsidiary of BT developing on TiddlyWiki under the direction of, you guessed it, Jeremy Ruston.
/***
| Name|ToggleTagPlugin|
| Description|Makes a checkbox which toggles a tag in a tiddler|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://tiddlyspot.com/mptw/#ToggleTagMacro|
| 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)

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

***/
//{{{

merge(config.macros,{

	toggleTag: {

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

		handler: function(place,macroName,params,wikifier,paramString,tiddler) {
			var tag = (params[0] && params[0] != '.') ? params[0] : "checked";
			var title = (params[1] && params[1] != '.') ? params[1] : tiddler.title;
			var defaultLabel = (title == tiddler.title ? this.shortLabel : this.longLabel);
			var label = (params[2] && params[2] != '.') ? params[2] : defaultLabel;
			label = (label == '-' ? '' : label);
			var theTiddler =  title == tiddler.title ? 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;
				}
				store.setTiddlerTag(title,this.checked,tag);
				return true;
			});
		}
	}
});

//}}}
I've been traveling, on and off, for about three years now. I'm not the most well traveled person in the world and I hate, with a passion, that whole 'how many stamps have you got in your passport' hostel scene. Simply I love traveling and I love photography, put the two together and... well... that's it really, put the two together in here you'll find any of my thoughts or snaps on travels.
Trusted Computing, in the context I speak of, is all about the enforcement of 'Trusted' behavior  through the use of cryptographic primitives specialist hardware and careful use of protocol. The core concept being that of Attestation, whereby a platform is given a means of proving to a service that it is running in a certain, trusted configuration.

A lot of people see the concept as being the axis of Open Source development, in light of this I'm in the business of arranging a small conference with key players in the industry in order to get around the table and iron out these apparent issues for the good of my employer. News of which should follow soon.
/***
Contains the stuff you need to use Tiddlyspot
Note you must also have UploadPlugin installed
***/
//{{{

// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'benjam';

// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)

// disable autosave in d3
if (window.location.protocol != "file:")
	config.options.chkGTDLazyAutoSave = false;

// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
	SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
	SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
	OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
	DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[Welcome to Tiddlyspot]] ");
	MainMenu = MainMenu.replace(/^/,"[[Welcome to Tiddlyspot]] ");
}

// create some shadow tiddler content
merge(config.shadowTiddlers,{

'Welcome to Tiddlyspot':[
 "This document is a ~TiddlyWiki from tiddlyspot.com.  A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //What now?// &nbsp;&nbsp;@@ Before you can save any changes, you need to enter your password in the form below.  Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
 "<<tiddler TspotControls>>",
 "See also GettingStarted.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working online// &nbsp;&nbsp;@@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// &nbsp;&nbsp;@@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick.  You can make changes and save them locally without being connected to the Internet.  When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Help!// &nbsp;&nbsp;@@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]].  Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help.  If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
 "",
 "@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// &nbsp;&nbsp;@@ We hope you like using your tiddlyspot.com site.  Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),

'TspotControls':[
 "| tiddlyspot password:|<<option pasUploadPassword>>|",
 "| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<<br>>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
 "| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),

'TspotSidebar':[
 "<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . .  " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),

'TspotOptions':[
 "tiddlyspot password:",
 "<<option pasUploadPassword>>",
 ""
].join("\n")

});
//}}}
<<upload http://benjam.TiddlySpot.com/store.cgi index.html . .  benjam>>
<html><a href='http://benjam.TiddlySpot.com/download' class='button'>download</a></html>
<html><a href="http://twitter.com/benjam"><img src="http://www.ambientbuzzsaw.co.uk/benjam/TWIT.gif" alt="T"></a></html>
A user identifier
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 28/10/2008 14:20:34 | BenJam | [[/|http://benjam.tiddlyspot.com/]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 26/11/2008 20:41:41 | BenJam | [[/|http://benjam.tiddlyspot.com/]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 03/12/2008 20:42:12 | BenJam | [[empty.html|file://localhost/Users/slide/Sites/benjam.tiddlyspot.com/empty.html]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 03/12/2008 20:43:04 | BenJam | [[empty.html|file://localhost/Users/slide/Sites/benjam.tiddlyspot.com/empty.html]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 03/12/2008 21:03:55 | BenJam | [[empty.html|file://localhost/Users/slide/Sites/benjam.tiddlyspot.com/empty.html]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 03/12/2008 21:44:09 | BenJam | [[/|http://benjam.tiddlyspot.com/]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 03/12/2008 21:44:31 | BenJam | [[/|http://benjam.tiddlyspot.com/]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 03/12/2008 21:51:31 | BenJam | [[/|http://benjam.tiddlyspot.com/]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 03/12/2008 22:02:27 | BenJam | [[/|http://benjam.tiddlyspot.com/#setTheme]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
| 03/12/2008 22:07:11 | BenJam | [[/|http://benjam.tiddlyspot.com/#BenJamTheme]] | [[store.cgi|http://benjam.TiddlySpot.com/store.cgi]] | . | [[index.html | http://benjam.TiddlySpot.com/index.html]] | . |
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 19, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.2.0 (Beta 5)'
};

config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");

merge(config.macros.option.types, {
	'pas': {
		elementType: "input",
		valueField: "value",
		eventName: "onkeyup",
		className: "pasOptionInput",
		typeValue: config.macros.option.passwordInputType,
		create: function(place,type,opt,className,desc) {
			// password field
			config.macros.option.genericCreate(place,'pas',opt,className,desc);
			// checkbox linked with this password "save this password on this computer"
			config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);			
			// text savePasswordCheckboxLabel
			place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
		},
		onChange: config.macros.option.genericOnChange
	}
});

merge(config.optionHandlers['chk'], {
	get: function(name) {
		// is there an option linked with this chk ?
		var opt = name.substr(3);
		if (config.options[opt]) 
			saveOptionCookie(opt);
		return config.options[name] ? "true" : "false";
	}
});

merge(config.optionHandlers, {
	'pas': {
 		get: function(name) {
			if (config.options["chk"+name]) {
				return encodeCookie(config.options[name].toString());
			} else {
				return "";
			}
		},
		set: function(name,value) {config.options[name] = decodeCookie(value);}
	}
});

// need to reload options to load passwordOptions
loadOptionsCookie();

/*
if (!config.options['pasPassword'])
	config.options['pasPassword'] = '';

merge(config.optionsDesc,{
		pasPassword: "Test password"
	});
*/
//}}}

/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.0|
|''Date:''|May 5, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (#3125)|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 0,
	date: new Date("May 5, 2007"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0 (#3125)'
};

//
// Environment
//

if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;	// true to activate both in Plugin and UploadService
	
//
// Upload Macro
//

config.macros.upload = {
// default values
	defaultBackupDir: '',	//no backup
	defaultStoreScript: "store.php",
	defaultToFilename: "index.html",
	defaultUploadDir: ".",
	authenticateUser: true	// UploadService Authenticate User
};
	
config.macros.upload.label = {
	promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
	promptParamMacro: "Save and Upload this TiddlyWiki in %0",
	saveLabel: "save to web", 
	saveToDisk: "save to disk",
	uploadLabel: "upload"	
};

config.macros.upload.messages = {
	noStoreUrl: "No store URL in parmeters or options",
	usernameOrPasswordMissing: "Username or password missing"
};

config.macros.upload.handler = function(place,macroName,params) {
	if (readOnly)
		return;
	var label;
	if (document.location.toString().substr(0,4) == "http") 
		label = this.label.saveLabel;
	else
		label = this.label.uploadLabel;
	var prompt;
	if (params[0]) {
		prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0], 
			(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
	} else {
		prompt = this.label.promptOption;
	}
	createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};

config.macros.upload.action = function(params)
{
		// for missing macro parameter set value from options
		var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
		var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
		var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
		var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
		var username = params[4] ? params[4] : config.options.txtUploadUserName;
		var password = config.options.pasUploadPassword; // for security reason no password as macro parameter	
		// for still missing parameter set default value
		if ((!storeUrl) && (document.location.toString().substr(0,4) == "http")) 
			storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
		if (storeUrl.substr(0,4) != "http")
			storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
		if (!toFilename)
			toFilename = bidix.basename(window.location.toString());
		if (!toFilename)
			toFilename = config.macros.upload.defaultToFilename;
		if (!uploadDir)
			uploadDir = config.macros.upload.defaultUploadDir;
		if (!backupDir)
			backupDir = config.macros.upload.defaultBackupDir;
		// report error if still missing
		if (!storeUrl) {
			alert(config.macros.upload.messages.noStoreUrl);
			clearMessage();
			return false;
		}
		if (config.macros.upload.authenticateUser && (!username || !password)) {
			alert(config.macros.upload.messages.usernameOrPasswordMissing);
			clearMessage();
			return false;
		}
		bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password); 
		return false; 
};

config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir) 
{
	if (!storeUrl)
		return null;
		var dest = bidix.dirname(storeUrl);
		if (uploadDir && uploadDir != '.')
			dest = dest + '/' + uploadDir;
		dest = dest + '/' + toFilename;
	return dest;
};

//
// uploadOptions Macro
//

config.macros.uploadOptions = {
	handler: function(place,macroName,params) {
		var wizard = new Wizard();
		wizard.createWizard(place,this.wizardTitle);
		wizard.addStep(this.step1Title,this.step1Html);
		var markList = wizard.getElement("markList");
		var listWrapper = document.createElement("div");
		markList.parentNode.insertBefore(listWrapper,markList);
		wizard.setValue("listWrapper",listWrapper);
		this.refreshOptions(listWrapper,false);
		var uploadCaption;
		if (document.location.toString().substr(0,4) == "http") 
			uploadCaption = config.macros.upload.label.saveLabel;
		else
			uploadCaption = config.macros.upload.label.uploadLabel;
		
		wizard.setButtons([
				{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption, 
					onClick: config.macros.upload.action},
				{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
				
			]);
	},
	refreshOptions: function(listWrapper) {
		var uploadOpts = [
			"txtUploadUserName",
			"pasUploadPassword",
			"txtUploadStoreUrl",
			"txtUploadDir",
			"txtUploadFilename",
			"txtUploadBackupDir",
			"chkUploadLog",
			"txtUploadLogMaxLine",
			]
		var opts = [];
		for(i=0; i<uploadOpts.length; i++) {
			var opt = {};
			opts.push()
			opt.option = "";
			n = uploadOpts[i];
			opt.name = n;
			opt.lowlight = !config.optionsDesc[n];
			opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
			opts.push(opt);
		}
		var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
		for(n=0; n<opts.length; n++) {
			var type = opts[n].name.substr(0,3);
			var h = config.macros.option.types[type];
			if (h && h.create) {
				h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
			}
		}
		
	},
	onCancel: function(e)
	{
		backstage.switchTab(null);
		return false;
	},
	
	wizardTitle: "Upload with options",
	step1Title: "These options are saved in cookies in your browser",
	step1Html: "<input type='hidden' name='markList'></input><br>",
	cancelButton: "Cancel",
	cancelButtonPrompt: "Cancel prompt",
	listViewTemplate: {
		columns: [
			{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
			{name: 'Option', field: 'option', title: "Option", type: 'String'},
			{name: 'Name', field: 'name', title: "Name", type: 'String'}
			],
		rowClasses: [
			{className: 'lowlight', field: 'lowlight'} 
			]}
}

//
// upload functions
//

if (!bidix.upload) bidix.upload = {};

if (!bidix.upload.messages) bidix.upload.messages = {
	//from saving
	invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
	backupSaved: "Backup saved",
	backupFailed: "Failed to upload backup file",
	rssSaved: "RSS feed uploaded",
	rssFailed: "Failed to upload RSS feed file",
	emptySaved: "Empty template uploaded",
	emptyFailed: "Failed to upload empty template file",
	mainSaved: "Main TiddlyWiki file uploaded",
	mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
	//specific upload
	loadOriginalHttpPostError: "Can't get original file",
	aboutToSaveOnHttpPost: 'About to upload on %0 ...',
	storePhpNotFound: "The store script '%0' was not found."
};

bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
	var callback = function(status,uploadParams,original,url,xhr) {
		if (!status) {
			displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
			return;
		}
		if (bidix.debugMode) 
			alert(original.substr(0,500)+"\n...");
		// Locate the storeArea div's 
		var posDiv = locateStoreArea(original);
		if((posDiv[0] == -1) || (posDiv[1] == -1)) {
			alert(config.messages.invalidFileError.format([localPath]));
			return;
		}
		bidix.upload.uploadRss(uploadParams,original,posDiv);
	};
	
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	// save on localdisk ?
	if (document.location.toString().substr(0,4) == "file") {
		var path = document.location.toString();
		var localPath = getLocalPath(path);
		saveChanges();
	}
	// get original
	var uploadParams = Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
	var originalPath = document.location.toString();
	// If url is a directory : add index.html
	if (originalPath.charAt(originalPath.length-1) == "/")
		originalPath = originalPath + "index.html";
	var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
	var log = new bidix.UploadLog();
	log.startUpload(storeUrl, dest, uploadDir,  backupDir);
	displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
	if (bidix.debugMode) 
		alert("about to execute Http - GET on "+originalPath);
	var r = doHttp("GET",originalPath,null,null,null,null,callback,uploadParams,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

bidix.upload.uploadRss = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		if(status) {
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
			bidix.upload.uploadMain(params[0],params[1],params[2]);
		} else {
			displayMessage(bidix.upload.messages.rssFailed);			
		}
	};
	// do uploadRss
	if(config.options.chkGenerateAnRssFeed) {
		var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
		var rssUploadParams = Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		bidix.upload.httpUpload(rssUploadParams,convertUnicodeToUTF8(generateRss()),callback,Array(uploadParams,original,posDiv));
	} else {
		bidix.upload.uploadMain(uploadParams,original,posDiv);
	}
};

bidix.upload.uploadMain = function(uploadParams,original,posDiv) 
{
	var callback = function(status,params,responseText,url,xhr) {
		var log = new bidix.UploadLog();
		if(status) {
			// if backupDir specified
			if ((params[3]) && (responseText.indexOf("backupfile:") > -1))  {
				var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
				displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
			}
			var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
			displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
			store.setDirty(false);
			log.endUpload("ok");
		} else {
			alert(bidix.upload.messages.mainFailed);
			displayMessage(bidix.upload.messages.mainFailed);
			log.endUpload("failed");			
		}
	};
	// do uploadMain
	var revised = bidix.upload.updateOriginal(original,posDiv);
	bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};

bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
	var localCallback = function(status,params,responseText,url,xhr) {
		url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
		if (xhr.status == httpStatus.NotFound)
			alert(bidix.upload.messages.storePhpNotFound.format([url]));
		if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
			alert(responseText);
			if (responseText.indexOf("Debug mode") >= 0 )
				responseText = responseText.substring(responseText.indexOf("\n\n")+2);
		} else if (responseText.charAt(0) != '0') 
			alert(responseText);
		if (responseText.charAt(0) != '0')
			status = null;
		callback(status,params,responseText,url,xhr);
	};
	// do httpUpload
	var boundary = "---------------------------"+"AaB03x";	
	var uploadFormName = "UploadPlugin";
	// compose headers data
	var sheader = "";
	sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
	sheader += uploadFormName +"\"\r\n\r\n";
	sheader += "backupDir="+uploadParams[3] +
				";user=" + uploadParams[4] +
				";password=" + uploadParams[5] +
				";uploaddir=" + uploadParams[2];
	if (bidix.debugMode)
		sheader += ";debug=1";
	sheader += ";;\r\n"; 
	sheader += "\r\n" + "--" + boundary + "\r\n";
	sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
	sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
	sheader += "Content-Length: " + data.length + "\r\n\r\n";
	// compose trailer data
	var strailer = new String();
	strailer = "\r\n--" + boundary + "--\r\n";
	data = sheader + data + strailer;
	if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
	var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
	if (typeof r == "string")
		displayMessage(r);
	return r;
};

// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
	if (!posDiv)
		posDiv = locateStoreArea(original);
	if((posDiv[0] == -1) || (posDiv[1] == -1)) {
		alert(config.messages.invalidFileError.format([localPath]));
		return;
	}
	var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
				store.allTiddlersAsHtml() + "\n" +
				original.substr(posDiv[1]);
	var newSiteTitle = getPageTitle().htmlEncode();
	revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
	revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
	revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
	revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
	revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
	return revised;
};

//
// UploadLog
// 
// config.options.chkUploadLog :
//		false : no logging
//		true : logging
// config.options.txtUploadLogMaxLine :
//		-1 : no limit
//      0 :  no Log lines but UploadLog is still in place
//		n :  the last n lines are only kept
//		NaN : no limit (-1)

bidix.UploadLog = function() {
	if (!config.options.chkUploadLog) 
		return; // this.tiddler = null
	this.tiddler = store.getTiddler("UploadLog");
	if (!this.tiddler) {
		this.tiddler = new Tiddler();
		this.tiddler.title = "UploadLog";
		this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
		this.tiddler.created = new Date();
		this.tiddler.modifier = config.options.txtUserName;
		this.tiddler.modified = new Date();
		store.addTiddler(this.tiddler);
	}
	return this;
};

bidix.UploadLog.prototype.addText = function(text) {
	if (!this.tiddler)
		return;
	// retrieve maxLine when we need it
	var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
	if (isNaN(maxLine))
		maxLine = -1;
	// add text
	if (maxLine != 0) 
		this.tiddler.text = this.tiddler.text + text;
	// Trunck to maxLine
	if (maxLine >= 0) {
		var textArray = this.tiddler.text.split('\n');
		if (textArray.length > maxLine + 1)
			textArray.splice(1,textArray.length-1-maxLine);
			this.tiddler.text = textArray.join('\n');		
	}
	// update tiddler fields
	this.tiddler.modifier = config.options.txtUserName;
	this.tiddler.modified = new Date();
	store.addTiddler(this.tiddler);
	// refresh and notifiy for immediate update
	story.refreshTiddler(this.tiddler.title);
	store.notify(this.tiddler.title, true);
};

bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir,  backupDir) {
	if (!this.tiddler)
		return;
	var now = new Date();
	var text = "\n| ";
	var filename = bidix.basename(document.location.toString());
	if (!filename) filename = '/';
	text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
	text += config.options.txtUserName + " | ";
	text += "[["+filename+"|"+location + "]] |";
	text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
	text += uploadDir + " | ";
	text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
	text += backupDir + " |";
	this.addText(text);
};

bidix.UploadLog.prototype.endUpload = function(status) {
	if (!this.tiddler)
		return;
	this.addText(" "+status+" |");
};

//
// Utilities
// 

bidix.checkPlugin = function(plugin, major, minor, revision) {
	var ext = version.extensions[plugin];
	if (!
		(ext  && 
			((ext.major > major) || 
			((ext.major == major) && (ext.minor > minor))  ||
			((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
			// write error in PluginManager
			if (pluginInfo)
				pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
			eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
	}
};

bidix.dirname = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(0, lastpos);
	} else {
		return filePath.substring(0, filePath.lastIndexOf("\\"));
	}
};

bidix.basename = function(filePath) {
	if (!filePath) 
		return;
	var lastpos;
	if ((lastpos = filePath.lastIndexOf("#")) != -1) 
		filePath = filePath.substring(0, lastpos);
	if ((lastpos = filePath.lastIndexOf("/")) != -1) {
		return filePath.substring(lastpos + 1);
	} else
		return filePath.substring(filePath.lastIndexOf("\\")+1);
};

bidix.initOption = function(name,value) {
	if (!config.options[name])
		config.options[name] = value;
};

//
// Initializations
//

// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);

// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");

//optionsDesc
merge(config.optionsDesc,{
	txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
	txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
	txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
	txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
	txtUploadUserName: "Upload Username",
	pasUploadPassword: "Upload Password",
	chkUploadLog: "do Logging in UploadLog (default: true)",
	txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});

// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');


/* don't want this for tiddlyspot sites

// Backstage
merge(config.tasks,{
	uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");

*/


//}}}
<!--{{{-->
<!--- http://MonkeyPirateTiddlyWiki.TiddlySpot.com/#MptwViewTemplate ($Rev: 2247 $) --->

<div class='toolbar'>
	<span macro="showWhenTagged systemConfig">
		<span macro="toggleTag systemConfigDisable . '[[disable|systemConfigDisable]]'"></span>
	</span>
	<span macro="showWhenTagged palette">
		<span macro="setPalette"></span>
	</span>
	<span style="padding:1em;"></span>
	<span macro='toolbar closeTiddler closeOthers +permalink > editTiddler deleteTiddler fields syncing references jump'></span> <span macro='newHere label:"new here"'></span>
</div>

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

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

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

<div macro="showWhenExists ViewPanelTemplate">[[ViewPanelTemplate]]</div>

<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
	<div class='viewer' macro='view text wikified'></div>
</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="showWhenExists ViewDashboardTemplate">[[ViewDashboardTemplate]]</div>

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

<!--}}}-->
VoIP or Voice over Internet Protocol pretty much does what is says on the tin. In puts a call (voice) over the internet (via IP) in order to reach another terminal. This terminal can be a computer, a hard-wired telephone or a mobile device such as a 'cellphone' (excuse the American but you try and define a mobile device that is called, in english, a 'mobile') or a walkie-talkie.
Voice over IP, or [[VoIP|VoIP on the iPhone]] as it's often abbreviated to, is simply about putting your voice (aka a phone call) down the wire, over the internet and back out into someone else's ear. I'm not going to explain how it works or what's crap about it because that's what tech pages are made for (the sort of stuff I have to read all day). Anyways on with the point.

I'm currently on an O2, eighteen-month contract with no fair usage poilcy on the data up and download rates. Therefore I see an opportunity for overcoming the two-hundred or so minutes I get to use every month by writing an application to integrate with the [[Asterisk|http://www.asterisk.org/]] open-source call manager system (again you can look that up in the future). I'm currently working with my (annonymous) employer in an office whereby said technologies are tested for deployment on certain large scale networks. I'm taking my next job (in April) within the same company, but in a research capacity, working with said systems to develop an application for quick rollout of telephony to hard-to-reach places.

In here I see opportunity for development, so, come March, I'll get right on it. I've already mentioned it to a friend who's potentially more programming savvy with me in the necessary objective-C (again look it up) so it'll be definately something that I'll be going ahead with. Look out for it in the future as it'll have the BenJam seal on it, be open source and will be competing against a load of proprietry clients written by big men in suits.

I've just decided, I'll leave some references for the lazier among you to get up to speed on any techie components of this wiki/blog.
Hello and welcome to technological commentary from BenJam. On this site you'll find stuff I'm working on and stuff I'm not, stuff I'm interested in and not stuff I'm not, and finally stuff you are not possibly but maybe probably interested in reading... It'll make sense, trust me.
WiFi is another name for 802.11. Wireless media for data transfer ISO standards, boomshanka!
Oh comon, you know a Wii is. If you don't you've been hiding under the covers for way too long. Now get out of bed and into the world you agoraphobe. Look here for interesting ideas and tomfoolery using a Wii remote and an infra-red beam. Mmm tasty tasty ideas.
<<slider chkSliderOptionsPanel adminSlider "admin »" "TiddlyWiki authoring options">>
<<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
<<newTiddler>>
<<newJournal "DD MMM YYYY">>
<<saveChanges>>
[[autoCorrectWords]]
<<tiddler TspotSidebar>>
These words are in here to help me author quicker... Just trying to push out the thoughts onto the page. Now shoo!
/***
|''Name''|deliciousAdaptor|
|''Author''|[[Simon McManus|http://simonmcmanus.com]] |
|''Version''|0.1|

!Code

***/
//{{{

function deliciousAdaptor(){}
deliciousAdaptor.prototype = new AdaptorBase();
deliciousAdaptor.mimeType = 'application/json';
deliciousAdaptor.serverType = 'delicious';

// convert ISO 8601 timestamp to Date instance
function convertISOTimestamp1(str) { // TODO: rename
	var components = str.match(/(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)/);
	return new Date(components[1], components[2] - 1, components[3], components[4], components[5], components[6]);
}

deliciousAdaptor.doHttpGET = function(uri,callback,params,headers,data,contentType,username,password){
	uri = window.url+"/handle/proxy.php?feed="+uri;
    return doHttp('GET',uri,data,contentType,username,password,callback,params,headers);
};

deliciousAdaptor.prototype.getWorkspaceList = function(context,userParams,callback){
	context = this.setContext(context,userParams,callback);
	var uriTemplate = '%0?count=15';
	var uri = uriTemplate.format([context.host]);
	var req = deliciousAdaptor.doHttpGET(uri,deliciousAdaptor.getWorkspaceListCallback,context, null, "format=json");
	return typeof req == 'string' ? req : true;
};

deliciousAdaptor.createTiddler = function(data) {
	var date = convertISOTimestamp1(data.dt);
	var tiddler = new Tiddler(data.d);
	fields = {};
	fields["server.type"] = "delicious";
	tiddler.set(data.d,data.u+"\n\rTags:"+data.t,"modifier",date,"",date,fields);
	store.addTiddler(tiddler);
}

deliciousAdaptor.getWorkspaceListCallback = function(status,context,responseText,uri,xhr){
	var links = eval(" { " + responseText + " } ");
	var i=0;
	while(links[i]){
		deliciousAdaptor.createTiddler(links[i]);
    i++;
	}
	window.refreshDisplay();
};
config.adaptors[deliciousAdaptor.serverType] = deliciousAdaptor;
//}}}
Just excludes these tiddlers from RSS... nothing to see here...
/***
|''Name''|flickrAdaptor|
|''Author''|[[Simon McManus|http://simonmcmanus.com]] |
|''Version''|0.1|

!Code

***/
//{{{

function flickrAdaptor(){}

flickrAdaptor.prototype = new AdaptorBase();
flickrAdaptor.mimeType = 'application/json';
flickrAdaptor.serverType = 'flickr';

// convert short-month string (mmm) to month number (zero-based)
function convertShortMonth(text){
	for(var i = 0; i < config.messages.dates.shortMonths.length; i++) { // XXX: inefficient!?
		if(text == config.messages.dates.shortMonths[i]) {
			return i;
		}
	}
}

flickrAdaptor.doHttpGET = function(uri,callback,params,headers,data,contentType,username,password){
	uri = window.url+"/handle/proxy.php?feed="+uri;
    return doHttp('GET',uri,data,contentType,username,password,callback,params,headers);
};

flickrAdaptor.prototype.getWorkspaceList = function(context,userParams,callback){
	context = this.setContext(context,userParams,callback);
	var uriTemplate = '%0&format=json';
	var uri = uriTemplate.format([context.host]);
	var req = flickrAdaptor.doHttpGET(uri,flickrAdaptor.getWorkspaceListCallback,context, null, "format=json");
	return typeof req == 'string' ? req : true;
};

function createTiddler(i){
	var date = convertISOTimestamp1(i.published);
	var tiddler = new Tiddler(i.title);
	fields = {};
	fields["link"] = i.link;
	fields["server.type"] = "flickr";
	tiddler.set(i.title, i.media.m,"modifier",date,"",date,fields);
	store.addTiddler(tiddler);
}

function jsonFlickrFeed(o){
	return o; 
}

flickrAdaptor.getWorkspaceListCallback = function(status,context,responseText,uri,xhr){
	var pics = eval(" { " + responseText + " } ");
	var i=0;
  	while(pics.items[i]){
		createTiddler(pics.items[i]);
		i++;
	}
	
	if(context.callback)
		context.callback(context,context.userParams);
	window.callbackCount+1;
//	window.refreshDisplay();
};

config.adaptors[flickrAdaptor.serverType] = flickrAdaptor;
//}}}
So, after taking the half day off work and queuing for six hours it appears I'm the first person inthe UK to win an Apple [[iPhone|http://www.apple.com/iphone]]... which I'm rather happy about. I won it courtesy of the lovely people [[Cloud WiFi|http://www.thecloud.com]].
//{{{
config.macros.lifeStream = {};
config.macros.lifeStream.handler = function(place,macroName,params)
{
	var context = {};
	context.callback = function() {
		config.macros.lifeStream.display(place, params);
	};

	context.host = "http://twitter.com/statuses/user_timeline/benjam";
	var twitter = new twitterAdaptor();
	twitter.openHost();
	twitter.getWorkspaceList(context);
	
	var flickr = new flickrAdaptor();
	flickr.openHost();
	context.host = "http://api.flickr.com/services/feeds/photos_public.gne?id=10769774@N07";
	flickr.getWorkspaceList(context);
	
//	var delicious = new deliciousAdaptor();
//	delicious.openHost();
//	context.host = "http://feeds.delicious.com/v2/json/simonmcmanus";
//	delicious.getWorkspaceList(context);
	
//	var wordpress = new wordpressAdaptor();
//	wordpress.openHost();
//	context.host = "http://simonmcmanus.wordpress.com";
//	wordpress.getWorkspaceList(context);
	
//	var trac = new tracAdaptor();
//	trac.openHost();
//	context.host = "http://trac.tiddlywiki.org/timeline?format=rss";
//	trac.getWorkspaceList(context);
//	createTiddlyElement(place, "h4", null, null, "loading...");
};

config.macros.lifeStream.display = function (place, params)
{
	removeChildren(place);
	setStylesheet(".tiddler .button, .tiddler .button:hover {background-repeat:no-repeat;  margin:1px; float:none}"+
	".tiddler .button:hover,.tiddler .button	 {background-repeat:no-repeat; float:none;  }"+
	".textSpace {padding-top:1px}"+
	".tiddler .button, .tiddler .button:hover {padding:5px; margin:5px}"+
	".noFloat {float:none; background-color:red;}"+
	".stream { display: block; padding:1px; margin:1px ; max-width:500px;  min-height:30px; }"+
	".imgClass {float:left; display:block;padding-right:10px}");
	var tiddlers = store.reverseLookup("tags","excludeLists",false,"modified");
	var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1])) : 0;
	var div = createTiddlyElement(place, "div");
	for(var t=tiddlers.length-1; t>=last; t--) {
		switch(tiddlers[t].fields['server.type']){
			case "wordpress" :
				var img = createTiddlyElement(null, "img", null, "imgClass");
				img.src = "http://www.mrblogger.com/wp-content/wordpress-icon-128.png";
				img.width = "30";
				img.height = "30";
				img.style.border ="0px";
				var slider = config.macros.slider.createSlider(place, "", "");
				addClass(slider,"slider");
				var sliderButton = findRelated(slider,"button","className","previousSibling");
				addClass(sliderButton,"stream wordpressStream");
				sliderButton.appendChild(img);
				createTiddlyElement(sliderButton, "div", null, "textSpace", tiddlers[t].title);
				wikify("'''"+tiddlers[t].text+"'''\n\r"+tiddlers[t].fields["url"],slider);			
			break;
			case "trac":
				var img = createTiddlyElement(null, "img", null, "imgClass");
				img.src = "http://mousebender.files.wordpress.com/2007/07/trac_logo.png";
				img.width = "30";
				img.height = "30";
				var slider = config.macros.slider.createSlider(place, "", "");
				addClass(slider,"slider");
				var sliderButton = findRelated(slider,"button","className","previousSibling");
				addClass(sliderButton,"stream tracStream");
				sliderButton.appendChild(img);
				createTiddlyElement(sliderButton, "div", null, "textSpace", tiddlers[t].title);
				wikify(tiddlers[t].fields["url"],slider);			
			break;
			case "flickr":
				var img = createTiddlyElement(null, "img", null, "imgClass");
				img.src = tiddlers[t].text;
				img.width = "30";
				img.height = "30";
				var slider = config.macros.slider.createSlider(place, "");
				addClass(slider,"slider");
				var sliderButton = findRelated(slider,"button","className","previousSibling");
				sliderButton.appendChild(img);		
				createTiddlyElement(sliderButton, "div", null, "textSpace", tiddlers[t].title);
				addClass(sliderButton,"stream flickrStream");
				wikify("[img["+tiddlers[t].text+"]]\n\r"+tiddlers[t].fields['link']+"\n\r"+tiddlers[t].created,slider);
				createTiddlyElement(sliderButton, "div", null, "noFloat");
			break;
			case "twitter":
				var img = createTiddlyElement(null, "img", null, "imgClass");
				img.src = tiddlers[t].fields['user_img'];
				img.width = "30";
				img.height = "30";
				var slider = config.macros.slider.createSlider(place, "", "");
				addClass(slider,"slider");
				var sliderButton = findRelated(slider,"button","className","previousSibling");
				sliderButton.appendChild(img);
				
				var div = createTiddlyElement(sliderButton, "div", null, "textSpace");
				div.innerHTML =  wikifyStatic(tiddlers[t].text);
				addClass(sliderButton,"stream twitterStream");
				createTiddlyElement(sliderButton, "div", null, "noFloat");
				wikify(tiddlers[t].fields['url']+""+"\n\r"+tiddlers[t].created,slider);
			break;
			case "delicious":
				var img = createTiddlyElement(null, "img", null, "imgClass");
				img.src = "http://ransom.redjar.org/images/delicious_icon.gif";
				img.width = "30";
				img.height = "30";
				var slider = config.macros.slider.createSlider(place, "", "");
				addClass(slider,"slider");
				var sliderButton = findRelated(slider,"button","className","previousSibling");
				sliderButton.appendChild(img);
				createTiddlyElement(sliderButton, "div", null, "textSpace", tiddlers[t].title);
				addClass(sliderButton,"stream deliciousStream");
				wikify(tiddlers[t].text+"\n\r"+tiddlers[t].created,slider);
			break;
			default:
		}
	}
};
//}}}
<div title="lifestreamTheme" modifier="Simon McManus" modified="200708091500" tags="systemTheme excludeSearch excludeLists">
<pre>
/***
|''Name:''|lifestreamTheme|
|''Author:''|Saq Imtiaz and Simon McManus|
|''~CodeRepository:''|http://svn.TiddlyWiki.org/Trunk/association/themes/BleachTheme.tiddler |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.4.1|
|''~PageTemplate:''|##PageTemplate|
|''~tabs:''|##tabs|
|''~OptionsPanel:''|##OptionsPanel|
|''~StyleSheet:''|##StyleSheet|
|''~taskViewTemplate:''|##taskViewTemplate|
|''~taskEditTemplate:''|##taskEditTemplate|
|''~EditTemplate:''|##EditTemplate|
|''~ViewTemplate:''|##ViewTemplate|
|''~wizardViewTemplate:''|##wizardViewTemplate|
***/


!PageTemplate
<!--{{{-->
<div class='backgroundHeader'></div>
<meta name = "viewport" content = "width = 600">
<div class='header' macro='gradient vert [[ColorPalette::background]] [[ColorPalette::background]]'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span></span><div id='mainMenu' refresh='content' tiddler='MainMenu'></div>

</div>
<div id='bodywrapper'>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay' width=100%></div>
</div>
<div id='contentFooter'  macro='gradient vert [[ColorPalette::ls_mid]] [[ColorPalette::ls_background]]'></div>
</div>
<!--}}}-->

!EditTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></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>
<!--}}}-->

!ViewTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='subtitle'>Last edited by: <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='tagClear'></div>
<!--}}}-->

!wizardViewTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!OptionsPanel
[[help|Help]] <br />[[settings|AdvancedOptions]]<br />

!tabs
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>

!SideBarOptions
<<search "search...">><<closeAll>><<newTiddler label:"new task" text:"New Task" title:"New Task" tag:"task">><<newTiddler>><<slider chkSliderOptionsPanel lifestreamTheme##OptionsPanel 'options »' 'change TiddlyWiki Options'>><<saveChanges>><<slider 'chkLoginStatus' 'LoginStatus' '  status »' 'Login to make changes'>><<slider chkSliderTabs lifestreamTheme##tabs 'contents »' 'View TiddlyWiki Tabs'>>

!StyleSheet
/***
General
***/
/*{{{*/
.tiddler .button:hover {
	background-color:[[ColorPalette::ls_mid]];
}
.tiddler .button {
//	border:1px solid black;
	line-height:4;
	margin:5px;
	padding:8px;
}

body .chkOptionInput {
	width:auto;
	float:right;
}

#contentWrapper .wizard .txtOptionInput {
	width:7em;
}

body{
	color:[[ColorPalette::ls_foreground]];
	background-color:[[ColorPalette::ls_background]];
}

#backstageCloak {
	opacity:0.9; filter:'alpha(opacity:90)';
	background:[[ColorPalette::ls_mid]];
}

#messageArea {
	border:0px;
	color:white;
	background-color:[[ColorPalette::ls_mid]];
}

#messageArea .button{
	background:none;
}

#mainMenu br {
	display:none;
}

h1 {
	color:white;
}

#contentWrapper{
	position:relative;
	margin: 2.5em auto;
	width:600px;
	line-height: 1.6em;
	border:1px solid [[ColorPalette::ls_background]];
	font-size: 11px;
	font-family: Lucida Grande, Tahoma, Arial, Helvetica, sans-serif;
	height:1%;
	background-color:[[ColorPalette::ls_mid]];
}

.clearAll{
	clear:both;
}

.tagClear{
	clear:none;
}
/*}}}*/

/*{{{*/

.siteTitle {
	font-family: 'Trebuchet MS' sans-serif;
	font-weight: bold;
	position:relative;
	top:20px;
	left :20px;
	font-size: 32px;
	color:#eee;
}

.siteSubtitle {
	padding-top:15px;
	font-size: 1.0em;
	display:block; 
	color: #999; margin-top:0.5em !important; margin-top:1em; margin-left:3em;
}

#displayArea {
	width:96%;
	margin-left:1.35em;
	margin-right:16.3em;
	margin-top:0;
	padding-top:1em;
	padding-bottom:10px;
}

.tabUnselected {
	background:[[ColorPalette::ls_light]] none repeat scroll 0%;
	color:#111;
	padding-bottom:0px;	
}

#sidebar {
	position:inherit;
	float:right;
	display:inline;
}

#tiddlerDisplay .tagging, #tiddlerDisplay .tagged {
	background-color:[[ColorPalette::ls_mid]];
	border:none;
	float:none;
}

.sliderPanel .tabsetWrapper .tabContents {
	border-right:none;
	border-color:#999;
	background-color:[[ColorPalette::ls_background]];
}

#sidebarOptions .sliderPanel a{
	padding:3px;
	margin:0px;
	border:2px;
	background-color:[[ColorPalette::ls_background]];
}

.tabsetWrapper {
	position :relative;
}

#sidebar {
	padding-left:0.5em;
	background-color:[[ColorPalette::ls_mid]];
	padding-top:1em;
}

#sidebarOptions a {
	margin:17px;
	display:block;
	margin:0.5em 0em;
	padding:0.3em 0.6em;
}

.popup li a {
	padding:12px;
}
.toolbar {
	z-index:2;
	padding-right:34px;
}
#tiddlerDisplay .toolbar a.button, #sidebarOptions a, .toolbar .popup li a, #mainMenu a, #sidebarOptions .sliderPanel input {
	background-color:[[ColorPalette::ls_background]];
	color:#999;
	border:1px solid [[ColorPalette::ls_background]];
}

.wizard  .txtOptionInput {
	text-align:right;
}

a:hover {
	background-color:[[ColorPalette::ls_mid]];
	color:#eee
}

#tiddlerDisplay .toolbar a.button:hover, #sidebarOptions a:hover, #mainMenu a:hover, #sidebarOptions .sliderPanel input:hover {
	border:1px solid #000;
	background-color:[[ColorPalette::ls_background]];
	color:white;
}

#mainMenu a {
	padding:8px 15px 8px 15px;
	margin:10px;
	line-height:40px;
	border:1px solid [[ColorPalette::ls_background]];
}

#contentWrapper #mainMenu { 
	position:static;
	width:100%;
	float:left;
	text-align:left;
	padding-top:20px;


}





.editor textarea, .editor input,  input, body select {
	border:1px solid [[ColorPalette::ls_mid]];
	background-color:[[ColorPalette::SecondaryDark]];
	color:#999;
	padding:3px;
	margin:3px;
}

textarea {
	height:20em;
}

#sidebarOptions input {
	border:1px solid #999;
	background-color:#00000;
	width:10em;
}

#sidebarTabs {
	margin:0px;
	padding:0px
}

#sidebarTabs .tabContents {
	color:#eee;
	background:[[ColorPalette::ls_background]];
}
.tagged li
{
	display: inline;
}
#sideBarOptions .searchButton {
	display:none;
}

#sidebar .sliderPanel {
	border-color:-moz-use-text-color [[ColorPalette::ls_mid]] -moz-use-text-color -moz-use-text-color;
	border-style:none solid none none;
	border-width:0 1px 0 0;
	margin-bottom:0.8em;
	margin-left:5px;
	padding:0;
	margin-left:0px;
}

#sidebarOptions .searchButton {
	display:none;
}

.title {
	color:#C0C0C0;
}

.subtitle, .subtitle a {
	color: #999;
	font-size: 1em;margin:0.2em;
	font-variant: small-caps;
}

.wizard .button:hover{
	background-color:[[ColorPalette::SecondaryDark]];
	border:1px solid #444;
	color:white;
}
.selected .toolbar a {
	color:#999;
}

.selected .toolbar a:hover {
	color:[[ColorPalette::ls_mid]];
	background:transparent;
	border:1px solid #fff;
}

.viewer pre {
	background:[[ColorPalette::ls_background]]111 none repeat scroll 0 0;
	border:1px solid #FFEE88;
}

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

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

a,#sidebarOptions .sliderPanel a, #topMenu a, #topMenu .button {
	color:[[ColorPalette::ls_high]];
	background-color:transparent;
}

#sidebarOptions .sliderPanel a:hover, #topMenu a, #topMenu .button:hover {
	background-color:transparent;
	border:0px;
}

#topMenu a, #topMenu .button, .wizard .button {
	padding: 5px 15px;
	margin:9px;
	border:1px solid #999;
	font-weight:bold;
	line-height:40px;
	top:1em;
	color:#eee;
	background-color:[[ColorPalette::ls_mid]];
}

#topMenu br {
	display:none;
}

#topMenu a:hover, #topMenu .button:hover {
	background-color:[[ColorPalette::ls_mid]];
}

.tagging, .tagged {
	border: 1px solid #eee;
}

.highlight, .marked {
	background:transparent;
	color:[[ColorPalette::ls_background]];
	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:[[ColorPalette::ls_mid]];
}

.tiddler {
	padding-bottom: 5px;
}

.viewer th, thead td {
	background: [[ColorPalette::ls_mid]];
	border:none;
	color: #fff;
}

.viewer table {
	border:1px dotted [[ColorPalette::ls_mid]];
}

table.twtable {
	border-collapse:separate;
}

.viewer pre {
	border: 1px solid #999;
}

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

.tabSelected {
	background:[[ColorPalette::ls_background]] none repeat scroll 0%;
	border:1px solid [[ColorPalette::ls_background]];
	border-bottom:1px solid black;
	color:#999;
}

.tabContents {
	background:#f7f7f7;
	border:0px;
}

.viewer code {
	background:#[[ColorPalette::ls_mid]] none repeat scroll 0%;
color:#999;
}

h1,h2,h3,h4,h5 {
	color: #555; border-color:[[ColorPalette::SecondaryDark]]; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif;
}

h1 {
	font-size:18px;
}

h2 {
	font-size:16px;
}

h3 {
	font-size: 14px;
}

#contentFooter {
	background:#999;
	clear: both;
	padding: 0.5em 1em;
}

.wizard input {
	border:1px solid [[ColorPalette::SecondaryDark]];
}
#sidebarOptions input {
	border: 1px solid [[ColorPalette::ls_mid]];
}

.button {
	border:1px solid #999;
	padding:3px 9px;
	margin:3px 9px;
	background:[[ColorPalette::ls_background]];
}

.annotation {
	background-color:white;
	border:1px solid white;
	color:white;
}

.wizardFooter .button{
	background:[[ColorPalette::ls_mid]];
	margin:3px;
	padding:0.5em;
	padding-left:1.5em;
	padding-right:1.5em;
	color:white;
	border:1px solid [[ColorPalette::SecondaryDark]];
}
table, .viewer td, .viewer tr, .twtable td, .twtable tr {
	border:0px solid #666666;
}

.tagging .listTitle, .tagged .listTitle, .txtMainTab .tabContents li {
	color:white;
}

body .wizardFooter {
	padding : 0em 0px 0px 5px;
	background:none;
	font-weight:bold;}

.wizardStep {
	border:none;
	background-color:none;
}

body .wizard {
	width:80%;
	padding:10px;
	border:1px solid #EBE6F5;
}

.wizard  th{
	background:[[ColorPalette::ls_mid]];
	color:#888;
	padding:3px;
	margin:40px;
};

.wizard, listView twtable {
	border:0px;
};

.wizard {
	padding : 4px 14px 4px 14px;
	font-weight:bold;
	color:#292929;
	border:solid 0px #292929;
	margin-top:1px;
}

.viewer .wizard, body .wizard{
	background:[[ColorPalette::ls_background]];
	margin:2em;
	border:0px;
	border:1px solid [[ColorPalette::SecondaryDark]];
	color:#777;
}

.wizard h1{
	color:#999;
}

.wizard h2{
	padding:4px;
	color:white;
}

body .wizardStep{
	color:#999;
	border:0px;
	margin:0m;
	background:none;
}

body select {
	border:0px;
	padding:3px;
	margin:4px;
}

#backstagePanel {
	border:0px;
	background:none;
	width:60%;
	position:fixed
	padding:0px;
	margin:0px;
	margin-top:-36px;
}

#sidebar .sliderPanel {
	background-color:[[ColorPalette::ls_mid]];
	font-size:1em;
}

.viewer .wizardStep table {
	border:0px;
}

.viewer th, .viewer td, .viewer tr, .viewer caption, .twtable th, .twtable td, .twtable tr, .twtable caption {
	border:0px;
	padding:0px;
	margin:0px;
}

.viewer .sortable td  {
	padding:12px;
	margin:21px;
}

.title {
	color:#C0C0C0;
	padding:10px;
}

.viewer table, table.twtable {
	border-collapse:seperated;
	border:0px;
}

.viewer th, .viewer thead td, .twtable th, .twtable thead td {
	border:0px;
	color:white;
}

.twtable th{
	background-color:[[ColorPalette::SecondaryDark]];
	padding:15px;
	margin:15px;
}

table.sortable td.sortedCol {
	background-color:[[ColorPalette::SecondaryDark]];
}

#backstageArea a:hover, #backstageArea a.backstageSelTab {
	background-color:[[ColorPalette::ls_background]];
	color:white;
}
.backstageArea {
	display:none;
}

#contentWrapper .backgroundHeader {
	
	height:140px;
	position:absolute;
	width:100px;
	float:right;
	z-index:9000;
	background:url(http://75.101.136.11/simon.png);
	background-repeat:no-repeat;
	left :440px;
	background-position: top right;
	background-color:transparent;
	
}

.header {
padding-left:31px;
}

div.tiddler .tab {
 border:1px solid #444;
padding-bottom:1px;
border-bottom:0px;
}

a.tabUnselected:hover, a.tabSelected:hover {
background-color:transparent;
}

.tiddler .button, .tiddler .button:hover {background-repeat:no-repeat;  margin:1px;background-color:[[ColorPalette::SecondaryDark]];line-height:1.5; }
.stream {  padding:2px; margin:1px ; width750px;  min-height:53px;}
.slider { margin-left:20px; margin-top:-2px; padding:2px 10px 10px 30px; width:435px;border:0px solid [[ColorPalette::ls_background]]; padding-left:30px;border-top:0px; color:white; background-color:[[ColorPalette::ls_mid]]; }
.textSpace {padding-left:40px; line-height:1.5; padding-top:13px}
.tiddler .button:hover,.tiddler .button	 { background-color:[[ColorPalette::ls_background]]; color:white;background-repeat:no-repeat; border:0px solid  [[ColorPalette::ls_mid]];}


/*}}}*/

[[StyleSheet]]

</pre>
</div>
	
This is just a tag in order to tell my AutoCorrectPlugin not to auto correct my Tiddler, ignore it and he may go away.
config.options.txtTheme="BenJamTheme";
/***
|''Name''|flickrAdaptor|
|''Author''|[[Simon McManus|http://simonmcmanus.com]] |
|''Version''|0.1|

!Code

***/
//{{{
	
function twitterAdaptor(){}
	
twitterAdaptor.prototype = new AdaptorBase();
twitterAdaptor.mimeType = 'application/json';
twitterAdaptor.serverType = 'twitter';


// Thanks to FND for this fuction.
function convertShortMonth(text) {
    for(var i = 0; i < config.messages.dates.shortMonths.length; i++) { // XXX: inefficient!?
        if(text == config.messages.dates.shortMonths[i]) {
            return i;
        }
    }
}

// convert "mmm 0DD 0hh:0mm:0ss +0000 YYYY" to Date instance
function convertTimestamp(str) { // TODO: rename
	var components = str.match(/(\w+) (\d+) (\d+):(\d+):(\d+) \+\d+ (\d+)/);
	return new Date(components[6], convertShortMonth(components[1]), components[2],
		components[3], components[4], components[5]);
}


twitterAdaptor.doHttpGET = function(uri,callback,params,headers,data,contentType,username,password){
    return doHttp('GET',window.url+"/handle/proxy.php?feed="+uri,data,contentType,username,password,callback,params,headers);
};

twitterAdaptor.prototype.getWorkspaceList = function(context,userParams,callback){
	context = this.setContext(context,userParams,callback);
	var uriTemplate = '%0.json?';
	var uri = uriTemplate.format([context.host]);
	var req = twitterAdaptor.doHttpGET(uri,twitterAdaptor.getWorkspaceListCallback,context, {'accept':twitterAdaptor.mimeType});
	return typeof req == 'string' ? req : true;
};

twitterAdaptor.getWorkspaceListCallback = function(status,context,responseText,uri,xhr){
	context.status = false;
	eval('var tweets=' + responseText);
	var list = [];
	for (var i=0; i < tweets.length; i++) {
		var tiddler = new Tiddler(tweets[i]['id']);
		var timestamp = tweets[i]['created_at'];
		var created = convertTimestamp(timestamp);
		fields = {};
		fields["server.type"] = "twitter";
		fields["url"] = "http://twitter.com/"+tweets[i]['user']['name']+"/statuses/"+tweets[i]['id'];
		fields["user_img"] = tweets[i]['user']['profile_image_url'];
		tiddler.set("tweet_"+tweets[i]['id'],tweets[i]['text'],"modifier",created,"",created,fields);
		store.addTiddler(tiddler);
	}			
	context.tiddlers = list;
	context.status = true;		
	window.refreshDisplay();
};
config.adaptors[twitterAdaptor.serverType] = twitterAdaptor;
/***
|''Name''|wordpressAdaptor|
|''Author''|[[Simon McManus|http://simonmcmanus.com]] |
|''Version''|0.1|

!Code

***/
//{{{
	
function wordpressAdaptor(){}
	
wordpressAdaptor.prototype = new AdaptorBase();
wordpressAdaptor.mimeType = 'application/json';
wordpressAdaptor.serverType = 'wordpress';

wordpressAdaptor.convertShortMonth = function(text) {
    for(var i = 0; i < config.messages.dates.shortMonths.length; i++) { // XXX: inefficient!?
        if(text == config.messages.dates.shortMonths[i]) {
            return i;
        }
    }
};

wordpressAdaptor.convertTimestamp = function(str) { // TODO: rename
	var components = str.match(/(\d+) (\w+) (\d+) (\d+):(\d+):(\d+) \+\d+/);
	return new Date(components[3], wordpressAdaptor.convertShortMonth(components[2]), components[1],
		components[4], components[5], components[6]);
};


wordpressAdaptor.doHttpGET = function(uri,callback,params,headers,data,contentType,username,password){
    return doHttp('GET',window.url+"/handle/proxy.php?feed="+uri,data,contentType,username,password,callback,params,headers);
};

wordpressAdaptor.prototype.getWorkspaceList = function(context,userParams,callback){
	context = this.setContext(context,userParams,callback);
	var uriTemplate = '%0/?feed=rss2';
	var uri = uriTemplate.format([context.host]);
	var req = wordpressAdaptor.doHttpGET(uri,wordpressAdaptor.getWorkspaceListCallback,context, {'accept':wordpressAdaptor.mimeType});
	return typeof req == 'string' ? req : true;
};

wordpressAdaptor.getWorkspaceListCallback = function(status,context,responseText,uri,xhr){
	if(!context)
		context = {};
	context.tiddlers = [];
	responseText = responseText.replace(/\r+/mg,"");
	var regex_item = /<item>(.|\n)*?<\/item>/mg;
	var regex_title = /<title>(.|\n)*?<\/title>/mg;
	var regex_created = /<pubDate>(.|\n)*?<\/pubDate>/mg;
	var regex_link = /<link>(.|\n)*?<\/link>/mg;
	var regex_guid = /<guid>(.|\n)*?<\/guid>/mg;
	var regex_desc = /<description>(.|\n)*?<\/description>/mg;
	var item_match = responseText.match(regex_item);
	for (var i=0;i<item_match.length;i++) {
		item = {};
		var title = item_match[i].match(regex_title);	
		var created = item_match[i].match(regex_created);
		item.title = title[0].replace(/^<title>|<\/title>$/mg,"");
		item.title = item.title.htmlDecode();
		item.created = created[0].replace(/^<pubDate>|<\/pubDate>$/mg,"");
		item.created = wordpressAdaptor.convertTimestamp(item.created).convertToLocalYYYYMMDDHHMM().toString();
		desc = item_match[i].match(regex_desc);
		var link = item_match[i].match(regex_link);
		link = link[0].replace(/^<link>|<\/link>$/mg,"");
		if (desc) item.text = desc[0].replace(/^<description>|<\/description>$/mg,"");
		var t = new Tiddler(item.title);
		t.text = "" + item.text.htmlDecode() + "";	
		t.text = t.text.replace("<![CDATA[", "");
		t.text = t.text.replace("]]]>", "");
		t.fields["url"] = link;
		t.fields["server.type"] = "wordpress";
		t.set(item.title,t.text,"modifier",item.created,null,t.fields);
		store.addTiddler(t);
	}
	context.status = true;
	
	if(context.callback)
		context.callback(context,context.userParams);
};
config.adaptors[wordpressAdaptor.serverType] = wordpressAdaptor;