<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff Foreground: #000 PrimaryPale: #8cf PrimaryLight: #18f PrimaryMid: #04b PrimaryDark: #014 SecondaryPale: #ffc SecondaryLight: #fe8 SecondaryMid: #db4 SecondaryDark: #841 TertiaryPale: #eee TertiaryLight: #ccc TertiaryMid: #999 TertiaryDark: #666 Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}
h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}
.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}
.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}
.tabSelected{color:[[ColorPalette::PrimaryDark]];
background:[[ColorPalette::TertiaryPale]];
border-left:1px solid [[ColorPalette::TertiaryLight]];
border-top:1px solid [[ColorPalette::TertiaryLight]];
border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}
#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}
.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}
#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}
.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}
.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}
.tiddler .defaultCommand {font-weight:bold;}
.shadow .title {color:[[ColorPalette::TertiaryDark]];}
.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}
.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}
.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}
.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}
.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}
.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}
.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}
.imageLink, #displayArea .imageLink {background:transparent;}
.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}
.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}
.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}
.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}
.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}
.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}
body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}
h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}
hr {height:1px;}
a {text-decoration:none;}
dt {font-weight:bold;}
ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}
.txtOptionInput {width:11em;}
#contentWrapper .chkOptionInput {border:0;}
.externalLink {text-decoration:underline;}
.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}
.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}
/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}
#mainMenu .tiddlyLinkExisting,
#mainMenu .tiddlyLinkNonExisting,
#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}
.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}
#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}
#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}
.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}
#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}
.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}
.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}
.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}
#contentWrapper {display:block;}
#splashScreen {display:none;}
#displayArea {margin:1em 17em 0em 14em;}
.toolbar {text-align:right; font-size:.9em;}
.tiddler {padding:1em 1em 0em 1em;}
.missing .viewer,.missing .title {font-style:italic;}
.title {font-size:1.6em; font-weight:bold;}
.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}
.tiddler .button {padding:0.2em 0.4em;}
.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}
.footer {font-size:.9em;}
.footer li {display:inline;}
.annotation {padding:0.5em; margin:0.5em;}
* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}
.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}
.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}
.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}
.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}
.sparkline {line-height:1em;}
.sparktick {outline:0;}
.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}
* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}
.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers: * SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar) * MainMenu: The menu (usually on the left) * DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs) <<option txtUserName>> <<option chkSaveBackups>> SaveBackups <<option chkAutoSave>> AutoSave <<option chkRegExpSearch>> RegExpSearch <<option chkCaseSensitiveSearch>> CaseSensitiveSearch <<option chkAnimate>> EnableAnimations ---- Also see AdvancedOptions
<<importTiddlers>>
And I'm back to work! The EBI ski trip was great fun and I actually was able to work on my skiing skills. Some pictures from that event are linked in the Photos section. Now everything is back to normal and I am already dealing with the usual email flood and rowing, EMBL science and society and work tasks (increasing in volume of time required ;-) ). Happy new year to everyone!
Sooo, first entry: After a long battle with my web host 1&1 Internet AG (I really can't recommend them!), I have finally moved my domain to strato AG and - only some months later ;-) - found the time to add some contents. I use my Christmas break to get some of those bullet points organised that have already spent too much time on the bottom of my todo list.
Now Christmas is over and I've had some more time to create the funny little green and white icons for my navigation. After trying very hard, I also got the CUCBC river conditions to run on a non-srcf.ucam.org web site by creating two pages on my srcf acconts that I can integrate into my TiddlyWiki via iframes (puh, that was difficult!). The holidays were rather relaxing: I met lots of relatives and friends, enjoyed the clear and cold weather in Bischberg, took the opportunity and had quite some German Glühwein with my friends from high school and am therefore now up to date regarding all the news and gossip from my year :-) Happy new year to everyone!
I only seem to be able to update this web page in winter :-) Today I have added some info to the Bioinformatics page as well as to the Rowing section, so you guys can have a look at what I've done over the summer. Most likely the next update will be around Christmas!
Below you'll find my CV, my publications and some web links to former and current research projects.
!Curriculum vitae
<html><table border=0>
<tr>
<th>2007-2011</th>
<td>PhD student and then "bridging" postdoc at the European Bioinformatics Institute <u><a href="http://www.ebi.ac.uk/Thornton" target="_blank">EMBL-EBI</a></u> and the <u><a href="http://www.cam.ac.uk" target="_blank">University of Cambridge, UK</a></u></td>
<td><img src="http://www.ebi.ac.uk/inc/images/ebilogohome.gif" alt="EBI" width=150><img src="http://www.cam.ac.uk/global/images/identifier4.gif" alt="UniCam" width=150></td>
</tr>
<tr>
<th>2006-2007</th>
<td>Diploma thesis followed by part-time employment at the <u><a href="http://www.eb.tuebingen.mpg.de/departments/1-protein-evolution/department-1-protein-evolution?set_language=en&cl=en" target="_blank">Max Planck Institute for Developmental Biology - Department of Protein Evolution</a></u></td>
<td><img src="http://tuebingen.mpg.de/fileadmin/template/main/images/minerva.jpg" alt="MPI" width=100></td>
</tr>
<tr>
<th>2000-2006</th>
<td>Diploma in Computer Science (Bioinformatics) at the <u><a href="http://www.uni-tuebingen.de" target="_blank">University of Tübingen, Germany</a></u>, at the <u><a href="http://wsi.uni-tuebingen.de" target="_blank"> Department of Computer Science</a></u></td>
<td><img src="http://www.uni-tuebingen.de/uni/qvr/icons/unilobl.gif" alt="UniTue" width=150></td>
</tr>
<tr>
<th>2003/2004</th>
<td>Exchange year at the <u><a href="http://www.durham.ac.uk" target="_blank">University of Durham, UK</a></u>, <u><a href="http://www.dur.ac.uk/computer.science/" target="_blank">Department of Computer Science</a></u></td>
<td><img src="http://www.dur.ac.uk/images/template/logounidurham-new.gif" alt="UniDur" width=150></td>
</tr>
<tr>
<th>2000</th>
<td>Abitur (German high school degree) at the <u><a href="http:www.franz-ludwig-gymnasium.de" target="_blank">Franz-Ludwig-Gymnasium Bamberg, Germany</a></u></td>
<td><img src="http://www.bnv-bamberg.de/home/ba2282/main/flglogo.gif" alt="FLG"></td>
</tr>
</table></html>
!Activities
*2008
**[[EMBL-EBI Science and Society|http://www.embl.de/aboutus/science_society/index.html]] committee member
**co-organiser of the symposium [[The Personal Genome - Hopes, Facts and Fears|http://www.ebi.ac.uk/Information/events/personalgenome/]] in Cambridge
*2009
**[[EMBL-EBI Science and Society|http://www.embl.de/aboutus/science_society/index.html]] committee rep
**head organiser of the symposium [[The mortal immortal - Scientific and Social Aspects of Ageing|http://www.ebi.ac.uk/Information/events/ageingresearch/]] in Cambridge
*2010
**[[EMBL-EBI Science and Society|http://www.embl.de/aboutus/science_society/index.html]] committee member
**co-organiser of the symposium [[Who Owns Science? Promises and Pitfalls of the Public-Private Partnerships|http://www.ebi.ac.uk/Information/events/whoownsscience/]]
!Publications
*Holliday GL, ''Fischer JD'', Mitchell, JB, Thornton JM: [[Characterising the complexity of enzymes based on their mechanisms and structures using a bio-computational analysis.|http://onlinelibrary.wiley.com/doi/10.1111/j.1742-4658.2011.08190.x/abstract;jsessionid=B2CD00487B31FBF286ED8D5646A8F619.d01t04]] //FEBS J.//. 2011 May 23 [Epub].
*''Fischer JD'', Holliday GL, Rahman, SA, Thornton JM: [[The structures and physicochemical properties of organic cofactors in biocatalysis.|http://bioinformatics.oxfordjournals.org/content/26/19/2496.long]]<br>//J. Mol. Biol.//. 2010 Nov 12; 403(5):803-24. Epub 2010 Sep 17.
*''Fischer JD'', Holliday GL, Thornton JM: [[The CoFactor database: Organic cofactors in enzyme catalysis.|http://bioinformatics.oxfordjournals.org/cgi/content/abstract/btq442?ijkey=57C0Smzp5Vu2gih&keytype=ref]]<br>//Bioinformatics//. 2010 Oct 1;26(19):2496-7. Epub 2010 Aug 2.
*''Fischer JD'', Mayer CE, Söding J: [[Prediction of protein functional residues from sequence by probability density estimation.|http://www.ncbi.nlm.nih.gov/pubmed/18174181]]<br>//Bioinformatics//. 2008 Mar 1;24(5):613-20.
*Krämer J, ''Fischer JD'', Zientz E, Vijayan V, Griesinger C, Lupas A, Unden G: [[Citrate sensing by the C4-dicarboxylate/citrate sensor kinase DcuS of Escherichia coli: binding site and conversion of DcuS to a C4-dicarboxylate- or citrate-specific sensor.|http://www.ncbi.nlm.nih.gov/pubmed/17416661]]<br>//J Bacteriol.// 2007 Jun;189(11):4290-8.
!Talks at national and international conferences
*Young Modellers' Forum 2010 (oral presentation): [[Organic enzyme cofactors - Nature's little helpers|http://www.mgms.org/YMF2010/YMF2010.html]]
*EMBO conference series [[Catalytic mechanisms by biological systems: at the interface between chemistry and biology|http://www.embl-hamburg.de/training/courses_conferences/conference/2010/CMS10-01/index.html]], EMBL Hamburg, Germany Wednesday 5 May - Friday 7 May 2010: //The Structures and Physicochemical Properties of Cofactors in Biocatalysis//
*Talk invited by Dr. R. Najmanovich in Université de Sherbrooke, Quebec, Canada: //Organic enzyme cofactors and the [[CoFactor|http://www.ebi.ac.uk/thornton-srv/databases/CoFactor/]] database//
!Links
*[[CoFactor|http://www.ebi.ac.uk/thornton-srv/databases/CoFactor]]: Organic enzyme cofactors in Biocatalysis
*[[MACiE|http://www.ebi.ac.uk/thornton-srv/databases/MACiE/index.html]]: Mechanism, Annotation and Classification in Enzymes
*[[FRpred|http://frpred.tuebingen.mpg.de]]: Functional residue prediction from amino acid sequence
Yes, I know. Everyone's got a blog. Most probably, this one is as unnecessary as most of them, but since it's so easy to do it, I might as well :-). Apart from that I'm that kind of yay-I-have-another-reason-to-play-with-my-computer-person. So in case anything interesting happens or anything that I feel the need to express in public, this is where it goes. <<listTaggedTiddlers journal -1 false true true>>
Name: MptwGreen Background: #fff Foreground: #000 PrimaryPale: #cfd PrimaryLight: #5c7 PrimaryMid: #141 PrimaryDark: #021 SecondaryPale: #ffc SecondaryLight: #fe8 SecondaryMid: #db4 SecondaryDark: #841 TertiaryPale: #eee TertiaryLight: #ccc TertiaryMid: #999 TertiaryDark: #666 Error: #f88
No post address here, because I don't want any snail mail spam. My email (in a hopefully non-machine-readable way) and my work contact info can be found on the [[EBI web site|http://www.ebi.ac.uk/Information/Staff/person_maintx.php?s_person_id=931]].
[[Welcome]]
[[Home|Welcome]]<html> <img src="icons/home.png" height=35></html> [[Bioinformatics]]<html> <img src="icons/bioinf.png" height=35></html> [[Rowing]]<html> <img src="icons/rowing.png" height=35></html> [[Blog]]<html> <img src="icons/blog.png" height=35></html> [[Contact]]<html> <img src="icons/contact.png" height=35></html>
Here are some of my photo albums. Please click on the photo to go to the album.
<html>
<table>
<tr>
<th>EBI Ski Trip Tignes 2009</th>
<td><a href="http://www.facebook.com/album.php?aid=80794&l=04885&id=678516514" target="_blank"><img src="pixx/ebiski09.png" height=120></a></td>
</tr>
<tr>
<th>EBI Christmas Party 2008</th>
<td><a href="http://www.facebook.com/album.php?aid=75975&l=8e320&id=678516514" target="_blank"><img src="pixx/ebixmas08.png" height=120></a></td>
</tr>
<tr>
<th>PhD retreat Lisbon</th>
<td><a href="http://www.facebook.com/album.php?aid=56949&l=f2134&id=678516514" target="_blank"><img src="pixx/lisbon08.png" height=120></a></td>
</tr>
<tr>
<th>May bumps 2008</th>
<td><a href="http://www.facebook.com/album.php?aid=43361&l=57aa1&id=678516514" target="_blank"><img src="pixx/maybumps08.png" height=120></a></td>
</tr>
<tr>
<th>Salamance 2007</th>
<td><a href="http://www.facebook.com/album.php?aid=14700&l=b5a51&id=678516514" target="_blank"><img src="pixx/salamanca07.png" height=120></a></td>
</tr>
<tr>
<th>Australia 2005</th>
<td><a href="http://www.facebook.com/album.php?aid=5361&l=8192b&id=678516514" target="_blank"><img src="pixx/australia05.png" height=120></a></td>
</tr>
<tr>
<th>New Zealand 2005</th>
<td><a href="http://www.facebook.com/album.php?aid=5349&l=09ef9&id=678516514" target="_blank"><img src="pixx/newzealand05.png" height=120></a></td>
</tr>
<tr>
<th>Corsica 2004</th>
<td><a href="http://www.facebook.com/album.php?aid=5342&l=98029&id=678516514" target="_blank"><img src="pixx/corsica.png" height=120></a></td>
</tr>
<tr>
<th>Durham 2003/04</th>
<td><a href="http://www.facebook.com/album.php?aid=5336&l=ba654&id=678516514" target="_blank"><img src="pixx/durham0304.png" height=120></a></td>
</tr>
</table>
</html>
/***
|''Name:''|ProcessingjsPlugin|
|''Description:''|TiddlyWiki Bundle of John Ressig's processing.js|
|''Date:''|May 9, 2008|
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com)|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ProcessingPlugin.js|
|''Version:''|0.2|
|''License:''|[[MIT license]]|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.2|
With contributions from Simon Baird.
***/
//{{{
// Ensure Plugin is only installed once.
if(!version.extensions.Processingjs) {
version.extensions.Processingjs = {installed:true};
config.macros.Processing = {
counter: 0,
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
var id = "processingcanvas"+this.counter;
var canvas = createTiddlyElement(place,"canvas",id);
// inlined code
var code = paramString;
// quick and dirty grab of code from a named tiddler
if (store.tiddlerExists(params[0])) {
code = store.getTiddlerText(params[0]);
}
// or with no params, grab code from this tiddler
if (paramString.trim() == '') {
code = tiddler.text;
}
createTiddlyElement(place,"br");
var restartBtn = createTiddlyButton(place,"restart","restart",function() {
story.refreshTiddler(tiddler.title,null,true);
return false;
},
'processingRestart' // it's a class so you can style the button
);
Processing(canvas,code);
}
};
// requires 2.4
merge(config.macros.view.views,{
processing: function(value,place,params,wikifier,paramString,tiddler) {
wikify("<<Processing\n"+value+"\n>>",place,highlightHack,tiddler);
}
});
/*
* inlined copy of Processing.js
* latest code at: http://ejohn.org/blog/processingjs/
*/
/*
* Processing.js - John Resig (http://ejohn.org/)
* MIT Licensed
* http://ejohn.org/blog/processingjs/
*
* This is a port of the Processing Visualization Language.
* More information: http://processing.org/
*/
(function(){
this.Processing = function Processing( aElement, aCode ) {
if ( typeof aElement == "string" )
aElement = document.getElementById( aElement );
var p = buildProcessing( aElement );
if ( aCode )
p.init( aCode );
return p;
};
function log() {
try {
console.log.apply( console, arguments );
} catch(e) {
try {
opera.postError.apply( opera, arguments );
} catch(e){}
}
}
var parse = Processing.parse = function parse( aCode, p ) {
// Angels weep at this parsing code :-(
// Remove end-of-line comments
aCode = aCode.replace(/\/\/ .*\n/g, "\n");
// Weird parsing errors with %
aCode = aCode.replace(/([^\s])%([^\s])/g, "$1 % $2");
// Simple convert a function-like thing to function
aCode = aCode.replace(/(?:static )?(\w+ )(\w+)\s*(\([^\)]*\)\s*{)/g, function(all, type, name, args) {
if ( name == "if" || name == "for" || name == "while" ) {
return all;
} else {
return "Processing." + name + " = function " + name + args;
}
});
// Force .length() to be .length
aCode = aCode.replace(/\.length\(\)/g, ".length");
// foo( int foo, float bar )
aCode = aCode.replace(/([\(,]\s*)(\w+)((?:\[\])+| )\s*(\w+\s*[\),])/g, "$1$4");
aCode = aCode.replace(/([\(,]\s*)(\w+)((?:\[\])+| )\s*(\w+\s*[\),])/g, "$1$4");
// float[] foo = new float[5];
aCode = aCode.replace(/new (\w+)((?:\[([^\]]*)\])+)/g, function(all, name, args) {
return "new ArrayList(" + args.slice(1,-1).split("][").join(", ") + ")";
});
aCode = aCode.replace(/(?:static )?\w+\[\]\s*(\w+)\[?\]?\s*=\s*{.*?};/g, function(all) {
return all.replace(/{/g, "[").replace(/}/g, "]");
});
// int|float foo;
var intFloat = /(\n\s*(?:int|float)(?:\[\])?(?:\s*|[^\(]*?,\s*))([a-z]\w*)(;|,)/i;
while ( intFloat.test(aCode) ) {
aCode = aCode.replace(new RegExp(intFloat), function(all, type, name, sep) {
return type + " " + name + " = 0" + sep;
});
}
// float foo = 5;
aCode = aCode.replace(/(?:static )?(\w+)((?:\[\])+| ) *(\w+)\[?\]?(\s*[=,;])/g, function(all, type, arr, name, sep) {
if ( type == "return" )
return all;
else
return "var " + name + sep;
});
// Fix Array[] foo = {...} to [...]
aCode = aCode.replace(/=\s*{((.|\s)*?)};/g, function(all,data) {
return "= [" + data.replace(/{/g, "[").replace(/}/g, "]") + "]";
});
// static { ... } blocks
aCode = aCode.replace(/static\s*{((.|\n)*?)}/g, function(all, init) {
// Convert the static definitons to variable assignments
//return init.replace(/\((.*?)\)/g, " = $1");
return init;
});
// super() is a reserved word
aCode = aCode.replace(/super\(/g, "superMethod(");
var classes = ["int", "float", "boolean", "string"];
function ClassReplace(all, name, extend, vars, last) {
classes.push( name );
var static = "";
vars = vars.replace(/final\s+var\s+(\w+\s*=\s*.*?;)/g, function(all,set) {
static += " " + name + "." + set;
return "";
});
// Move arguments up from constructor and wrap contents with
// a with(this), and unwrap constructor
return "function " + name + "() {with(this){\n " +
(extend ? "var __self=this;function superMethod(){extendClass(__self,arguments," + extend + ");}\n" : "") +
// Replace var foo = 0; with this.foo = 0;
// and force var foo; to become this.foo = null;
vars
.replace(/,\s?/g, ";\n this.")
.replace(/\b(var |final |public )+\s*/g, "this.")
.replace(/this.(\w+);/g, "this.$1 = null;") +
(extend ? "extendClass(this, " + extend + ");\n" : "") +
"<CLASS " + name + " " + static + ">" + (typeof last == "string" ? last : name + "(");
}
var matchClasses = /(?:public |abstract |static )*class (\w+)\s*(?:extends\s*(\w+)\s*)?{\s*((?:.|\n)*?)\b\1\s*\(/g;
var matchNoCon = /(?:public |abstract |static )*class (\w+)\s*(?:extends\s*(\w+)\s*)?{\s*((?:.|\n)*?)(Processing)/g;
aCode = aCode.replace(matchClasses, ClassReplace);
aCode = aCode.replace(matchNoCon, ClassReplace);
var matchClass = /<CLASS (\w+) (.*?)>/, m;
while ( (m = aCode.match( matchClass )) ) {
var left = RegExp.leftContext,
allRest = RegExp.rightContext,
rest = nextBrace(allRest),
className = m[1],
staticVars = m[2] || "";
allRest = allRest.slice( rest.length + 1 );
rest = rest.replace(new RegExp("\\b" + className + "\\(([^\\)]*?)\\)\\s*{", "g"), function(all, args) {
args = args.split(/,\s*?/);
if ( args[0].match(/^\s*$/) )
args.shift();
var fn = "if ( arguments.length == " + args.length + " ) {\n";
for ( var i = 0; i < args.length; i++ ) {
fn += " var " + args[i] + " = arguments[" + i + "];\n";
}
return fn;
});
// Fix class method names
// this.collide = function() { ... }
// and add closing } for with(this) ...
rest = rest.replace(/(?:public )?Processing.\w+ = function (\w+)\((.*?)\)/g, function(all, name, args) {
return "ADDMETHOD(this, '" + name + "', function(" + args + ")";
});
var matchMethod = /ADDMETHOD([\s\S]*?{)/, mc;
var methods = "";
while ( (mc = rest.match( matchMethod )) ) {
var prev = RegExp.leftContext,
allNext = RegExp.rightContext,
next = nextBrace(allNext);
methods += "addMethod" + mc[1] + next + "});"
rest = prev + allNext.slice( next.length + 1 );
}
rest = methods + rest;
aCode = left + rest + "\n}}" + staticVars + allRest;
}
// Do some tidying up, where necessary
aCode = aCode.replace(/Processing.\w+ = function addMethod/g, "addMethod");
function nextBrace( right ) {
var rest = right;
var position = 0;
var leftCount = 1, rightCount = 0;
while ( leftCount != rightCount ) {
var nextLeft = rest.indexOf("{");
var nextRight = rest.indexOf("}");
if ( nextLeft < nextRight && nextLeft != -1 ) {
leftCount++;
rest = rest.slice( nextLeft + 1 );
position += nextLeft + 1;
} else {
rightCount++;
rest = rest.slice( nextRight + 1 );
position += nextRight + 1;
}
}
return right.slice(0, position - 1);
}
// Handle (int) Casting
aCode = aCode.replace(/\(int\)/g, "0|");
// Remove Casting
aCode = aCode.replace(new RegExp("\\((" + classes.join("|") + ")(\\[\\])?\\)", "g"), "");
// Convert 3.0f to just 3.0
aCode = aCode.replace(/(\d+)f/g, "$1");
// Force numbers to exist
//aCode = aCode.replace(/([^.])(\w+)\s*\+=/g, "$1$2 = ($2||0) +");
// Force characters-as-bytes to work
aCode = aCode.replace(/('[a-zA-Z0-9]')/g, "$1.charCodeAt(0)");
// Convert #aaaaaa into color
aCode = aCode.replace(/#([a-f0-9]{6})/ig, function(m, hex){
var num = toNumbers(hex);
return "color(" + num[0] + "," + num[1] + "," + num[2] + ")";
});
function toNumbers( str ){
var ret = [];
str.replace(/(..)/g, function(str){
ret.push( parseInt( str, 16 ) );
});
return ret;
}
//log(aCode);
return aCode;
};
function buildProcessing( curElement ){
var p = {};
// init
p.PI = Math.PI;
p.TWO_PI = 2 * p.PI;
p.HALF_PI = p.PI / 2;
p.P3D = 3;
p.CORNER = 0;
p.RADIUS = 1;
p.CENTER_RADIUS = 1;
p.CENTER = 2;
p.POLYGON = 2;
p.QUADS = 5;
p.TRIANGLES = 6;
p.POINTS = 7;
p.LINES = 8;
p.TRIANGLE_STRIP = 9;
p.TRIANGLE_FAN = 4;
p.QUAD_STRIP = 3;
p.CORNERS = 10;
p.CLOSE = true;
p.RGB = 1;
p.HSB = 2;
// mouseButton constants: values adjusted to come directly from e.which
p.LEFT = 1;
p.CENTER = 2;
p.RIGHT = 3;
// "Private" variables used to maintain state
var curContext = curElement.getContext("2d");
var doFill = true;
var doStroke = true;
var loopStarted = false;
var hasBackground = false;
var doLoop = true;
var looping = 0;
var curRectMode = p.CORNER;
var curEllipseMode = p.CENTER;
var inSetup = false;
var inDraw = false;
var curBackground = "rgba(204,204,204,1)";
var curFrameRate = 1000;
var curShape = p.POLYGON;
var curShapeCount = 0;
var curvePoints = [];
var curTightness = 0;
var opacityRange = 255;
var redRange = 255;
var greenRange = 255;
var blueRange = 255;
var pathOpen = false;
var mousePressed = false;
var keyPressed = false;
var firstX, firstY, secondX, secondY, prevX, prevY;
var curColorMode = p.RGB;
var curTint = -1;
var curTextSize = 12;
var curTextFont = "Arial";
var getLoaded = false;
var start = (new Date).getTime();
// Global vars for tracking mouse position
p.pmouseX = 0;
p.pmouseY = 0;
p.mouseX = 0;
p.mouseY = 0;
p.mouseButton = 0;
// Will be replaced by the user, most likely
p.mouseDragged = undefined;
p.mouseMoved = undefined;
p.mousePressed = undefined;
p.mouseReleased = undefined;
p.keyPressed = undefined;
p.keyReleased = undefined;
p.draw = undefined;
p.setup = undefined;
// The height/width of the canvas
p.width = curElement.width - 0;
p.height = curElement.height - 0;
// The current animation frame
p.frameCount = 0;
// In case I ever need to do HSV conversion:
// http://srufaculty.sru.edu/david.dailey/javascript/js/5rml.js
p.color = function color( aValue1, aValue2, aValue3, aValue4 ) {
var aColor = "";
if ( arguments.length == 3 ) {
aColor = p.color( aValue1, aValue2, aValue3, opacityRange );
} else if ( arguments.length == 4 ) {
var a = aValue4 / opacityRange;
a = isNaN(a) ? 1 : a;
if ( curColorMode == p.HSB ) {
var rgb = HSBtoRGB(aValue1, aValue2, aValue3);
var r = rgb[0], g = rgb[1], b = rgb[2];
} else {
var r = getColor(aValue1, redRange);
var g = getColor(aValue2, greenRange);
var b = getColor(aValue3, blueRange);
}
aColor = "rgba(" + r + "," + g + "," + b + "," + a + ")";
} else if ( typeof aValue1 == "string" ) {
aColor = aValue1;
if ( arguments.length == 2 ) {
var c = aColor.split(",");
c[3] = (aValue2 / opacityRange) + ")";
aColor = c.join(",");
}
} else if ( arguments.length == 2 ) {
aColor = p.color( aValue1, aValue1, aValue1, aValue2 );
} else if ( typeof aValue1 == "number" ) {
aColor = p.color( aValue1, aValue1, aValue1, opacityRange );
} else {
aColor = p.color( redRange, greenRange, blueRange, opacityRange );
}
// HSB conversion function from Mootools, MIT Licensed
function HSBtoRGB(h, s, b) {
h = (h / redRange) * 100;
s = (s / greenRange) * 100;
b = (b / blueRange) * 100;
if (s == 0){
return [b, b, b];
} else {
var hue = h % 360;
var f = hue % 60;
var br = Math.round(b / 100 * 255);
var p = Math.round((b * (100 - s)) / 10000 * 255);
var q = Math.round((b * (6000 - s * f)) / 600000 * 255);
var t = Math.round((b * (6000 - s * (60 - f))) / 600000 * 255);
switch (Math.floor(hue / 60)){
case 0: return [br, t, p];
case 1: return [q, br, p];
case 2: return [p, br, t];
case 3: return [p, q, br];
case 4: return [t, p, br];
case 5: return [br, p, q];
}
}
}
function getColor( aValue, range ) {
return Math.round(255 * (aValue / range));
}
return aColor;
}
p.nf = function( num, pad ) {
var str = "" + num;
while ( pad - str.length )
str = "0" + str;
return str;
};
p.AniSprite = function( prefix, frames ) {
this.images = [];
this.pos = 0;
for ( var i = 0; i < frames; i++ ) {
this.images.push( prefix + p.nf( i, ("" + frames).length ) + ".gif" );
}
this.display = function( x, y ) {
p.image( this.images[ this.pos ], x, y );
if ( ++this.pos >= frames )
this.pos = 0;
};
this.getWidth = function() {
return getImage(this.images[0]).width;
};
this.getHeight = function() {
return getImage(this.images[0]).height;
};
};
function buildImageObject( obj ) {
var pixels = obj.data;
var data = p.createImage( obj.width, obj.height );
if ( data.__defineGetter__ && data.__lookupGetter__ && !data.__lookupGetter__("pixels") ) {
var pixelsDone;
data.__defineGetter__("pixels", function() {
if ( pixelsDone )
return pixelsDone;
pixelsDone = [];
for ( var i = 0; i < pixels.length; i += 4 ) {
pixelsDone.push( p.color(pixels[i], pixels[i+1], pixels[i+2], pixels[i+3]) );
}
return pixelsDone;
});
} else {
data.pixels = [];
for ( var i = 0; i < pixels.length; i += 4 ) {
data.pixels.push( p.color(pixels[i], pixels[i+1], pixels[i+2], pixels[i+3]) );
}
}
return data;
}
p.createImage = function createImage( w, h, mode ) {
var data = {};
data.width = w;
data.height = h;
data.data = [];
if ( curContext.createImageData ) {
data = curContext.createImageData( w, h );
}
data.pixels = new Array( w * h );
data.get = function(x,y) {
return this.pixels[w*y+x];
};
data._mask = null;
data.mask = function(img) {
this._mask = img;
};
data.loadPixels = function(){};
data.updatePixels = function(){};
return data;
};
p.createGraphics = function createGraphics( w, h ) {
var canvas = document.createElement("canvas");
var ret = buildProcessing( canvas );
ret.size( w, h );
ret.canvas = canvas;
return ret;
};
p.beginDraw = function beginDraw(){};
p.endDraw = function endDraw(){};
p.tint = function tint( rgb, a ) {
curTint = a;
};
function getImage( img ) {
if ( typeof img == "string" ) {
return document.getElementById(img);
}
if ( img.img || img.canvas ) {
return img.img || img.canvas;
}
for ( var i = 0, l = img.pixels.length; i < l; i++ ) {
var pos = i * 4;
var c = (img.pixels[i] || "rgba(0,0,0,1)").slice(5,-1).split(",");
img.data[pos] = parseInt(c[0]);
img.data[pos+1] = parseInt(c[1]);
img.data[pos+2] = parseInt(c[2]);
img.data[pos+3] = parseFloat(c[3]) * 100;
}
var canvas = document.createElement("canvas")
canvas.width = img.width;
canvas.height = img.height;
var context = canvas.getContext("2d");
context.putImageData( img, 0, 0 );
img.canvas = canvas;
return canvas;
}
p.image = function image( img, x, y, w, h ) {
x = x || 0;
y = y || 0;
var obj = getImage(img);
if ( curTint >= 0 ) {
var oldAlpha = curContext.globalAlpha;
curContext.globalAlpha = curTint / opacityRange;
}
if ( arguments.length == 3 ) {
curContext.drawImage( obj, x, y );
} else {
curContext.drawImage( obj, x, y, w, h );
}
if ( curTint >= 0 ) {
curContext.globalAlpha = oldAlpha;
}
if ( img._mask ) {
var oldComposite = curContext.globalCompositeOperation;
curContext.globalCompositeOperation = "darker";
p.image( img._mask, x, y );
curContext.globalCompositeOperation = oldComposite;
}
};
p.exit = function exit() {
clearInterval(looping);
};
p.save = function save( file ){};
p.loadImage = function loadImage( file ) {
var img = document.getElementById(file);
if ( !img )
return;
var h = img.height, w = img.width;
var canvas = document.createElement("canvas");
canvas.width = w;
canvas.height = h;
var context = canvas.getContext("2d");
context.drawImage( img, 0, 0 );
var data = buildImageObject( context.getImageData( 0, 0, w, h ) );
data.img = img;
return data;
};
p.loadFont = function loadFont( name ) {
return {
name: name,
width: function( str ) {
if ( curContext.mozMeasureText )
return curContext.mozMeasureText( typeof str == "number" ?
String.fromCharCode( str ) :
str) / curTextSize;
else
return 0;
}
};
};
p.textFont = function textFont( name, size ) {
curTextFont = name;
p.textSize( size );
};
p.textSize = function textSize( size ) {
if ( size ) {
curTextSize = size;
}
};
p.textAlign = function textAlign(){};
p.text = function text( str, x, y ) {
if ( str && curContext.mozDrawText ) {
curContext.save();
curContext.mozTextStyle = curTextSize + "px " + curTextFont.name;
curContext.translate(x, y);
curContext.mozDrawText( typeof str == "number" ?
String.fromCharCode( str ) :
str );
curContext.restore();
}
};
p.char = function char( key ) {
return key;
};
p.println = function println(){};
p.map = function map( value, istart, istop, ostart, ostop ) {
return ostart + (ostop - ostart) * ((value - istart) / (istop - istart));
};
String.prototype.replaceAll = function(re, replace) {
return this.replace(new RegExp(re, "g"), replace);
};
p.Point = function Point( x, y ) {
this.x = x;
this.y = y;
this.copy = function() {
return new Point( x, y );
}
};
p.Random = function() {
var haveNextNextGaussian = false;
var nextNextGaussian;
this.nextGaussian = function() {
if (haveNextNextGaussian) {
haveNextNextGaussian = false;
return nextNextGaussian;
} else {
var v1, v2, s;
do {
v1 = 2 * p.random(1) - 1; // between -1.0 and 1.0
v2 = 2 * p.random(1) - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0);
var multiplier = Math.sqrt(-2 * Math.log(s)/s);
nextNextGaussian = v2 * multiplier;
haveNextNextGaussian = true;
return v1 * multiplier;
}
};
};
p.ArrayList = function ArrayList( size, size2, size3 ) {
var array = new Array( 0 | size );
if ( size2 ) {
for ( var i = 0; i < size; i++ ) {
array[i] = [];
for ( var j = 0; j < size2; j++ ) {
var a = array[i][j] = size3 ? new Array( size3 ) : 0;
for ( var k = 0; k < size3; k++ ) {
a[k] = 0;
}
}
}
} else {
for ( var i = 0; i < size; i++ ) {
array[i] = 0;
}
}
array.size = function() {
return this.length;
};
array.get = function( i ) {
return this[ i ];
};
array.remove = function( i ) {
return this.splice( i, 1 );
};
array.add = function( item ) {
return this.push( item );
};
array.clone = function() {
var a = new ArrayList( size );
for ( var i = 0; i < size; i++ ) {
a[ i ] = this[ i ];
}
return a;
};
array.isEmpty = function() {
return !this.length;
};
array.clear = function() {
this.length = 0;
};
return array;
};
p.colorMode = function colorMode( mode, range1, range2, range3, range4 ) {
curColorMode = mode;
if ( arguments.length >= 4 ) {
redRange = range1;
greenRange = range2;
blueRange = range3;
}
if ( arguments.length == 5 ) {
opacityRange = range4;
}
if ( arguments.length == 2 ) {
p.colorMode( mode, range1, range1, range1, range1 );
}
};
p.beginShape = function beginShape( type ) {
curShape = type;
curShapeCount = 0;
curvePoints = [];
};
p.endShape = function endShape( close ) {
if ( curShapeCount != 0 ) {
if ( close || doFill )
curContext.lineTo( firstX, firstY );
if ( doFill )
curContext.fill();
if ( doStroke )
curContext.stroke();
curContext.closePath();
curShapeCount = 0;
pathOpen = false;
}
if ( pathOpen ) {
if ( doFill )
curContext.fill();
if ( doStroke )
curContext.stroke();
curContext.closePath();
curShapeCount = 0;
pathOpen = false;
}
};
p.vertex = function vertex( x, y, x2, y2, x3, y3 ) {
if ( curShapeCount == 0 && curShape != p.POINTS ) {
pathOpen = true;
curContext.beginPath();
curContext.moveTo( x, y );
firstX = x;
firstY = y;
} else {
if ( curShape == p.POINTS ) {
p.point( x, y );
} else if ( arguments.length == 2 ) {
if ( curShape != p.QUAD_STRIP || curShapeCount != 2 )
curContext.lineTo( x, y );
if ( curShape == p.TRIANGLE_STRIP ) {
if ( curShapeCount == 2 ) {
// finish shape
p.endShape(p.CLOSE);
pathOpen = true;
curContext.beginPath();
// redraw last line to start next shape
curContext.moveTo( prevX, prevY );
curContext.lineTo( x, y );
curShapeCount = 1;
}
firstX = prevX;
firstY = prevY;
}
if ( curShape == p.TRIANGLE_FAN && curShapeCount == 2 ) {
// finish shape
p.endShape(p.CLOSE);
pathOpen = true;
curContext.beginPath();
// redraw last line to start next shape
curContext.moveTo( firstX, firstY );
curContext.lineTo( x, y );
curShapeCount = 1;
}
if ( curShape == p.QUAD_STRIP && curShapeCount == 3 ) {
// finish shape
curContext.lineTo( prevX, prevY );
p.endShape(p.CLOSE);
pathOpen = true;
curContext.beginPath();
// redraw lines to start next shape
curContext.moveTo( prevX, prevY );
curContext.lineTo( x, y );
curShapeCount = 1;
}
if ( curShape == p.QUAD_STRIP) {
firstX = secondX;
firstY = secondY;
secondX = prevX;
secondY = prevY;
}
} else if ( arguments.length == 4 ) {
if ( curShapeCount > 1 ) {
curContext.moveTo( prevX, prevY );
curContext.quadraticCurveTo( firstX, firstY, x, y );
curShapeCount = 1;
}
} else if ( arguments.length == 6 ) {
curContext.bezierCurveTo( x, y, x2, y2, x3, y3 );
curShapeCount = -1;
}
}
prevX = x;
prevY = y;
curShapeCount++;
if ( curShape == p.LINES && curShapeCount == 2 ||
(curShape == p.TRIANGLES) && curShapeCount == 3 ||
(curShape == p.QUADS) && curShapeCount == 4 ) {
p.endShape(p.CLOSE);
}
};
p.curveVertex = function( x, y, x2, y2 ) {
if ( curvePoints.length < 3 ) {
curvePoints.push([x,y]);
} else {
var b = [], s = 1 - curTightness;
/*
* Matrix to convert from Catmull-Rom to cubic Bezier
* where t = curTightness
* |0 1 0 0 |
* |(t-1)/6 1 (1-t)/6 0 |
* |0 (1-t)/6 1 (t-1)/6 |
* |0 0 0 0 |
*/
curvePoints.push([x,y]);
b[0] = [curvePoints[1][0],curvePoints[1][1]];
b[1] = [curvePoints[1][0]+(s*curvePoints[2][0]-s*curvePoints[0][0])/6,curvePoints[1][1]+(s*curvePoints[2][1]-s*curvePoints[0][1])/6];
b[2] = [curvePoints[2][0]+(s*curvePoints[1][0]-s*curvePoints[3][0])/6,curvePoints[2][1]+(s*curvePoints[1][1]-s*curvePoints[3][1])/6];
b[3] = [curvePoints[2][0],curvePoints[2][1]];
if ( !pathOpen ) {
p.vertex( b[0][0], b[0][1] );
} else {
curShapeCount = 1;
}
p.vertex( b[1][0], b[1][1], b[2][0], b[2][1], b[3][0], b[3][1] );
curvePoints.shift();
}
};
p.curveTightness = function( tightness ) {
curTightness = tightness;
};
p.bezierVertex = p.vertex;
p.rectMode = function rectMode( aRectMode ) {
curRectMode = aRectMode;
};
p.imageMode = function(){};
p.ellipseMode = function ellipseMode( aEllipseMode ) {
curEllipseMode = aEllipseMode;
};
p.dist = function dist( x1, y1, x2, y2 ) {
return Math.sqrt( Math.pow( x2 - x1, 2 ) + Math.pow( y2 - y1, 2 ) );
};
p.year = function year() {
return (new Date).getYear() + 1900;
};
p.month = function month() {
return (new Date).getMonth();
};
p.day = function day() {
return (new Date).getDay();
};
p.hour = function hour() {
return (new Date).getHours();
};
p.minute = function minute() {
return (new Date).getMinutes();
};
p.second = function second() {
return (new Date).getSeconds();
};
p.millis = function millis() {
return (new Date).getTime() - start;
};
p.ortho = function ortho(){};
p.translate = function translate( x, y ) {
curContext.translate( x, y );
};
p.scale = function scale( x, y ) {
curContext.scale( x, y || x );
};
p.rotate = function rotate( aAngle ) {
curContext.rotate( aAngle );
};
p.pushMatrix = function pushMatrix() {
curContext.save();
};
p.popMatrix = function popMatrix() {
curContext.restore();
};
p.redraw = function redraw() {
if ( hasBackground ) {
p.background();
}
p.frameCount++;
inDraw = true;
p.pushMatrix();
p.draw();
p.popMatrix();
inDraw = false;
};
p.loop = function loop() {
if ( loopStarted )
return;
looping = setInterval(function() {
try {
p.redraw();
}
catch(e) {
clearInterval( looping );
throw e;
}
}, 1000 / curFrameRate );
loopStarted = true;
};
p.frameRate = function frameRate( aRate ) {
curFrameRate = aRate;
};
p.background = function background( img ) {
if ( arguments.length ) {
if ( img && img.img ) {
curBackground = img;
} else {
curBackground = p.color.apply( this, arguments );
}
}
if ( curBackground.img ) {
p.image( curBackground, 0, 0 );
} else {
var oldFill = curContext.fillStyle;
curContext.fillStyle = curBackground + "";
curContext.fillRect( 0, 0, p.width, p.height );
curContext.fillStyle = oldFill;
}
};
p.sq = function sq( aNumber ) {
return aNumber * aNumber;
};
p.sqrt = function sqrt( aNumber ) {
return Math.sqrt( aNumber );
};
p.int = function int( aNumber ) {
return Math.floor( aNumber );
};
p.min = function min( aNumber, aNumber2 ) {
return Math.min( aNumber, aNumber2 );
};
p.max = function max( aNumber, aNumber2 ) {
return Math.max( aNumber, aNumber2 );
};
p.ceil = function ceil( aNumber ) {
return Math.ceil( aNumber );
};
p.round = function round( aNumber ) {
return Math.round( aNumber );
};
p.floor = function floor( aNumber ) {
return Math.floor( aNumber );
};
p.float = function float( aNumber ) {
return typeof aNumber == "string" ?
p.float( aNumber.charCodeAt(0) ) :
parseFloat( aNumber );
};
p.byte = function byte( aNumber ) {
return aNumber || 0;
};
p.random = function random( aMin, aMax ) {
return arguments.length == 2 ?
aMin + (Math.random() * (aMax - aMin)) :
Math.random() * aMin;
};
// From: http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
p.noise = function( x, y, z ) {
return arguments.length >= 2 ?
PerlinNoise_2D( x, y ) :
PerlinNoise_2D( x, x );
};
function Noise(x, y) {
var n = x + y * 57;
n = (n<<13) ^ n;
return Math.abs(1.0 - (((n * ((n * n * 15731) + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0));
};
function SmoothedNoise(x, y) {
var corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16;
var sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8;
var center = Noise(x, y) / 4;
return corners + sides + center;
};
function InterpolatedNoise(x, y) {
var integer_X = Math.floor(x);
var fractional_X = x - integer_X;
var integer_Y = Math.floor(y);
var fractional_Y = y - integer_Y;
var v1 = SmoothedNoise(integer_X, integer_Y);
var v2 = SmoothedNoise(integer_X + 1, integer_Y);
var v3 = SmoothedNoise(integer_X, integer_Y + 1);
var v4 = SmoothedNoise(integer_X + 1, integer_Y + 1);
var i1 = Interpolate(v1 , v2 , fractional_X);
var i2 = Interpolate(v3 , v4 , fractional_X);
return Interpolate(i1 , i2 , fractional_Y);
}
function PerlinNoise_2D(x, y) {
var total = 0;
var p = 0.25;
var n = 3;
for ( var i = 0; i <= n; i++ ) {
var frequency = Math.pow(2, i);
var amplitude = Math.pow(p, i);
total = total + InterpolatedNoise(x * frequency, y * frequency) * amplitude;
}
return total;
}
function Interpolate(a, b, x) {
var ft = x * p.PI;
var f = (1 - p.cos(ft)) * .5;
return a*(1-f) + b*f;
}
p.red = function( aColor ) {
return parseInt(aColor.slice(5));
};
p.green = function( aColor ) {
return parseInt(aColor.split(",")[1]);
};
p.blue = function( aColor ) {
return parseInt(aColor.split(",")[2]);
};
p.alpha = function( aColor ) {
return parseInt(aColor.split(",")[3]);
};
p.abs = function abs( aNumber ) {
return Math.abs( aNumber );
};
p.cos = function cos( aNumber ) {
return Math.cos( aNumber );
};
p.sin = function sin( aNumber ) {
return Math.sin( aNumber );
};
p.pow = function pow( aNumber, aExponent ) {
return Math.pow( aNumber, aExponent );
};
p.constrain = function constrain( aNumber, aMin, aMax ) {
return Math.min( Math.max( aNumber, aMin ), aMax );
};
p.sqrt = function sqrt( aNumber ) {
return Math.sqrt( aNumber );
};
p.atan2 = function atan2( aNumber, aNumber2 ) {
return Math.atan2( aNumber, aNumber2 );
};
p.radians = function radians( aAngle ) {
return ( aAngle / 180 ) * p.PI;
};
p.size = function size( aWidth, aHeight ) {
var fillStyle = curContext.fillStyle;
var strokeStyle = curContext.strokeStyle;
curElement.width = p.width = aWidth;
curElement.height = p.height = aHeight;
curContext.fillStyle = fillStyle;
curContext.strokeStyle = strokeStyle;
};
p.noStroke = function noStroke() {
doStroke = false;
};
p.noFill = function noFill() {
doFill = false;
};
p.smooth = function smooth(){};
p.noLoop = function noLoop() {
doLoop = false;
};
p.fill = function fill() {
doFill = true;
curContext.fillStyle = p.color.apply( this, arguments );
};
p.stroke = function stroke() {
doStroke = true;
curContext.strokeStyle = p.color.apply( this, arguments );
};
p.strokeWeight = function strokeWeight( w ) {
curContext.lineWidth = w;
};
p.point = function point( x, y ) {
var oldFill = curContext.fillStyle;
curContext.fillStyle = curContext.strokeStyle;
curContext.fillRect( Math.round( x ), Math.round( y ), 1, 1 );
curContext.fillStyle = oldFill;
};
p.get = function get( x, y ) {
if ( arguments.length == 0 ) {
var c = p.createGraphics( p.width, p.height );
c.image( curContext, 0, 0 );
return c;
}
if ( !getLoaded ) {
getLoaded = buildImageObject( curContext.getImageData(0, 0, p.width, p.height) );
}
return getLoaded.get( x, y );
};
p.set = function set( x, y, obj ) {
if ( obj && obj.img ) {
p.image( obj, x, y );
} else {
var oldFill = curContext.fillStyle;
var color = obj;
curContext.fillStyle = color;
curContext.fillRect( Math.round( x ), Math.round( y ), 1, 1 );
curContext.fillStyle = oldFill;
}
};
p.arc = function arc( x, y, width, height, start, stop ) {
if ( width <= 0 )
return;
if ( curEllipseMode == p.CORNER ) {
x += width / 2;
y += height / 2;
}
curContext.beginPath();
curContext.moveTo( x, y );
curContext.arc( x, y, curEllipseMode == p.CENTER_RADIUS ? width : width/2, start, stop, false );
if ( doFill )
curContext.fill();
if ( doStroke )
curContext.stroke();
curContext.closePath();
};
p.line = function line( x1, y1, x2, y2 ) {
curContext.lineCap = "round";
curContext.beginPath();
curContext.moveTo( x1 || 0, y1 || 0 );
curContext.lineTo( x2 || 0, y2 || 0 );
curContext.stroke();
curContext.closePath();
};
p.bezier = function bezier( x1, y1, x2, y2, x3, y3, x4, y4 ) {
curContext.lineCap = "butt";
curContext.beginPath();
curContext.moveTo( x1, y1 );
curContext.bezierCurveTo( x2, y2, x3, y3, x4, y4 );
curContext.stroke();
curContext.closePath();
};
p.triangle = function triangle( x1, y1, x2, y2, x3, y3 ) {
p.beginShape();
p.vertex( x1, y1 );
p.vertex( x2, y2 );
p.vertex( x3, y3 );
p.endShape();
};
p.quad = function quad( x1, y1, x2, y2, x3, y3, x4, y4 ) {
p.beginShape();
p.vertex( x1, y1 );
p.vertex( x2, y2 );
p.vertex( x3, y3 );
p.vertex( x4, y4 );
p.endShape();
};
p.rect = function rect( x, y, width, height ) {
if ( width == 0 && height == 0 )
return;
curContext.beginPath();
var offsetStart = 0;
var offsetEnd = 0;
if ( curRectMode == p.CORNERS ) {
width -= x;
height -= y;
}
if ( curRectMode == p.RADIUS ) {
width *= 2;
height *= 2;
}
if ( curRectMode == p.CENTER || curRectMode == p.RADIUS ) {
x -= width / 2;
y -= height / 2;
}
curContext.rect(
Math.round( x ) - offsetStart,
Math.round( y ) - offsetStart,
Math.round( width ) + offsetEnd,
Math.round( height ) + offsetEnd
);
if ( doFill )
curContext.fill();
if ( doStroke )
curContext.stroke();
curContext.closePath();
};
p.ellipse = function ellipse( x, y, width, height ) {
x = x || 0;
y = y || 0;
if ( width <= 0 && height <= 0 )
return;
curContext.beginPath();
if ( curEllipseMode == p.RADIUS ) {
width *= 2;
height *= 2;
}
var offsetStart = 0;
// Shortcut for drawing a circle
if ( width == height )
curContext.arc( x - offsetStart, y - offsetStart, width / 2, 0, Math.PI * 2, false );
if ( doFill )
curContext.fill();
if ( doStroke )
curContext.stroke();
curContext.closePath();
};
p.link = function( href, target ) {
window.location = href;
};
p.loadPixels = function() {
p.pixels = buildImageObject( curContext.getImageData(0, 0, p.width, p.height) ).pixels;
};
p.updatePixels = function() {
var colors = /(\d+),(\d+),(\d+),(\d+)/;
var pixels = {};
pixels.width = p.width;
pixels.height = p.height;
pixels.data = [];
if ( curContext.createImageData ) {
pixels = curContext.createImageData( p.width, p.height );
}
var data = pixels.data;
var pos = 0;
for ( var i = 0, l = p.pixels.length; i < l; i++ ) {
var c = (p.pixels[i] || "rgba(0,0,0,1)").match(colors);
data[pos] = parseInt(c[1]);
data[pos+1] = parseInt(c[2]);
data[pos+2] = parseInt(c[3]);
data[pos+3] = parseFloat(c[4]) * 100;
pos += 4;
}
curContext.putImageData(pixels, 0, 0);
};
p.extendClass = function extendClass( obj, args, fn ) {
if ( arguments.length == 3 ) {
fn.apply( obj, args );
} else {
args.call( obj );
}
};
p.addMethod = function addMethod( object, name, fn ) {
if ( object[ name ] ) {
var args = fn.length;
var oldfn = object[ name ];
object[ name ] = function() {
if ( arguments.length == args )
return fn.apply( this, arguments );
else
return oldfn.apply( this, arguments );
};
} else {
object[ name ] = fn;
}
};
p.init = function init(code){
p.stroke( 0 );
p.fill( 255 );
// Canvas has trouble rendering single pixel stuff on whole-pixel
// counts, so we slightly offset it (this is super lame).
curContext.translate( 0.5, 0.5 );
if ( code ) {
(function(Processing){with (p){
eval(parse(code, p));
}})(p);
}
if ( p.setup ) {
inSetup = true;
p.setup();
}
inSetup = false;
if ( p.draw ) {
if ( !doLoop ) {
p.redraw();
} else {
p.loop();
}
}
attach( curElement, "mousemove", function(e) {
var scrollX = window.scrollX != null ? window.scrollX : window.pageXOffset;
var scrollY = window.scrollY != null ? window.scrollY : window.pageYOffset;
p.pmouseX = p.mouseX;
p.pmouseY = p.mouseY;
p.mouseX = e.clientX - curElement.offsetLeft + scrollX;
p.mouseY = e.clientY - curElement.offsetTop + scrollY;
if ( p.mouseMoved ) {
p.mouseMoved();
}
if ( mousePressed && p.mouseDragged ) {
p.mouseDragged();
}
});
attach( curElement, "mousedown", function(e) {
mousePressed = true;
p.mouseButton = e.which;
if ( typeof p.mousePressed == "function" ) {
p.mousePressed();
} else {
p.mousePressed = true;
}
});
attach( curElement, "contextmenu", function(e) {
e.preventDefault();
e.stopPropagation();
});
attach( curElement, "mouseup", function(e) {
mousePressed = false;
if ( typeof p.mousePressed != "function" ) {
p.mousePressed = false;
}
if ( p.mouseReleased ) {
p.mouseReleased();
}
});
attach( document, "keydown", function(e) {
keyPressed = true;
p.key = e.keyCode + 32;
if ( e.shiftKey ) {
p.key = String.fromCharCode(p.key).toUpperCase().charCodeAt(0);
}
if ( typeof p.keyPressed == "function" ) {
p.keyPressed();
} else {
p.keyPressed = true;
}
});
attach( document, "keyup", function(e) {
keyPressed = false;
if ( typeof p.keyPressed != "function" ) {
p.keyPressed = false;
}
if ( p.keyReleased ) {
p.keyReleased();
}
});
function attach(elem, type, fn) {
if ( elem.addEventListener )
elem.addEventListener( type, fn, false );
else
elem.attachEvent( "on" + type, fn );
}
};
return p;
}
})();
} //# end of "install only once"
//}}}
Rowing is probably the most popular sport at Cambridge University and also rather popular with the townies. If you had told me some years ago that I'd get up every day at 6 in the morning to work out on the river, I probably would have pointed and laughed at you. Yet, here I am, doing exactly that. Well, I guess it's addictive. :-)
I learned to row in my College is [[Clare Hall|http://www.clarehall.cam.ac.uk]] and we have a great environment for everyone who wants to give it a try. You can row socially, on Saturday afternoons, or - if you are more the competitive type - you can do some more serious training in our club! Be our fan on facebook to be updated on all of our activities!
After rowing with the Cambridge University women (CUWBC) in 2009/10, I now row for [[Cantabrigian Rowing Club|http://www.cantabsrowing.org.uk/]].
<html>
<table border=0><tr><td>
<!-- Facebook Badge START --><a href="http://www.facebook.com/pages/Clare-Hall-Boat-Club/129042870439468" target="_TOP" style="font-family: "lucida grande",tahoma,verdana,arial,sans-serif; font-size: 11px; font-variant: normal; font-style: normal; font-weight: normal; color: #3B5998; text-decoration: none;" title="Clare Hall Boat Club">Clare Hall Boat Club</a><br/><a href="http://www.facebook.com/pages/Clare-Hall-Boat-Club/129042870439468" target="_TOP" title="Clare Hall Boat Club"><img src="http://badge.facebook.com/badge/129042870439468.1934.1376220134.png" width="120" height="222" style="border: 0px;" /></a><br/><a href="http://www.facebook.com/business/dashboard/" target="_TOP" style="font-family: "lucida grande",tahoma,verdana,arial,sans-serif; font-size: 11px; font-variant: normal; font-style: normal; font-weight: normal; color: #3B5998; text-decoration: none;" title="Make your own badge!">Promote your Page too</a><!-- Facebook Badge END --></td><td></td><td>
<!-- Facebook Badge START --><a href="http://www.facebook.com/pages/Cantabrigian-Rowing-Club/144152645617026" target="_TOP" style="font-family: "lucida grande",tahoma,verdana,arial,sans-serif; font-size: 11px; font-variant: normal; font-style: normal; font-weight: normal; color: #3B5998; text-decoration: none;" title="Cantabrigian Rowing Club">Cantabrigian Rowing Club</a><br/><a href="http://www.facebook.com/pages/Cantabrigian-Rowing-Club/144152645617026" target="_TOP" title="Cantabrigian Rowing Club"><img src="http://badge.facebook.com/badge/144152645617026.1612.831764547.png" width="120" height="207" style="border: 0px;" /></a><br/><a href="http://www.facebook.com/business/dashboard/" target="_TOP" style="font-family: "lucida grande",tahoma,verdana,arial,sans-serif; font-size: 11px; font-variant: normal; font-style: normal; font-weight: normal; color: #3B5998; text-decoration: none;" title="Make your own badge!">Promote your Page too</a><!-- Facebook Badge END --></td></tr>
</table>
</html>
Last year I was training with the University team (CUWBC).
!Regatta season 2011
The regatta season has just started and I am looking forward to racing at Henley women's regatta and CRA town bumps in the 4 seat of Cantabs W1.
!Winter season 2010/11
Within the Cantabs W1 crew, we went to several national head races (e.g. the Fuller's Four's Head, the Nottingham Winter Head and the Women's Head Of the River Race). Our biggest success, however, were two races on the Cam, in which we have won our division: the Winter Head-to-Head race and the CRA winter league.
<html>
<img src="pixx/winterleague.jpg" alt="Winter League W1 crew" height=200> <img src="pixx/wl_me.png" alt="Winter League - me" height=200><br>
The two photos above are copyright of <a href="http://www.davidboughey.com/">David Boughey Photographic</a>. Thank you for kindly providing permission to publish the photos here.<br>
<img src="pixx/wehorr2011a.png" alt="WeHoRR Cantabs W1 crew" height=200> <img src="pixx/wehorr2011b.png" alt="WeHoRR Cantabs W1 and W2 crews" height=200><br>
<img src="pixx/4shead.png" alt="Fuller's Fours Head" height=100>
</html>
!Regatta season 2010
This season I have competed in Cantabs crews in several on-Cam and off-Cam races, including Henley Vets and Ross Regatta. The most successful races were the {{{IM3}}} mixed IV+ at Gloucester Regatta and the women's {{{IM1}}} IV+ at Peterborough Regatta, where my crews have won pots.
<html>
<img src="pixx/gloucester.png" alt="Winning IV+ at Gloucester" height=200> <br>
<img src="pixx/pbo.png" alt="Winning IV+ at Peterborough" height=200> <img src="pixx/pbo2.png" alt="Final at Peterborough" height=200>
</html>
I have also gathered my first experiences as a race cox, steering for the Cantabs M11 crew "Misfits" in ton bumps 2010.
<html>
<img src="pixx/cox1.png" alt="My first race as a cox" height=200> <img src="pixx/cox2.png" alt="Town bumps 2010: Cantabs M11 crew" height=200>
</html>
!May term 2010
!!! May Bumps with Clare Hall
With the University rowing commitments gone, I went back to my College for May Bumps (8-12 June 2010). We were very successful this year and not only won blades again (3rd year running for Clare Hall women) but also bumped up into the 3rd division. Clare Hall Boat Club was even awarded the Pegasus Cup for the most successful College Club in May Bumps 2010, thanks to an excellent performance by the first men and women.
<html>
<img src="pixx/Mays10-01.png" alt="CHBC W1" height=200> <img src="pixx/Mays10-02.jpg" alt="CHBC W1" height=200><br>
<img src="pixx/Mays10-03.jpg" alt="CHBC W1" height=200> <img src="pixx/Mays10-04.jpg" alt="Pegasus cup" width=200>
</html>
!Lent term 2010
!!!British University and College Sports Regatta
On 3rd May 2010, I was part of the coxed Blondie IV (2 seat), which CUWBC have sent to BUCS regatta 2010. We competed with 44 crews from all over Great Britain, and after an initial time trial, quarter finals, semi finals and finals, we won the gold medal in our category (beating an Oxford crew on the way :-) )!
<html>
<img src="pixx/bucs1.jpg" alt="BUCS crew" height=200> <img src="pixx/bucs2.jpg" alt="BUCS gold medal" height=200>
</html>
<html><!--Here's a video of the event
<object width="400" height="300" ><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://www.facebook.com/v/705435924203" /><embed src="http://www.facebook.com/v/705435924203" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="300"></embed></object>-->
</html>
!!! Henley boat race
After having trialled for the Cambridge University Women's Boat Club (CUWBC) this year, I have raced in the traditional Henley Boat Races on 28 March 2010. I was rowing in 4 seat in the Blondie crew (the CUWBC open weight reserve crew) and we competed against the Oxford University heavy weight women reserve crew, Osiris. Although we lost this race, I can say that I have learned a lot and it was an honour to row with such a committed and fast crew.
<html>
<img src="pixx/blondie1.jpg" alt="Blondie@Henley" width=800><br>
<img src="pixx/blondie2.jpg" alt="Blondie@Henley" width=390> <img src="pixx/blondie3.jpg" alt="Blondie@Henley" width=390>
</html>
!Michaelmas term 2009
!!!Trial {{{VIIIs}}}
One of the most important races of the year for the CUWBC triallists is trial {{{VIIIs}}}: it's a first trial race with the putative crews for the big races against Oxford in March. In this CUWBC internal race our three boats Hook, Line and Sinker raced for 2k. I rowed in 4 seat in sinker.
<html>
<img src="pixx/trialVIIIs.jpg" alt="Trial VIIIs" height=200> <img src="pixx/fairbairns2.jpg" alt="dev squad VIII" height=200>
</html>
!!!Fairbairns
On Thursday and Friday, 3 and 4 December, the [[Fairbairns|http://jcbc.jesus.cam.ac.uk/Fairbairns/]] race took place on the Cam. The Clare Hall women novice boat {{{NW1}}} did an amazing job and came 20th in the novice division, beating 17 College first women's novice crews! This is a great way to end the first term of rowing in the academic year 2009-2010.
I raced Fairbairns with CUWBC III in bow seat and our boats came 1st, 2nd and 4th on the river in the senior women's division!
<html>
<img src="pixx/fairbains.jpg" alt="Fairbairns" height=200>
</html>
!!!Queens' Ergs
On Tuesday, 10 November, 2009, our novices (Clare Hall {{{NW1}}}) participated in the [[Queens' Ergs|http://www.qjcr.org.uk/qergs/index.php]] competition. To read the race report and how awesome they've done, click [[here|http://www.clarehall.cam.ac.uk/index.php?id=466]].
!Summer break 2009
I have rowed in the [[Cambridge University Women's|http://www.cuwbc.org/]] development squad over summer. I took part in two ARA races
*''[[Kingston Regatta|http://www.kingstonregatta.co.uk/]]'': Our VIII (I was on 3) won the novice cup! Here comes my first ARA point! We beat the crew of Sons of the Thames RC, Kingston RC and Barnes Bridge Ladies RC (see [[results|http://www.kingstonregatta.co.uk/results.htm]])
<html>
<img src="pixx/kingston1.jpg" alt="dev squad VIII" height=200> <img src="pixx/kingston2.jpg" alt="dev squad VIII" height=200>
</html>
*''[[Molesey Regatta|http://www.moleseyregatta.org/]]'': Our coxed IV (I was on 3) beat two other crews (Vesta RC and Walbrook RC) on the {{{IM-III}}} level and lost the final by 1 boat length
<html>
<img src="pixx/moseley.jpg" alt="dev squad IV" height=200>
</html>
!May term 2009
!!!May Bumps
Listen to the Cambridge University Radio live coverage of the bumps! Clare hall W1 is in the fourth women's division.
<html><a href="http://www.cur1350.co.uk"> <img src="http://www.cur1350.co.uk/images/CUR1350_extbutton.png" style="border:none" width="234" height="121" /></a><br></html>
''UPDATE''
The Clare Hall women (I rowed on 5) have won blades in this year's May Bumps! This means we are up 4 places and will have the chance to bump up into the 3rd division next year!
*Watch a [[slo-mo video|http://www.spannerspotter.com/v/Mays-wed-w4-2009-06-09/Clare+Hall.flv.html]] of us racing
<html>
<img src="pixx/Mays09.jpg" alt="CHBC W1" height=200> <img src="pixx/Mays09-2.jpg" alt="CHBC W1" height=200>
</html>
!Important web links
*<html>
<img src="http://www.cucbc.org/sites/default/files/cam_logo.png" alt="cucbc" width=30>
</html>[[CUCBC|http://www.cucbc.org]]: Cambridge University Combined Boat Club
*<html>
<img src="http://www.ara-rowing.org/sites/all/themes/ara/images/logo.gif" alt="ara" width=30>
</html>[[ARA|http://www.ara-rowing.org]]: Amateur Rowing Association
*<html>
<img src="http://www.clarehall.cam.ac.uk/typo3temp/pics/16fd864e0f.gif" alt="chbc" width=30>
</html>[[CHBC|http://www.clarehall.cam.ac.uk/index.php?id=123]]: Clare Hall Boat Club
*<html>
<img src="http://www.cuwbc.org/images/cuwbclogo.jpg" alt="cuwbc" height=30>
</html>[[CUWBC|http://www.cuwbc.org]]: Cambridge University Women's Boat Club
*<html>
<img src="http://lakeridgeschools.schoolwires.com/1389101281714947/lib/1389101281714947/icon_direction.gif" alt="map" width=30>
</html>[[map|http://www.ebi.ac.uk/~jfischer/ClareHallRowing/Map_to_Boathouse.pdf]] to the Clare and Clare Hall boat house
*<html>
<img src="http://www.clarehall.cam.ac.uk/typo3temp/pics/16fd864e0f.gif" alt="chbc-pixx" width=30>
</html>[[CHBC photos|http://picasaweb.google.com/chbc.fundraising]]: Clare Hall Bot Club photo album gallery
*<html>
<img src="http://www.clarehall.cam.ac.uk/typo3temp/pics/16fd864e0f.gif" alt="chbc-pixx" width=30>
</html>[[Wikipedia|http://en.wikipedia.org/wiki/Clare_Hall_Boat_Club]]: CHBC leadrship
Welcome to my homepage!
juliafischer.de
TiddlyProcessing is a TiddlyWiki containing [[John Ressig|http://ejohn.org]]'s [[Processing.js|http://ejohn.org/apps/processing.js/]] [[basic examples|BasicExample]]. Double click an example, e.g. [[Clock]] to view and edit the source. Most of the examples work, with the notable exception of those involving images. [[Download|./download.php]] this file and reopen it in Firefox to save your work. [[Simon Baird|http://simonbaird.com/]] has made some great tweaks and examples, and put [[his version|http://tiddlyprocessing-simon.tiddlyspot.com]] up on [[TiddlySpot|http://tiddlyspot.com]], a great place to store your ~TiddlyWikis.
[[TiddlyWiki|http://tiddlywiki.com]], a wiki in a single HTML page. Open a [[Downloaded]] a copy of this page in Firefox, and you'll be able to edit the examples and save your changes locally on your computer. For more help on using TiddlyWiki, including support for other browsers, see [[Download Software|http://www.tiddlywiki.com/#DownloadSoftware]]. If you have questions, the ~TiddlyWiki community is incredibly helpful - there's a [[developer's group|http://groups.google.com/group/TiddlyWikiDev]] and a [[user's group|http://groups.google.com/group/TiddlyWiki]] on Google Groups.
To access my private pages, please click on [[Rowing]] or [[Photos]], for my professional pages, follow the link [[Bioinformatics]]. This is a TiddlyWiki page, so in case you've been wondering: yes, it's normal that the old contents don't close when you click on a new link :-)
!Weather
And this is how the weather is where I probably am (in German, but I think the numbers and pictures are self-explanatory):
<html>
<table border=0>
<tr>
<th> <b>Cambridge, UK</b> </th>
<th> <b>Bischberg, DE</b> </th>
<th> <b>Heidelberg, DE</b> </th>
</tr>
<tr>
<td>
<iframe src="http://juliafischer.de/weathercam.html" width=220 height=220 border=0></iframe>
</td>
<td>
<iframe src="http://juliafischer.de/weatherba.html" width=220 height=220 border=0></iframe>
</td>
<td>
<iframe src="http://juliafischer.de/weatherhd.html" width=220 height=220 border=0></iframe>
</td>
</table>
</html>
// List a specified number of tiddlers for a given tag name. In addition there are parameters to specifiy bulleting, contents,
// and paragraph breaking.
//
// Synopsis:
// listTaggedTiddlers tagName [howmany][true|false useBullet][true|false showContents][true|false forceParagraphBreak]
//
// Author: Marc Mayfield
// 01-24-2006
//
// listTaggedTiddlers is provided under the GNU General Public License (GPL) and may be used/shared/modified so long
// as these comments are not removed.
config.macros.listTaggedTiddlers = { text: "Hello" };
config.macros.listTaggedTiddlers.handler = function(place,macroName,params)
{
var howMany = params[1] ? params[1] : -1;
var listClass = params[2]=="true" ? null : "listTitle";
// mod lookup: title, created, modifier, modified.
var tagged = store.reverseLookup("tags",params[0],true,"modified"); // tiddlers with given tag by modified date
var showContent = params[3] ? params[3] : "false";
var forceParagraph = params[4] ? params[4] : "false";
var tiddlerList = document.createElement("ul");
place.appendChild(tiddlerList);
// for(var r=0;r<tagged.length && howMany!=0;r++) // oldest..newest, a..z, ascending
for(var r=tagged.length-1;r>=0 && howMany!=0;r--) // newest..oldest, z..a, descending
{
var tiddlerListItem = createTiddlyElement(tiddlerList,"li",null,listClass,null);
tiddlerListItem.appendChild(createTiddlyLink(place,tagged[r].title,true));
howMany--;
if ("true" == showContent)
{
createTiddlyElement(tiddlerListItem,"br",null,null,null);
wikify(tagged[r].text,tiddlerListItem,null,tagged[r]);
}
if (howMany != 0 && !r<tagged.length && "true"==forceParagraph) // paragraph break if requested via param
{
createTiddlyElement(tiddlerListItem,"p",null,null,null);
}
}
}