<!--{{{-->
<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]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#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>>
<<options>>
Wer keine Lust hat Geld für teure Backup-Software auszugeben und dazu noch Windows Boardmittel benutzen will, dem sei das Tool Robocopy ans Herz gelegt. Seit Windows Vista ist es Bestandteil des Betriebssystems, für ältere Versionen kann man googeln, laut Wikipedia, gibt es diverse "Resource Kits", die Robocpoy enthalten.
Vorteil gegenüber den simplen Kommandozeilenprogrammen wie copy oder xopy ist, dass das Kopieren intelligent vonstatten geht, sprich von der Quelle gelöschte Dateien auch beim Ziel entfernt werden und sich so keine alten Daten im Backup befinden.

Los geht's: START->Ausführen "cmd" öffnet eine Kommandozeile
*Zeige alle Parameter an:
{{{
robocopy /?
}}}
*Guter "Standard"-Parameter Aufruf (kopiert komplette Verzeichnisstruktur inklusive leerer Ordner und löscht Dateien wie oben beschrieben):
{{{
robocopy [Quellverzeichnis] [Zielverzeichnis] /MIR
}}}

Darüber hinaus gibt es noch eine Vielzahl an weiteren Optionen wie Logging etc., die ich selbst aber garnicht nutze. Der beschriebene Aufruf ist meiner Meinung nach das, was der Großteil der Leute benötigt und nutzen möchte und für ein kontinuierliches Backup sinnvoll ist. Möchte man sein Backup auf ein entferntes System sichern, muss Robocopy aber passen, eine Alternative wäre "rsync".
<html>
<pre>
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
  &lt;head&gt;
    &lt;title&gt;Kartenbeispiel&lt;/title&gt;
    &lt;!-- hier muss man den Pfad zur OpenLayers Bibliothek,
             relativ zum aktuellen Verzeichnis angeben--&gt;
    &lt;script src="http://dev.openlayers.org/releases/OpenLayers-2.10/OpenLayers.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript"&gt;
        var map, layer;
	&lt;!-- eine Funktion definieren, 
		 welche beim Laden der Seite dann aufgerufen wird --&gt;
        function init(){
	    &lt;!-- Eine leere Karte wird erstellt im div Container 'map', wenn man ein default Control hinzufügt,
                     müssen die anderen Controls die ohne Parameteraufruf geladen würden,
                     manuell hinzugefügt werden (hier die PanZoomBar, ein nachträgliches Laden würde das
                     Standard-Control auch laden, ein Überblenden wäre der Effekt) --&gt;
	    map = new OpenLayers.Map('map', {
	        controls: [
	        new OpenLayers.Control.ArgParser(),
                new OpenLayers.Control.Attribution(),
		new OpenLayers.Control.Navigation(),
	  	new OpenLayers.Control.MousePosition(),
		new OpenLayers.Control.LayerSwitcher(),
		new OpenLayers.Control.ScaleLine({geodesic: true}),
		new OpenLayers.Control.PanZoomBar()
	        ],
               units: "m",
               numZoomLevels: 20,
               displayProjection: new OpenLayers.Projection("EPSG:4326")
            });
	    &lt;!-- Anzeige der Mausposition hinzufügen --&gt;
	    map.addControl(new OpenLayers.Control.MousePosition());
	    &lt;!-- Übersichtskarte hinzufügen --&gt;
	    map.addControl(new OpenLayers.Control.OverviewMap());
	    &lt;!-- Layer Auswahl hinzufügen --&gt;
	    map.addControl(new OpenLayers.Control.LayerSwitcher());
	    &lt;!-- Neuen OpenStreetMap Basislayer erstellen --&gt;
            layer = new OpenLayers.Layer.OSM("Simple OSM Map");
	    &lt;!-- und hinzufügen --&gt;
            map.addLayer(layer);
	    &lt;!-- setzt den Mittelpunkt der Karte auf Karlsruhe 
                    und auf Stufe 12 heranzoomen --&gt;
	    map.setCenter(new OpenLayers.LonLat(934824, 6276091), 12);
        }
    &lt;/script&gt;
  &lt;/head&gt;

  &lt;body onload="init()"&gt;
    &lt;div id="map" class="smallmap"&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
</html>
Oft möchte man nicht nur eine Karte angezeigt bekommen, sondern auch Sachen einzeichnen und später dann damit arbeiten.
Für diesen Fall bindet man sich einfach in eine bestehende Karte Vektor-Layer ein, in die man dann Punkte, Linienzüge oder Polygone einzeichnen kann. Sei 'map' eine OpenLayers.Map Instanz. Im einfachsten Fall erstellt man sich mit:
{{{
var vector = new OpenLayers.Layer.Vector("Mein Vektorlayer");
map.addLayer(vector);
map.addControl(new OpenLayers.Control.EditingToolbar(vector));       
}}}
einen Vektorlayer und eine dazugehörige Toolbar, die es erlaubt Vektoren zu zeichnen.

Um nun an die eingezeichneten "Features" zu kommen, kann man sich einfach mit:
{{{
var features = vector.features;
}}}
das Array holen, welches die Vektor-Objekte enthält. Durch dieses kann man durchiterieren oder wie in unserem Fall einen serialisierten String nach der [[GeoJSON|http:/www.geojson.org/]] (externer Link!) Spezifikation erstellen lassen, den man dann an den Server weiterreicht (alles was man mit OpenLayers macht passiert nämlich über JavaScript und somit auf dem eigenen PC, dem Client) um mit den Daten zu arbeiten.
{{{
//Parser erstellen
var geojson = new OpenLayers.Format.GeoJSON();
//ist das 2. Argument auf "true" gesetzt,
//wird eine Einrückung verwendet die die Lesbarkeit erhöht
var serializedData = geojson.write(features, true);
}}}
Nun sind wir auch schon bereit die Daten so wie sie sind an den Server zu übermitteln (z.B. durch Klicken eines "Senden" Buttons). Da wir aber in aller Regel nicht wollen, dass unsere Seite mit der Karte neu lädt, müssen wir die Daten im Hintergrund übertragen. Dies ist relativ einfach möglich mit XMLHttpRequest, einer JavaScript Klasse, die genau diese Funktionalität bietet.
{{{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
	xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
	xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}}}
erstellt ein Objekt der Klasse.
Nun können wir eine Funktion erstellen, die dann beim klicken eines Buttons aufgerufen wird und unsere Daten im Hintergrund an den Server sendet sowie das Ergebnis entgegen nimmt und präsentiert.
{{{
function postData() {
var data =geojson.write(features, false);

	xmlhttp.onreadystatechange=function()
	  {
		//innerhalb dieser Bedingung steht der Code der ausgeführt wird,
		//wenn das Ergebnis vorliegt
		if (xmlhttp.readyState==4 && xmlhttp.status==200)
		  {
			//in unserem Fall wird die Antwort einfach als AlertPopup angezeigt
			alert(xmlhttp.responseText);
		  }
	  }

	//im Beispiel nimmt auf dem Server ein PHP Script die Daten entgegen
	//z.B. mit "$data = $_POST['daten'];"
	//das 1. Argument gibt an ob GET oder POST verwendet werden soll
	//das 3. Argument ist "true", andernfalls erfolgt eine synchrone Übertragung
	xmlhttp.open("POST","auswertung.php",true);
	//für POST muss ein Header gesetzt werden
	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	//sendet den String "daten=data", wobei data unseren GeoJSON String enthält
	xmlhttp.send('daten=' + data);
}
}}}

Wie man mit den Daten auf dem Server arbeitet ist einem selbst überlassen, PHP hat aber z.B. die Methode "json_decode($data, true);" mit der die Daten, sofern sie in korrektem JSON vorliegen, wieder deserialisiert werden und, durch setzen des zweiten Arguments auf "true", in einem verschachtelten Array gespeichert werden.


''Weiterführende Informationen (externe Links!)''

[[JavaScript Einführung|http://w3schools.com/js/default.asp]]
[[AJAX Einführung|http://w3schools.com/ajax/default.asp]]
[[OpenLayers Beispiele|http://dev.openlayers.org/releases/OpenLayers-2.9.1/examples/]]
Willkommen
Einige Tipps für die Synology DiskStation 110j.
Login über ssh mit dem Benutzer root und dem Administrator Passwort.

*''__Scanner mit saned betreiben__''
Ähnlich wie [[hier |Methode 2.1: Debian 5 als virtuelle Maschine]] wird auf der DiskStation sane installiert, worauf man dann übers Netzwerk zugreifen kann. Zuerst muss man sich dafür den Paket-Manager ipkg installieren und dann 
@@"ipkg install sane-backends"@@, @@"ipkg install dlib"@@ und @@"ipkg install libusb"@@ installieren. Eine detaillierte Beschreibung gibt es [[hier |http://arnoutboer.nl/weblog/?p=223]] (externer Link).
Wer eine SSD sein Eigen nennt, weiß (hoffentlich), dass er die Lebenszeit verlängern kann, indem man "unnötige" Schreibzugriffe minimiert. Auf die Technik, die dahinter steht, gehe ich an der Stelle nicht ein, Google hilft dem Interessierten.

Die Eventlog Dateien kann man sich anschauen, indem man {{{START -> Ausführen -> "compmgmt.msc"}}} öffnet und in die Rubrik "Ereignisanzeige" wechselt. Dort sind die jeweiligen Logs in die passenden Kategorien eingeteilt, ein {{{Rechtsklick -> Eigenschaften}}} zeigt den aktuellen Speicherort an, Standard ist {{{%SystemRoot%\system32\Winevt\Logs\[Logname]}}}, wobei {{{%SystemRoot%}}} im Allgemeinen {{{C:\Windows}}} entspricht.
Nun könnte man anfangen die Pfade jedes einzelnen Logs zu ändern, aber es geht auch schneller.

Dazu erstellt man ein Powershell Script {{{change_eventlog_paths.ps1}}} mit folgendem Inhalt:
{{{
#den neuen Pfad setzen, z.B. ein temporäres Verzeichnis auf einer Festplatte
$myNewPath = "D:\Temp"

#wevtutil ist ein Kommandozeilenprogramm, mit dem man die Eventlogs anzeigen und
#konfigurieren kann; man iteriert über alle Einträge
Foreach ($log in wevtutil el) {
  #hier holt man sich für jeden Eintrag die Einstellungen (standardmäßig als Text) und
  #geht zeilenweise durch die Ausgabe, solange bis man die Zeile mit dem
  #"logFileName" hat und speichert den Pfad in $path
  $path = switch -wildcard (wevtutil gl $log)
  {
    "*logFileName*" { $switch.Current.TrimStart("logFileName: ") }
  }
  #nun ersetzt man den bisherigen Pfad (in beliebiger Tiefe) mit dem neuen
  #hier wird "%SystemRoot%\system32\Winevt\Logs\[Logname]" zu "D:\Temp\Winevt\Logs\[Logname]"
  $path = $path.Replace("%SystemRoot%\System32", $myNewPath)
  #neuen Pfad setzen
  wevtutil sl $log /lfn:$path
}
}}}

Dieses Script muss man nun als Administrator ausführen, die Pfade werden dann neu gesetzt und die Dateien werden auch direkt angelegt, die alten kann man nach belieben löschen.
Mein Name ist Fabian und ich studiere [[Informationswirtschaft|http://www.informationswirtschaft.org]] an der [[Uni Karlsruhe (bzw. am KIT, wie es nun heißt)|http://www.kit.edu]]. Schon länger habe ich immer mal wieder einen Versuch unternommen eine Homepage zu unterhalten, rein technisch ist das ja auch nicht schwer, nur am Inhalt haperte es dann immer ;-)
Nachdem ich auf das (wie ich finde) fabelhafte TiddlyWiki aufmerksam (gemacht) wurde, beschloss ich wieder mal einen neuen Versuch zu starten, wobei ich nun hauptsächlich über technische Dinge schreiben will.

{{{
yZZZuuXWWppbbpbppfVVyyyZZZuuuzzvvrrrrrtttlllll====????;?;?;;;;;;;;;;;;;;;;;;;?;??????==l=l
ZZZZuXWHHHHHHHbbppffVyyyZZZuuuuzzvrrrrrttttlllll====???????;?;;;;;;;;;;;;;;?;??;????===lll
ZZZXWWkkHMHHHMHkbppffVyyyyZZuuuuzzzvrrrrrttttlllll====????;??;??;;;;;;;?;;?;?;??????==lllt
yZXXWHWWWMMHHHMWbbppffVVyyyZZZuuuzzzvrrrrrrttttlllll====????;?;?;??;?;?;??;?;??????===lllt
QQHNMNHpWWMHHHHMNHpppffVyyyyZZZZuuuzzvrrrrrttttttllzuaewwAAA&x+?;;?;;?;?;?;??;?????==llllt
WXMNffWWHgMHHHHHMHpffffVyyyyZZZuuuuzzvvrrrrrrttwQgMHMH0XXWHMHHkkmx;?;;?;;??;??????====lllt
QkHHHNkWMHMHHgHHNHrXVyyyZZZuuuzzvrrrrtttllllwgMHHHgHWXW9WWHHMHgMMHZo++++;++;;;;?????===llt
MMMMMMMMMHWH9UUUUHrXyyyZyXXuuuzzvrrtttlllzwWNHHMHHwOXWWkkWWHMHHHgHMHy+:::::::::::;;;;????=
gMHHHqqHMXuzzzvrwHrWppfffVyyZZZuuuzvvrrrwdMNHMHHWkXVVXWHHWmHWXXHWgHHNko:^::::::::;;;;;????
HHHqHWWmMkXzzzvvwMrkSwukXwddwwwOOOOOZZOdMMMMMWkXUVVOOwXWWWHHMkWHHHMMHHHc:^:::::::;;;;;;??=
WgHkHgHqMHHHyzzvzgvkkXz00wddwwzzzzzIIIzdHMS=?++7VUV??7zWVWHHgHWHkWWHdHWH+:^:::::::;;;?;???
WggHHbbWMqHHqHmAwMvSkXz00zddwwzzzzzIIIzjHHv+:+``.. ``.zXVdXWHHdHHdgHXWWHl::^:::::;;;;;????
MHqkHHHHHgHMHHHHHgwZSXwkkuddwdzzzzzIIIzJBZ?;:^^...``.IyzIzOwWWUU0XWXHWHM:::::::::;:;;;????
ZZkHmqkHMHHHWHkzQgkykZwXkuddOddzzzzI7!+jRzz++^^....``XHWkkdwwrXXkwXkHHg9:::::::::;;;;;????
MHHHMMMMMgHgHgMMMMSy0ZwXkXwdddddzV++^.+!4su++.......`JHgHSXXWuVWHWHHdHH:::::^::::;;;;;????
ZZQQQQHHMHQQQkXWXHkXXZwz00wddZz+1+:^:?zz!J:??wOC1+.....WWwwZOC:`+WNMMM$:::::::::;;;;;?;???
yZMNHHHMHMkWfyWHNHRXzXwzkX0z!+::+1+:^^?zwC`.^?6z!``....vXwC?.``.?dMNNH:::::::::::;;;;;???=
WHWHMMNXMMqWHyZXHMKXXkXVz!+^^::++1wo+.^Jl`...:++!^...^^j0Z....`++XMNNMHHma++:::;;;;;?????=
HkWWHMMHWMqkbWWWqHHU0z+!:^:.+++zdWWMMmgp....??;:^^^^^^^J7=:....+dWNNMgggHHHgHHHHMNmJ+;???=
HHHkWZUHVMHHMMMM90z++::::+++zAXUzzwmkggMMNz:.++^^^^^^^^^:::::^?1dWMMqkqqmHHHHggHgHHHHMmaz=
HWWHMHWP^.`?YHSOz++::::++zydHddddHHHHHHHgMHwz++:^:^^:`::::^`^.+zwWMkkqHHmHgHggHggHggHHHHHH
MHMMMMM!.`..^.^?;::::++zzdHWQkHHHHHHggHgggMw+??.:::::.++:^^^.+?=zXqqHHgHHHHgHHHgHggMggHHHH
MMNMM9IJlz=1+.`;;:+++zzZVvdHHgHHggHgHHHHgMSI=++;+??;?;;:..?!.?;?zdHHMHHHHHHHHggHgHgHHMggHg
MMMUOOwW9Ozv+!++++zvCz1+++HgHHHgHHgMHHHHggHmAyx+zzzzzz??`^^.:;;?zdMMHHHMHHHHggHHgHHMggHHHH
HEz!++!+++v+!::1z+;;;?;;;+HHgHgHggHHHggqHHHgggHHgggggHHkkQQQQmQgHgggggHHHHgHHggHWMgHHHHMMM
M9+;+^^^^^::^^^+z;;;;;;;;:HHgHHHMHHHHHgHHWHHggHggggggHHHHHMHmqqqmHHgHgMMHggggHHHHgHggHHMMM
I=??;+::^^^^^^^`jzzzzzzzz+JMHgMHMHWWHMMMHHHHHggggggggmmmHHqqqqqqmqHHHMHHHHggHWgggHgMHMgHgM
NOzOz?++.^^^^^^.jHMMNHQmQmQkVHHgHCvHWQkgHHHHHHgggmmmmmmHqkqqqqqmmmgggHgHgggHHgHgHHHMHgHMHg
NyzwOlz?++.^^^^^+WHgMMHMgHggHmWXkXHgggHHHWHHHmmgHqqmggqqkqmgggmgmgggggHHMHHggMHMgHHHHgggHH
NHNWkrrzz=1+++.:^?WHHgHHHHgggHQHkWHgH3?HWIvHqHHqmgggmqqqmmmqqqgmggggggggHMgggggHHgHggggHgg
NNNMNHkwrOzlz+++::+WHMMggHMggggHQUkHmHqqKwWHHMHmmggHqqqqqqqkqqqmgggggggHgHHHHggHgggggggggg
HHHHHHMNkkXwzz+:::+zgMggggMggHgHdHJ4yWHqK+?TqHgMmmqqqmqqqqqqqqqmmgggggHgHHHMgHMggggggHggHg
HHHHHMMMHNkyXOz;:?;+WggHgggMgHggHJWh,4HWkz?1JqggMgmgmqmqqqqqqqmggggggggggHHHHggggggggggggg
NNMHgHHgMHNXWXz+::;;vHgggggHgHgggHdHkh,4gHxdqqHgMgHmmmqqqqqqqqqmmmggggHHgggHHggggggggggggg
HHHHHHHHHHHNfXO++:+++dHgggggMgHggggqJHf.gggqmHggggqqqqqqkkqkqqqqmmggggggHHgHgggggggggggggg
HMHHHMHHHHHHHXOz;;?:;zXHggggHMHgHggggHJHgggmqmMgHqqqqqqkqkkqqqqqmmgggggggHHgggggmmgmgggggg
HWMHHHHHHHHMNkXO++:+;+zXHggggHHMHHHgggHgHgHgmmHgqqqqqqkqkqqkqqqqmmgggggHgHMggmmmmmmggggggg
HWMHHHHHHHHHMHkwz?::;+1zXgggHgMMgMHggHHgggHHgHgmmqqqqkqqqqqqqqqmmgggggHgHMgHmmqmqmmmgggggg
ggMNHHHHgHggHHkwzz+:::+?zUHHHggHMHMgHggHHgmmHMgmqqqkqqqHqqqqqmqmmggggggHMggmqmmmmggmgmgggg
HHpWHMHHHHHgHMHXOz++:;;?1zXHMMHgMMMHHHHgHMHH97TUHqkqkqkqkqqqqmHggggggHHMggmmmmmmmmmgmggggg
HHmgHMHHHgHHgHmkwOz;;;;+??zZHgHggMMMHHgggHM6:^^.. ?7UHqqqqqqmmmggggggMgmgggmmqmggmmmmggggg
MHHHHqMMHHHHgHNkkOz?;;;;???zwWHHHgHHHMMggH0+:^^....```.?7TWHmmgggggHMggmmmmgmmqmmmgmmggggg
MgHHggHMMHHHHgMWkXO=??;?????zwWHggHgMMHMH9z+:^^.......`......?TWHggHgqqmmqmmmmmqmmmgmmmmgg
MHgggggHMMHHHHHHWkwOl?;;;??==lwUHHgggMMg8I+::^^^..........^^..+uXgHgmqqmmmqqqqqmmmmqmgHMMM
HHqggggggMMHHHHNWHkOO?+;;;??=ltrXMggggHHZ=;;:^^^^^^...^^^.:.+jdgmgmqqqqqqqqqqqqqqmmmmMMMMM
qkgmgHqgHqMMMHHMkHkXrz???;???=lOwXHggHWZv??;::^^^^^^^^^^:++zdHgmmmqqkkqqqqqqqqqqqqqmgMMMMM
}}}
[[Routen in und um Karlsruhe]]
OpenLayers bietet standardmäßig keine Unterstützung um erstelle Features in Vektor-Layern zu löschen. Möchte man dies tun, muss man also selbst Hand anlegen, was aber auch nicht weiter schwer ist:
Man muss sich dazu überlegen, ob man vorher Features markieren, oder ob man pauschal alle vorhandenen in einem Layer löschen möchte. Zur Laufzeit befinden sich etwaige Features dann entweder im Array LAYERNAME.selectedFeatures oder in LAYERNAME.features. Ein Feature wird dann mit der Funktion destroy() zerstört.
{{{
//löscht alle (markierten) Features auf dem übergebenen Layer
function deleteFeatures(vectorLayer, onlySelected) {
 if (onlySelected) {

  while (vectorLayer.selectedFeatures.length != 0) {
   //man muss unbedingt immer das erste Feature löschen oder von hinten nach vorne arbeiten,
   //weil das Array automatisch verkleinert wird
   vectorLayer.selectedFeatures[0].destroy();
  }

 } else {

  while (vectorLayer.features.length != 0) {
   vectorLayer.features[0].destroy();
  }

 }
}
}}}
Diese Funktion kann natürlich nach belieben erweitert oder angepasst werden und z.B. in eine Toolbar eingebunden werden. Features markieren kann man mit "OpenLayers.Control.SelectFeature".
&copy; 2009-2011 - Fabian Ball
*[[OpenLayers]]
**[[Kartenbeispiel]]
**[[Beispielquelltext]]
**[[Daten auslesen und asychron verarbeiten]]
**[[Features(Punkte, Linien, ...) löschen]]
[[Netgear DG834GB]]
[[DiskStation 110j]]
Alle Inhalte die ich hier veröffentliche unterstehen zuerst einmal meinem persönlichen Urheberrecht,
sollte das anders sein, werde ich darauf hinweisen!
Sollte sich jemand in seinem Urheberrecht verletzt sehen, bitte ich um Nachricht, damit die Sache schnellstmöglich behoben werden kann!

Diese Seite basiert auf TiddlyWiki

''Anbieter:''
//Fabian Ball
<<InsertMailMacro "" "">>//
/***
|''Name:''|InsertMailMacro|
|''Description:''|Builds my Mailadress dynamically to hide it from Robots.|
|''Version:''|1.0|
|''Date:''|Jan 21, 2011|
***/

config.macros.InsertMailMacro= {};
 config.macros.InsertMailMacro.handler = function (place,macroName,params,wikifier,paramString,tiddler) {
 
     var adress = params.length > 0 ? ( params[0].length > 0 ? params[0] : "mail" ) : "mail";
     var text = params.length > 1 ? ( params[1].length > 0 ? params[1] : "Mail" ) : "Mail";
     var domain = window.location.hostname.replace("www.", "");
     wikify("[[" + text + "|mailto:" + adress + "@" + domain + "]]", place);
 }
<html>

<body>
<iframe src="map.html" width="90%" height="400" frameborder="0">
</body>
</html>
Geodaten © [[OpenStreetMap | http://www.openstreetmap.org/]] und Mitwirkende, [[CC-BY-SA | http://creativecommons.org/licenses/by-sa/2.0/]]
[[Home|Willkommen]]

[[Fahrradfahren]]

[[Mozilla Firefox]]
[[Windows 7 (64bit)]]
[[Windows]]
[[GIS]]
[[Hardware]]

[[Impressum]]
<!--{{{-->
<meta name="author" content="Fabian Ball" />
<meta name="keywords" content="mwzocker, Fabian Ball, fabian-ball.de, mwzocker.de, Windows 7, 64bit, Scanner, Scanner 64bit, Firefox, GIS, OpenLayers, OpenStreetMap, OSM, Karlsruhe">
<!--}}}-->
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Wer noch eine "alte" Lizenz für ein 32bit Betriebssystem hat, wie in meinem Fall Windows XP, kann über diese elegante Lösung eine vollständige Kompabilität herstellen.
Den Vmware Player gibt es [[hier|http://www.vmware.com]] (externer Link!) kostenlos nach einer einmaligen Anmeldung. Andere kostenlose Optionen wie die VirtualBox von Sun habe ich auch ausprobiert, dabei gab es leider Probleme den USB-Anschluss durchzuschleifen (ansonsten auch ein tolles Programm wie ich finde).

#Hat man den Wmware Player installiert, kann man recht leicht eine neue virtuelle Maschine erstellen, man gibt die Installationsquelle an (Image oder optisches Laufwerk) und i n meinem Falle lief der Rest automatisch ab (sehr nett!). Je nach Geschwindigkeit des eigenen Rechners hat man so in maximal 15 Minuten ein frisches Windows als virtuelle Maschine! Wenn man will, kann man noch nicht benötigten Windows-Ballast entfernen.
#Nun kann man den Scanner anschließen und durch einen Klick rechts unten am Programmfenster von Vmware Player wird der USB-Anschluss an dem der Scanner hängt durchgeschleift und in der VM erkannt. Die alten Treiber (die natürlich mit dem Gast-Betriebssystem kompatibel sein müssen) kann man nun installieren und den Scanner mit der gewünschten Software betreiben.
#Zu guter Letzt ist es angenehm die Scan-Software in den Autostart Ordner zu verlinken. Noch einen Vorteil hat man durch die VM, man muss das Gast-Betriebssystem nicht herunterfahren, man schließt einfach das Wmware Programmfenster und der aktuelle Zustand wird gespeichert, startet man die Maschine, ist man in ca. 10 Sekunden wieder bereit zum Scannen.
[[Hier|http://www.debian.org/CD/netinst/]] (externer Link!) kann man sich eine minimale Version von Debian 5 herunterladen, die weitere Ausführung bezieht sich auf die i386 Version von "netinst" und den Vmware Player.

#Im Vmware Player eine neue virtuelle Maschine erstellen und das heruntergeladene Debian Image einbinden, Vmware erkennt automatisch, dass es sich um Debian 5 handelt und schlägt eine Hardwarekonfiguration vor. Diese ändert man am besten wie folgt ab: als Festplatte reicht 1GB, Ram 128MB (kann später noch weiter reduziert werden, so läuft aber die Installation schneller ab), Diskettenlaufwerk und Soundkarte kann man entfernen. Beim Netzwerk stellt man am besten den "Bridged" Modus ein, so bekommt die VM vom DHCP im Netzwerk eine IP zugewiesen und ist auch von allen anderen Rechnern im Netzwerk Problemlos erreichbar.
#Startet man nun die VM, kann man standardmäßig mit der Installation beginnen, stellt die Deutsche Sprache ein, partitioniert wie gewünscht (Standardvorschlag kann übernommen werden) und wenn es darum geht zusätzliche Pakete auszuwählen, entfernt man alles was vorausgewählt ist, weil das nur unnötigen Ballast darstellt.
#Nachdem die Installation erfolgreich beendet ist, bootet die VM zur Konsole wo man sich mit dem selbstgewählten Nutzernamen anmelden kann.
#Mit dem Befehl @@"su"@@ in den SuperUser Modus wechseln, jetzt kann das benötigte Paket "libsane" mit dem Befehl @@"apt-get install libsane"@@ herunterladen und installieren.
#Falls der Scanner bisher noch nicht angeschlossen ist, jetzt anschließen und, falls das nicht automatisch passiert, über den Button rechts unten im Vmware Programmfenster an zur VM durchschleifen. Führt man nun den Befehl @@"sane-find-scanner"@@ aus, sollte der Scanner angezeigt werden, falls nicht, nochmal überprüfen, ob der Scanner wirklich an die VM weitergereicht wird und natürlich auch von SANE unterstützt wird.
##Mein Scanner wird über das GT68xx Backend betrieben und muss nun noch mit Firmware gefüttert werden, diese und weitere Infos dazu gibt es [[hier|http://www.meier-geinitz.de/sane/gt68xx-backend/]] (externer Link!)
##Die Firmware Datei kann mittels @@"wget [Adresse]"@@ heruntergeladen und mit @@"mv [Name] /usr/share/sane/gt68xx/[Name]"@@ verschoben werden.
##Nun sollte der Scanner funktionsfähig sein, "scanimage > test.png" führt einen Scan durch und speichert ihn im aktuell befindlichen Verzeichnis.
#Nun muss der saned Netzwerkserver konfiguriert werden: ([[Hier|http://penguin-breeder.org/sane/saned/]] (externer Link!) gibt es ein weiteres Tutorial dazu.)
## Mit "vim /etc/default/saned" die Konfigurationsdatei öffnen, einmal "i" drücken um in den Einfügemodus von vim zu gelangen und in der Zeile "RUN" das "no" in ein "yes abändern. Um die Datei wieder zu schließen und zu speichern drückt man "Escape" (Einfügemodus verlassen) ":" (unten erscheint eine Eingabezeile) und "wq" (für write & quit) eingeben, mit "Enter" Befehl senden. (Gibt es einen Fehler beim Datei speichern, ist man wahrscheinlich nicht root!)
##Als nächstes muss man in der Datei "/etc/sane.d/saned.conf" die IP-Adressen angeben, von denen aus man später auf den Server zugreifen möchte. (z.B. "192.168.0.2", theoretisch kann man auch "192.168.0.0/16" für das ganz Subnet angeben, funktionierte bei mir allerdings nicht)
##Nun sollte man noch in "/etc/hosts" die IP-Adresse und den Hostnamen eintragen, bei mir wurde immer die Verbindung von Clients abgelehnt, wenn man das nicht macht!
##Mit @@"telnet localhost 6566"@@ kann man prüfen ob saned läuft, wird die Verbindung abgelehnt, ist etwas schief gegangen. (z.B. mit @@"ps uax"@@ schauen ob saned läuft, wenn nicht starten mit @@"/etc/init.d/saned start"@@) Auf dem Client, kann man das selbe tun (bei Windows 7 muss man den Telnet-Client erst über die Systemsteuerung nachinstallieren).
#Zu guter Letzt braucht man nach ein Frontend auf dem Client, hierfür empfiehlt sich entweder das oben schon angesprochene [[SaneTwain|http://sanetwain.ozuzo.net/]] (externer Link!) (hiermit kann man direkt über die Twain Schnittstelle und somit aus jedem Programm das Twain unterstützt heraus Scannen) oder die Windows Version von [[XSane|http://www.xsane.org/xsane-win32.html]] (externer Link!) (mächtiger als SaneTwain, Informationen beachten, startet nur vom Laufwerk C: aus!).

Hat man einmal den Sane Daemon eingerichtet, kann man die VM wieder nur "schlafen" schicken indem man sie nicht herunterfährt, sondern in den Suspend-Modus schickt.
Diese Methode möchte ich bei Gelegenheit ausprobieren, die Idee ist folgende:
Ein schlankes Unix-System das schnell in der VM zu booten ist (andere Option: cygwin?!) zusammen mit dem Open-Source Backend SANE betreiben. Die VM fungiert dann als Scanner-Server, für Windows gibt es das Frontend [[SaneTwain|http://sanetwain.ozuzo.net/]] (externer Link!) welches sich mit dem Sane-Server verbindet und an die TWAIN Schnittstelle vermittelt. Nun sollte man aus jedem TWAIN fähigen Programm (GIMP, Photoshop, ...) heraus scannen.
Diese Variante ist im Nachhinein betrachtet die einfachste und bequemste Art zugleich. Ist man Besitzer von mindestens Windows 7 Professional (also auch Enterprise und Ultimate), kann man [[hier|http://www.microsoft.com/windows/virtual-pc/download.aspx]] (externer Link!) den Windows XP-Mode, eine Art abgespeckte Virtual PC Variante, herunterladen. Besitzer der Home Premium Edition kommen nciht in den Genuss.
Der Vorteil ist, das man sozusagen eine Gratis Lizenz für Windows XP (32Bit) bekommt und damit legal einen sehr eleganten Kompabilitätsmodus bekommt.
#Zuerst muss man alles einrichten, dafür lädt man über den oben angegebenen Link die benötigten Dateien herunter und befolgt die Anweisungen. Nach einem Neustart, kann man direkt aus dem Startmenü heraus den Windows XP-Mode starten, ein vorinstalliertes 32Bit Windows XP erscheint nach kurzer Wartezeit. Wer schon Erfahrung hat mit Virtual PC, Vmware o.ä. wird sich recht schnell zurechtfinden mit den vorhandenen Einstellungen, oder aber man lässt alles wie es ist, standardmäßig werden alle Laufwerke des Host-PCs durchgereicht (was sehr nützlich ist, weil so kann man in der VM quasi arbeiten wie auf dem Host selbst).
#Das man nun ein virtuelles XP hat ist erstmal noch nicht, bis auf die Gratis-Lizenz, sonderlich elegant. Der Clou ist nun aber der folgende:
##Man installiert man auf dem Gast eine Software bzw. einen Treiber (der natürlich mit Windows XP 32Bit kompatibel sein muss).
##In meinem Fall wird also der Scanner-Treiber (vorher den Scanner anschließen und an die VM durchreichen!), die zugehörige Software und [[Irfan-View|http://irfanview.com/]] (externer Link!) installiert (Irfan-View kann prima die Aufgaben zum Scannen übernehmen und ist zudem auch schön schlank), natürlich geht auch jede andere gewünschte Software.
##Man sollte auf jeden Fall vom Programm einen Eintrag ins Startmenü vernehmen lassen, weil alle Einträge aus [Startmenü]\Programme\... werden auf dem Host im Ordner "Windows XP Mode-Anwendungen" angezeigt. Dies sollte man auch direkt überprüfen, fehlt der Eintrag, so muss man den Startmenüeintrag in der VM in "C:\Dokumente und Einstellungen\All Users\Startmenü\Programme" verschieben (weil der Eintrag nur für den aktuellen Benutzer vorgenommen wurde, nicht aber für alle).
##Jetzt kann man die VM herunterfahren (bzw. einfach schließen, standardmäßig wird dann der Ruhezustand aktiviert) und das eben installierte Programm vom Host aus starten, nicht die ganze VM, sondern nur das Programm selbst, wird in einem Fenster angezeigt und man kann damit arbeiten, als führte man das Programm auf dem Host direkt aus.
##In meinem Fall heißt das, Irfan View starten, in der Taskleiste einen Rechtsklick auf den zugehörigen Eintrag machen und "USB-Geräte verwalten" wählen, hier kann man dann den angeschlossenen Scanner zur VM durchreichen.
##Nun kann man wie gewohnt scannen, der Treiber läuft in der VM, wovon man aber nichts mitbekommt, und, insoweit man die Festplatten an die VM durchreicht, auch direkt auf dem Host speichern.
Man sieht, dass diese Variante am schönsten ist, weil man sich, einmal eingerichtet, keine Gedanken mehr machen muss, was im Hintergrund passiert und man seine "alte" Software bzw. seine Treiber verwenden kann wie vorher.
Einige nette Tweaks/Einstellungen/... die ich selber nutze und es Wert sind kurz zusammengefasst zu werden:

*''__Daten synchronisieren mit Weave__''
Wer mindestens 2 Rechner hat und auf beiden Firefox nutzt und seine Bookmarks synchronisieren möchte, konnte schon länger auf Plug-Ins von externen Anbietern zurückgreifen. Eine Alternative die sich nun seit einiger Zeit eröffnet hat, ist das mozilla-eigene Plug-In Weave, welches zusätzlich zu den Bookmarks auch Passwörter, die History, Tabs und die Einstellungen zwischen mehreren Rechnern synchronisiert.
Ich nutze Weave (in etwa seit Version 0.9?!) um zwischen meinem PC und meinem Apple Notebook up-to-date zu bleiben. Da ich, wie viele andere, meine Daten aber nicht gerne in fremde Hände gebe, habe ich auf meinem eigenen Server den [[WeaveMinimalServer|http://tobyelliott.wordpress.com/]] (externer Link!) installiert, eine Minimalversion, welche mit sich mit einer SQlite Datenbank begnügt.

Ich muss sagen, dass ich hellauf begeistert bin, das Synchronisieren funktioniert prima, bisher gab es noch nie Probleme, dass neuere Daten von älteren überschrieben wurden oder etwas verloren ging. Die Passwörter werden verschlüsselt übertragen, benutzt man zusätzlich noch eine SSL-Verbindung (wie ich inzwischen auch), werden nur noch die ganz Paranoiden etwas zum Meckern haben. Möchte man das nicht, kann in den Einstellungen einfach abgewählt werden, was nicht synchronisiert werden soll.
Schaut man sich die [[Roadmap|https://wiki.mozilla.org/Labs/Weave/Roadmap]] (externer Link!) an, sieht man auch die geplanten Entwicklungsschritte für die Zukunft, besonders Interessant dabei ist die API, die es Plug-In Autoren eine Anbindung ermöglicht. Selbst warte ich auf eine Synchronisationsunterstützung vom News-Reader "Brief" :-)

''Quick&Dirty Anleitung:''
#Den WeaveMinimalServer herunterladen (ist weiter oben verlinkt) und installieren.
##In das gewünschte Verzeichnis entpacken. (z.B. ./public_html/weave/)
##Den Pfad in die Config vom Webserver eintragen (genaueres in der beigefügten ReadMe)
##Benutzer auf dem Server erstellen mit @@"php create_user"@@
#Den [[Weave Client|https://addons.mozilla.org/de/firefox/addon/10868]] (externer Link!) installieren.
##Euren Server eintragen (z.B. http://www.[Server].de/weave/)
##Benutzerdaten angeben
##Anweisungen folgen...
Bei Problemen sollte man auf jeden Fall in das "Activity Log" schauen!

SSL-Zertifikat erstellen:
#OpenSSL installieren (mit Aptitude o.ä.)
#@@"openssl req -new -x509 -keyout NAME.pem -out NAME.pem -days 365"@@ erstellt das eigentliche Zertifikat
#@@"openssl x509 -in NAME.pem -out NAME.crt"@@ erstellt das zugehörige Client-Zertifikat

*''__Benutzerprofil an einem anderen Ort speichern (Windows)__''
Standardmäßig wird das eigene Benutzerprofil auf dem Systemlaufwerk im Ordner
"\Dokumente und Einstellungen\[Benutzername]\Anwendungsdaten\Mozilla\Firefox\Profiles\[kryptischer Ordnername]" (Windows XP)<br> (bzw. "\Users\[Benutzername]\appdata\Roaming\Mozilla\Firefox\Profiles\[kryptischer Ordnername]" Windows Vista/7)
gespeichert.
Das hat natürlich den Vorteil, dass, wenn man mit mehreren Nutzern am System arbeitet, die Daten vor dem Zugriff der anderen geschützt sind.
Möchte man nun den Pfad dennoch ändern (z.B. das Profil in den Eigenen Dateien speichern, oder auf einer anderen Festplatte) kann man wie folgt vorgehen: (am besten vorher Sicherungskopie des Profils anlegen, kann nie schaden)
#im Verzeichnis (ausgehend vom Profilverzeichnis!) ..\ liegt die Datei profiles.ini -> mit einem Texteditor öffnen
#hierin sind alle vorhandenen Profile zum eigenen Benutzer aufgelistet, i.d.R. natürlich nur eines
#nun schließt man Firefox und verschiebt den gewünschten Ordner (mit dem kryptischen Namen, kann auch umbenannt werden!) in das Wunschverzeichnis
#in profiles.ini <html><pre>IsRelative=0 <br>Path=[Laufwerk]:\[Pfad]\[Profilordnername]</pre></html> setzen, profiles.ini speichern
#startet man jetzt Firefox ist (hoffentlich ;-) ) alles beim alten

Vorteil der Methode ist, dass man bei einer Neuinstallation des Betriebssystems, seinen Profilordner nicht extra sichern muss, sofern er schon auf eine andere Partition oder gar Festplatte verschoben wurde. Alles was man tun muss ist Firefox neu installieren und in der Datei profiles.ini den Pfad wie unter Punkt 4 beschrieben ändern.
* __Neueinwahl per Crontab__
Wer über seinen Router 24/7 mit dem Internet verbunden ist ärgert sich oft, wenn mitten am Tag der providerseitige reconnect passiert. Damit dies gesteuert zu einem bestimmten Zeitpunkt geschieht, kann man auf dem //Netgear ~DG834GB(G/B ?!)// einen Crontab anlegen. Dies wird dadurch ermöglicht, dass auf der Hardware eine kleine ~Linux-Umgebung läuft (Busybox).

Das Vorgehen ist dabei wie folgt:
# Im Browser http://192.168.0.1/setup.cgi?todo=debug aufrufen, dadurch wird der Telnet Dienst gestartet, sodass man sich darüber mit dem Router verbinden kann.
# Über Telnet auf den Router zugreifen: entweder mit ~PuTTY oder über die Kommandozeile mit {{{telnet 192.168.0.1}}}
# Nun kann man sich erst einen Überblick verschaffen oder sich gleich mit {{{cat /etc/crontab}}} die aktuelle Konfiguration ansehen, die etwa so aussehen sollte:
{{{
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
MAILTO=root
HOME=/
TZ=GMT-1

0 12 * * * root /usr/sbin/rc ddns start
0 0 * * 0,1,2,3,4,5,6 root /usr/sbin/rc firewall restart
0 0 * * 0 root killall -1 syslogd
}}}
# Der Befehl um die Verbindung neu aufzubauen lautet {{{rc wan restart}}}, wenn man sich nicht sicher ist, kann man es auch einfach ausprobieren, am besten schaut man sich im Webinterface des Routers den Verbindungsstatus an um zu sehen was passiert. Diesen Befehl möchte man nun täglich zu einer Zeit, zu der man relativ selten im Internet ausführen lassen. Die Zeile, die man dazu zur ~Crontab-Konfiguration hinzufügen muss lautet {{{30 4 * * 0,1,2,3,4,5,6 root /usr/sbin/rc wan restart}}}, was einer Ausführung an jedem Wochentag um 4:30 Uhr entspricht.
# Da es keinerlei Texteditor und nicht den Befehl {{{wget}}} auf dem Router gibt, muss man mit den vorhandenen Systemtools arbeiten.
{{{
#ins Verzeichnis wechseln
cd /etc/
#ein Backup der vorhandenen Konfiguration erstellen (nur für den Fall...)
cp crontab crontab_b
#eine Zeile anhängen
cat >> crontab
#eingeben und Enter drücken
30 4 * * 0,1,2,3,4,5,6 root /usr/sbin/rc wan restart
#Bearbeiten abschließen
Str+D
#nochmal prüfen ob alles passt
cat crontab
}}}


Generell sind wohl auf unterschiedlichen Version des ~DG834 leicht verschiedene Busybox Versionen drauf, wer nicht genau GB besitzt, findet für die anderen Modelle sicher über eine Forensuche das passende, wobei aber der Grundlegende Ablauf der selbe ist.
Schon vor längerer Zeit bin ich auf das wunderbare Projekt [[OpenStreetMap|http://www.openstreetmap.org/]] (externer Link!) gestoßen, bei dem frei verfügbares Kartenmaterial durch eine Community erstellt wird. Dadurch bedingt, ist es gerade in großen Städten wesentlich detaillierter als andere im Internet verfügbare Dienste.
Ein weiterer sehr interessanter Dienst der darauf aufbaut ist [[OpenRouteService|http://www.openrouteservice.org/]] (externer Link!), welcher sogar Fußgänger- und Fahrrad-Routen berechnen kann. Diese Route kann dann direkt als .gpx Datei (GPS-Exchange Datenformat) exportiert werden und so z.B. auf einem mobilen Navigationsgerät genutzt werden.

Die Technologie welche zum Einbinden des Kartenmaterials genutzt wird nennt sich [[OpenLayers|http://www.openlayers.org/]] (externer Link!) und ist, wie der Name schon suggeriert, unter freier Lizenz erhältlich und dementsprechend kostenlos. Dabei handelt es sich um ein JavaScript Framework mit dem man schon mit wenigen Zeilen Code eine Karte in seine eigene Homepage einbinden kann. Es gibt zudem zahlreiche Beispiele, sodass auch etwas komplexere Anforderungen relativ schnell implementiert werden können.

Ich werde mich damit auch im Zuge meines HiWi-Jobs noch weiter damit beschäftigen und mich dann hoffentlich dazu abringen können hier möglichst viel darüber zu berichten und zu dokumentieren ;)
<!--{{{-->
<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 id='footer'>
<br><br>
<div class='footerText' refresh='content' tiddler='FooterText'></div>
</div>
</div>
<!--}}}-->
/***
|''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"
	});
*/
//}}}
<html>

<body>
<iframe src="map_bike.html" width="90%" height="500" frameborder="0">
</body>
</html>
Geodaten © [[OpenStreetMap | http://www.openstreetmap.org/]] und Mitwirkende, [[CC-BY-SA | http://creativecommons.org/licenses/by-sa/2.0/]]

Benutzung: Alle vorhandenen Routen werden zu Beginn im Hintergrund geladen und können rechts oben über einen Klick auf das Plus-Symbol in der Layerauswahl aktiviert werden.
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">>
<<upload>>
<<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
<<slider chkSliderSideBarTabsPanel SideBarTabs "SideBarTabs »" "SideBarTabs">>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
praktische Tipps und sonstiges Gedöhns
fabian-ball.de
http://www.fabian-ball.de
/*{{{*/
* 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;}

#footer 
.footerText {font-weight:bold; text-align:center;}

* 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;}
/*}}}*/
Ist eine Wiki Software, auf der diese Homepage aufbaut. Das tolle (bzw. das schlechte, wie man's nimmt) ist, dass alles in einem einzigen html-Dokument implementiert ist und per JavaScript realisiert wurde.

Weitere Informationen gibt es auf der [[Homepage|http://www.tiddlywiki.com/]].
|~ViewToolbar|closeTiddler closeOthers +editTiddler > fields syncing permalink references jump|
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 09/02/2011 22:15:10 | Fabian | [[/|http://www.fabian-ball.de/]] | [[store.php|http://www.fabian-ball.de/store.php]] | . | [[index.html | http://www.fabian-ball.de/index.html]] |  |
| 17/03/2011 15:34:42 | Fabian | [[/|http://www.fabian-ball.de/]] | [[store.php|http://www.fabian-ball.de/store.php]] | . | [[index.html | http://www.fabian-ball.de/index.html]] |  |
| 17/03/2011 15:36:02 | Fabian | [[/|http://www.fabian-ball.de/]] | [[store.php|http://www.fabian-ball.de/store.php]] | . | [[index.html | http://www.fabian-ball.de/index.html]] |  |
| 24/04/2011 20:02:04 | Fabian | [[/|http://www.fabian-ball.de/]] | [[store.php|http://www.fabian-ball.de//store.php]] | . | [[index.html | http://www.fabian-ball.de//index.html]] |  | ok |
| 24/04/2011 20:03:33 | Fabian | [[/|http://www.fabian-ball.de/]] | [[store.php|http://www.fabian-ball.de//store.php]] | . | [[index.html | http://www.fabian-ball.de//index.html]] |  |
| 27/04/2011 00:39:17 | Fabian | [[/|http://fabian-ball.de/]] | [[store.php|http://fabian-ball.de/store.php]] | . | [[index.html | http://fabian-ball.de/index.html]] |  | ok |
| 27/04/2011 00:40:57 | Fabian | [[/|http://fabian-ball.de/]] | [[store.php|http://fabian-ball.de/store.php]] | . | [[index.html | http://fabian-ball.de/index.html]] |  |
| 18/09/2011 22:08:05 | Fabian | [[/|http://www.fabian-ball.de/]] | [[store.php|http://www.fabian-ball.de/store.php]] | . | [[index.html | http://www.fabian-ball.de/index.html]] |  | failed |
| 18/09/2011 22:08:21 | Fabian | [[/|http://www.fabian-ball.de/]] | [[store.php|http://www.fabian-ball.de/store.php]] | . | [[index.html | http://www.fabian-ball.de/index.html]] |  |
| 29/10/2011 13:14:21 | Fabian | [[/|http://www.fabian-ball.de/]] | [[store.php|http://www.fabian-ball.de/store.php]] | . | [[index.html | http://www.fabian-ball.de/index.html]] |  |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.4|
|''Date:''|2008-08-11|
|''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|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
	major: 4, minor: 1, revision: 4,
	date: new Date("2008-08-11"),
	source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0'
};

//
// 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
		if (!params) params = {};
		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}
				
			]);
	},
	options: [
		"txtUploadUserName",
		"pasUploadPassword",
		"txtUploadStoreUrl",
		"txtUploadDir",
		"txtUploadFilename",
		"txtUploadBackupDir",
		"chkUploadLog",
		"txtUploadLogMaxLine"		
	],
	refreshOptions: function(listWrapper) {
		var opts = [];
		for(i=0; i<this.options.length; i++) {
			var opt = {};
			opts.push();
			opt.option = "";
			n = this.options[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 = new 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,username,password,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 = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
		var rssString = generateRss();
		// no UnicodeToUTF8 conversion needed when location is "file" !!!
		if (document.location.toString().substr(0,4) != "file")
			rssString = convertUnicodeToUTF8(rssString);	
		bidix.upload.httpUpload(rssUploadParams,rssString,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 == 404)
			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; ;charset=UTF-8; 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');


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


//}}}

Hallo und Willkommen auf meiner Homepage,
die Inhalte die ihr hier erwarten könnt sind oben ganz klar erklärt ;-)

Es freut mich wenn ich einigen Leuten damit (hauptsächlich natürlich mit den Tipps) helfen kann und ich hoffe,
dass ich die Muse finde Lösungen für Probleme die ich selbst schon hatte hier auch niederzuschreiben.

Viel Spaß,
Fabian

!!''NEWS''
!!!//04.02.2011//
Seit dieser Woche habe ich ein neues Superhandy mit integriertem ~GPS-Empfänger. Jetzt muss es nur noch etwas wärmer werden, sodass ich die [[Fahrrad-Routen-Sektion |Routen in und um Karlsruhe]] sicher bald etwas anreichern kann.
Dazu habe ich mir mit ~JavaScript und Php ein kleines System geschrieben, bei dem ~GPS-Dateien im ~Xml-Format (.gps) nur noch in einen bestimmten Ordner geworfen werden müssen und dann beim Aufruf der Seite automatisch geladen werden.
[[Backup mit Robocopy]]
* ''__alten Scanner zum Laufen bringen__''
Als ich vor kurzem auf Windows 7 64bit umgestiegen bin, hatte ich natürlich vorher geprüft, ob ich auch für meine ganzen Geräte 64bit Treiber beziehen kann. Einzig und allein mein betagter Scanner (Mustek Bearpaw 1200CU) konnte da nicht mithalten, und nur deswegen 32bit installieren kam für mich nicht in Frage. Um aber trotzdem weiter damit arbeiten zu können habe ich das Problem wie folgt gelöst:
**[[Methode 1: Vmware Player zusammen mit Windows XP]]
**[[Methode 2: ein schlankes Unix-System als VM installieren und den Scanner via SANE betreiben]]
**[[Methode 2.1: Debian 5 als virtuelle Maschine]]
**[[Methode 3: Windows XP-Mode von Windows 7]]
Grenzt man die drei vorgestellten Methoden voneinander ab, hat ganz klar jede ihre Vor- und Nachteile:
||''Methode 1''|''Methode 2''|''Methode 3''|
|''Preis''|Vmware Player kostenlos, Windows XP nicht|komplett kostenlos weil Open-Source|kostenlos|
|''Aufwand''|mittelmäßig, Installation geht recht schnell|hoch, bis alles läuft vergeht einige Zeit|gering, da fast alles automatisch passiert|
|''Anwendbarkeit''|für jeden mit "altem" Betriebssystem|für jeden|nur für Besitzer von Windows 7 Pofessional und höher (außerdem muss das System Hardware-Virtualisierung unterstützen)|
|''Bequemlichkeit''|relativ hoch|hoher Einrichtungsaufwand, danach etwas umständlich zu bedienen|hoch|
|''Speicherplatzbedarf''|recht hoch ~2,5 GB für die VM (kann mit etwas Aufwand sicher reduziert werden)|gering, je nach eigenem Kenntnisstand, kommt man z.B. mit DamnSmallLinux auf ~300MB (wobei ich es damit auch versucht habe und gescheitert bin)|hoch, die Basis-VM hat ca. 1,1 GB (kann evtl. gelöscht werden?!), hinzu kommt die eigentliche VM, je nach Anzahl isntallierter Programme nocheinmal ~1,5+ GB|
|''Sonstiges''|Back- und Frontend in der VM; universell einsetzbar|nur Backend in der VM|wie Methode 1|

* ''__praktische Tastenkürzel__''
Vor kurzem habe ich diese Tastenkürzel durch Zufall entdeckt, als ich nach etwas anderem gegoogelt hatte, sie sind natürlich nicht geheim, nur wer schaut schon in die Windows-Hilfe?!
Alle haben etwas mit der Fensteranordnung zu tun und sind i.d.R. auch verfügbar, wenn man nicht das Aero-Thema aktiviert hat ([Win] bezeichnet im Folgenden die Windowstaste):
|[Win] + G					|Zwischen Minianwendungen umschalten|
|[Win] + Leertaste			|	Alle Fenster Transparent schalten|
|[Win] + Pos 1				|	Inaktive Fenster minimieren|
|[Win] + P					|Optionen für mehrere Monitore anzeigen (gerade bei Laptops nützlich)|
|[Win] + -					|	Ansicht der Bildschirmlupe verkleinern|
|[Win] + +					|Ansicht der Bildschirmlupe vergrößern|
|[Win] + Shift + Pfeil Rechts	|	Fenster einen Monitor nach rechts verschieben|
|[Win] + Shift + Pfeil Links		|	Fenster einen Monitor nach links verschieben|
|[Win] + Pfeil Unten			|	aktives Fenster minimieren|
|[Win] + Pfeil Oben			|	aktives Fenster maximieren|
|[Win] + Pfeil Rechts			|	"Aero Snap" auf der rechten Seite|
|[Win] + Pfeil Links			|	"Aero Snap" auf der linken Seite|

*__[[Eventlog Speicherort ändern]]__