tag:blogger.com,1999:blog-130955572024-03-13T05:35:51.077+01:00cast42Cast for twocast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.comBlogger139125tag:blogger.com,1999:blog-13095557.post-62942913115689521142016-12-11T16:41:00.000+01:002016-12-12T16:48:21.574+01:00Adding virtual power to your Tacx T2600 workout using PythonIn previous post<a href="http://castfortwo.blogspot.be/2014/01/adding-virtual-power-to-tcx-for-tacx.html"> 'Adding virtual power to tcx for Tacx'</a> I talked about adding virtual power to your trainer workout. Today I made a Github repository with a Python program for doing that: <a href="https://github.com/cast42/vpower">vpower</a><br />
<br />
What is needed to be able to add power ? First, you must record your speed during the workout. The power is specifically for the Tacx Blue Motion T2600. This model is not for sale anymore, but the Tacx Blue Motion 2650 is:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://image.coolblue.io/products/472132?width=1024&height=768" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://image.coolblue.io/products/472132?width=1024&height=768" width="320" /></a></div>
<br />
The lever for the manual resistance control must remain on the same position during the workout. I leave mine in position 5 and use my gears to alter the workload during the workout.<br />
<br />
I use my Garmin 810 for recording but any cycling computer will work probably as well. The result from my Garmin 810 is a FIT file that I normally submit to Strava. If you want to add virtual power, you must do following steps before submitting to Strava:<br />
<br />
<ol>
<li>Obtain a TCX file with speed during the workout: In case of a Garmin, I convert the FIT file of my workout to TCX (I use Garmin Training Center for that, but unfortunately Garmin does not offer it anymore for download).</li>
<li>Process the TCX file with the vpower.py program from the vpower repository. The result is an altered TCX file with power included. The added power element are derived from the speed you were riding at a certain moment during your workout. It is assumed that you did not altered the lever for the manual resistance control during the workout. Since the lever of the Tacx T2600 is purely mechanical, it can not be recorded by your cycling computer during the workout.</li>
<li>Upload the altered TCX file to Strava.</li>
</ol>
<div>
Here's an <a href="https://www.strava.com/activities/799528713">example workout on the Tacx Blue Motion T2600 with virtual power added</a>:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-2hVDQZUy6fw/WE1tPLHIISI/AAAAAAAC6-s/aMqDbWhlb-IFlmqXbAzxr4eP0miZVTXnwCLcB/s1600/strava_virtual_power.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://4.bp.blogspot.com/-2hVDQZUy6fw/WE1tPLHIISI/AAAAAAAC6-s/aMqDbWhlb-IFlmqXbAzxr4eP0miZVTXnwCLcB/s640/strava_virtual_power.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Why do I use TCX and not GPX? GPX has no extensions for power at this moment.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The linear formula to determine power from speed is based on following drawing:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/d6VGRLhv-TAVI7SIE_OM49nOLypnQ7DYSXnVBSMceH2GZH5rjENuuW8mrgpo2X5qWLQd4U78015LDw=w5760-h3600-rw-no" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="584" src="https://4.bp.blogspot.com/d6VGRLhv-TAVI7SIE_OM49nOLypnQ7DYSXnVBSMceH2GZH5rjENuuW8mrgpo2X5qWLQd4U78015LDw=w5760-h3600-rw-no" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Suppose that your lever for manual resistance control is at position 5 and your riding at 30km/h, your power is then a little less then 250 Watt.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div>
<br /></div>
cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com13tag:blogger.com,1999:blog-13095557.post-43859870175933876892015-11-16T21:06:00.000+01:002015-12-04T08:30:57.967+01:00Kaggle competitionsSince a few weeks, I'm participating in Kaggle data science competitions. First I entered the <a href="https://www.kaggle.com/c/titanic">Titanic survival competition</a> and
now I'm trying to predict sales for the <a href="https://www.kaggle.com/c/rossmann-store-sales">German Rossman stores</a>. I wrote a jupiter notebook with some basic exploration. You can view the notebook on <a href="https://gist.github.com/cast42/bcfd70b919e6648c2b58">github</a> or get an even nicer view on NBviewer
<a href="http://nbviewer.ipython.org/gist/cast42/bcfd70b919e6648c2b58">NBviewer</a>.<br />
Enjoy,<br />
Lodecast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com1tag:blogger.com,1999:blog-13095557.post-36630093789859219752014-07-30T11:19:00.002+02:002014-08-01T09:55:01.555+02:00Calculating Heart Rate zone based on Lactate Threshold Heart RateI already investigated the issue of setting heart rate zones in blogpost "<a href="http://castfortwo.blogspot.be/2014/05/setting-strava-heart-rate-zones-based.html">Setting Strava heart rate zones based on Lactate threshold heart rate (LTHR)</a>". In the article "<a href="http://www.competitivecyclist.com/learn/how-to-find-your-heart-rate-zones-2">HOW TO FIND YOUR HEART RATE ZONES</a>" all zones are defined along with the protocol to determine your lacatate threshold yourself:<br />
<br />
<ul>
<li>Z1 < 81% of LTHR </li>
<li>Z2 81% - 89% of LTHR</li>
<li>Z3 90% - 93% of LTHR</li>
<li>Z4 94%-99% of LTHR</li>
<li>Z5a 100%-102% of LTHR</li>
<li>Z5b 103%-106% of LTHR</li>
<li>Z5c > 106% of LTHR</li>
</ul>
<div>
The definition of the zones correspond to those found in Joe Friel's book "The cyclist trainings bible" at page 37 Table 4.5.</div>
<div>
<br /></div>
<div>
Based on a LTHR of 175bpm my zones would be:</div>
<div>
<div>
<ul>
<li>Z1 Endurance: < 141 bpm</li>
<li>Z2 Moderate: 142 - 156 bpm</li>
<li>Z3 Tempo: 157 - 163 bpm</li>
<li>Z4 Threshold: 164 - 173 bpm</li>
<li>Z5a: 175 - 179 bpm</li>
<li>Z5b: 180 - 185 bpm</li>
<li>Z5c: 186 - 187 bpm</li>
</ul>
</div>
</div>
cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-37118668654686876452014-06-22T22:08:00.000+02:002014-06-22T22:20:25.816+02:00Parsing Strava GPX file with python minidom<a href="http://en.wikipedia.org/wiki/GPS_Exchange_Format">GPX</a> is more and more becoming the lingua franca for storing cycling rides. Basically it is a list of points, called track points, with satellite positions (latitude and longitude) decorated with extra information (elevation, heartrate, cadence, power or temperature). A track (<trk>), has one or more segments (<trkseg>) with a list of trackpoints (<trkpt>)<br />
<pre><trk>
<name>Track Name</name>
<trkseg>
<trkpt lat="50.653007542714477" lon="5.558940963819623" />
</pre>
<i>Lots of track point...</i>
<br />
<pre> <trkpt lat="50.653007542714477" lon="5.558940963819623" />
</trkseg>
</trk>
</pre>
Sometimes elevation is also included for every trackpoint:
<br />
<pre><trk>
<name>Track Name</name>
<trkseg>
<trkpt lat="50.653007542714477" lon="5.558940963819623" >
<ele>60.0</ele>
</trkpt>
</pre>
<i>Lots of track point...</i>
<br />
<pre> <trkpt lat="50.653007542714477" lon="5.558940963819623" >
<ele>60.0</ele>
</trkpt>
</trkseg>
</trk>
</pre>
Those GPX files can be used as tracks that you can follow. You can copy those file to the New File directory on your Garmin and you can select them to follow. If <pre><ele> … </ele></pre>
elements are included you will see how
the height evolves in front of you.
<br/>
If you download the GPX file from a ride you rode with a bike computer that registers cadence and heartrate, the file will look like this:
<script src="https://gist.github.com/cast42/a7df6a4a77a5818c1fc3.js"></script>
You can see the whole file here: <a href="https://gist.github.com/cast42/727f48a0358fa67e60fb">https://gist.github.com/cast42/727f48a0358fa67e60fb</a>
<br/>
The elevation element is part of the standard GPS specification as defined by the XML schema provided hre: <a href="http://www.topografix.com/gpx.asp">http://www.topografix.com/gpx.asp</a>
The heartrate and cadence are stored using trackpoint extensions as specfied here: <a href="http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd">http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd</a>
<br/>
Here is a simple Python example to parse a <a href="http://strava.com">Strava</a> GPX file with extensions using <a href="https://wiki.python.org/moin/MiniDom">minidom</a>:
<script src="https://gist.github.com/cast42/ca2a003f54c7a423788e.js"></script>
It is required that cadence and heartrate are added to every trackpoint but temperature is optional.cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com3tag:blogger.com,1999:blog-13095557.post-31283942603205870732014-05-19T13:22:00.000+02:002016-07-02T11:35:45.169+02:00Setting Strava heart rate zones based on Lactate threshold heart rate<div style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: small; margin-bottom: 5px; margin-top: 5px; padding: 0px;">
Recently, i got my <a href="http://en.wikipedia.org/wiki/Lactate_threshold">lactate threshold</a> heart rate (LTHR) tested in a lab by taking blood samples. The threshold measured this year was 175 beats per minute. I wanted to customize my zones in Strava pro based on this threshold. I googled around but did not find clear information how to determine the zones based on LTHR. So I did a bit of research. In Joe Friel's book "The cyclist trainings bible" at page 37 Table 4.5, the following zone's in function of the lactate threshold heart rate (LTHR) are defined as following: </div>
<div style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: small; margin-bottom: 5px; margin-top: 5px; padding: 0px;">
</div>
<ul>
<li>Z1 Recovery 65% - 81% </li>
<li>Z2 Aerobic 82% -88%</li>
<li>Z3 Tempo 89% - 93%</li>
<li>Z4 Subtreshold 94% - 100%</li>
<li>Z5 Suptheshold 100% - 102%</li>
<li>Z6 Anaerobic > 102%</li>
</ul>
<br />
<div style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: small; margin-bottom: 5px; margin-top: 5px; padding: 0px;">
In the book of Hunter Allen and Andrew Coggan, "Training and racing with a power meter", on page 83 Table 3.1, the zones are defined by Dr. A. Coggan as follows in function of the Functional Threshold Heart Rate (FTHR) : </div>
<div style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: small; margin-bottom: 5px; margin-top: 5px; padding: 0px;">
</div>
<ul>
<li>Active recovery < 68% of FTHR</li>
<li>Endurance 69% - 83% of FTHR</li>
<li>Tempo 84% - 94% of FTHR</li>
<li>Lactate threshold 95%-105% of FTHR</li>
<li>VO<sup>2</sup> Max >106% of FTHR</li>
<li>Anaerobic Capacity N/A</li>
<li>Neuromuscular N/A</li>
</ul>
<br />
<div style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: small; margin-bottom: 5px; margin-top: 5px; padding: 0px;">
See also the explanation on youtube: <a href="https://www.youtube.com/watch?v=dpTWzJZbSyU#t=3m41s" rel="nofollow" style="color: #336699; text-decoration: none;">Getting started with power training</a> or here <a href="https://www.youtube.com/watch?v=XoZoUMVbfMk">Training Zones Explained</a></div>
<div style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: small; margin-bottom: 5px; margin-top: 5px; padding: 0px;">
I think those zones map better to those defined by Strava. Strava has no zone for "Active recovery". Endurance is called Moderate in the Strava zones. I would also collapse the "VO2max", Anaerobic en neuromuscular" into the Strava "Anaerobic" zone. These are basically the zones that earn you points in the red.</div>
<div style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: small; margin-bottom: 5px; margin-top: 5px; padding: 0px;">
So based on your cycling Lactate Threshold Heart Rate (LTHR) or FTHR set zones in Strava as follows:</div>
<div style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: small; margin-bottom: 5px; margin-top: 5px; padding: 0px;">
</div>
<ul>
<li>Endurance : < 68% of LTHR</li>
<li>Moderate: 69% - 83% of LTHR</li>
<li>Tempo: 84% - 94% of LTHR</li>
<li>Threshold: 95%-105% of LTHR</li>
<li>Anaerobic: > 106% of LTHR</li>
</ul>
<div>
I my particular case of hitting the lactate threshold (LT) at 175 beats per minute this boils down to:</div>
<div>
<ul>
<li>Z1 Endurance: < 119 bpm</li>
<li>Z2 Moderate: 120 - 146 bpm</li>
<li>Z3 Tempo: 147 - 165 bpm</li>
<li>Z4 Threshold: 166 - 184 bpm</li>
<li>Z5 Anaerobic: > 185 bpm</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-BRN5FrJP3sk/U3noQ7HmW-I/AAAAAAAAwDc/8vhc9QisLrQ/s1600/Strava+++My+Performance.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="166" src="https://3.bp.blogspot.com/-BRN5FrJP3sk/U3noQ7HmW-I/AAAAAAAAwDc/8vhc9QisLrQ/s1600/Strava+++My+Performance.png" width="640" /></a></div>
<div>
<br /></div>
</div>
cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com1tag:blogger.com,1999:blog-13095557.post-31752652769724715212014-03-22T13:56:00.001+01:002014-03-26T09:26:42.112+01:00Comparing power models for cyclingOn January 23, 1984, Francesco Moser set a new Hour Record of 51.151km/h at altitude in Mexico City. What probably contributed to that success was the theory developed by Prof. Conconi. He theorized that heart rate could be correlated with perceived exertion in order to allow Moser to cycle at the absolute maximum of his capability. Ever since, training with a heart rate monitor became more and more popular.<br />
<br />
Training with a heart rate monitor has its limitations. Suppose, last week you drove your favorite time trail lap for 20 minutes at an average heartbeat of 155 beats per minute (bpm). This week you did the same test, riding the same distance but your heart rate was 5 beats higher on average. Does that mean that your condition lowered ? The answer is that you can't be sure. Maybe you had more headwind and had to push harder to ride at the same speed. Maybe you ate something before the test that still had to be digested. Maybe you didn't sleep well ? Maybe you were stressed. Heart rate is only an indication what is going on in the black box of your body but is influenced by a lot of external parameters that can't be controlled during a ride.<br />
<br />
Enter the power meters. They measure exactly what power you're pushing instantaneously. In case of headwind, you'll drive slower but the power readings will be higher. It allows to assess if your body is performing better or not without guessing. Therefore power meters allow to train more scientifically. Power meters give objective values about the performance and hence can be better trusted to evaluate your training efforts.
<br />
A central curve helping to gauge your performance is the power duration curve. How many power can you generate for how long ? A typical power curve looks like this:<br />
<img src="https://docs.google.com/drawings/d/1S1pd6wPQ9I_PMHM2kw0knhhaLMtKRYkRkhQDIXjr8RU/pub?w=960&h=720" />
<br />
The horizontal axis is the duration in seconds (usually on a logarithmic scale) and the vertical axis is the delivered power in Watt. The maximum power one can generate for 1 second during a sprint is called the Peak Power. The power one can deliver for one hour is called the Functional Threshold Power (FTP). The limit of the power one can generate forever is called the Critical Power (CP).<br />
<br />
But how do we obtain such a curve ? If you record your rides with a computer, software can derive this from the measured values. Since curves of different riders show up similarly, researcher started to believe a model could predict the curve based on some measurements. For example, record how much power you can delivers for 1 minute, 3 minutes and 20 minutes and the whole curve can be reconstructed. In the paper "<a href="http://www.ncbi.nlm.nih.gov/pubmed/23728131">Rationale and resources for teaching the mathematical modeling of athletic training and performance</a>" by Clarke DC, Skiba PF contains a good overview of the state of the art. The formula to derive power in function of the duration is as follows:
$P = AWC (1/t) + CP$ where AWC is the Anaerobic Work Capacity in Joule, $t$ is the duration in seconds and CP is the Critical Power in Watt. The AWC (called W' nowadays) represents the finite amount of energy that is available above the critical power. CP is power that can be sustained without the fatigue for very long time (longer than 10 hours). See also the paper by Charles Dauwe, "<a href="http://www.fietsica.be/Grand_Tour_Champions.pdf">Critical Power and Anaerobic Capacity of Grand Cycling Tour </a><a href="http://www.fietsica.be/Grand_Tour_Champions.pdf">Winners</a>". Recently, <a href="https://twitter.com/acoggan">@acoggan</a>, <a href="https://twitter.com/veloclinic">@veloclinic</a> and <a href="https://twitter.com/djconnel">@djconnel</a> are working on more sophisticated models.<br />
<br />
@veloclinic proposed in "<a href="https://docs.google.com/document/d/1-JJWsO-xJhTjhX5mn-IweTMIb0i4zjCwuQAPsnK0OBc/edit">Cycling Research Study Pre Plan</a>":<br />
$P(t) = \frac{W’_1}{t+\tau_1} + \frac{W’_2}{t+\tau_2}$
<br />
and since $W’ = P \times \tau $ <br />
$P(t) = \frac{P_1 \tau_1}{t+\tau_1} + \frac{P_2 \tau_2}{t+\tau_2}$
<br />
@veloclinic guesses that <a href="http://veloclinic.tumblr.com/post/78082056106/hey-cog-is-the-wko4-model-this">the new Trainings Peak model to be included in WKO4</a> is:<br />
$P(t) = \frac{FRC}{t} (1-e^{-\frac{t}{\frac{FRC}{P_{max}-FTP}}}) + FTP + \alpha (t-3600)$
<br />
For more information about <a href="https://www.youtube.com/watch?v=T4nd_ydgwFU">WKO's new model</a>, watch the youtube video.
<br />
And <a href="http://djconnel.blogspot.be/2014/02/power-model-summary.html">Dan Connelly arrived at</a>:<br />
$P(t) = P_1 \frac{\tau_1}{t}( 1 - e^{-\frac{t}{\tau_1}} ) + \frac{P_2}{(1 + \frac{t}{\tau_2})^ {\alpha_2}}$
<br />
<br />
Fitting those models to my data, gives the following result (<a href="https://github.com/cast42/powercyclingmodels/blob/master/power_curve_fit_all.py">source code</a>):
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Jb3PcmkzP50/Uymz4pPe34I/AAAAAAAAvck/x4lpe-Ks3-A/s1600/power.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Jb3PcmkzP50/Uymz4pPe34I/AAAAAAAAvck/x4lpe-Ks3-A/s640/power.png" /></a></div>
With some extra code, we can get the confidence interval of the models.
For the veloclinic model, the 95% confidence interval is between the dotted green lines (<a href="https://github.com/cast42/powercyclingmodels/blob/master/power_curve_fit_veloclinic.py">source code</a>):
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Pn3pBtgedd4/Uym1cXyXFSI/AAAAAAAAvc4/sOnlFj0CdNM/s1600/power.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-Pn3pBtgedd4/Uym1cXyXFSI/AAAAAAAAvc4/sOnlFj0CdNM/s640/power.png" /></a></div>
The estimated veloclinic parameters and their 95% confidence interval are:<br />
<ul>
<li>$P_1$ = 291.910642398 Watt [252.385602829 331.435681968]</li>
<li>$\tau_1$ = 28.6068269179 seconds [17.5113005392 39.7023532965]</li>
<li>$P_2$ = 800.776804574 Watt [726.249462145 875.304147003]</li>
<li>$\tau_2$ = 0.312268982434 seconds [-0.16239984039 0.786937805257]</li>
</ul>
The supposed WKO4 model gives this (<a href="https://github.com/cast42/powercyclingmodels/blob/master/power_curve_fit_WKO4.py">source code</a>):
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-IuIDVVCbQYA/Uym1qWeWEEI/AAAAAAAAvdA/aI5OMMzqmts/s1600/power_WKO4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-IuIDVVCbQYA/Uym1qWeWEEI/AAAAAAAAvdA/aI5OMMzqmts/s640/power_WKO4.png" /></a></div>
The estimated WKO4 parameters and their 95% confidence interval are:<br />
<ul>
<li>FRC = 20463.525586 Joule [13518.0176693 27409.0335028]</li>
<li>$P_{max}$ = 1011.29658965 Watt [937.344413201 1085.2487661]</li>
<li>FTP = 257.543501763 Watt [226.388909604 288.698093922]</li>
<li>$\alpha$ = -0.00512616028401 [-0.00777859140802 -0.00247372916]</li>
</ul>
And finally, Dan Connelly's model (<a href="https://github.com/cast42/powercyclingmodels/blob/master/power_curve_fit_djconnel.py">source code</a>):
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-DDMy6T19y68/Uym16bqj4MI/AAAAAAAAvdI/OnKFCOo2Ttk/s1600/power_WKO4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-DDMy6T19y68/Uym16bqj4MI/AAAAAAAAvdI/OnKFCOo2Ttk/s640/power_WKO4.png" /></a></div>
The estimated djconnel parameters and their 95% confidence interval are:
<br />
<ul>
<li>$P_1$ = 730.972437292 Watt, [638.464114912 823.480759673]</li>
<li>$\tau_1$ = 19.9194404736 seconds [9.71207387339 30.1268070738] </li>
<li>$P_2$ = 324.66235674 Watt [246.999942142 402.324771339]</li>
<li>$\tau_2$ = 0.312268982434 seconds [-0.16239984039 0.786937805257]</li>
<li>$\alpha_2$ = 0.312268982434 [-0.16239984039 0.786937805257]</li>
</ul>
From those graphs one could derive that the WKO4 model fits best. Remark that this is only the case for my data and that is a too narrow basis to draw such a conclusion. Also my power data itself has to be taken by a grain of salt because I have no power meter and all power data is estimated from other measurements. The dots on the graph are derived from<a href="http://castfortwo.blogspot.be/2014/01/adding-virtual-power-to-tcx-for-tacx.html"> virtual power derived from the speed measurements on my Tacx trainer</a> or by<a href="http://freetrispeed.com/2013/08/16/how-accurate-is-strava-as-a-power-meter-a-retest-on-a-long-ride-with-wind-and-hills/"> power estimated by Strava on climbs</a> (in that case estimated power by Strava is fairly accurate).
<br />
<br />
<b>Update</b>: Apparently, <a href="https://twitter.com/djconnel/status/447382358870618112">the formula in the end of the blogpost from Dan Connely which I used in this blogpost was not correct</a> and must be: <br />
$P(t) = P_1 \frac{\tau_1}{t}( 1 - e^{\frac{-t}{\tau_1}} ) + \frac{P_2}{( 1 + \frac{t}{\alpha_2\tau_2} )^{\alpha_2}}$
<br />
Remark the extra $\alpha_2$ in the denomintator under $t$ in the last term of the formula.
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Iw97XgrjDXQ/Uy2lJKrWkLI/AAAAAAAAveQ/Vuem7fHI7cs/s1600/power_djconnel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Iw97XgrjDXQ/Uy2lJKrWkLI/AAAAAAAAveQ/Vuem7fHI7cs/s640/power_djconnel.png" /></a></div>
Strangely, the confidence interval behaves strange. I have to look into it.
The estimated djconnel parameters of the updated model and their 95% confidence interval are:
<br />
<ul>
<li>$P_1$ = 730.972437292 Watt, [638.464114912 823.480759673]</li>
<li>$\tau_1$ = 19.9194404736 seconds [9.71207387339 30.1268070738] </li>
<li>$P_2$ = 324.66235674 Watt [246.999942142 402.324771339]</li>
<li>$\tau_2$ = 8793.18635004 [-12682.9310423 30269.3037424]</li>
<li>$\alpha_2$ = 0.312268982434 [-0.16239984039 0.786937805257]</li>
</ul>
Only the $\tau_2$ parameter changed value, but the confidence interval indicated it does not converge. When starting the optimization function with other initial values, I get overflow errors. To be continued.
As <a href="https://twitter.com/djconnel/status/447387326428094465">Dan remarked</a> we can approximate $\frac{1}{( 1 + \frac{t}{\alpha_2\tau_2} )^{\alpha_2}} \approx (1-\frac{t}{\tau_2 \alpha_2})^{\alpha_2} \approx 1-\frac{t}{\tau_2}$ in the first order. In that case, we get:
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-obwjbyYMgIg/Uy29BmGusEI/AAAAAAAAvew/eRkdApBtY3E/s1600/power_djconnel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-obwjbyYMgIg/Uy29BmGusEI/AAAAAAAAvew/eRkdApBtY3E/s640/power_djconnel.png" /></a></div>
The parameters of this simplified model are:
<br />
<ul>
<li>$P_1$ = 753.75304433 Watt [676.513606926 830.992481733]</li>
<li>$\tau_1$ = 27.1488626906 seconds [17.4753205281 36.822404853] </li>
<li>$P_2$ = 275.99764045 Watt [238.468417448 313.526863451]</li>
<li>$\tau_2$ = 53841.0314734 seconds [30850.1607097 76831.9022372]</li>
</ul>
<div>
Remark that in order to fit the curve the $\tau_2$ parameter must be very big to avoid to get negative power. Hence using the first order approximation is not a good idea.</div>
<div>
<br /></div>
<div>
Another idea I tested is to use a capacity for the second term of Dan Connely's function:</div>
<div>
$P(t) = P_1 \frac{\tau_1}{t}( 1 - e^{\frac{-t}{\tau_1}} ) + \frac{P_2 \tau_2}{t+\tau_2}$</div>
<div>
This gives the following fitting:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/--y015GzbTXA/Uy3Qcj6wasI/AAAAAAAAvfA/XWQPIH-OOgY/s1600/power_djconnel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/--y015GzbTXA/Uy3Qcj6wasI/AAAAAAAAvfA/XWQPIH-OOgY/s1600/power_djconnel.png" height="212" width="640" /></a></div>
<div>
The parameters of this mixed djconel/veloclinic model are:<br />
<ul>
<li>$P_1$ = 743.251464989 Watt [666.223087684 820.279842294]</li>
<li>$\tau_1$ = 23.648384644 seconds [14.5239744624 32.7727948257]</li>
<li>$P_2$ = 297.690593484 Watt [253.858306164 341.522880804]</li>
<li>$\tau_2$ = 24294.3750137 seconds [8540.40600978 40048.3440176]</li>
</ul>
<div>
The only thing I hoped to achieve is to offer some software to evaluate power models like those proposed by veloclinic, djconel and acogan. What we now need is a lot of power data so that we can ran those models quickly over that data to draw more solid/general conclusions.</div>
</div>
cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com2tag:blogger.com,1999:blog-13095557.post-45325583091524086172014-01-31T12:14:00.001+01:002014-03-27T10:22:31.756+01:00Adding virtual power to TCX for the Tacx Blue Motion Cycling TrainerI recently bought a cycle trainer for indoor training: <a href="https://www.tacx.com/en/products/trainers/blue-motion#tab_2">Tacx Blue Motion T2600</a> for 185€ at <a href="http://fiets.be/">fiets.be</a>, a local cycling store. Using my Garmin 800, i could record my heartrate, cadence and speed while riding a workout. Since I have no power meter on my bike, I was barred from a feature that higher and more expensive trainers offer. But in the documentation of the trainer, I found a graph showing a linear relation between speed and power. So if I just could add this to the recorded file before submitting it to Strava, I would have trainer for less than 200€ with power measurement. This is the graph:
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-hce4b3Pn7K0/Uut5DK6bYBI/AAAAAAAAvRU/-YYkbXTNYEo/s1600/tacx_blu_motion_power_pdf__1_page_.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-hce4b3Pn7K0/Uut5DK6bYBI/AAAAAAAAvRU/-YYkbXTNYEo/s1600/tacx_blu_motion_power_pdf__1_page_.png" /></a></div>
From that graph we can derive that riding at 60 km/h in position 5 (the middle blue line) a power of 500 Watt is developed. Hence power = speed / 60 * 500 = speed / 6 * 50 . Remark that speed must be in Km/h dimensions to obtain the power in Watt. There's even an <a href="http://www.tacx.com/en/products/trainers/blue-motion#tab_2">interactive graph</a> at website of Tacx.
The Garmin 800 measures speed by counting the number of revolution of the wheel in a time unit and multiplying this by the circumference of the wheels. I converted the .fit file, I obtained from the Garmin device, in TCX (a XML file) using<a href="http://www.garmin.com/garmin/cms/intosports/training_center"> Garmin Training Center</a> (Free software available for Windows and Mac). This file basically contains a list of trackpoints (1 trackpoint every second). One trackpoint looks like this:
<br />
<pre> <Trackpoint>
<Time>2014-01-29T20:38:59Z</Time>
<AltitudeMeters>157.4000244</AltitudeMeters>
<DistanceMeters>14850.7099609</DistanceMeters>
<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
<Value>139</Value>
</HeartRateBpm>
<Cadence>92</Cadence>
<Extensions>
<TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2" CadenceSensor="Bike">
<Speed>8.4530001</Speed>
</TPX>
</Extensions>
</Trackpoint>
</pre>
At this time, the speed was 8.4530001 meter per second. To convert this to km/h, we have to divide by thousand and multiply by 3600 (the number of seconds in an hour). So speed_in_kmperh = speed /1000.0 * 60 *60 = 30.43080036 km/h. The power developed at that moment was : 30.43080036/6.0*50.0 = 253.590003 Watts. We convert to integer : 253 Watt.
To add this to the TCX file, we add a line <code><Watts>253</Watts></code> as follows:
<br />
<pre> <Trackpoint>
<Time>2014-01-29T20:38:59Z</Time>
<AltitudeMeters>157.4000244</AltitudeMeters>
<DistanceMeters>14850.7099609</DistanceMeters>
<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
<Value>139</Value>
</HeartRateBpm>
<Cadence>92</Cadence>
<Extensions>
<TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2" CadenceSensor="Bike">
<Speed>8.4530001</Speed>
<b><Watts>253</Watts></b>
</TPX>
</Extensions>
</Trackpoint>
</pre>
The next step was to automate the calculation of the power and adding it to the TCX file. I wrote the following Python script to do that:
<script src="https://gist.github.com/cast42/8729445.js"></script>
<br />
<pre>prompt> python vpower.py > vpower_29-01-14\ 20-53-27.tcx
</pre>
I uploaded the resulting TCX file to Strava and obtained this:
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-tJIV-mcCEs4/Uut_F04U26I/AAAAAAAAvRs/FL2Hb3y8bjE/s1600/29_01_2014_Belgium__Tacx_Blue_Motion_has_arrived___Strava_Ride.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-tJIV-mcCEs4/Uut_F04U26I/AAAAAAAAvRs/FL2Hb3y8bjE/s640/29_01_2014_Belgium__Tacx_Blue_Motion_has_arrived___Strava_Ride.png" /></a></div>
Of course, the power in this workout is based on the fact that I left the lever om my trainer on position 5 during the whole workout. If you change the position of the lever during the workout, this approach will give wrong results.<br />
<br />
Is this approach of "virtual power" accurate ? Not as accurate as power meters on the bike but usable I would argue. The concept of "<a href="http://www.trainerroad.com/features/virtual-power">virtual power</a>" is also supported by Trainer Road Software.
Later, I found an <a href="http://www.tacx.com/en/products/trainers/blue-motion#tab_2">interactive graph of the speed power relation for Tacx Blue Motion</a> on the website of Tacx. From that graph, I could obtain more precise datapoints : at 60 km/h power is 407 Watt. So next time I use my script, I will use power = speed_in_kmperh / 60.0 * 407.0 as power formula.cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com3tag:blogger.com,1999:blog-13095557.post-47162778243325832462014-01-15T16:48:00.000+01:002014-02-07T22:02:25.990+01:00Euler : great talk by William DunhamHaving a Google Chrome Cast at home increased my longform consumption on Youtube dramatically. For instance, I discovered this talk about the great mathematician Euler by William Dunham:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/fEWj93XjON0?feature=player_embedded' frameborder='0'></iframe></div>
I learned from it that there's a simple polynomial discovered by Euler that generates 40 consecutive primes: $ \forall n \in [0,40] : x^2+ x+ 41$ is a prime number.
<br />
You can check it by running following Python code:<br />
<script src="https://gist.github.com/cast42/8350149.js"></script>
You may wonder if there are other polynomials that generate primes. The article "<a href="http://www.mathpuzzle.com/MAA/48-Prime%20Generating%20Polynomials/mathgames_07_17_06.html">Prime Generating Polynomials</a>" claims that the polynomial
$(x^5 - 133x^4 + 6729x^3 - 158379x^2 + 1720294x - 6823316)/4$ generates 57 consecutive primes for $x \in [0,56]$. Also the Wolfram article "
<a href="http://mathworld.wolfram.com/Prime-GeneratingPolynomial.html">Prime-Generating Polynomial</a> indicates that polynomial as a winner. There are of course formula's to generate prime numbers but i think the Euler polynomial is the fastest.
<br/>
The solution to <a href="http://code.jasonbhill.com/sage/project-euler-problem-27/">Euler problem 27</a> is also interesting. A second degree polynomial
generates 71 primes (but they are not consecutive). The polynomial $x^2 - 61x + 971$ generates 71 primes for $ x \in [0,70]$. This is the longest solution when the absolute values of the coefficients are restricted to thousand. If we drop that restriction, an <a href="http://blog.dreamshire.com/2009/05/20/project-euler-problem-27-solution/">even stronger polynomial is found</a> :
$x^2 -79 x + 1601$ generates 80 primes. Remark that the generated primes are not unique. For example the numbers 1601, 41, 197, 797, 1373, 1523 are generated twice. From the 80 primes generated, 40 are unique. I think Euler would not have been impressed.cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-31588875571657801492012-12-11T09:39:00.001+01:002012-12-11T18:07:24.537+01:00Random Forests are the new kid in machine learning townIs was reading "<a href="http://www.slate.com/articles/health_and_science/new_scientist/2012/12/kaggle_president_jeremy_howard_amateurs_beat_specialists_in_data_prediction.html">Specialist Knowledge Is Useless and Unhelpful</a><br />
<a href="http://www.slate.com/articles/health_and_science/new_scientist/2012/12/kaggle_president_jeremy_howard_amateurs_beat_specialists_in_data_prediction.html">When data prediction is a game, the experts lose out.</a>" I learned about the new algorithm that seems like a silver bullet for data mining problems: <a href="http://en.wikipedia.org/wiki/Random_forest">random forests</a>. An <a href="http://www.quora.com/Machine-Learning/How-do-random-forests-work-in-laymans-terms">explanation in layman's terms</a> can be found on Quora. It still don't fully grasp the idea but I think its worth exploring further to add to a toolbox to solve problems. There exist a <a href="http://cran.r-project.org/web/packages/randomForest/index.html">R package for random forests</a> for some quick exploration on your datas. Happy hacking.cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com2tag:blogger.com,1999:blog-13095557.post-47348940555819808762011-10-10T09:42:00.000+02:002011-10-10T20:28:16.161+02:00Design inspirationThis weekend I was browsing with<a href="http://www.zite.com/"> zite</a> app on Ipad. Especially in the "webdesign and user experience" section I encountered some interesting links:<br />
<br />
<ul>
<li><div>
<a href="http://elliotjaystocks.com/blog/the-typography-out-approach-in-the-world-of-browser-based-web-design/" style="background-color: white; font-family: skolar-1, skolar-2, Georgia, 'Times New Roman', serif; font-size: 16px; letter-spacing: 4px; line-height: 27px; text-transform: uppercase;">THE TYPOGRAPHY-OUT APPROACH IN THE WORLD OF BROWSER-BASED WEB DESIGN</a></div>
</li>
</ul>
<div>
<ul>
<li><h1 class="h-slideshow-title" style="background-color: white; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; display: inline; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1.333em; line-height: 1; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
<a href="http://www.slideshare.net/austingovella/ux-the-power-of-getting-things-designed">UX: The Power of Getting Things Designed</a></h1>
</li>
<li><a href="http://www.smashingmagazine.com/2011/10/07/16-pixels-body-copy-anything-less-costly-mistake/">16 PIXELS For Body Copy. Anything Less Is A Costly Mistake</a></li>
<li><a href="http://udanium.com/misc/svcc11_UIfundamentals_v3.pdf" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: dotted; border-bottom-width: 1px; color: #21759b; font-family: Georgia, 'Times New Roman', serif; font-size: 14px; line-height: 23px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;">Fundamentals of Good UI Design PDF</a><span class="Apple-style-span" style="color: #444444; font-family: Georgia, 'Times New Roman', serif; font-size: 14px; line-height: 23px;"> (23 MB) from<a href="http://www.ghostinthepixel.com/"> Ghost in the pixel</a></span></li>
</ul>
<div>
On a more technical level, I taught these are interesting:</div>
<ul>
<li><a href="http://www.louisremi.com/2011/10/07/offline-web-applications-were-not-there-yet/" style="background-color: white; font-family: junction-1, junction-2, sans-serif; font-size: 21px; font-weight: bold; line-height: 27px;">Offline Web Applications, we’re not there yet.</a></li>
</ul>
<div>
<ul>
<li><a href="http://www.html5rocks.com/en/mobile/optimization-and-performance.html" style="background-color: white; font-family: 'Droid Sans', Arial, sans-serif; font-size: 27px; font-weight: bold;">HTML5 Techniques for Optimizing Mobile Performance</a></li>
<li><span class="Apple-style-span" style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; font-weight: bold; line-height: 15px;"><a href="http://www.slideshare.net/LeaVerou/css3-secrets-10-things-you-might-not-know-about-css3">CSS3 secrets: 10 things you might not know about CSS3</a></span></li>
</ul>
</div>
<div>
<div>
The above is proof I'll need a lot of good lessons about design (but it probably won't help)</div>
</div>
</div>cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-51332697272807480192011-08-22T11:14:00.002+02:002011-08-22T11:14:45.013+02:00Back from holiday<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/-2y5tg0JSmI?feature=player_embedded' frameborder='0'></iframe></div>
This video sums up how the holiday was. Two of the boys that are jumping are my sons. It was shot with a simple Canon Ixus 300HS. The video video resolution is only 320x240 pixels and was shot at 240 frames per second. Enjoy it.cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-62898647972974734542011-06-25T14:32:00.000+02:002011-06-25T14:32:50.981+02:00It's not the story, the people, the technology, it's the team<div class="separator" style="clear: both;">I was directed to the<a href="http://amix.dk/"> blog of Amir Salihefendic</a>, and i bounced into this <a href="http://amix.dk/blog/post/19623#Good-Idea-Vs-Good-People">gem</a>:</div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/k2h2lvhzMDc?feature=player_embedded' frameborder='0'></iframe></div><div class="separator" style="clear: both; text-align: center;"></div><div style="text-align: left;"><span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Georgia, serif; font-size: 16px; line-height: 25px;">Finally, these are the operating principals of Pixar as quoted by Catmull:</span></div><span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Georgia, serif; font-size: 16px; line-height: 25px;"><ul><li style="text-align: left;"><span class="status-body"><span class="entry-content">constant review</span></span></li>
<li style="text-align: left;"><span class="status-body"><span class="entry-content">it must be safe for people to tell the truth</span></span></li>
<li style="text-align: left;"><span class="status-body"><span class="entry-content">communication should not mirror the organizational structure</span></span></li>
<li style="text-align: left;"><span class="status-body"><span class="entry-content">people and how they function is more important than ideas</span></span></li>
<li style="text-align: left;"><span class="status-body"><span class="entry-content">do not let success mask problems, do a deep assessment</span></span></li>
<li style="text-align: left;"><span class="status-body"><span class="entry-content">mix up creative and technical people</span></span></li>
</ul><div style="text-align: left;">So it's not the story, the people, the technology, it's the team, but remember: </div></span><span class="Apple-style-span" style="background-color: white; color: #333333; font-family: Georgia, serif; font-size: 16px; line-height: 20px;">"Once one can articulate an important idea into a concise statement, then one can use the statement and not have to have a fear of changing behavior." (Ed Catmull, pixar).</span><div><span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif;"><span class="Apple-style-span" style="line-height: 20px;"><br />
</span></span></div><div><span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif;"><span class="Apple-style-span" style="line-height: 20px;">Maybe I should read <a href="http://books.google.com/books?id=6ium9aok5yMC&lr=">the pixar book</a> that's on my reading list for some time now.</span></span><br />
<div style="text-align: left;"><br />
</div></div>cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-63051675596486831452011-03-16T13:21:00.001+01:002011-03-16T13:22:46.023+01:00Panoramic picture taken with Iphone 4<a href="http://www.flickr.com/photos/cast42/5531312299/" title="photo by cast42, on Flickr"><img src="http://farm6.static.flickr.com/5212/5531312299_f76803086c_b.jpg" width="1024" height="247" alt="photo" /></a><br />
Made with <a href="http://debaclesoftware.com/">Pano</a>cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0Klösterle, Austria47.139847595965335 10.15895247459411647.138935595965336 10.157128474594117 47.140759595965335 10.160776474594115tag:blogger.com,1999:blog-13095557.post-71480610383143998792010-12-07T19:27:00.001+01:002010-12-09T20:51:12.564+01:00Bye bye battery of MacBook Pro<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_FRy3Wbrk89M/TP54FIlFBnI/AAAAAAAARKY/tCFPPoZ7ETs/s1600/IMG_1621.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="http://4.bp.blogspot.com/_FRy3Wbrk89M/TP54FIlFBnI/AAAAAAAARKY/tCFPPoZ7ETs/s400/IMG_1621.JPG" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Today, I replaced for the second time the battery of my Macbook Pro. The battery had 560 reload cycles. Apple's documentation states that normally a battery should be able to deliver about 800 cycles before replacement is needed. I got my (now iconic) <a href="http://reviews.cnet.com/laptops/apple-macbook-pro-2007/4505-3121_7-32465635.html">Macbook Pro</a> beginning of 2007 and this is already the second time I have to replace the battery. So with my (heavy) usage the battery worked for two years. The new battery is again made in 2006. So problem's again in 2013 ? Or will I have a new Macbook Pro with a fixed battery by then ??? Maybe I have <a href="http://docs.info.apple.com/article.html?path=mac/10.4/en/mh2339.html">to recalibrate my battery</a> more often.</div>cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com1tag:blogger.com,1999:blog-13095557.post-60536796270577770172010-09-11T11:40:00.000+02:002010-09-11T11:40:06.440+02:00Fireworks shot with Canon Ixus 300HSYesterday evening, I went to the yearly firework held in Leuven, Belgium. I filmed the finale with my new <a href="http://www.dpreview.com/news/1008/10080203canonsd4000isreview.asp">Canon Ixus 300HS</a> (aka Powershot 4000 SD) at 720p. Here's the result:<br />
<iframe class="youtube-player" type="text/html" width="640" height="385" src="http://www.youtube.com/embed/xehHtRWRz8w" frameborder="0"><br />
</iframe><br />
I also took some pictures in the fireworks mode. I think the movie catches the moment much more than the pictures. But for those interested, <a href="http://picasaweb.google.com/lode.nachtergaele/Vuurwerk?feat=directlink">here is a picasa album</a> containing the original unedited files. Here's a nice one:<br />
<table style="width:auto;"><tr><td><a href="http://picasaweb.google.com/lh/photo/uo4ccYXlSRx4Y8iEdaC_0Q?feat=embedwebsite"><img src="http://lh4.ggpht.com/_FRy3Wbrk89M/TIq2CMeB9uI/AAAAAAAAPnY/E58Y76pzvWA/s800/IMG_1264.JPG" /></a></td></tr><tr><td style="font-family:arial,sans-serif; font-size:11px; text-align:right">From <a href="http://picasaweb.google.com/lode.nachtergaele/Vuurwerk?feat=embedwebsite">Vuurwerk</a></td></tr></table>cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-90129994040195573752010-07-31T20:10:00.000+02:002010-07-31T20:10:03.444+02:00Darth Vader on a Chipmunk, the analog way ;-)<object type="application/x-shockwave-flash" width="400" height="225" data="http://www.flickr.com/apps/video/stewart.swf?v=71377" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"> <param name="flashvars" value="intl_lang=en-us&photo_secret=28d7bf14d5&photo_id=4821127260"></param><param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=71377"></param><param name="bgcolor" value="#000000"></param><param name="allowFullScreen" value="true"></param><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=71377" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&photo_secret=28d7bf14d5&photo_id=4821127260" height="225" width="400"></embed></object>cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-82042476623798523572010-07-27T21:08:00.000+02:002010-07-27T21:08:41.385+02:00Hosting my pictures in the cloud: Google Storage<a href="http://skitch.com/cast42/dqm4n/picasa-web-albums-cast42"><img alt="Picasa Web Albums - cast42" src="http://img.skitch.com/20100727-bfqj91id2scxnr4iqx5gixi6jf.preview.jpg" /></a><br />
<div><div><span style="color: grey; font-family: 'Lucida Grande', Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px;">Uploaded with <a href="http://plasq.com/">plasq</a>'s <a href="http://skitch.com/">Skitch</a>!</span><br />
<span class="Apple-style-span" style="color: grey; font-family: 'Lucida Grande', Trebuchet, sans-serif, Helvetica, Arial; font-size: x-small;"><span class="Apple-style-span" style="font-size: 10px;"><br />
</span></span></div></div>I finally did it: ordered 20 gigabyte of Google Storage to store my pictures in the cloud. I need to pay 5 dollar every year. A real bargain if you ask me. I wished to upgrade my quota because the free gigabyte everybody gets on <a href="http://picasaweb.google.com/">Picasa Web</a> was getting full. My pictures are stored on my mac and are backuped by <a href="http://www.apple.com/macosx/what-is-macosx/time-machine.html">Time Machine</a>. So a solution to safeguard my pictures in case of a real catastrophy that destroys both the mac and the backup was not in place yet. With the extra gigabytes on Google storage, I now can store an extra copy in the cloud. It's not only an extra safety for the storage but comes in very handy because of the convience of the <a href="http://picasa.google.com/">Picasa</a> tool and <a href="http://picasaweb.google.com/">Picasaweb</a> website for sharing pictures.<br />
<br />
My workflow is now as follows:<br />
<br />
<ul><li>Copy the pictures from my digital camera (currently a <a href="http://www.dpreview.com/news/1005/10051101canonixus300hs.asp">Canon Ixus 300 HS</a>) to my mac with Iphoto. Iphoto puts the pictures into new events (= pictures taken at the same time of the day)</li>
<li>Then I select the pictures I like and put them into an album of Iphoto.</li>
<li>Next I export the album on Picasa Web using <a href="http://picasa.google.com/mac_tools.html">Picasa Web Albums Uploader</a>, selecting "Actual Size" so that it archives the original files in the cloud. This may take a bit longer for uploading but will save the day when all my pictures disappear from my mac and backup.</li>
</ul><br />
If I manage to fill up the 20 Gigabyte, it can upgrade to 80 GByte/ year for 20 dollar/year. So that's save for the future ;-)<br />
<div class="thumbnail"><a href="http://skitch.com/cast42/dqm58/my-account"><img alt="My Account" src="http://img.skitch.com/20100727-nr3et5eiyxwb5ywk8fsswgu7bu.preview.jpg" /></a><br />
<span style="color: grey; font-family: 'Lucida Grande', Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px;">Uploaded with <a href="http://plasq.com/">plasq</a>'s <a href="http://skitch.com/">Skitch</a>!</span></div>cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com1tag:blogger.com,1999:blog-13095557.post-90772505589385844762010-05-19T14:04:00.000+02:002010-05-19T14:04:47.199+02:00HTML5 example to change the opacity of an image via CSS3Here's a simple HTML5 example that changes the opacity of an image via CSS3 using an input range element and some Javascript.<br />
<pre class="prettyprint"><!DOCTYPE html>
<html>
<head>
<title>HTML5 example to change the opacity of an image via CSS3</title>
</head>
<body>
<img id="img_0576" src="IMG_0576.jpg" alt="My bike"style="opacity: 0.5;" />
<input id="img_op" type='range' min='0' max='100' value='50' onchange="changeOpacity()">
<script>
function changeOpacity() {
var opacity = document.getElementById('img_op').value/100;
document.getElementById('img_0576').style.opacity = opacity;
}
</script>
</body>
</html>
</pre>This example is mainly to test out the use of <a href="http://lukabloga.blogspot.com/2008/10/to-test-new-highlighting.html">code highlighting on Blogger</a> as explained by <a href="http://www.google.com/profiles/union.pivo">Luka Marinko</a>. It seems to work well. Huray!<br />
If you're interested in HTML5 you can follow the <a href="http://friendfeed.com/html5">Friendfeed on HTML5</a>.cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com2tag:blogger.com,1999:blog-13095557.post-56987862940698718282010-04-26T22:34:00.006+02:002010-04-27T09:58:06.886+02:00Trailer for the episode 3 of the virtual revolution on the Flemish televisionOn tuesday 24 april 2010, VRT will air a dutch spoken version of the third episode of BBC's Virtual Revolution. <a href="http://programmas.canvas.be/wp-content/uploads/2010/04/The-virtual-revolution-Aflevering-3-trailer.html">Here</a>'s the trailer:<br /><!-- BEGIN EMBEDCODE CANVAS--> <br /><div id='canvasvideo_container_47281' style="width: 507px; height: 320px; border: 1px solid black;"> <br /> <object id="canvasvideo_47281" width="507" height="320"> <br /> <param name="movie" value="http://static.vrt.be/swf/jwplayer45.swf"/> <br /> <param name="allowScriptAccess" value="always" /> <br /> <param name="allowFullScreen" value="true" /> <br /> <param name="flashvars" value="config=http://video.canvas.be/embed%3Fvideo%3D47281"/> <br /> <param name="wmode" value="transparent"> <br /> <embed type="application/x-shockwave-flash" wmode="transparent" name="media" src="http://static.vrt.be/swf/jwplayer45.swf" quality="high" allowscriptaccess="always" allowfullscreen="true" flashvars="config=http://video.canvas.be/embed%3Fvideo%3D47281" width="507" height="320"> <br /> </embed> <br /> </object> <br /></div> <br /><!-- EINDE EMBEDCODE CANVAS--> <br />The code to embed this:<br /><pre><br /><!-- BEGIN EMBEDCODE CANVAS--> <br /><div id='canvasvideo_container_47281' style="width: 507px; height: 320px; border: 1px solid black;"> <br /> <object id="canvasvideo_47281" width="507" height="320"> <br /> <param name="movie" value="http://static.vrt.be/swf/jwplayer45.swf"/> <br /> <param name="allowScriptAccess" value="always" /> <br /> <param name="allowFullScreen" value="true" /> <br /> <param name="flashvars" value="config=http://video.canvas.be/embed%3Fvideo%3D47281"/> <br /> <param name="wmode" value="transparent"> <br /> <embed type="application/x-shockwave-flash" wmode="transparent" name="media" src="http://static.vrt.be/swf/jwplayer45.swf" quality="high" allowscriptaccess="always" allowfullscreen="true" flashvars="config=http://video.canvas.be/embed%3Fvideo%3D47281" width="507" height="320"> <br /> </embed> <br /> </object> <br /></div> <br /><!-- EINDE EMBEDCODE CANVAS--><br /></pre><br /><br />It's a pitty the embed code is not working on Blogger..... <br /><br />UPDATE: It tried to solve this by using an Iframe:<br /><iframe src ="http://programmas.canvas.be/wp-content/uploads/2010/04/The-virtual-revolution-Aflevering-3-trailer.html" width="507" height="320"><br /><p>Your browser does not support iframes.</p></iframe><br />usign this code:<br /><pre><iframe src ="http://programmas.canvas.be/wp-content/uploads/2010/04/The-virtual-revolution-Aflevering-3-trailer.html" width="507" height="320"></pre><br />But that is still not working. Strange.<br /><br /><br />UPDATE 3: maybe I have to URL unescape the value of flashvars to<br /><pre>http://video.canvas.be/embed?video=47281</pre><br /><!-- BEGIN EMBEDCODE CANVAS--> <br /><div id='canvasvideo_container_47281' style="width: 507px; height: 320px; border: 1px solid black;"> <br /> <object id="canvasvideo_47281" width="507" height="320"> <br /> <param name="movie" value="http://static.vrt.be/swf/jwplayer45.swf"/> <br /> <param name="allowScriptAccess" value="always" /> <br /> <param name="allowFullScreen" value="true" /> <br /> <param name="flashvars" value="config=http://video.canvas.be/embed?video=47281"/> <br /> <param name="wmode" value="transparent"> <br /> <embed type="application/x-shockwave-flash" wmode="transparent" name="media" src="http://static.vrt.be/swf/jwplayer45.swf" quality="high" allowscriptaccess="always" allowfullscreen="true" flashvars="config=http://video.canvas.be/embed?video=47281" width="507" height="320"> <br /> </embed> <br /> </object> <br /></div> <br /><!-- EINDE EMBEDCODE CANVAS-->cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com3tag:blogger.com,1999:blog-13095557.post-18327912467510357402010-03-06T15:07:00.005+01:002010-03-06T18:29:29.438+01:00Skiing in Stuben am Arlberg, AustriaIn a yearly tradition, I publish a short movie about the skiing holiday. It's not as cool as with a <a href="http://vimeo.com/8996290">Go Pro Hero cam</a> but still interesting. This year I edited again with Imovie on the mac. Imovie is really the tool you need for such a job. When finished, I pushed the button to upload to youtube and half an hour later:<br /><object width="853" height="505"><param name="movie" value="http://www.youtube.com/v/Spyqt5iocL0&hl=en_US&fs=1&hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Spyqt5iocL0&hl=en_US&fs=1&hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="853" height="505"></embed></object><br />This year we stayed in <a href="http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=Stuben+am+Arlberg,+Kl%C3%B6sterle,+Austria&sll=37.0625,-95.677068&sspn=52.505328,113.554688&ie=UTF8&hq=&hnear=Stuben+am+Arlberg+Kl%C3%B6sterle,+Bludenz,+Vorarlberg,+Austria&z=15">Stuben am Arlberg in Austria</a>. <a href="http://ineedsnow.com/">They</a> say that stuben <a href="http://www.youtube.com/watch?v=hs0Vs_u0lcA">is the capital of off piste skiing</a>, but this year we stayed on the slopes because the danger of snowavalanches was very real.<br /><br />I only noticed an annoying bug. Although the star wars end trailer is in imovie:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_FRy3Wbrk89M/S5Jk0xuSr7I/AAAAAAAAFz4/E41Mxbvghuo/s1600-h/Schermafbeelding+2010-03-06+om+15.01.28.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 230px;" src="http://2.bp.blogspot.com/_FRy3Wbrk89M/S5Jk0xuSr7I/AAAAAAAAFz4/E41Mxbvghuo/s400/Schermafbeelding+2010-03-06+om+15.01.28.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5445525757307826098" /></a><br />the end of the movie on Youtube is just the black background with white stars but without the moving end credits. Annoying bug !cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com1tag:blogger.com,1999:blog-13095557.post-26558966451235943412010-02-01T17:51:00.006+01:002010-02-01T18:56:22.175+01:00How to deal with search crawlers for your mobile siteSo you've setup your mobile site (for example hosted at http://m.yoursite.com) derived from a desktop version (for example hosted at http://www.yoursite.com).Typically, you're using a Content Management System and by providing adapted templates for your mobile items, you can provide a mobile version of your site. The question is now how to deal with robots that crawl the web to build a search index. The danger exists that the robots detect duplicate content because the mobile version from a content item might contain the same text and pictures but wrapped on another template. I think the following steps should be taken:<br /><ol><br /><li>Only allow the mobile web crawlers with the following robot.txt in the root of the mobile site (for example http://m.yoursite.com) by allowing bots with user agent "Googlebot-Mobile" or "YahooSeeker/M1A1-R2D2" and to disallow all others:<br /><code><br />User-agent: Googlebot-Mobile<br />Disallow:<br /><br />User-agent: YahooSeeker/M1A1-R2D2<br />Disallow:<br /><br />User-agent: *<br />Disallow: /<br /></code><br />Also, disallow mobile crawlers to your desktop version of your site by adding the following robot.txt in the root of your site (for example http://www.yoursite.com/robot.txt ):<br /><code><br />User-agent: Googlebot-Mobile<br />Disallow: /<br /><br />User-agent: YahooSeeker/M1A1-R2D2<br />Disallow: /<br /><br />User-agent: *<br />Disallow:<br /></code><br />With the first robot.txt in the mobile root and the second one (here above) in the root of your desktop site, your mobile site items should only appear when people search with a mobile search engine (for example by using <a href="http://m.google.com">http://m.google.com</a> ) but not when searching with the desktop version (for example <a href="http://www.google.com">http://www.google.com</a> ).<br /> <br />As far as I know, the MSNbot that crawls for the Microsoft Bing index together does not have a bot version that crawls strickly for the mobile Bing search engine at <a href="http://m.bing.com">http://m.bing.com</a>.<br /></li><br /><li>Add your mobile site to Google : <a href="http://www.google.com/support/webmasters/bin/answer.py?answer=40348">http://www.google.com/support/webmasters/bin/answer.py?answer=40348</a> , Bing <a href="http://www.bing.com/webmaster/SubmitSitePage.aspx">http://www.bing.com/webmaster/SubmitSitePage.aspx</a>, Yahoo (http://siteexplorer.search.yahoo.com/mobilesubmit) and other relevant mobile indexes</li><br /><li>Create a mobile sitesmap : <a href="http://www.google.com/support/webmasters/bin/answer.py?answer=34648&cbid=-1rt6r3us7wrvl&src=cb&lev=answer">http://www.google.com/support/webmasters/bin/answer.py?answer=34648&cbid=-1rt6r3us7wrvl&src=cb&lev=answer</a> </li><br /></ol><br />Let me know I've you have anything to add to this strategy in the comments.cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-48237432442465945262009-08-02T13:39:00.008+02:002009-08-02T14:31:10.335+02:00Set all links target to _blank on a XHTML 1.0 Strict using jqueryAs explained <a href="http://www.sitepoint.com/article/standards-compliant-world/3/">here</a>, opening links in a new window is no longer possible via target=_blank in XHTML 1.0 strict. This code is a workaround using Javascript:<br /><pre class="prettyprint"><br />function externalLinks() { <br /> if (!document.getElementsByTagName) return; <br /> var anchors = document.getElementsByTagName("a"); <br /> for (var i=0; i<anchors.length; i++) { <br /> var anchor = anchors[i]; <br /> if (anchor.getAttribute("href") && <br /> anchor.getAttribute("rel") == "external") <br /> anchor.target = "_blank"; <br /> } <br />} <br />window.onload = externalLinks;<br /></pre><br />A link with attribute rel set to external will open in a new window:<br /><pre class="prettyprint"><br /><a rel="external" href="http://castfortwo.blogpspot.com/">cast42</a><br /></pre><br />On the <a href="http://friendfeed.com/cast42/embed">Friendfeed realtime embed</a> code, I saw they use jquery to do the job:<br /><pre class="prettyprint"><br /><script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.js"><br /><script type="text/javascript"> <br />$("body").mousedown(function(e) {<br />for (var target = e.target; target; target = target.parentNode) {<br /> if (target.tagName == "A") {<br /> if ((document.location.href.split("#")[0] + "#") == target.href) {<br /> return;<br /> }<br /> target.target = "_blank";<br /> return;<br /> }<br />}<br />});<br /></script> <br /></pre><br />The advantage is that all links will open in a new window, except if the refere to an anchor in the page. Hence there's no need to add the attribute rel to each anchor.cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0tag:blogger.com,1999:blog-13095557.post-67390238214090448392009-07-28T10:53:00.005+02:002009-07-28T11:12:52.390+02:00Urbain Airship: a webhook based service for Iphone 3.0 Push Notification<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://infosthetics.com/archives/telekom_installation.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 600px; height: 300px;" src="http://infosthetics.com/archives/telekom_installation.jpg" border="0" alt="picture about fast internet infrastructure" /></a><br />This morning I discovered a <a href="http://appengine-cookbook.appspot.com/recipe/googleappengine-python-with-urbanairship-to-send-out-iphone-os30-push-notifications/">new recipe on <a href="http://appengine-cookbook.appspot.com/">Google App Engine Cookbook</a> to send out Iphone 3.0 Push notifications via Google App Engine</a>. In fact, the recipe makes use of a service called <a href="http://urbanairship.com/">Urban Airship</a>. They provide a free service that allows to send upto 5000 Push notifications a month. For larger volumes, the price seems reasonable. Image now that all content producers become pubsubhubbub (<a href="http://castfortwo.blogspot.com/2009/07/pubsubhubbub-webhook-based.html">the pseudo realtime webhook based enabled publish/subscribe protocol proposed by two Googlers</a>) enabled and maybe we scratch the surface of the future internet architecture that will drive the realtime web. Who knows?cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com1tag:blogger.com,1999:blog-13095557.post-20656566277698734102009-07-20T10:27:00.005+02:002009-07-20T11:17:15.213+02:00Pubsubhubbub: a webhook based publish/subscribeOn <a href="http://www.techcrunch.com/2009/07/09/speeding-up-rss/">Friday 9 July 2009</a>, Google engineers <a href="http://bradfitz.com/">Brad Fitzpatrick</a> and <a href="http://friendfeed.com/brett">Brett Slatkin</a> showed a demo of a new realtime protocol called <a href="http://code.google.com/p/pubsubhubbub">pubsubhubbub</a>. This new technology could lead to a more reactive, pseudo realtime web. I my humble opinion, this might be much bigger news from Google then the announcement of Chrome OS. Of course, only the latter made a big splash in the mainstream news.<br /><br />The issue of messaging is a topic addressed already many times in the course of computer science. Common wisdom is that the <a href="http://en.wikipedia.org/wiki/Publish/subscribe">publish-subscribe pattern</a> is a sound solution to this. The problem is that due to all kinds of practicalities it often regresses into a polling solution. Even with pubhubsubbub, the website that want to display realtime updates has to poll the hub to check if an update has happened. So there's still a nut to crack! <a href="http://code.google.com/p/pubsubhubbub/source/browse/#svn/trunk/subscriber">In the example of a subscriber</a><a href="http://code.google.com/p/pubsubhubbub/source/browse/trunk/subscriber/static/agg.js">, a Javascript polls the hub</a> to check for an update.<br /><br />If anybody would know an implementation of the client that does not poll, please let me know.<br /><br />In the demo at Techcrunch, updates made by blogger appeared almost realtime in google reader. Currenlty,<a href="http://friendfeed.com/svartling/d7fda94c/trying-to-real-time-blog-more-on-my-blogs-instead"> not all blogger accounts support pubsubhubbub</a>. <br /><br />To be ready when your blogger account is updated, do not forget to add your feed to Feedburner and to activate Pingshot:<br /><img src="http://img.skitch.com/20090720-gdhx3csrrhkkciidbmimd4e86d.png" alt="enable pingshot in feedburner"></img><br />A <a href="http://wordpress.org/extend/plugins/pubsubhubbub/">pubsubhubbub plugin for wordpress</a> exists and the Drupal community is probably already working on it. Check the <a href="http://code.google.com/p/pubsubhubbub/wiki/PublisherClients">overview of publisher code for clients on the pubsubhubbub project page</a>.<br /><br />Pushed on publish post on monday 20 Juli 2009, at 10:41. Updated at 11u17cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com1tag:blogger.com,1999:blog-13095557.post-46951193864530984682009-06-23T20:27:00.003+02:002009-06-23T20:38:55.271+02:00Spore Galactic Adventure Released in Europe, today 23 June 2009<a href="http://www.flickr.com/photos/24480190@N05/3654866254/" title="IMG_0791 by cast42, on Flickr"><img src="http://farm4.static.flickr.com/3545/3654866254_9c5be6d817.jpg" width="500" height="375" alt="IMG_0791" /></a><br /><a href="http://www.flickr.com/photos/24480190@N05/3654867184/" title="Spore Ruimteavonturen (Galactic Adventures) Picture 2 by cast42, on Flickr"><img src="http://farm4.static.flickr.com/3255/3654867184_732b29d7bf.jpg" width="375" height="500" alt="Spore Ruimteavonturen (Galactic Adventures) Picture 2" /></a><br />This afternoon i received a SMS that my preordered expention kit, called <a href="http://www.spore.com/what/ga">Galactic Adventures </a>for the EA Spore game, was available. I picked it up for 30 euros and installed it. Everything went smooth.<br /><a href="http://www.flickr.com/photos/24480190@N05/3654068855/" title="IMG_0794 by cast42, on Flickr"><img src="http://farm3.static.flickr.com/2466/3654068855_6a8e3a603d.jpg" width="500" height="375" alt="IMG_0794" /></a><br />After a succesfull installation, we clicked on the Spore icon in the dock of the mac and prepared for the new fun....that we didn't find. Looking up the documentation and calling the EA helpdesk brought no prevail. I tried a second install. Nothing helped. Until I went looking in the installation directory Spore in the Applications directory. I saw that a new executable was there called "Spore Ruimteavonturen" (dutch for Spore Galactic Adventures). Dubbel click this new executable and of we go:<br /><a href="http://www.flickr.com/photos/24480190@N05/3654069231/" title="IMG_0795 by cast42, on Flickr"><img src="http://farm4.static.flickr.com/3634/3654069231_1106aa67cc.jpg" width="500" height="375" alt="IMG_0795" /></a>cast42http://www.blogger.com/profile/15954114607504297643noreply@blogger.com0