<!--{{{-->
<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 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 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:0 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 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding: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 0;}
.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 0 0 0.5em;}
.tab {margin:0 0 0 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 0 14em;}

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

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

.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:0 0.25em; padding:0 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 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin: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;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding: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;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<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 excludeLists'></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>>
Type the text for '12 July 2010'
- vt. To inform; to make familiar with.

You may find something interesting on this site if you are in to..

* <<slider tagSailing Sailing "Sailing »" "List everything tagged as Sailing related">>
* <<slider tagLinux Linux "Linux »" "List everything tagged as Linux">>
* <<slider tagOptics Optics "Optics »" "List everything tagged as Optics">>
* <<slider tagBeer Beer "Home Brewing »" "List everything tagged as Beer">>
* <<slider tagMusic Music "Music Theory »" "List everything tagged as Music">>
* <<slider tagPhysics Physics "Physics »" "List everything tagged as Physics">>
* <<slider tagPhotography Photography "Photography »" "List everything tagged as Photography">>

<<tiddler HideTiddlerTags>>
<<tiddler HideTiddlerSubtitle>>
<<tiddler HideTiddlerToolbar>>
I added Google analytics to TiddlyWiki by following these two guides:
http://hawksworx.posterous.com/tracking-tiddlywiki-with-google-analytics
http://blog.spacelag.com/2007/10/tracking-tiddlywiki-with-google.html

This boiled down to simply adding this to the MarkupPostHead shadow tiddler:
{{{
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
}}}

and then creating a tiddler by the name of [[zCustomTracker]] with the following content (and tagging is with systemConfig):
{{{
{{{
// Specify your account number here!
_uacct = "UA-1234567-1";

// zCustomTracker as a namespace for tracking related functions
var zCustomTracker = {
// store a reference to the original displayTiddler function
displayTiddler: story.displayTiddler
};

zCustomTracker.track = function() {
if (readOnly) {
urchinTracker.apply(this, arguments);
}
};

zCustomTracker.trackAndDisplayTiddler = function(srcElement, titles) {
// log with the tracker
zCustomTracker.track('/' + titles);
// call the original displayTiddler function
zCustomTracker.displayTiddler.apply(this,arguments);
};

// replace the default displayTiddler function with a tracking version
story.displayTiddler = zCustomTracker.trackAndDisplayTiddler;

// Call once for the initial page load
zCustomTracker.track();
}}}
Of course, change the account number to match that of the site. Also note that I changed the tiddler name (and all the references withing the script) to zCustomTracker which fixes an issue I had where using this broke singlepagemode. I suspect it was due fragility in the order in which systemConfig tiddlers are loaded. Perhaps one just needs to ensure that inlinejavascript is loaded before this, but I'm not sure at the moment. 
<<tagging>>
Update!!: I recently spent many an hour trying to compare what had changed in the kernel source that was causing my newest custom kernel to not boot. Turns out, it had no initrd because of a change in kernel-package. The following will still work as it always did (better in fact, now that make-kpkg rebuilds easier after small changes to source), but first you must make sure you have copied initramfs scripts to /etc/kernel:

This only needs to be done once on a machine: 
{{{
cp /usr/share/kernel-package/examples/etc/kernel/postinst.d/initramfs /etc/kernel/postinst.d/
cp /usr/share/kernel-package/examples/etc/kernel/postrm.d/initramfs /etc/kernel/postrm.d/
}}}

Download and untar:
{{{
tar -jxf linux-2.x.x.tar.bz2
}}}

Patch if you want:
{{{
mv patchfile linux-2.x.x/
patch -p1 < patchfile
}}}

Configure:
{{{
make xconfig
}}}
If you use {{{"make xconfig"}}}, it will attempt to set all the options the same as the currently running kernel. On the command line, you will see all the options that failed because they no longer exist in the current kernel source. It's a good idea to glance through them. Also, in the xconfig window, any new options will be marked 'new' and you will want to set them. The problem with this is that it is easy to miss some new options.
{{{
make oldconfig
}}}
This sets all the options as above, but from the command line it steps through and asks specifically what to set for any options that are new. This is the best way, except that you can't easily jump around to different sections and it can take a while if the new kernel is much different from the currently running kernel.

Compile and package:
If you have multiple processors or multiple cores, make sure you:
{{{
export CONCURRENCY_LEVEL=2
}}}
which allows make-kpkg to split things up and go way faster (don't use the gcc flag directly). I set this in my bashrc.
This is the spiffy part. You should have things like fakeroot, make-kpkg, etc installed, then you do all this in one step:
{{{
fakeroot make-kpkg --initrd --append-to-version=-jdr kernel_image
}}}
Where I append -jdr to my kernel name.

Bam! Now, you just 
{{{
dpkg -i linux-image-*-jdr*.deb
}}}
and rejoice
- vt. To record.

Notes and miniHowtos on how to get some things done (or at least how I did it).

<<list filter [tag[Notes]][sort[-modified]]>>

<<tiddler HideTiddlerTags>>
<<tiddler HideTiddlerSubtitle>>
<<tiddler HideTiddlerToolbar>>
- vt. To behave in a specified manner; to behave in a manner conformable to what is right, proper, or expected.

For more information on my academic work, visit my [[academic site|http:/ultraviolet.bme.northwestern.edu/~jdrogers]] where you wile find a list of publications and information about my research.

<<tiddler HideTiddlerTags>>
<<tiddler HideTiddlerSubtitle>>
<<tiddler HideTiddlerToolbar>>
Installing tp_smapi in ubuntu is really easy: 
{{{
aptitude install tp-smapi-source
module-assistant prepare tp-smapi
module-assistant auto-install tp-smapi
}}}

I used to use a script to set the charging thresholds:
{{{
echo 40 > /sys/devices/platform/smapi/BAT0/start_charge_thresh
echo 70 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh
}}}

But now I use /etc/sysfs.conf to set them as well as a couple other things. Here is what I added to the default /etc/sysfs.conf:
{{{
# added by JDR for battery charging friendliness and power saving 
devices/platform/smapi/BAT0/start_charge_thresh=60
devices/platform/smapi/BAT0/stop_charge_thresh=100
module/snd_hda_intel/parameters/power_save=1
devices/platform/thinkpad_acpi/bluetooth_enable=0
}}}
[[Acquaint]]
- v. To ramble; digress.

Random thoughts organized by date..  probably best described as a Blog.

<<list filter [tag[Blog]][sort[-created]]>>

<<tiddler HideTiddlerTags>>
<<tiddler HideTiddlerSubtitle>>
<<tiddler HideTiddlerToolbar>>
- vt. to pour out; disseminate.

Code, programs, tools, etc. written by J. D. Rogers

//All code on this page is Copyright J. D. Rogers. Please use, copy, modify and redistribute anything you find here, but please give credit where due. I prefer to keep a running list of authors in the top of the code, so add your name, write some code, and have fun.//
!!Programs
<<<
!!!~MCML_mpi
''MCML for parallel processing,'' for example on clusters or multiprocessor workstations.
[[MCML|http://labs.seas.wustl.edu/bme/Wang/mc.html]] is a multi-layered [[Monte Carlo|http://omlc.ogi.edu/software/mc]] simulation for studying light transport in random media. It was written by [[Steve Jacques|http://www.bme.ogi.edu/biomedicaloptics/jacques/]] and [[Lihong Wang|http://labs.seas.wustl.edu/bme/Wang/]] for light scattering in biological tissue (or other random media). This version is the minimal modification to the original that adds MPI support. Message Passing Interface (MPI) allows the code to be run in parallel across many processors (or cores) such as clusters, multi-processors workstations, etc. You will need a working installation of MPI such as [[open-mpi|http://www.open-mpi.org]].
* README
* tarball
* zip file
* Patch file

!!!nscat_MCML
''MCML modified to track and bin the number of scattering events'', and other parameters.
It also uses a more general 3-parameter phase function based on the ~Whittle-Matern correlation function. The phase function includes exponential, stretched-exponential, ~Henyey-Greenstein and mass-fractal type scattering functions.
<<<
!!Code snippets, matlab routines, etc
<<<
!!!Matlab routines
* pr2lebs
<<<

<<tiddler HideTiddlerTags>>
<<tiddler HideTiddlerSubtitle>>
<<tiddler HideTiddlerToolbar>>
About a year ago, I decided to start using full disk encryption on my portable USB disk that I use for a backup. The disk died (at least the usb connector part), but fortunately the warrenty was good for 2 more week, so Western Digital just sent me a replacement. Now I have to go through the process again, but sadly I didn't document it the first time, so here goes:

!!! Step 1: Fill the drive with random data
Most howtos suggest either using the program 'badblocks' or 'dd if=/dev/urandom of=/dev/sdx'. The rate of writing with dd was 2.5MB/s which would take about 100 hours to complete on the 1TB drive. Instead, I used 
{{{
shred -v -n 1 /dev/sdx
}}}
which took 10 hours. I suspect that shred uses a simple pseudo random number generator. Perhaps the data is less random than /dev/urandom, but good enough for my purposes and 10x faster. 

!!! Step 2: partition the drive 
I've always been a fan of cfdisk: 
{{{
cfdisk /dev/sdx
}}}
Start with a zeroed partition table, create a primary partition 995GB type linux. Place a small 5GB partition at the end with type "hidden NTFS". Make the small partition bootable. 
Since I am formatting this disk as ext, it will not be easy to access the data in the event that I find myself with my portable drive surrounded by windows machines. This small partition will be used to install a bootable image using the 'startup-disk-creator' tool in ubuntu. The partition is hidden, so it does not automount when I plug the drive into a running linux system, but I can boot from it and have a running linux system on any computer from which I can mount and access the encrypted data. (I think this is pretty slick.)

!!! Step 3: Create hidden bootable linux drive
Format the ntfs partition:
{{{
mkfs.ntfs /dev/sdx2
}}}
Now install ubuntu on this partition using the 'startup-disk-creator' tool in ubuntu. Need to download a recent iso of ubuntu. Optionally, some of the space can be used as writable loopback file where changes can be written when using the bootable image. 

!!! Step 4: Setup encrypted partition
{{{
cryptsetup luksFormat /dev/sdx1
cryptsetup luksOpen /dev/sdx1 DriveName
mkfs.ext4 -m .1 /dev/mapper/DriveName
cryptsetup luksClose DriveName
}}}
The '-m .1' reduces the blocks reserved for root to 0.1%. With a 1TB drive, the default 5% is an insanely large 50GB. On a removable backup drive, 1GB = 0.1% should be plenty. 

The nice thing about creating the 'DriveName' label is that when Ubuntu automounts the drive, it will show up (after entering the passphrase) as an icon with this name on the desktop and be mounted at /media/DriveName. Choose something meaningful and unique to this particular backup drive and you can use the name in backup scripts and such. Very convenient.

Now simply unplug the device and plug it back in, and it should automatically popup a passphrase dialog box. Enter the passphrase you entered for cryptsetup, and bam, your encrypted backup drive is mounted and ready for data.

If you need to access the data from a windows machine, the easiest method is to plug the drive in and reboot the machine. Most BIOSes will have a key like F12 that produces a boot menu. Boot from the usb drive, and the bootable drive you installed in step 3 will load. Once booted, you can select the backup drive from the "places" menu, enter your passphrase, and access your encrypted data. 

Enjoy.
Walker's response to "Tell me one thing about the camera?"
Zemax works in a windows virtual machine just fine, but we need to setup usb permissions to access the dongle.

First, create a groups called usbusers and add the user to it who will be running the VM:
{{{sudo addgroup usbusers}}}
{{{sudo addgroup <username> usbusers}}}
Logout and login again to get the group to take effect. Next, create a udev rule to give the usb dongle the correct permissions when it is plugged in. Make a file
{{{vi /etc/udev/rules.d/60-zemaxkey.rules}}} 
containing
{{{
SUBSYSTEM!="usb_device", ACTION!="add", GOTO="key_rules_end"
# Zemax Key
SYSFS{idVendor}=="04b9", SYSFS{idProduct}=="8000", GROUP="usbusers", MODE="0660"
LABEL="key_rules_end"
}}}
and restart udev:
{{{restart udev}}}
/%
|Name|HideTiddlerSubtitle|
|Source|http://www.TiddlyTools.com/#HideTiddlerSubtitle|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|hide a tiddler's subtitle (dates/created by) display|

Usage: <<tiddler HideTiddlerSubtitle>>

%/<script>
	var t=story.findContainingTiddler(place);
	if (!t || t.id=="tiddlerHideTiddlerSubtitle") return;
	var nodes=t.getElementsByTagName("*");
	for (var i=0; i<nodes.length; i++)
		if (hasClass(nodes[i],"subtitle"))
			nodes[i].style.display="none";
</script>
/%
|Name|HideTiddlerTags|
|Source|http://www.TiddlyTools.com/#HideTiddlerTags|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|hide a tiddler's tagged/tagging display elements|

Usage: <<tiddler HideTiddlerTags>>

%/<script>
	var t=story.findContainingTiddler(place);
	if (!t || t.id=="tiddlerHideTiddlerTags") return;
	var nodes=t.getElementsByTagName("div");
	for (var i=0; i<nodes.length; i++)
		if (hasClass(nodes[i],"tagged"))
			nodes[i].style.display="none";
</script>
/%
|Name|HideTiddlerToolbar|
|Source|http://www.TiddlyTools.com/#HideTiddlerToolbar|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|hide a tiddler's toolbar display|

Usage: <<tiddler HideTiddlerToolbar>>

%/<script>
	var t=story.findContainingTiddler(place);
	if (!t || t.id=="tiddlerHideTiddlerToolbar") return;
	var nodes=t.getElementsByTagName("*");
	for (var i=0; i<nodes.length; i++)
		if (hasClass(nodes[i],"toolbar"))
			nodes[i].style.display="none";
</script>
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.4|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 3, date: new Date(2008,6,11)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",

	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var src=lookaheadMatch[1];
			var label=lookaheadMatch[2];
			var tip=lookaheadMatch[3];
			var key=lookaheadMatch[4];
			var show=lookaheadMatch[5];
			var code=lookaheadMatch[6];
			if (src) { // load a script library
				// make script tag, set src, add to body to execute, then remove for cleanup
				var script = document.createElement("script"); script.src = src;
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (code) { // there is script code
				if (show) // show inline script code in tiddler output
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (label) { // create a link to an 'onclick' script
					// add a link, define click handler, save code in link (pass 'place'), set link attributes
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
					var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
					link.code="function _out(place){"+fixup+"\n};_out(this);"
					link.tiddler=w.tiddler;
					link.onclick=function(){
						this.bufferedHTML="";
						try{ var r=eval(this.code);
							if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
								var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
							if(this.bufferedHTML.length)
								s.innerHTML=this.bufferedHTML;
							if((typeof(r)==="string")&&r.length) {
								wikify(r,s,null,this.tiddler);
								return false;
							} else return r!==undefined?r:false;
						} catch(e){alert(e.description||e.toString());return false;}
					};
					link.setAttribute("title",tip||"");
					var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
					URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
					URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
					link.setAttribute("href",URIcode);
					link.style.cursor="pointer";
					if (key) link.accessKey=key.substr(0,1); // single character only
				}
				else { // run inline script code
					var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
					var c="function _out(place){"+fixup+"\n};_out(w.output);";
					try	 { var out=eval(c); }
					catch(e) { out=e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
				}
			}
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} )
//}}}

// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
	if(limit > 0) text = text.substr(0,limit);
	var wikifier = new Wikifier(text,formatter,null,tiddler);
	return wikifier.wikifyPlain();
}
//}}}

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
For some reason, I seem to be learning music backwards. Apparently, most people would only start learning music theory and physics of music after becoming a more or less accomplished musician. Well I bought a guitar in 1999 because I had moved to a new state and didn't know anyone and had no TV, so I thought it would be a good time to teach myself how to play. Ten years later, my guitar has lived in 3 states at all ends of the country, suffered some terrible abuse, and I could still only play a small handful of intro riffs. 

Part of my problem is that I was always frustrated by the illogical and seemingly arbitrary aspects of music. 
# Why are there 12 equally spaced notes in an //octave//?
# Why are some notes called sharp and some flat when the frequency interval between all 12 notes is the same?
# Why does a scale skip some notes (sharps and flats in C major)?
# If C major is the most basic scale (skipping sharps and flats), why does the major scale start with C?
# Why is a C# the same as a Db? 
# Why do some notes have sharps and flats while others do not?
..and so on. 

Recently, I started to learn the answers so some of these questions, and for the first time, I started to actually keep up my interest long enough to learn how to play some music! (It helps that I have been sharing an office with a very accomplished musician who also happens to understand a great deal of music theory. It also helps that I finally decided to take advantage of the [[Old Town|http://www.oldtownschool.org]] music school only a block down the street and take some lessons.) As I have learned about the physics of music, my interest and appreciation has soared. 

I think it really comes down to learning style, and I happen to prefer knowing the 'reason' behind something before I can accept the need to memorize. I started looking for physical explanations of music, and I was surprised to find that one of the best websites on the topic is by a Professor I had in undergrad. His [[site|http://www.phy.mtu.edu/~suits/Physicsofmusic.html]] has answers to many of the questions that had been nagging me. 

I know many fantastic musicians would never need to consider these ideas to be great at what they do. And I know I will never be a fantastic musician. But I find that learning music backwards, that is learning the theory behind scale before I learn to play a scale, has been the key to unlocking my interest in music. 

* My thoughts on the logic behind [[Music theory]]
* [[Music theory links]]
Dummy Tiddler on Optics
<<list filter [tag[Linux]]>>
- v. To work, study or write laboriously, especially late at night.

!!!Some poems, songs, short stories and other creative writings and artwork.

[>img[pics/JD_knot.png]] I like knots, and thought of a cool logo for the site based on a knot. I also made a shadow to emphasize the parts that make my initials. Neat.



<<tiddler HideTiddlerTags>>
<<tiddler HideTiddlerSubtitle>>
<<tiddler HideTiddlerToolbar>>
/%[[About]]
[[Publications]]
[[Research]]
[[Code]]%/
/%<html><a href=slatch.html#Acquaint title="About" class="tiddlyLinkExisting">Acquaint</a></html>
<html><a href=slatch.html#Divigate title="Blog" class="tiddlyLinkExisting">Divigate</a></html>
<html><a href=slatch.html#Chronicle title="Notes on how to do things" class="tiddlyLinkExisting">Chronicle</a></html>
<html><a href=slatch.html#Lucubrate title="Creative writing" class="tiddlyLinkExisting">Lucubrate</a></html>
<html><a href=slatch.html#Comport title="Academic work" class="tiddlyLinkExisting">Comport</a></html>
<html><a href=slatch.html#Effuse title="Code" class="tiddlyLinkExisting">Effuse</a></html>
<html><a href=slatch.html#Vaunt title="Photography" class="tiddlyLinkExisting">Vaunt</a></html>%/
[[Acquaint]]<<tiddler {{place.lastChild.title='About';''}}>>
[[Divigate]]<<tiddler {{place.lastChild.title='Blog';''}}>>
[[Chronicle]]<<tiddler {{place.lastChild.title='Notes on how to do things';''}}>>
[[Lucubrate]]<<tiddler {{place.lastChild.title='Creative writing';''}}>>
[[Comport]]<<tiddler {{place.lastChild.title='Academic work';''}}>>
[[Effuse]]<<tiddler {{place.lastChild.title='Code';''}}>>
[[Vaunt]]<<tiddler {{place.lastChild.title='Photography';''}}>>
Saving a movie in matlab creates and avi that is absurdly huge. There are almost an infinite number of options in converting to various movie formats. Many reduce the resolution or use compression that results in visible artifacts and degraded quality. Others leave the filesize huge. After playing with a number of options, the following seems to produce a very small file with good visual quality. 

{{{
mkfifo tmp.fifo.yuv

mencoder -vf format=i420 -nosound -ovc raw -of rawvideo -ofps 23.976 -o tmp.fifo.yuv inputfile.avi 2>&1 > /dev/null &

x264 -o outputfile.mp4 --fps 23.976 --bframes 2 --progress --crf 26 --subme 6 --analyse p8x8,b8x8,i4x4,p4x4 --no-psnr tmp.fifo.yuv 720x480

rm tmp.fifo.yuv
}}}
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
<<tagging>>
Much of music, like language, is rooted in tradition and has a long legacy. That legacy is a beautiful and fascinating history, but can make learning music (at least for [[me|Learning music backwards]]) awkward and frustrating. In these pages, I attempt to organize and explain what I have learned about music in as much a logical manner as possible.

!! Pitch (frequency) and tone
For the most part, our ears hear musical notes as relative to one another. With our eyes, we detect electromagnetic oscillations at different frequencies as color. We know when something is red or blue but we don't refer to a lemon as 'bluer' than an apple, even though the frequency of yellow is higher and closer to blue than the frequency we see as red. However, with our ears, we do perceive the frequency of the air pressure waves on a relative scale. There are some people who have 'perfect pitch' and can tell the note of a single isolated frequency. For the rest of us, what matters is the separation or 'interval' between two notes of different pitch. In the world of physics, pitch is called frequency and is measured in Hertz [Hz] which is the number of oscillations per second. A frequency of 440Hz (standardly used as the note "A" in western music) is produced by a string (or speaker) vibrating up and down 440 times a second.
[<img[Frequency|music/freq.png]] 
In this figure, the sound wave has 4 complete oscillations in 1 second, so the frequency is 4 Hz. The y-axis can be thought of as the position of a point on a vibrating string, the position of a speaker cone being driven by the magnetic coil, or the relative air pressure at the listener's eardrum. Of course, 4 Hz is below the limit of human hearing, which spans the range of frequencies from approximately 20 Hz to 20 kHz. 

The human ear is sensitive to changes in pitch on a logarithmic scale meaning that if you hum a series of notes of increasing pitch, the higher frequencies will be separated by a larger frequency even though the interval sounds about the same. For example, the difference in pitch from 20 to 30 Hz sounds much like the difference in pitch from 10,000 Hz to 15,000 Hz even though the first interval is 10 Hz and the second is 5,000 Hz.

Pitch is what those in the the physics world call frequency.

Tone is a bit more abstract. From what I can tell, in music, tone refers to the 'quality' of the note. I suspect that tone depends on the exact spectrum of frequencies produce by a voice or instrument playing a particular note. In physics, we like to idealize and simplify a system to describe it, but even a single vibrating string on an instrument will excite harmonics and background vibrations across the whole frequency spectrum to various levels unique to each instrument or voice. As an extreme example, think of a trumpet and a violin playing the same note. Although the dominate pitch is the same, the perceived sound is quite different.


!! Melody and Harmony
[>img[Harmonics|music/harmonics.png]]
A nice sequence of individual notes is called a melody. Some melodies are very catchy and pleasant to listen to, but playing one note at a time only captures a small fraction of the potential of music. Playing several notes together is called harmony. Some notes sound very pleasant together, but others do not. Pleasant harmonies occur when the frequencies of the notes are related to each other in a resonant way.

The simplest resonant relationship is one where a second tone is twice the frequency of the first. These two tones are an octave apart. In a string instrument, for each oscillation of the string of the first tone, the string of the second tone oscillates twice. Since these tones sound so similar to each other, they are given the same note name (i.e. A, B, C, or Fa, Sol, La, etc.). Two notes of the same name are always 2^^n^^ multiples of the frequency of the lowest note. So a C note 1 octave above middle C would be vibrating 2^^1^^ times or twice as fast as middle C. The C note 3 octaves higher would be 2^^3^^ or 8 times the frequency of middle C. 

You don't have to double the frequency to get a harmony. If the second note is 4/3 the frequency of the lower note, the 2nd string oscillates 4 times for every 3 oscillations of the 1st (C to F). A ratio of 3/2 (C to G) and 5/3 (C to A) also works well.

!! Notes and Temperament 
One of the most fascinating (and for me, puzzling) aspects of music is the octave. 
* Why are only certain pitches given the status of a note?
* Why is the octave divided up into 12 notes when the term 'octave' implies 8?
* Why are scales irregular intervals of tone? 
...and so on.

The logic (and math) behind music finally started to fall into place for me during a whiteboard conversation with my friend Ilker Capoglu. From the previous section, we saw that notes sound pleasant together when the frequencies are related to each other by simple whole number fractions. The simplest fraction is 1/2 which corresponds to and octave. The other significant fractions between 1 and 1/2 are 2/3, 3/4, and 4/5. If we take the lower frequency as our reference, these fractions become 2, 3/2, 4/3, and 5/4. So we arrive at the most basic requirement for any system of notes.

[<img[Temperament|music/temperament.png]]  The figure at the left shows these fractions as the colored horizontal lines. Now, it would be nice to divide the octave into equal divisions so that we can repeat it or start at any point and find the same pattern of relationships between notes. This is the second requirement for a system of notes: we need to divide the range of pitches that spans a doubling of frequency into equal parts. In the previous section we noted that notes that are double, triple or n times the frequency have the same name and are related by 2^^n^^. Now we use the same relationship but allow the exponent to be a fraction less than one.  

To divide the octave into x equal parts, we use an interval of 2^^1/x^^ or the xth root of 2. The vertical lines on the figure represent  an increasing number of such divisions. As one can see, the smallest number of equal divisions that lines up well with our first requirement (notes that include frequencies very close to the horizontal colored lines) is x=12.  By dividing the octave into 12 equal parts, we come very close to including the frequencies that sound so pleasant because of their fractional relationship. The system of tuning that uses precisely equal increments this was is called equal temperament. See the references section for an excellent book about the history and development of temperament.

!! Scales
Not all of these 12 notes are used at the same time since not all of these notes will have the pleasing resonant quality. The octave is therefor reduced to 7 notes the eighth being the octave. Aha, now we can see why the word octave meaning eight use used to refer to a doubling of frequency split up int o12 notes.

[>img[scales|music/scales.png]]The western major scale drops notes such that the interval pattern is 
2-2-1-2-2-2-1
where a 2 represents a jump of 2 notes, 1 a jump of 1 note. Applying this pattern to any starting note, we can get the major scales for any key. A key is just the pattern applied to a particular note, i.e. the C-major scale is the major pattern with the C note as the starting point. A minor scale drops some different notes and has the pattern
2-1-2-2-1-2-2
For both these patterns, the important ratios of 3/2 and 4/3 are present. More on this is discussed at http://www.phy.mtu.edu/~suits/west_scales.html


!! References
# http://www.phy.mtu.edu/~suits/Physicsofmusic.html  -  Some excellent notes on the Physics of Music by Physics Prof. B. Suits of Michigan Tech.
# //Temperament//, Stuart Isacoff, Random House, 2001.  -  A fantastic book interweaving history, philosophy, science, and technology with the history of tuning.
Here is a list of links and resources pertaining to music theory and physics of music. Also, some links to nice software tools.

!!! Music theory
* Prof. Brian Suits' site on the [[Physics of Music|http://www.phy.mtu.edu/~suits/Physicsofmusic.html]]

!!! Useful music software
* A small [[program|http://www.arachnoid.com/signal_processing/fft.html]] to see a real time fourier transform (frequency plot) of the sounds heard by your microphone. I had to add some include lines for cstdio to avoid some sscanf errors on compile. 
rogersjd (at) gmail
(dot) com

Copyright © 2009
by J.D. Rogers
<<tagging>>
<!--{{{-->
<div id='header' class='header'>
<div class='headerShadow'>

<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>

</div>
<div id='mainMenu'>
<span refresh='content' tiddler='MainMenu'></span>
<span id='noticeBoard' refresh='content' tiddler='NoticeBoard'></span>

</div>
<div id='sidebar'>
<span class='searchBar' macro='search'></span>
<div id='sidebarOptions' refresh='content' tiddler='MochaSideBarOptions'></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 id='contentFooter' refresh='content' tiddler='contentFooter'></div>
<!--}}}-->
<<tagging>>
<<tagging>>
/%
|Name|ReplaceDoubleClick|
|Source|http://www.TiddlyTools.com/#ReplaceDoubleClick|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides|tiddler background click and doubleclick handlers|
|Description|disable doubleclick-to-edit-tiddler or replace doubleclick with shift/ctrl/alt+singleclick|

Usage:
	in tiddler content:
		<<tiddler ReplaceDoubleClick>> or
		<<tiddler ReplaceDoubleClick with: key trigger>>
	in ViewTemplate:
		<span macro="tiddler ReplaceDoubleClick"></span> or
		<span macro="tiddler ReplaceDoubleClick with: key trigger"></span>
where: 
	'key' (optional) is one of: none (default), ctrl, shift, or alt
	'trigger' (optional) is one of: click, doubleclick (default)

* if no key parameter (or "none") is specified, then the double-click action is **disabled** for that tiddler.
* if a key (other than none) is specified, the doubleclick action for the tiddler will only be invoked
	when the key+trigger combination is used.
* note: double-clicking will also trigger the single-click handler.  As a result, when 'click' option is specified,
	either click OR double-click (plus the specified key) will trigger the action.

Revisions:
2.0.0 renamed from ShiftClickToEdit and merged with DoubleClickDisable and added support specifying alternative key+click combination

%/<script>
	var here=story.findContainingTiddler(place); if (!here) return;
	if (here.ondblclick) {
		here.setAttribute("editKey","none");
		if ("$1"=="shift" || "$1"=="ctrl" || "$1"=="alt")
			here.setAttribute("editKey","$1"+"Key");
		var trigger=("$2"=="click")?"onclick":"ondblclick";
		here.save_dblclick=here.ondblclick;
		here.ondblclick=null;
		if (here.getAttribute("editKey")!="none")
			here[trigger]=function(e) {
				var ev=e?e:window.event;
				if (ev[this.getAttribute("editKey")])
					this.save_dblclick.apply(this,arguments);
			}
	}
</script>
<<tagging>>
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.9.6|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler(), Story.prototype.displayTiddlers()|
|Options|##Configuration|
|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|
This plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.
!!!!!Documentation
>see [[SinglePageModePluginInfo]]
!!!!!Configuration
<<<
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)

Notes:
* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2008.10.17 [2.9.6] changed chkSinglePageAutoScroll default to false
| Please see [[SinglePageModePluginInfo]] for previous revision details |
2005.08.15 [1.0.0] Initial Release.  Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 6, date: new Date(2008,10,17)};
//}}}
//{{{
config.paramifiers.SPM = { onstart: function(v) {
	config.options.chkSinglePageMode=eval(v);
	if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
		config.lastURL = window.location.hash;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
} };
//}}}
//{{{
if (config.options.chkSinglePageMode==undefined)
	config.options.chkSinglePageMode=false;
if (config.options.chkSinglePagePermalink==undefined)
	config.options.chkSinglePagePermalink=true;
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined)
	config.options.chkSinglePageKeepFoldedTiddlers=false;
if (config.options.chkSinglePageKeepEditedTiddlers==undefined)
	config.options.chkSinglePageKeepEditedTiddlers=false;
if (config.options.chkTopOfPageMode==undefined)
	config.options.chkTopOfPageMode=false;
if (config.options.chkBottomOfPageMode==undefined)
	config.options.chkBottomOfPageMode=false;
if (config.options.chkSinglePageAutoScroll==undefined)
	config.options.chkSinglePageAutoScroll=false;
//}}}
//{{{
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
	if (!config.options.chkSinglePageMode)
		{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
	if (config.lastURL == window.location.hash) return; // no change in hash
	var tids=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();
	if (tids.length==1) // permalink (single tiddler in URL)
		story.displayTiddler(null,tids[0]);
	else { // restore permaview or default view
		config.lastURL = window.location.hash;
		if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();
		story.closeAllTiddlers();
		story.displayTiddlers(null,tids);
	}
}


if (Story.prototype.SPM_coreDisplayTiddler==undefined)
	Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
{
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	var tiddlerElem=document.getElementById(story.idPrefix+title); // ==null unless tiddler is already displayed
	var opt=config.options;
	var single=opt.chkSinglePageMode && !startingUp;
	var top=opt.chkTopOfPageMode && !startingUp;
	var bottom=opt.chkBottomOfPageMode && !startingUp;
	if (single) {
		story.forEachTiddler(function(tid,elem) {
			// skip current tiddler and, optionally, tiddlers that are folded.
			if (	tid==title
				|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
				return;
			// if a tiddler is being edited, ask before closing
			if (elem.getAttribute("dirty")=="true") {
				if (opt.chkSinglePageKeepEditedTiddlers) return;
				// if tiddler to be displayed is already shown, then leave active tiddler editor as is
				// (occurs when switching between view and edit modes)
				if (tiddlerElem) return;
				// otherwise, ask for permission
				var msg="'"+tid+"' is currently being edited.\n\n";
				msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
				if (!confirm(msg)) return; else story.saveTiddler(tid);
			}
			story.closeTiddler(tid);
		});
	}
	else if (top)
		arguments[0]=null;
	else if (bottom)
		arguments[0]="bottom";
	if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {
		window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));
		config.lastURL = window.location.hash;
		document.title = wikifyPlain("SiteTitle") + " - " + title;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
	if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		if (!isTopTiddler && (single || top))
			tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);
		else if (bottom)
			tiddlerElem.parentNode.insertBefore(tiddlerElem,null);
		else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	} else
		this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	var tiddlerElem=document.getElementById(story.idPrefix+title);
	if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
		// scroll to top of page or top of tiddler
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);
		// if animating, defer scroll until after animation completes
		var delay=opt.chkAnimate?config.animDuration+10:0;
		setTimeout("window.scrollTo(0,"+yPos+")",delay); 
	}
}

if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
	Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function() {
	// suspend single/top/bottom modes when showing multiple tiddlers
	var opt=config.options;
	var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
	var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
	var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
	this.SPM_coreDisplayTiddlers.apply(this,arguments);
	opt.chkBottomOfPageMode=saveBPM;
	opt.chkTopOfPageMode=saveTPM;
	opt.chkSinglePageMode=saveSPM;
}
//}}}
n. The period of a transitory breeze. An interval of fair weather<<tiddler ToggleRightSidebar with: ".">>
[img[pics/JD_knot.png]] Slatch
I woke up a few hours ago at 5am which is unusual for me since, left to my own devices, I would probably sleep till 7 or 8.

But I woke up today at 5am (maybe it was something I ate), and all I could think about was John Lennon. I suddenly remembered his death. Well, to be more precise, I vividly remember my mother crying.I remember jumping on the bed and not understanding why my mother was crying. The rest of the memory is more fuzzy, but I think I asked "mommy, mommy, what's wrong?" And I believe she said in a bit of a gasp, "someone was shot". I remember asking "who?" and getting something like "John Lennon, he's dead... never mind." I don't know why I remember this at 5am, but I remembered and remembered it hard. I wondered how old I was, so I had to get up and look up the date of John Lennon's death. As it turns out, I was three.

This is one a few memories that I have from a very early age. Sometimes I think its difficult to discern whether you remember an early childhood event directly, or you remember being told about at a later age. For example, I'm fairly certain I don't remember the stitches I had to have in my knee or the time I went to the emergency room with hay in my eye, but I do remember being told about these times. 

The test I use on whether a memory is direct is that sometime they are such mundane things that nobody would tell me about it later. Like my very distinct memory of riding in the car and asking what the 'green signs' mean. Turns out, I was asking about street signs. The problem with these memories is that I can't judge how old I was when the happened because there was no reference. I think the street sign question was when I was 3 or 4, but I can't be sure.

A few years ago, I took my wife to see the Lipizzaner stallions when they came to town, and I was excited because I had never seen them before. During the show, I suddenly realized it was all very very familiar. I started to get the feeling I maybe had seen them before. Not on TV, but sitting there hearing them and smelling the arena as well. Later, I called my mother to ask if she ever took me to see them, and sure enough when I was only two, she took me (mostly because she wanted to see them herself). So do I actually remember these events? Perhaps my mother forgot what year we went, and I was more like 3 at the time. Perhaps I remembered it and thought about it when I was 4, and this reinforced the memory allowing me to remember it during adulthood. 
/*{{{*/
/*Slatch TiddlyWiki Theme*/
/*Version 1.0*/
/*by J.D. Rogers, based on Mocha by... */
    /*Design and CSS originally by Anthonyy, ported to TiddlyWiki by Saq Imtiaz.*/
/*}}}*/
/*{{{*/
 #contentWrapper{
margin: 0 3.4em;

			font-family: Lucida Grande, Tahoma, Arial, Helvetica, sans-serif; /* Lucida Grande for the Macs, Tahoma for the PCs */
font-size: 11px;
			line-height: 1.6em;
			color: #666;
}

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

border-bottom: 4px solid #00098e;
}

.headerShadow {	padding: 2.6em 0em 0.5em 0em; }

.siteTitle {
			font-family: 'Trebuchet MS' sans-serif;
			font-weight: bold;
			font-size: 64px;
			color: #4c648b;
			margin-bottom: 30px;
			background-color: #FFF;
}

.siteTitle a{color:#4c648b; border-bottom:1px dotted #4c648b;}

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

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

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

}

#displayArea {
	margin: 0em 17em 0em 15em;
}

.tagClear {clear:none;}

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

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

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

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

.viewer .button, .editorFooter .button{
	color: #666;
	border: 0px solid #4c648b; /% changed from 1px to 0px to make sliders prettier -- JDR %/
}

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

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


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

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

#mainMenu span {position:relative;}

#mainMenu br {display:none;}

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

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

#sidebarOptions {line-height:1.4em;}

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

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

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

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

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

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

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

.tabUnselected {
 background: #ccc;
}

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

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

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


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

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

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

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

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

.viewer code {
	color: #2F2A29;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

#noticeBoard br {display:inline;}

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

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

.searchbar {position:relative; width:11em;}
.searchbar .button{margin:0; width:11em;}
#header {display:block;}  /%#header {display:inline-block;}    %/ /% switched "inline-block" to "block" to fix display in newer browsers -- jDR %/ 
/*}}}*/
I bought a new toothbrush this weekend, and it always amazes me how quickly they evolve. You can never buy the same toothbrush twice, because the fierce competition between the toothbrush companies provides each successive model with, more knobs and bumps and bends than its predecessor. 

Unfortunately, and much like the dog breeding world, the evolution appears to lack the all important driving force of natural selection. As a result, I spent a solid 10 minutes staring with dismay at Walgreen's zoo of brushes featuring strange and unusual fluorescent plumage, disconcerting and unnatural angles, and small nodules which are apparently intended to massage your cheek while you brush. Or perhaps they serve some courtship function like a peacock's feathers or the blue nose of a baboon. 

I eventually made a seemingly innocuous selection and made my way home. The next day, I unpacked my new toothbrush and used it for the first time. I was pleased with my selection until I finished brushing and attempted to place the toothbrush in it's holder.. an attempt that failed. This particular toothbrush was apparently bred for girth. 

One apparent silver lining, is that the end is suspended above the muck that accumulates at a disturbing rate in the bottom of the holder.

[img[pics/fat_toothbrush.png]] 
This website is self contained in one big html file called a [[TiddlyWiki|http://www.tiddlywiki.com]]. The idea of tiddlywiki was a 'non-linear personal notebook', but I find it convenient to use as a content management system because it is highly portable and easy to keep current (no migrating SQL databasen or anything!). 

In order to make it more website-like, I made some modifications to the default tiddlywiki, such as installing and configuring some plugins like singlepagemode to make it behave more like people expect of a website. These modifications can be found here (right-click and save as if you want to use this yourself):
[[tw_website_template_jdr.html|tw_website_template_jdr.html]]

Below are some useful links and an ongoing list of things I have changed or modified to make it work better.

!! Useful links:
* The mothership at http:www.tiddlywiki.com where you can download an empty barebones tiddlywiki.
* Quick markup reference: http://tiddlywiki.org/wiki/TiddlyWiki_Markup
* Use filters, it's great to make lists that auto-update: http://tiddlywiki.org/wiki/Filtering
* Lots of miscellaneous documentation: http://tiddlywiki.org/wiki/Main_Page
* 

!! Changes I have made to my various tiddlywikis:
# Imported HideTiddlerTags, HideTiddlerSubtitle, HideTiddlerToolbar, ReplaceDoubleClick, SinglePageModePlugin, ToggleRightSidebar, InlineJavascriptPlugin from http://www.tiddlytools.com
# Toolbars, tags, and subtitle on tiddlers can now be hidden by including  <br> {{{<<tiddler HideTiddlerTags>><<tiddler HideTiddlerSubtitle>><<tiddler HideTiddlerToolbar>>}}} <br>in any tiddler where you don't want such things showing up.
# Created a zzConfigTweaks tiddler to make the default options stick and tagged it with systemConfig tag so it loads. zzConfig contents:<br>{{{config.options.chkSinglePageMode = true;}}}<br>{{{config.options.chkSinglePagePermalin = true;}}}<br>{{{config.options.chkShowRightSidebar = false;}}}
# Added the rightsidebar toggle dot  to the subtitle -- this allows the right sidebar with all the controls to be hidden by clicking on the period at the end of the subtitle. <br>{{{<<tiddler ToggleRightSidebar with: ".">>}}}
# Added <span macro="tiddler ReplaceDoubleClick with: shift doubleclick"></span> to the ViewTemplate -- this makes it necessary to hold shift and double click a tiddler to edit to avoid getting site visitors accidentally in edit mode. 
# imported mocha theme
# changed {{{ #header {display:inline-block;} }}} to just {{{ #header {display:block;} }}} in the stylesheet so that the title spans the whole top of the page in newer broswers
# changed the border from 1px to 0px in stylesheet under {{{.viewer .button, .editorFooter .button}}} to make sliders look prettier
# 
Seriously, this makes it all so easy.
/%
|Name|ToggleRightSidebar|
|Source|http://www.TiddlyTools.com/#ToggleRightSidebar|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|show/hide right sidebar (MainMenu)|

Usage: <<tiddler ToggleRightSidebar with: "label">>

Config settings:
	config.options.chkShowRightSidebar (true)
	config.options.txtToggleRightSideBarLabelShow (◄)
	config.options.txtToggleRightSideBarLabelHide (►)

%/<script label="$1" title="show/hide right sidebar content">
	var co=config.options;
	if (co.chkShowRightSidebar=='undefined') co.chkShowRightSidebar=true;
	co.chkShowRightSidebar=!co.chkShowRightSidebar;
	var sb=document.getElementById('sidebar'); if (!sb) return;
	sb.style.display=co.chkShowRightSidebar?'block':'none';
	document.getElementById('displayArea').style.marginRight=co.chkShowRightSidebar?'':'1em';
	saveOptionCookie('chkShowRightSidebar');
	var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
	if (typeof(place)!='undefined' && '$1'=='$'+'1') {
		place.innerHTML=co.chkShowRightSidebar?labelHide:labelShow;
		place.title=(co.chkShowRightSidebar?'hide':'show')+' right sidebar';
	}
	var sm=document.getElementById('storyMenu'); if (sm) config.refreshers.content(sm);
</script><script>
	var co=config.options;
	if (co.chkShowRightSidebar=='undefined') co.chkShowRightSidebar=true;
	var sb=document.getElementById('sidebar'); if (!sb) return;
	sb.style.display=co.chkShowRightSidebar?'block':'none';
	document.getElementById('displayArea').style.marginRight=co.chkShowRightSidebar?'':'1em';
	if ('$1'=='$'+'1') {
		var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
		var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
		place.lastChild.innerHTML=co.chkShowRightSidebar?labelHide:labelShow;
		place.lastChild.title=(co.chkShowRightSidebar?'hide':'show')+' right sidebar';
	}
</script>
- vi. to call attention to pridefully and often boastfully

Here's where I'll link to photos I am particularly proud of. For now, I mainly have my bird list.
[[Bird List|../birds/birds.html]]

<<tiddler HideTiddlerTags>>
<<tiddler HideTiddlerSubtitle>>
<<tiddler HideTiddlerToolbar>>
<!--{{{-->
<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>
<span macro="tiddler ReplaceDoubleClick with: shift doubleclick"></span>
<!--}}}-->
After some tinkering with various options including ImageMagick, I find that the easiest way to make great looking watermarks on the photos I post on my website is the batch queue in digikam (which is convenient, because I was already using digikam for my photos). 

To remind myself of the settings I use:
text: J.D. Rogers
font: Times New Roman
color: white
opacity: 20% (sometimes 25%)
background: no
position: bottom right
size: 20%
x margin: 5%
y margin: 2%

I add to the queue from the parent directory and save to a subdir called 'watermakred'. 
[[TiddlyWiki|http://www.tiddlywiki.com]] © Osmosoft
//{{{
//This ensures that the footer sticks to the bottom of the screen when there are no tiddlers open. If that is not desirable, it can be deleted.
function setFooter() {
         if (document.getElementById && document.getElementById("contentFooter") ) {
            var windowHeight=findWindowHeight();
         if (windowHeight>0) {
            var contentHeight= document.getElementById('mainMenu').offsetHeight + document.getElementById("header").offsetHeight + document.getElementById("contentFooter").offsetHeight;
            var menu= document.getElementById('mainMenu');
            if (windowHeight-(contentHeight)>=0) {
               menu.style.position='relative';
               menu.style.marginBottom=(windowHeight-(contentHeight))+'px';
               }
            else {
                 menu.style.position='';
                 menu.style.marginBottom='';
                 }
            }
         }
}
window.onresize = function() {
  setFooter();
}

Story.prototype.refreshTiddler_footerhack=Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function (title,template,force)
{    
var theTiddler = Story.prototype.refreshTiddler_footerhack.apply(this,arguments);
setFooter();
   return theTiddler;}

//}}}
This can be done in the command line using things like:
{{{
exiv2 -M"set Exif.Image.Copyright Ascii (c) J. D. Rogers" *.jpg
exiv2 -M"set Exif.Image.Artist Ascii rogersjd (at) gmail (dot) com" *.jpg
}}}

or by writing the following into a file and calling exiv2 as shown in the file header:

{{{
# command file for setting copyright and exif data on images
# written by J.D. Rogers
#
# use: exiv2 -m thisfilename photofilenamelist

set Exif.Image.Copyright Ascii (c) J.D. Rogers
set Exif.Image.Artist Ascii rogersjd (at) gmail (dot) com
}}}
!!Steps I took to install Ubuntu alongside windows 7 on a new thinkpad t410s with SSD (solid state drive).

Booted windows 7, checked that it worked
Downloaded Ubuntu 10.10 64bit desktop iso, used startup disk creator to make a bootable flash key, booted ubuntu using f12 boot menu.

Started gparted, showed 3 partitions, all NTFS with 1 MB unallocated at the beginning, and 1.8 MB unallocated at the end. The partition information reports 240Heads, 63 Sectors per track, sector size 512.
sda1 - """SYSTEM_DRV""" (???), 1.17GiB, first sector: 2048, last: 2459647
sda2 - """Windos7_OS""", first sector: ?, last sector 292098047
sda3 - """Lenovo_Recovery""", 9.77GB, first sector 292098048, last 312578047

Using gparted, the default is to align by MiB which should keep the filesystem aligned to erase blocks? In any case, I resized sda2 to 46GiB, added an extended partition to fill the space, and created sda5 (83GiB) and sda6 (8.23GiB) for swap in the extended sda4 partition. Note that the layout now looks like: sda1, sda2, sda4[sda5, sda6], sda3. 

Rebooted to windows and allowed the diskcheck, then rebooted to ubuntu flashkey and surprisingly, the first unallocated MB no longer shows up. (shrug)

Booted the install flashkey again, choose manual/advanced partitions, choose sda5 for root, sda6 for swap. Install finished in just a couple of minutes!. 

!!! Now the configuration to make everything work well..
* update software <- fresh installation now occupies 2.9 GB on the disk including all standard software like openoffice and other monsters.
* added 'noatime' to fstab and 'tmpfs /tmp tmpfs nodev,nosuid,noexec,mode=1777 0 0' to mount tmp in ram and keep from writing to ssd shortening the life. 
* install vim
* bashrc: 
{{{
alias mv='mv -i'
#some history stuff -- JDR
export HISTCONTROL=ignoreboth
HISTFILESIZE=''

#history search -- JDR (Capoglu)
#if shopt -q login_shell ; then
        bind '"\e[A"':history-search-backward
        bind '"\e[B"':history-search-forward
#fi
}}}
* install: sysfsutils, 
* [[Configure battery charging control with tp_smapi]]
* reduce swappiness by adding 'vm.swappiness=10' to /etc/sysctl.conf to extend ssd life
* install nvidia driver (this fixed suspend/hibernate not working because resume left the backlight off, but now hotkey brightness is broken. To adjust screen brightness, ctl+alt+F1 to get a virtterm, adjust brightness with hotkeys, ctl+alt+F7 to go back to x.)
* downloaded flashplugin (64 bit) and drop into ~/.mozilla/plugins/ on user accounts

!! Install the following packages:
* abiword
* gimp
* texmaker (pulls in texlve) ~760MB
* qemu-kvm
* various vpn packages
* opensh-server
* digikam ~316MB
If the crypt mounted usb disk accidently gets unplugged without unmounting, cryptdisks gets confused and plugging the drive back in asks for the passwd, but results in an error. To fix this, you have to luksClose the device. Find the device name in /dev/mapper:
{{{
ls /dev/mapper
cryptsetup luksClose udisks-luks-uuid-07497ec1-29de-4518-a1f0-f7864f779f41-uid1000
}}}
{{{
// Specify your account number here!
_uacct = "UA-23066812-1";

// zCustomTracker as a namespace for tracking related functions
var zCustomTracker = {
// store a reference to the original displayTiddler function
displayTiddler: story.displayTiddler
};

zCustomTracker.track = function() {
if (readOnly) {
urchinTracker.apply(this, arguments);
}
};

zCustomTracker.trackAndDisplayTiddler = function(srcElement, titles) {
// log with the tracker
zCustomTracker.track('/' + titles);
// call the original displayTiddler function
zCustomTracker.displayTiddler.apply(this,arguments);
};

// replace the default displayTiddler function with a tracking version
story.displayTiddler = zCustomTracker.trackAndDisplayTiddler;

// Call once for the initial page load
zCustomTracker.track();
}}}
//{{{
config.options.chkSinglePageMode = true;
config.options.chkSinglePagePermalin = true;
config.options.chkShowRightSidebar = false;
//}}}