Merge branch 'main' of github.com:TomHodson/tomhodson.github.com
1
.gitignore
vendored
@ -7,3 +7,4 @@ env/
|
||||
.DS_Store
|
||||
node_modules/
|
||||
package-lock.json
|
||||
.ipynb_checkpoints/
|
||||
|
@ -7,7 +7,7 @@ You probably want to run ruby from a version manager like `chruby`, see [here](h
|
||||
- add humans.txt https://humanstxt.org/
|
||||
- fix the OG tags so that https://cards-dev.twitter.com/validator works
|
||||
- consider switching to using pandoc as a markdown renderer
|
||||
- switch so that the blog is served from the root instead of doing a redirect
|
||||
- setup webmentions https://aarongustafson.github.io/jekyll-webmention_io/
|
||||
|
||||
## Notes
|
||||
[Installation](https://jekyllrb.com/docs/installation/macos/)
|
||||
|
@ -27,4 +27,4 @@ whitelist:
|
||||
- flexible_include
|
||||
|
||||
feed:
|
||||
posts_limit: 20
|
||||
posts_limit: 100
|
@ -6,16 +6,103 @@ location: Trinity College, Cambridge
|
||||
subtitle: "Imaging Magnetic Phenomena with Scanning Diamond Magnetometry"
|
||||
|
||||
image: /assets/images/vector_magnet_angle_view.png
|
||||
alt: "A vector magnet that I designed."
|
||||
alt: "A render of vector magnet that I designed in a CAD program."
|
||||
|
||||
image_markup: <model-viewer style="height:250px;" src="/assets/blog/vector_magnet/vector_magnet.glb" ar ar-modes="webxr scene-viewer quick-look" camera-controls poster="/assets/blog/vector_magnet/vector_magnet.png" shadow-intensity="1" environment-image="/assets/blog/vector_magnet/aircraft_workshop_01_1k.hdr" camera-orbit="-169.8deg 78.57deg 0.8881m" field-of-view="32.55deg" interaction-prompt="none" auto-rotate> </model-viewer>
|
||||
|
||||
layout: cv_entry
|
||||
read_more: true
|
||||
assets: /assets/blog/vector_magnet
|
||||
---
|
||||
|
||||
Supervisor: Professor Mete Atatüre<br>
|
||||
<br>
|
||||
The project centered around the use of a Nitrogen-Vancancy defect in a nanoscale diamond to detect magnetic fields with ultra high resolution. We experimented with mounting such a nano-diamond to the tip of an atomic force microscope in order to produce field images. I built a 3d vector magnetometer in order to determine the axis of a defect in a nano-diamond.
|
||||
|
||||
Check out a little interactive model of the magnetometer below.
|
||||
Check out a little interactive model of the magnetometer below. The device has three pairs of copper Helmholtz coils that generate controlled, linear, magnetic fields in all three directions.
|
||||
|
||||
<iframe src="https://myhub.autodesk360.com/ue2a56e59/shares/public/SH7f1edQT22b515c761efc56dd943429df14?mode=embed" width="640" height="480" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true" frameborder="0"></iframe>
|
||||
<figure>
|
||||
<model-viewer style="height:500px;" src="{{ page.assets }}/vector_magnet.glb" ar ar-modes="webxr scene-viewer quick-look" camera-controls poster="{{ page.assets }}/vector_magnet.png" shadow-intensity="1" environment-image="{{ page.assets }}/aircraft_workshop_01_1k.hdr" camera-orbit="-169.8deg 78.57deg 0.8881m" field-of-view="32.55deg" interaction-prompt="none" auto-rotate> </model-viewer>
|
||||
|
||||
<!-- <model-viewer id="vector-magnet-whole-2" style="height:500px;" src="{{ page.assets }}/vector_magnet.glb" ar ar-modes="webxr scene-viewer quick-look" camera-controls poster="{{ page.assets }}/vector_magnet.png" shadow-intensity="1" environment-image="{{ page.assets }}/aircraft_workshop_01_1k.hdr" interaction-prompt="none" interpolation-decay="300" auto-rotate>
|
||||
|
||||
<button class="Hotspot" style="disaplay:none;" slot="hotspot-1" data-position="0.3140708429455987m 0.2809109652738389m -0.32504316945989636m" data-normal="-3.85185900533595e-30m -1.343588384327496e-7m 0.9999999999999911m" data-visibility-attribute="visible"><div class="left HotspotAnnotation">AFM Tip</div></button>
|
||||
|
||||
<button class="Hotspot" style="disaplay:none;" slot="hotspot-3" data-position="0.32587557211500007m 0.2711873555719334m -0.32504317169367186m" data-normal=" -4.575935640098142e-8m -2.0164410743149838e-7m 0.9999999999999787m" data-visibility-attribute="visible"><div class="HotspotAnnotation">Microscope Objective</div></button>
|
||||
|
||||
<button class="Hotspot" style="disaplay:none;" slot="hotspot-4" data-position="0.3186977335100803m 0.2788147714959883m -0.3250432252613787m" data-normal=" 1.5099584039393812e-7m -1.34358838432748e-7m 0.9999999999999796m" data-visibility-attribute="visible"><div class="HotspotAnnotation">PCB Excitation Coil</div></button>
|
||||
<button class="section" onclick="toggleSection(this)">Show Section View</button>
|
||||
|
||||
</model-viewer> -->
|
||||
<figcaption>
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
Here's a cutaway view, try zooming out to get your bearing with respect to the above diagram. You can see that in the center of these three pairs of coils there is:
|
||||
|
||||
<figure>
|
||||
<model-viewer style="height:400px;" src="{{ page.assets }}/vector_magnet_section.glb" ar ar-modes="webxr scene-viewer quick-look" camera-controls poster="{{ page.assets }}/section_view.png" shadow-intensity="1" environment-image="{{ page.assets }}/aircraft_workshop_01_1k.hdr" camera-orbit="37.19deg 75.38deg 0.3104m" field-of-view="12deg">
|
||||
<button class="Hotspot" slot="hotspot-1" data-position="0.0002550490643940138m 0.12905932644259982m 0.0003319628199390896m" data-normal="-3.85185900533595e-30m -1.343588384327496e-7m 0.9999999999999911m" data-visibility-attribute="visible">
|
||||
<div class="left HotspotAnnotation">AFM Tip</div>
|
||||
</button><button class="Hotspot" slot="hotspot-3" data-position="0.015349223451080356m 0.11522588429565153m 0.0037307930577810513m" data-normal="0.9822871951592153m -1.7349759832900923e-7m 0.18738160589079159m" data-visibility-attribute="visible">
|
||||
<div class="HotspotAnnotation">Microscope Objective</div>
|
||||
</button><button class="Hotspot" slot="hotspot-4" data-position="0.004252449047777678m 0.12449395035064194m -0.0015034997269766357m" data-normal="3.85185900533595e-30m 0.9999999999999911m 1.343588384327496e-7m" data-visibility-attribute="visible">
|
||||
<div class="HotspotAnnotation">PCB Excitation Coil</div>
|
||||
</button></model-viewer>
|
||||
<figcaption>
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
**AFM Tip**: The atomic force microscope tip in blue with a nano-diamond attached to the very tip. We want to figure out which was the axis the NV defect in this nano-diamond is pointing. To do that we need to expose it to different directions of magnetic field while also blasting it with light and radio waves.
|
||||
|
||||
**PCB coil** For the radio wave blasting we have a single turn coil made on a PCB. I haven't cut the coil away so that you can see it's whole shape. We'll pump RF power into this tuned to the electronic transitions in the NV defect that we want to probe.
|
||||
|
||||
**Microscope Objective** The microscope objective allows us to optically pump the transitions in the NV defect (much like a laser) in order to keep electrons in excited quantum states that they wouldn't normally sit in.
|
||||
|
||||
By putting in varying currents through the three coils pairs we can create a very well controlled magnetic field in any direction and of varying strength. We can then run a sweep through all the possible field directions while blasting the NV center with light and RF in order to determine it axis with respect to the plastic housing of the tip.
|
||||
|
||||
This is how you would calibrate one of these magnetism sensing AFM tips after first sticking a diamond to the tip.
|
||||
|
||||
Once we know the axis direction this AFM tip could then be transferred back to the AFM to measure magnetic fields at the nanoscale!
|
||||
|
||||
TODO: Explain this in a bit more detail.
|
||||
|
||||
<!-- <script type="module">
|
||||
const modelViewer = document.querySelector("model-viewer#vector-magnet-whole-2");
|
||||
modelViewer.in_section_view = false;
|
||||
|
||||
modelViewer.addEventListener('load', (event) => {
|
||||
|
||||
modelViewer.cameraOrbit = modelViewer.in_section_view ? "37.19deg 75.38deg 0.01m" : "auto auto auto";
|
||||
modelViewer.cameraTarget = modelViewer.in_section_view ? "0.3142m 0.2804m -0.3250m" : "auto auto auto";
|
||||
modelViewer.fieldOfView = modelViewer.in_section_view ? "5deg" : "auto";
|
||||
modelViewer.autoRotate = !modelViewer.in_section_view;
|
||||
|
||||
if(modelViewer.in_section_view){
|
||||
window.setTimeout(() => [...modelViewer.getElementsByClassName("Hotspot")].forEach(e => e.style.display = "unset"), 1000);
|
||||
} else {
|
||||
[...modelViewer.getElementsByClassName("Hotspot")].forEach(e => e.style.display = "none")
|
||||
}
|
||||
|
||||
// const logPoint = (event) => {
|
||||
// const p = modelViewer.positionAndNormalFromPoint(event.clientX, event.clientY)
|
||||
// console.log(p.position.toString(), p.normal.toString());
|
||||
// };
|
||||
|
||||
// modelViewer.addEventListener("click", logPoint);
|
||||
|
||||
});
|
||||
|
||||
window.toggleSection = (element) => {
|
||||
modelViewer.in_section_view = !modelViewer.in_section_view;
|
||||
|
||||
console.log(modelViewer.cameraOrbit, modelViewer.cameraTarget, modelViewer.fieldOfView);
|
||||
if(modelViewer.in_section_view) {
|
||||
modelViewer.src = "{{ page.assets }}/test_section.glb";
|
||||
} else {
|
||||
modelViewer.src = "{{ page.assets }}/test_whole.glb";
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
</script> -->
|
@ -1,5 +1,5 @@
|
||||
- name: Blog
|
||||
link: /blog/
|
||||
link: /
|
||||
- name: CV
|
||||
link: /cv/
|
||||
- name: Thesis
|
||||
|
1
_drafts/auto_screenshot.md
Normal file
@ -0,0 +1 @@
|
||||
https://gist.github.com/leodutra/d880580f86620915b28a3eadccb81527
|
1
_drafts/rpi_selfhosting.md
Normal file
@ -0,0 +1 @@
|
||||
https://www.raspberryconnect.com/projects/65-raspberrypi-hotspot-accesspoints/183-raspberry-pi-automatic-hotspot-and-static-hotspot-installer
|
@ -1,14 +1,23 @@
|
||||
---
|
||||
title: Building Micropython from source
|
||||
title: My First Half Marathon
|
||||
layout: post
|
||||
image:
|
||||
alt:
|
||||
image: /assets/blog/running/time_vs_distance.svg
|
||||
social_image: /assets/blog/running/time_vs_distance.png
|
||||
alt: A scatter graph of run time vs run distance for all my runs on strava. It shows that I mainly run between 5 and 6 min per kilometer, regardless of distance
|
||||
---
|
||||
|
||||
I just ran my first half marathon. To celebrate the occasion I'm going to have a look at my historical run data.
|
||||
|
||||
<figure>
|
||||
<img src="/assets/blog/running/time_vs_distance_plus_hist.svg"/>
|
||||
<figcaption>
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
- download all my runs from strava
|
||||
- scatter them on a (distance, time) plot
|
||||
- plot the (distance, time) curves predicted by the V02 max tables in the running book
|
||||
- interpolate the table to get a smooth function parametrised by V02max
|
||||
- interpolate the table to get a smooth function parametrized by V02max
|
||||
- fit that to my data
|
||||
|
||||
- potentially will need to take only the top 20% of runs or something
|
||||
@ -16,4 +25,4 @@ alt:
|
||||
|
||||
Extensions:
|
||||
- download heart rate data and make a histogram per hour of the day
|
||||
- could map radius to heart rate and angle to hour of day to make a nice figure
|
||||
- could map radius to heart rate and angle to hour of day to make a nice figure
|
||||
|
@ -8,13 +8,18 @@ alt:
|
||||
|
||||
<!-- <div class="strava-embed-placeholder" data-embed-type="activity" data-embed-id="9552293688"></div><script src="https://strava-embeds.com/embed.js"></script> -->
|
||||
|
||||
<!-- Import the component -->
|
||||
<script type="module" src="https://ajax.googleapis.com/ajax/libs/model-viewer/3.1.1/model-viewer.min.js"></script>
|
||||
|
||||
<!-- Use it like any other HTML element -->
|
||||
<!-- <model-viewer alt="test" src="/assets/blog/toothbrush_shelf/toothbrush_shelf.glb" ar environment-image="" poster="/assets/blog/toothbrush_shelf/spin.gif" shadow-intensity="1" camera-controls touch-action="pan-y"></model-viewer> -->
|
||||
|
||||
<!-- <model-viewer> HTML element -->
|
||||
<model-viewer src="/assets/blog/toothbrush_shelf/model/toothbrush_shelf.glb" ar ar-modes="webxr scene-viewer quick-look" camera-controls poster="/assets/blog/toothbrush_shelf/model/poster.webp" shadow-intensity="1" auto-rotate camera-orbit="-212.4deg 77.5deg 411.2m" field-of-view="30deg"> </model-viewer>
|
||||
<!-- Loads <model-viewer> for browsers: -->
|
||||
<script type="module" src="https://ajax.googleapis.com/ajax/libs/model-viewer/3.0.1/model-viewer.min.js"></script>
|
||||
|
||||
|
||||
<model-viewer src="/assets/blog/terrain/untitled.glb" ar ar-modes="webxr scene-viewer quick-look" camera-controls shadow-intensity="1" environment-image="/assets/blog/terrain/pillars_1k.hdr" exposure="1.34" camera-orbit="-198.3deg 49.94deg 143.8m" field-of-view="38.8deg">
|
||||
<button class="Hotspot" slot="hotspot-1" data-position="6.6575782971657045m 1.2675063664559048m -11.69313039177284m" data-normal="0.03993612823978079m 0.9984038328257562m 0.0399361022141038m" data-visibility-attribute="visible">
|
||||
<div class="HotspotAnnotation">My House</div>
|
||||
</button><button class="Hotspot" slot="hotspot-2" data-position="-12.219647443249531m 0.2444805745162455m -0.03384905050821585m" data-normal="-0.3045547244913506m 0.9517337624555773m -0.03806921580684815m" data-visibility-attribute="visible">
|
||||
<div class="HotspotAnnotation">RARA</div>
|
||||
</button>
|
||||
</model-viewer>
|
||||
|
@ -40,10 +40,14 @@ See: https://developers.google.com/search/docs/advanced/mobile/google-discover?h
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<!-- indieauth.com authentication -->
|
||||
<link rel="authorization_endpoint" href="https://indieauth.com/auth">
|
||||
|
||||
<link rel="stylesheet" href="/assets/css/styles.css">
|
||||
<script type="module" src="/assets/js/model-viewer.js"></script>
|
||||
<script src="/assets/js/index.js"></script>
|
||||
|
||||
<script type="module" src="/assets/js/model-viewer.js"></script>
|
||||
|
||||
|
||||
<script>
|
||||
MathJax = {
|
||||
|
@ -6,10 +6,9 @@
|
||||
</div>
|
||||
<p class="p-note">Physicist, Programmer, Maker and Baker
|
||||
<p class="professional-links">
|
||||
<a class="u-url" rel="me" href="https://github.com/TomHodson"><img class="icon" src="/assets/icons/github.svg">GitHub</a>
|
||||
<a class="u-url" rel="me" href="https://twitter.com/T_Hodson"><img class="icon" src="/assets/icons/twitter.svg"><s>Twitter</s></a>
|
||||
<a href="https://github.com/TomHodson" rel="me authn" class="u-url"><img class="icon" src="/assets/icons/github.svg">GitHub</a>
|
||||
<a href="https://tech.lgbt/@Tomhodson" rel="me" class="u-url"><img class="icon" src="/assets/icons/mastodon.svg">Mastodon</a>
|
||||
<a href="/feed.xml"><img class="icon" src="/assets/icons/rss.svg">RSS</a>
|
||||
<a class="u-url" rel="me" href="https://tech.lgbt/@Tomhodson"><img class="icon" src="/assets/icons/mastodon.svg">Mastodon</a>
|
||||
</p>
|
||||
{% include sidebar.html%}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
<nav aria-label="Site Map" class="site-map"></nav>
|
||||
<nav aria-label="Site Map" class="site-map">
|
||||
{% for item in site.data.navigation %}
|
||||
<a href="{{ item.link }}" {% if page.url == item.link %}class="current"{% endif %}>{{ item.name }}</a>
|
||||
{% endfor %}
|
||||
|
@ -5,12 +5,21 @@ layout: post
|
||||
image: /assets/blog/shelves/thumb.svg
|
||||
social_image: /assets/social/shelves.png
|
||||
alt: A 3D render of some shelves fitting into a triangular space under a ladder.
|
||||
assets: /assets/blog/shelves
|
||||
---
|
||||
|
||||
<figure>
|
||||
<model-viewer src="{{page.assets}}/model/shelves.glb" ar ar-modes="webxr scene-viewer quick-look" camera-controls poster="{{page.assets}}/model/shelves.png" shadow-intensity="2" shadow-softness="1" camera-orbit="13.36deg 78.29deg 8.638m" field-of-view="37.48deg" interaction-prompt="none" auto-rotate environment-image="{{page.assets}}/model/env.jpg" alt="An interactive 3D model of the shelves, this is pretty unnecessary but I find it very cool that you can just view 3D models in browsers now like they're any other media."> </model-viewer>
|
||||
<figcaption>
|
||||
I'm a bit addicted these little interactive 3D models. Give me time, I'll get over it.
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
In our new flat we have this mezzanine bed with a yellow ladder leading up to it. Between the ladder and the wardrobe we had this kind of triangular space that we wanted to use for more storage. After doing a quick design on paper I started mocking something up.
|
||||
|
||||
|
||||
<figure>
|
||||
<img src="/assets/blog/shelves/skeleton.jpg"/>
|
||||
<img style="height:500px;" src="{{page.assets}}/skeleton.jpg"/>
|
||||
<figcaption>
|
||||
The first try.
|
||||
</figcaption>
|
||||
@ -19,7 +28,7 @@ The first try.
|
||||
I got quite far with this version before realised I hade made a terrible error, somewhere on my scratch pad of calculations I had written something like "1700 - 36 = 1404"! After taking a few days to mourn the lost effort I decided to make a better plan to avoid making similar mistakes. I used the CAD model to generate a set of cutting plans that I could print out and take to the workshop.
|
||||
|
||||
<figure>
|
||||
<img src="/assets/blog/shelves/Shelves v11.png"/>
|
||||
<img src="{{page.assets}}/Shelves v11.png"/>
|
||||
<figcaption>
|
||||
After messing up the measurments on the first iteration, I went back and myself a nice CAD model to take measurements from while cutting.
|
||||
</figcaption>
|
||||
@ -28,21 +37,21 @@ After messing up the measurments on the first iteration, I went back and myself
|
||||
In this new version I opted to make the sided panels out of solid sheets of 18mm pine plywood, it made the final object heavier but they were much easier to cut on the table saw. The extra weight was probably a good thing, in place it feels pleasantly heavy and sturdy.
|
||||
|
||||
<figure>
|
||||
<img src="/assets/blog/shelves/plans.svg"/>
|
||||
<img src="{{page.assets}}/plans.svg"/>
|
||||
<figcaption>
|
||||
From the CAD model, it's quite easy to make nice plans for each piece.
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
<figure>
|
||||
<img src="/assets/blog/shelves/thumb.svg"/>
|
||||
<img src="{{page.assets}}/thumb.svg"/>
|
||||
<figcaption>
|
||||
I really like the line drawn aesthetic, reminds me a lot of Ikea construction plans.
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
<figure>
|
||||
<img src="/assets/blog/shelves/real_2.jpg"/>
|
||||
<img src="{{page.assets}}/real_2.jpg"/>
|
||||
<figcaption>
|
||||
The final shelves in their new home!
|
||||
</figcaption>
|
||||
|
@ -1,7 +1,7 @@
|
||||
---
|
||||
title: My first PCB!
|
||||
excerpt: |
|
||||
I've had a longstanding ambition to get a PCB manufactured but I've always put it off. Lately I had a need for a little adapter board to break out these 1.27mm spaced pins to 2.54mm pins that would fit into a breadboard. Feeling like it was a simple enough board I finally decided to fire up KiCad and give it a go. <model-viewer alt="An interactive 3D render of a PCB with 2.54mm headers on one side to fit a breadboard and 1.27 inch headers on the other." src="/assets/blog/PCB/model/pcb.glb" ar camera-controls poster="/assets/blog/PCB/model/poster.webp" interaction-prompt="none" shadow-intensity="1" shadow-softness="1" exposure="0.5" camera-orbit="196.6deg 59.73deg 0.1m" field-of-view="30deg" auto-rotate> </model-viewer>
|
||||
I've had a longstanding ambition to get a PCB manufactured but I've always put it off. Lately I had a need for a little adapter board to break out these 1.27mm spaced pins to 2.54mm pins that would fit into a breadboard. Feeling like it was a simple enough board I finally decided to fire up KiCad and give it a go. <model-viewer alt="An interactive 3D render of a PCB with 2.54mm headers on one side to fit a breadboard and 1.27 inch headers on the other." src="/assets/blog/PCB/model/pcb.glb" ar camera-controls poster="/assets/social/pcb_1.png" interaction-prompt="none" shadow-intensity="1" shadow-softness="1" exposure="0.5" camera-orbit="196.6deg 59.73deg 0.1m" field-of-view="30deg" auto-rotate> </model-viewer>
|
||||
layout: post
|
||||
commentid: 110810437631337327
|
||||
hide_image: true # Only use this image for static previews
|
||||
|
@ -1,7 +1,7 @@
|
||||
---
|
||||
title: Toothbrush Shelf
|
||||
excerpt: |
|
||||
It can be hard to find genuine everyday uses of 3D printing, but after a while you do find some. <model-viewer alt="An interactive 3D render of a small 3D printed shelf to hold a toothbrush near the bathroom shaver socket without the cables being messy" src="/assets/blog/toothbrush_shelf/model/toothbrush_shelf.glb" ar poster="/assets/blog/toothbrush_shelf/model/poster.webp" camera-controls shadow-intensity="1.38" shadow-softness="2" exposure="0.8" auto-rotate camera-orbit="-35deg 78.72deg 411.2m" field-of-view="30deg" interaction-prompt="none"> </model-viewer>
|
||||
It can be hard to find genuine everyday uses of 3D printing, but after a while you do find some. <model-viewer alt="An interactive 3D render of a small 3D printed shelf to hold a toothbrush near the bathroom shaver socket without the cables being messy" src="/assets/blog/toothbrush_shelf/model/toothbrush_shelf.glb" ar poster="/assets/blog/toothbrush_shelf/model/toothbrush_shelf.webp" camera-controls shadow-intensity="1.38" shadow-softness="2" exposure="0.8" auto-rotate camera-orbit="-35deg 78.72deg 411.2m" field-of-view="30deg" interaction-prompt="none" ar-placement="wall"> </model-viewer>
|
||||
layout: post
|
||||
hide_image: true # Only use this image for static previews
|
||||
image: /assets/blog/toothbrush_shelf/spin.gif
|
||||
@ -11,12 +11,13 @@ alt: A render of a 3D printed shelf sitting above a shaver outlet, it spins slow
|
||||
It can be hard to find genuine everyday uses of 3D printing, but after a while you do find some! I made this little shelf to tidy up the wires to our devices in the bathroom. The wires are now hidden, coiled up, inside the shelf.
|
||||
|
||||
<figure>
|
||||
<model-viewer alt="An interactive 3D render of a small 3D printed shelf to hold a toothbrush near the bathroom shaver socket without the cables being messy" src="/assets/blog/toothbrush_shelf/model/toothbrush_shelf.glb" ar poster="/assets/blog/toothbrush_shelf/model/poster.webp" camera-controls shadow-intensity="1.38" shadow-softness="2" exposure="0.8" auto-rotate camera-orbit="-35deg 78.72deg 411.2m" field-of-view="30deg" interaction-prompt="none"> </model-viewer>
|
||||
<model-viewer alt="An interactive 3D render of a small 3D printed shelf to hold a toothbrush near the bathroom shaver socket without the cables being messy" src="/assets/blog/toothbrush_shelf/model/toothbrush_shelf.glb" ar poster="/assets/blog/toothbrush_shelf/model/toothbrush_shelf.webp" camera-controls shadow-intensity="1.38" shadow-softness="2" exposure="0.8" auto-rotate camera-orbit="-35deg 78.72deg 411.2m" field-of-view="30deg" interaction-prompt="none" ar-placement="wall"> </model-viewer>
|
||||
<figcaption>
|
||||
A little 3D model that you can pan and zoom on. Or even use AR on your phone.
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
|
||||
<figure>
|
||||
<img style="height:500px;" src="/assets/blog/toothbrush_shelf/crop.jpeg"/>
|
||||
<figcaption>
|
||||
|
108
_posts/2023-08-10-miniflux-and-rsshub.md
Normal file
@ -0,0 +1,108 @@
|
||||
---
|
||||
title: "Selfhosting: Miniflux and RSSHub"
|
||||
layout: post
|
||||
excerpt: Some notes on selfhosting an RSS reader.
|
||||
---
|
||||
|
||||
Like many nerdy, computery types, I like to subscribe to blogs and other content through RSS. RSS is crazy simple, you host a url on a website with a list of posts with titles/URLs/content encoded in XML (I know I know but it only have like 5 tags and is only nested one level deep.) An RSS reader just checks a big list of those URLs every now and then and presents you the latest thing to show up.
|
||||
|
||||
Incidentally this is also how podcasts work, at least for a while, Spotify is clearly trying to capture it.
|
||||
|
||||
Anyway, I usually use [theoldreader](https://theoldreader.com/) to read RSS feeds but lately they've implemented a premium version that you have to pay $3 a month for if you have more than 100 feeds (I have 99...).
|
||||
|
||||
Honestly, I use their service a lot so somehow $3 doesn't seem so bad, but it spurred me to look into selfhosting.
|
||||
|
||||
Selfhosting seems to be all the rage these days. Probably in response to feeling locked in to corporate mega structures, the aforementioned computery nerdy types have gone looking for ways to maintain their own anarchic web infrastructure. See i.e [the indieweb movement](https://indieweb.org/), [mastodon](https://joinmastodon.org/) etc etc etc
|
||||
|
||||
So I want to try out some self hosting. Let's start with an RSS reader. [Miniflux](https://miniflux.app/) seems well regarded. So I popped over their, grabbed a `docker-compose.yml`, ran `docker compose up -d` and we seem to be off to the races.
|
||||
|
||||
Ok, a nice thing about Miniflux when compared to theoldreader is the former seems to be better at telling you when there's something wrong with your feeds. It told me about a few blogs it couldn't reach, notably [Derek Lowe's excellent blog about chemical drug discovery](https://www.science.org/blogs/pipeline).
|
||||
|
||||
That blog has an [rss feed](https://www.science.org/blogs/pipeline/feed), which loads perfectly find in my browser but doesn't seem to work when outside of that context, i.e in python:
|
||||
|
||||
```python
|
||||
>>> import requests
|
||||
>>> requests.get("https://blogs.sciencemag.org/pipeline/feed")
|
||||
<Response [403]>
|
||||
```
|
||||
|
||||
Playing around a bit more, adding in useragents, accepting cookies and following redirects, I eventually get back a page with a challenge that requires JS to run. This is the antithesis of how RSS should work!
|
||||
|
||||
Ok so to fix this I came upon [RSSHub](https://docs.rsshub.app/en/) which is a kind of RSS proxy, it parses sites that don't have RSS feeds and generates them for you. I saw that this has pupeteer support so I'm hopping that I can use it to bypass the anti-crawler tactics science.org is using.
|
||||
|
||||
Anyway, for how here is a docker-compose.yml for both miniflux and RSSHub. What took me a while to figure out is that docker containers live in their own special network. So to subscribe to a selfhosted RSSHub feed you need to put something like "http://rsshub:1200/" where rsshub is the key to the image in the yaml file below.
|
||||
|
||||
EDIT: I got it to work using puppeteer! For now the code is in a [branch](https://github.com/TomHodson/RSSHub/tree/science_blogs) for which I'll do a proper PR soon.
|
||||
|
||||
```
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
miniflux:
|
||||
image: miniflux/miniflux:latest
|
||||
# build:
|
||||
# context: .
|
||||
# dockerfile: packaging/docker/alpine/Dockerfile
|
||||
container_name: miniflux
|
||||
restart: always
|
||||
healthcheck:
|
||||
test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"]
|
||||
ports:
|
||||
- "8889:8080"
|
||||
depends_on:
|
||||
- rsshub
|
||||
- db
|
||||
|
||||
environment:
|
||||
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
|
||||
- RUN_MIGRATIONS=1
|
||||
- CREATE_ADMIN=1
|
||||
- ADMIN_USERNAME=admin
|
||||
- ADMIN_PASSWORD=test123
|
||||
db:
|
||||
image: postgres:15
|
||||
environment:
|
||||
- POSTGRES_USER=miniflux
|
||||
- POSTGRES_PASSWORD=secret
|
||||
volumes:
|
||||
- miniflux-db:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-U", "miniflux"]
|
||||
interval: 10s
|
||||
start_period: 30s
|
||||
|
||||
rsshub:
|
||||
# two ways to enable puppeteer:
|
||||
# * comment out marked lines, then use this image instead: diygod/rsshub:chromium-bundled
|
||||
# * (consumes more disk space and memory) leave everything unchanged
|
||||
image: diygod/rsshub
|
||||
restart: always
|
||||
ports:
|
||||
- '1200:1200'
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
CACHE_TYPE: redis
|
||||
REDIS_URL: 'redis://redis:6379/'
|
||||
PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000' # marked
|
||||
depends_on:
|
||||
- redis
|
||||
- browserless # marked
|
||||
|
||||
browserless: # marked
|
||||
image: browserless/chrome # marked
|
||||
restart: always # marked
|
||||
ulimits: # marked
|
||||
core: # marked
|
||||
hard: 0 # marked
|
||||
soft: 0 # marked
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
restart: always
|
||||
volumes:
|
||||
- redis-data:/data
|
||||
|
||||
volumes:
|
||||
miniflux-db:
|
||||
redis-data:
|
||||
```
|
58
_posts/2023-08-13-half-marathon.md
Normal file
@ -0,0 +1,58 @@
|
||||
---
|
||||
title: My First Half Marathon!
|
||||
layout: post
|
||||
image: /assets/blog/running/time_vs_distance.svg
|
||||
social_image: /assets/blog/running/time_vs_distance.png
|
||||
alt: A scatter graph of run time vs run distance for all my runs on strava. It shows that I mainly run between 5 and 6 min per kilometer, regardless of distance
|
||||
---
|
||||
|
||||
I recently ran my first half marathon! I'm also signed up for a full marathon in October. 😬
|
||||
|
||||
Anyway, to celebrate the occasion and because I have now have a reason to think about how fast I might run a particular distance. I had a look at my historical run data. There's a great website called [statshunter](https://www.statshunters.com/) that you can authorise to Strava and from which you can download a little csv of all your runs. The first logical thing I could think to do is to see how fast I tend to run different distances.
|
||||
|
||||
<figure>
|
||||
<img src="/assets/blog/running/time_vs_distance_plus_hist.svg"/>
|
||||
<figcaption>
|
||||
So it's pretty much a straight line. This is telling me what I kinda already knew: I'm comfortable running between 5 and 7 mins/km and that's basically how fast I always run regardless of distance.
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
A friend lent me a huge running book which I'm going to dig through more but I suspect one of the conclusions will be a bit obvious: I could run those shorter distances a lot faster.
|
||||
|
||||
That same friend also lent me a heart rate watch which I've been playing with. So the next thing I want to learn about is what type of heart rates you should target when you train for a particular event.
|
||||
|
||||
|
||||
Code:
|
||||
|
||||
```python
|
||||
from matplotlib import pyplot as plt
|
||||
import numpy as np
|
||||
from datetime import datetime
|
||||
import pandas as pd
|
||||
|
||||
runs = pd.read_csv("runs.csv", parse_dates = ["Date"]) # Get this from statshunter.com
|
||||
|
||||
f, (ax2, ax) = plt.subplots(nrows=2, figsize = (5,5), sharex = True,
|
||||
gridspec_kw = dict(height_ratios = (1,2)))
|
||||
|
||||
ax.set(ylabel = "Moving Time (mins)", xlabel = "Distance (km)")
|
||||
|
||||
x = runs["Distance (m)"].values/1e3
|
||||
y = runs["Moving time"].values/60
|
||||
|
||||
dists = np.linspace(1, 25, 2)
|
||||
for i in [5,6,7]:
|
||||
mins_per_km = i * dists
|
||||
ax.plot(dists, mins_per_km, color = "black", linestyle = "dotted", label = f"{i} min/km")
|
||||
ax.text(25.5, 25*i, f"{i} min/km", va = "center")
|
||||
|
||||
ax.annotate("Half Marathon!", (x[0], y[0]-1), (20, 50), arrowprops = dict(arrowstyle = "->"))
|
||||
|
||||
ax.scatter(x, y, s=20, alpha = 0.6*fade_out_by_date(runs["Date"]))
|
||||
for a in [ax, ax2]: a.spines[['right', 'top']].set_visible(False)
|
||||
|
||||
ax2.hist(x, bins = 30, alpha = 0.5)
|
||||
ax2.set(yticks=[], ylabel = "Frequency Density")
|
||||
|
||||
f.savefig("time_vs_distance_plus_hist.svg", transparent=True)
|
||||
```
|
@ -79,8 +79,11 @@ header p.professional-links a {
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
// To squish the text together a bit in the mobile view.
|
||||
header p {
|
||||
margin-block: 0.25em;
|
||||
}
|
||||
|
||||
|
||||
header .avatar {
|
||||
margin: auto;
|
||||
}
|
||||
@ -90,7 +93,6 @@ header p.professional-links a {
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
nav a {
|
||||
margin-left: 1em;
|
||||
@ -98,6 +100,8 @@ header p.professional-links a {
|
||||
|
||||
header p.professional-links {
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
header hr {
|
||||
@ -107,7 +111,7 @@ header p.professional-links a {
|
||||
header p.professional-links a {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
flex-wrap: wrap;
|
||||
flex-wrap: nowrap;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@
|
||||
@import "thesis"; // the thesis content
|
||||
@import "blogroll"; // the summaries of the blogposts
|
||||
@import "comments"; //the mastodon comments
|
||||
@import "model_viewer"; //Styles for the 3D model viewer
|
||||
|
||||
// The syntax highlighting css
|
||||
// generated with rougify style bw > code_style_bw.scss
|
||||
|
65
_sass/model_viewer.scss
Normal file
@ -0,0 +1,65 @@
|
||||
.Hotspot {
|
||||
background: #fff;
|
||||
border-radius: 32px;
|
||||
border: 0;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
|
||||
box-sizing: border-box;
|
||||
cursor: pointer;
|
||||
height: 15px;
|
||||
padding: 8px;
|
||||
position: relative;
|
||||
transition: opacity 0.3s;
|
||||
width: 15px;
|
||||
}
|
||||
|
||||
.Hotspot:not([data-visible]) {
|
||||
background: transparent;
|
||||
border: 4px solid #fff;
|
||||
box-shadow: none;
|
||||
height: 32px;
|
||||
pointer-events: none;
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
.Hotspot:focus {
|
||||
border: 4px solid rgb(0, 128, 200);
|
||||
height: 32px;
|
||||
outline: none;
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
.Hotspot > * {
|
||||
opacity: 1;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.HotspotAnnotation{
|
||||
background: #fff;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
|
||||
color: rgba(0, 0, 0, 0.8);
|
||||
display: block;
|
||||
font-family: Futura, Helvetica Neue, sans-serif;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
left: calc(100% + 2em);
|
||||
max-width: 128px;
|
||||
overflow-wrap: break-word;
|
||||
padding: 0.5em 1em;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
.left.HotspotAnnotation {
|
||||
right: calc(100% + 2em);
|
||||
left: unset;
|
||||
}
|
||||
|
||||
.Hotspot:not([data-visible]) > * {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transform: translateY(calc(-50% + 4px));
|
||||
transition: transform 0.3s, opacity 0.3s;
|
||||
}
|
||||
|
776
assets/blog/running/running.ipynb
Normal file
197
assets/blog/running/runs.csv
Normal file
@ -0,0 +1,197 @@
|
||||
Date,Name,Tiles,New Tiles,Moving time,Elapsed time,Average,Distance (m),Elevation (m),Type,Commute,Trainer,Max heartrate,Avg heartrate,Start Lat,Start Long,Gear
|
||||
2023-07-30 18:34:42,"Heavy rain, grazing on blackberries ",7,4,7455,8206,10.1484,21012.5,47.1,Run,0,0,0,0,51.5555,-0.0805394,
|
||||
2023-07-27 19:06:27,Evening Run,4,0,1046,1309,11.9772,3479.5,15.3,Run,0,0,0,0,51.5556,-0.080564,
|
||||
2023-07-26 07:20:46,Morning Run,4,0,3368,4697,9.684,9058.4,40.5,Run,0,0,0,0,51.5556,-0.0804497,
|
||||
2023-07-23 19:44:19,Evening Run,4,0,1304,2055,10.3716,3757.1,14.9,Run,0,0,0,0,51.5553,-0.0802908,
|
||||
2023-07-22 20:09:37,Night Run,5,1,4073,5099,10.1772,11514.3,43.8,Run,0,0,0,0,51.5555,-0.0805495,
|
||||
2023-07-13 17:20:25,Afternoon Run,1,0,1979,2197,11.3832,6258.2,32.2,Run,0,0,0,0,51.5653,-0.0524104,
|
||||
2023-07-10 17:11:06,Afternoon Run,4,0,1877,3011,11.4912,5990.7,23.1,Run,0,0,0,0,51.5554,-0.0805919,
|
||||
2023-07-08 19:22:28,Evening Run,4,0,3180,3801,10.3572,9150.4,43.4,Run,0,0,0,0,51.5554,-0.0806102,
|
||||
2023-07-05 07:56:30,Morning Run,5,4,2563,2994,10.548,7508.7,37.1,Run,0,0,0,0,51.4197,-0.947986,
|
||||
2023-07-04 08:12:25,Morning Run,2,2,653,1640,10.5192,1908.2,29.4,Run,0,0,0,0,51.4198,-0.949513,
|
||||
2023-06-30 07:03:15,Morning Run,3,0,1842,3900,10.386,5314.3,10.3,Run,0,0,0,0,51.3425,12.3776,
|
||||
2023-06-28 07:13:02,Morning Run,3,0,1782,4064,10.7424,5317.2,6.7,Run,0,0,0,0,51.3427,12.3781,
|
||||
2023-06-27 06:36:40,Morning Run,3,3,1743,2376,11.3148,5478.6,4.8,Run,0,0,0,0,51.3422,12.3781,
|
||||
2023-06-12 19:26:39,Evening Run,1,0,1240,1630,10.2456,3529,12.7,Run,0,0,0,0,51.5647,-0.046122,
|
||||
2023-06-06 18:27:57,Evening Run,4,0,1944,2233,11.592,6258.7,23,Run,0,0,0,0,51.5554,-0.0805764,
|
||||
2023-05-31 18:40:29,Night Run,2,0,1469,12276,8.4384,3443.1,8.9,Run,0,0,0,0,51.5554,-0.0805397,
|
||||
2023-05-13 17:11:27,Night Run,3,0,2117,19978,10.4796,6162.2,22.9,Run,0,0,0,0,51.5553,-0.0805932,
|
||||
2023-05-11 17:26:01,Evening Run,3,0,1508,2683,10.2888,4310.5,14.9,Run,0,0,0,0,51.5555,-0.0804862,
|
||||
2023-05-07 20:04:15,Night Run,3,0,1417,4465,9.4212,3708.5,12.8,Run,0,0,0,0,51.5556,-0.0805553,
|
||||
2023-04-29 10:18:55,Lunch Run,4,0,1453,4535,8.6256,3482.1,14.1,Run,0,0,0,0,51.5556,-0.0805465,
|
||||
2023-04-24 19:22:59,Evening Run,4,0,2232,2889,10.1088,6266.9,22.9,Run,0,0,0,0,51.5557,-0.0805353,
|
||||
2023-04-17 19:09:39,Evening Run,4,0,1975,3051,11.0448,6058.6,23,Run,0,0,0,0,51.5555,-0.0806151,
|
||||
2023-04-14 18:49:08,Evening Run,4,0,2006,2246,11.0268,6144.3,22.9,Run,0,0,0,0,51.5555,-0.080489,
|
||||
2023-04-05 17:38:00,Evening Run,3,0,2815,3858,9.4824,7415,32.3,Run,0,0,0,0,51.5556,-0.0804512,
|
||||
2023-03-30 18:20:11,Evening Run,4,0,1773,2115,10.17,5009.2,22.3,Run,0,0,0,0,51.5554,-0.0805344,
|
||||
2022-12-22 09:49:00,Morning Run,1,0,1215,2044,10.7748,3636.3,4.8,Run,0,0,0,0,51.5584,-0.0622994,
|
||||
2022-11-30 17:23:40,Afternoon Run,1,0,1437,2440,9.8496,3931.7,9.1,Run,0,0,0,0,51.5581,-0.0623459,
|
||||
2022-11-14 17:41:33,Evening Run,2,0,1877,2549,10.6128,5532.8,15.6,Run,0,0,0,0,51.5583,-0.0613758,
|
||||
2022-10-11 18:07:25,Evening Run,2,1,1397,2949,10.8648,4216.5,14.3,Run,0,0,0,0,51.5584,-0.0626121,
|
||||
2022-09-29 18:59:54,Evening Run,2,0,2144,2616,10.0548,5988.1,23.2,Run,0,0,0,0,51.5583,-0.0622645,
|
||||
2022-09-28 18:11:48,Evening Run,1,0,1226,1560,10.854,3697,9.3,Run,0,0,0,0,51.5583,-0.0619869,
|
||||
2022-09-20 19:29:34,Evening Run,4,1,1824,2133,10.8792,5512.3,24.2,Run,0,0,0,0,51.5584,-0.062278,
|
||||
2022-09-15 18:43:11,Evening Run,2,1,2189,2613,10.0368,6102.8,16.3,Run,0,0,0,0,51.5584,-0.0620325,
|
||||
2022-09-13 17:57:06,Evening Run,2,2,1402,1800,10.2204,3979.7,14.1,Run,0,0,0,0,51.5582,-0.0622277,
|
||||
2022-08-27 20:17:22,Evening Run,2,0,820,1026,10.53,2398.7,48.3,Run,0,0,0,0,43.7697,4.12133,
|
||||
2022-08-22 19:20:29,Hooooooot,2,0,946,1088,9.5004,2496.2,47.4,Run,0,0,0,0,43.7696,4.12102,
|
||||
2022-08-03 17:02:43,Afternoon Run,3,0,2090,2494,9.5364,5537.4,62.7,Run,0,0,0,0,51.4709,-0.0849791,
|
||||
2022-08-02 17:49:17,Evening Run,3,0,1635,1805,9.5508,4338.3,47.5,Run,0,0,0,0,51.4705,-0.0852663,
|
||||
2022-07-22 18:33:59,Evening Run,3,1,1804,2400,10.8,5412.7,53,Run,0,0,0,0,51.4706,-0.0848732,
|
||||
2022-07-11 18:02:45,Morning Run,3,0,2496,60579,9.2844,6436.4,13,Run,0,0,0,0,52.7238,-1.79276,
|
||||
2022-06-27 18:48:14,Evening Run,2,0,1053,3829,11.0448,3230.5,7.2,Run,0,0,0,0,52.7237,-1.79294,
|
||||
2022-06-16 17:42:05,Afternoon Run,1,0,1016,1140,11.3076,3191.4,11,Run,0,0,0,0,48.1249,11.5498,
|
||||
2022-06-13 19:03:34,Evening Run,5,0,1516,1814,11.2968,4757.1,47.7,Run,0,0,0,0,48.1248,11.5498,
|
||||
2022-06-06 19:03:21,Evening Run,5,0,3325,4683,9.7164,8975.4,107.2,Run,0,0,0,0,48.1249,11.5498,
|
||||
2022-05-30 19:17:53,Evening Run,5,0,2103,2611,10.8252,6324.1,56.7,Run,0,0,0,0,48.1232,11.5259,
|
||||
2022-05-23 19:02:10,Evening Run,5,2,3248,5919,10.278,9271.4,68.8,Run,0,0,0,0,48.1187,11.5818,
|
||||
2022-05-18 20:48:40,Night Run,6,0,2301,8775,12.0816,7722.4,39.5,Run,0,0,0,0,48.1186,11.5817,
|
||||
2022-05-16 20:05:56,Evening Run,4,0,2432,2973,10.5012,7093.8,48,Run,0,0,0,0,48.1185,11.5817,
|
||||
2022-05-11 07:21:10,Morning Run,3,0,1587,2008,10.2636,4524.3,41.1,Run,0,0,0,0,48.1185,11.5817,
|
||||
2022-05-02 21:34:33,Night Run,3,0,1631,1689,11.0844,5021.8,8.3,Run,0,0,0,0,48.1524,11.5796,
|
||||
2022-04-21 08:53:11,Morning Run,4,4,2267,3068,9.36,5895,164.8,Run,0,0,0,0,23.3653,-110.189,
|
||||
2022-03-22 07:48:23,Morning Run,3,0,1439,4620,10.4616,4182.4,14.2,Run,0,0,0,0,48.1206,11.5581,
|
||||
2022-03-20 09:25:35,Morning Run,3,3,1435,1737,10.3032,4106.4,13,Run,0,0,0,0,48.1208,11.5587,
|
||||
2022-03-01 17:16:31,Afternoon Run,3,0,1959,2991,10.5624,5748.3,36.1,Run,0,0,0,0,51.5485,-0.110401,
|
||||
2022-02-24 18:34:14,Evening Run,5,3,3003,48607,8.6796,7239.9,48.8,Run,0,0,0,0,51.5485,-0.110477,
|
||||
2022-02-15 19:16:08,Evening Run,3,2,2636,3590,10.6344,7787.4,46.6,Run,0,0,0,0,51.5486,-0.110636,
|
||||
2022-02-11 18:41:39,Evening Run,4,0,1291,1707,10.098,3620.7,10,Run,0,0,0,0,52.7375,-1.74716,
|
||||
2022-02-09 18:18:54,Evening Run,5,0,2028,2325,10.6272,5985.7,6.6,Run,0,0,0,0,52.7236,-1.79297,
|
||||
2022-01-21 17:28:20,Afternoon Run,2,0,1833,3549,10.3968,5294.3,53.5,Run,0,0,0,0,50.8604,4.37734,
|
||||
2022-01-16 16:51:03,Afternoon Run,2,2,2073,2488,8.55,4922.7,42.4,Run,0,0,0,0,50.8602,4.37721,
|
||||
2022-01-03 18:58:52,Evening Run,4,0,3056,3308,10.566,8968.3,57.1,Run,0,0,0,0,43.7694,4.12095,
|
||||
2021-12-29 12:37:57,My first half marathon! (Phone died at 16k),8,4,5391,9744,11.0412,16535.8,71.4,Run,0,0,0,0,43.7703,4.1216,
|
||||
2021-12-22 18:43:56,Evening Run,4,2,1673,2030,9.4608,4396.7,17.6,Run,0,0,0,0,43.7758,4.16233,
|
||||
2021-12-10 18:16:18,Evening Run,4,0,2643,2814,10.8504,7965.4,36.2,Run,0,0,0,0,43.7694,4.12112,
|
||||
2021-12-04 19:05:27,Evening Run,4,0,2954,3577,10.242,8404.4,8.6,Run,0,0,0,0,51.4756,-0.108807,
|
||||
2021-11-29 18:06:28,Evening Run,4,0,3050,3517,9.8856,8375.7,15.4,Run,0,0,0,0,51.4754,-0.10877,
|
||||
2021-10-31 19:32:30,Evening Run,4,1,1936,2197,10.476,5633.7,2.6,Run,0,0,0,0,51.4756,-0.108841,
|
||||
2021-10-25 19:02:51,Evening Run,2,0,2024,2204,10.44,5869.8,12.8,Run,0,0,0,0,51.4755,-0.108554,
|
||||
2021-10-06 18:35:27,Evening Run,4,1,1817,2187,10.9908,5546.4,12,Run,0,0,0,0,51.4756,-0.108592,
|
||||
2021-09-16 08:44:34,Morning Run,5,0,2621,2782,9.6192,7004,6.6,Run,0,0,0,0,52.7238,-1.79313,
|
||||
2021-09-02 10:35:29,Morning Run,3,3,2395,3308,9.3204,6200.4,83.1,Run,0,0,0,0,55.7,14.1047,
|
||||
2021-08-23 19:38:24,Evening Run,3,3,2646,2832,9.972,7329.9,20.1,Run,0,0,0,0,52.5514,13.3504,
|
||||
2021-08-17 13:51:30,Afternoon Run,5,0,2868,3753,10.1124,8055.1,15.9,Run,0,0,0,0,52.5058,13.309,
|
||||
2021-08-10 18:52:03,"Running, walking, talking ",5,5,3043,5036,9.3456,7899.1,9.6,Run,0,0,0,0,52.506,13.309,
|
||||
2021-07-14 18:54:24,Evening Run,3,0,2281,2573,10.4724,6634.6,53.4,Run,0,0,0,0,48.14,11.5387,
|
||||
2021-07-08 18:35:03,Evening Run,4,0,2411,2832,10.638,7125.4,45.6,Run,0,0,0,0,48.1398,11.5388,
|
||||
2021-07-02 18:28:41,Evening Run,6,0,2757,3279,8.6976,6661,64.4,Run,0,0,0,0,48.1392,11.539,
|
||||
2021-06-29 17:51:37,Afternoon Run,6,0,3225,6333,10.7496,9629.1,89.5,Run,0,0,0,0,48.14,11.5382,
|
||||
2021-06-14 19:08:31,Tooooo hot,5,0,2287,2527,9.936,6313,61.5,Run,0,0,0,0,48.1271,11.5382,
|
||||
2021-06-08 18:55:54,Nice phone call and a run ,6,0,3666,3952,10.2708,10458.4,73,Run,0,0,0,0,48.1372,11.5402,
|
||||
2021-06-02 21:27:52,Night Run,2,0,1720,1883,12.2616,5858.2,16,Run,0,0,0,0,48.1398,11.5387,
|
||||
2021-05-31 18:47:27,Evening Run,6,0,3971,4434,9.9288,10951.5,87.6,Run,0,0,0,0,48.1399,11.539,
|
||||
2021-05-24 18:48:45,Evening Run,6,0,3425,3641,10.134,9640.2,58.5,Run,0,0,0,0,48.1398,11.5387,
|
||||
2021-05-17 19:30:07,Wiggly and hilly ,4,0,2450,3202,10.5876,7204.6,124.3,Run,0,0,0,0,43.7695,4.12127,
|
||||
2021-05-15 15:08:40,Afternoon Run,4,0,3818,4164,10.458,11089.6,68.2,Run,0,0,0,0,43.7699,4.12157,
|
||||
2021-05-13 13:03:53,Afternoon Run,3,3,1957,2059,11.1312,6051.1,26.1,Run,0,0,0,0,49.0193,2.08805,
|
||||
2021-05-03 17:09:06,Afternoon Run,6,0,3077,3142,10.5588,9024.9,71.5,Run,0,0,0,0,48.1398,11.5391,
|
||||
2021-04-16 17:49:34,Afternoon Run,6,0,2978,3676,10.1988,8437.3,57.8,Run,0,0,0,0,48.1388,11.5391,
|
||||
2021-04-08 09:27:07,Morning Run,6,0,2869,4730,9.9288,7913.1,53.7,Run,0,0,0,0,48.1338,11.5401,
|
||||
2021-03-23 19:10:18,Evening Run,4,2,3858,4168,10.6632,11428.8,64.8,Run,0,0,0,0,43.7694,4.12132,
|
||||
2021-03-22 19:10:15,Evening Run,2,0,1403,1435,10.8576,4232,42.6,Run,0,0,0,0,43.7693,4.12126,
|
||||
2021-03-15 19:31:28,Evening Run,4,0,2752,2849,10.0908,7714.4,30.5,Run,0,0,0,0,48.1394,11.5392,
|
||||
2021-03-08 19:39:43,Evening Run,3,0,2440,2528,10.4796,7103.7,43.5,Run,0,0,0,0,48.1401,11.5386,
|
||||
2021-03-05 08:45:33,Morning Run,3,0,2963,3441,10.1592,8361.1,45.5,Run,0,0,0,0,48.1395,11.5393,
|
||||
2021-02-03 20:06:33,Evening Run,6,0,2933,3042,11.0664,9016.7,53,Run,0,0,0,0,48.14,11.539,
|
||||
2021-01-26 16:47:44,Afternoon Run,3,3,2842,3068,11.1996,8842,26.2,Run,0,0,0,0,51.5051,-0.308281,
|
||||
2021-01-14 08:45:00,"Icy, windy and press-ups :(",7,1,3734,4112,10.8072,11210.8,73.5,Run,0,0,0,0,48.1393,11.539,
|
||||
2021-01-11 17:05:53,Gentle run on icy paths ,3,0,1829,1998,11.2644,5722.9,22.4,Run,0,0,0,0,48.1399,11.5381,
|
||||
2021-01-04 17:12:56,Afternoon Run,3,0,1367,1422,13.1976,5011.5,21.8,Run,0,0,0,0,48.1398,11.5391,
|
||||
2020-12-26 08:59:21,Blowing out the cobwebs...,6,6,3998,4534,10.2204,11350.6,203.8,Run,0,0,0,0,49.1418,9.10928,
|
||||
2020-12-11 09:19:03,"Gentle Run no pace feedback, 10 press-ups or 5 pull-ups every song change ",6,0,3502,4194,10.836,10541.3,80.1,Run,0,0,0,0,48.1375,11.5411,
|
||||
2020-12-03 09:56:32,Morning Run,6,0,3759,3876,10.4832,10946.5,68.8,Run,0,0,0,0,48.1374,11.5408,
|
||||
2020-11-28 18:12:26,Evening Run,6,0,3314,3541,11.4588,10547.8,82.6,Run,0,0,0,0,48.1372,11.5405,
|
||||
2020-11-15 15:42:04,Afternoon Run,6,0,2432,2488,12.3516,8344.1,57.5,Run,0,0,0,0,48.1372,11.5403,
|
||||
2020-11-10 19:25:49,Evening Run,3,0,1826,1890,12.2364,6206.5,41.8,Run,0,0,0,0,48.1373,11.5406,
|
||||
2020-11-06 17:55:46,Afternoon Run,6,6,2521,350731,9.7488,6828.1,70.7,Run,0,0,0,0,48.1373,11.5405,
|
||||
2020-10-31 15:02:00,Afternoon Run,5,0,4276,6000,11.322,13446.1,72.5,Run,0,0,0,0,48.1228,11.5883,
|
||||
2020-10-22 18:05:38,Evening Run,5,1,3694,4508,9.7776,10033.5,70.1,Run,0,0,0,0,48.1224,11.5883,
|
||||
2020-10-20 18:29:02,Evening Run,3,0,3520,3520,10.7604,10520.3,72.2,Run,0,0,0,0,48.1226,11.5886,
|
||||
2020-10-03 09:04:51,Morning Run,5,2,3815,4015,9.4284,9990.4,70.3,Run,0,0,0,0,48.1227,11.5882,
|
||||
2020-09-13 09:19:36,Morning Run,4,0,3778,4489,10.4796,10996.9,20.8,Run,0,0,0,0,48.1643,11.5838,
|
||||
2020-09-05 10:01:27,Morning Run,6,1,3983,4147,9.666,10695.9,22.3,Run,0,0,0,0,48.1643,11.5835,
|
||||
2020-09-02 10:29:53,Morning Run,2,0,1902,2055,10.3428,5465.1,14.8,Run,0,0,0,0,48.1642,11.5836,
|
||||
2020-08-14 20:09:25,Evening Run,2,2,1297,1394,11.7396,4229.6,39.2,Run,0,0,0,0,45.941,6.89233,
|
||||
2020-07-29 19:24:12,Evening Run,4,0,3546,4308,10.1628,10008.9,17.6,Run,0,0,0,0,52.7236,-1.79298,
|
||||
2020-07-27 18:00:22,Evening Run,4,0,3459,3936,10.8072,10382.3,27.5,Run,0,0,0,0,52.7236,-1.79319,
|
||||
2020-07-19 19:17:54,Evening Run,3,0,1771,1933,12.2364,6019.4,15.5,Run,0,0,0,0,52.7238,-1.79294,
|
||||
2020-07-16 20:53:24,6 press-ups per km,3,1,3368,3756,10.6992,10008.6,11.6,Run,0,0,0,0,52.7236,-1.79295,
|
||||
2020-07-14 19:31:23,6 press-ups per km,4,0,3397,3761,10.6236,10024,26,Run,0,0,0,0,52.7239,-1.79276,
|
||||
2020-07-13 18:03:30,Evening Run,4,0,4066,5571,10.4112,11759.5,17.4,Run,0,0,0,0,52.7236,-1.79261,
|
||||
2020-07-02 21:06:56,Night Run,6,2,4584,5831,10.4184,13267.8,30.6,Run,0,0,0,0,52.7235,-1.79278,
|
||||
2020-06-29 19:58:01,So windy ,5,0,3618,4135,10.512,10566.2,27.3,Run,0,0,0,0,52.7237,-1.79295,
|
||||
2020-06-25 21:49:16,Night Run,4,0,3601,4086,10.5336,10537.5,27.7,Run,0,0,0,0,52.7235,-1.79245,
|
||||
2020-06-20 19:35:38,Evening Run,3,1,2660,3502,10.0872,7453.3,15.4,Run,0,0,0,0,52.7234,-1.79207,
|
||||
2020-06-18 10:08:04,Easing back in ,4,0,1307,1783,11.1312,4040.8,10,Run,0,0,0,0,52.7234,-1.79257,
|
||||
2020-06-02 18:25:43,Evening Run,5,0,1876,1952,11.6388,6064.7,6.9,Run,0,0,0,0,52.7237,-1.79311,
|
||||
2020-05-25 19:32:18,Evening Run,4,0,3299,3573,10.944,10027.5,23.2,Run,0,0,0,0,52.7238,-1.79244,
|
||||
2020-05-22 20:29:09,So windy ,4,0,3331,3585,11.268,10427.6,26.1,Run,0,0,0,0,52.7235,-1.79285,
|
||||
2020-05-16 18:06:04,Evening Run,4,0,3160,3502,11.4696,10068.1,24.3,Run,0,0,0,0,52.7236,-1.7927,
|
||||
2020-05-11 19:41:00,Evening Run,4,0,3151,3331,12.0024,10505.9,25.9,Run,0,0,0,0,52.7236,-1.79296,
|
||||
2020-05-09 07:36:35,Morning Run,5,0,1928,2287,11.1096,5949.5,7.9,Run,0,0,0,0,52.7237,-1.79293,
|
||||
2020-05-04 18:18:46,Evening Run,4,1,2432,2765,10.7928,7291.1,24,Run,0,0,0,0,52.7236,-1.7929,
|
||||
2020-05-02 19:47:28,Evening Run,8,1,4868,4872,11.8512,16024.2,7.8,Run,0,0,0,0,52.7237,-1.79298,
|
||||
2020-04-30 18:16:34,Evening Run,4,0,3152,3223,11.952,10463.5,26.2,Run,0,0,0,0,52.7237,-1.79303,
|
||||
2020-04-28 19:19:44,Evening Run,6,0,2923,3142,12.4236,10087.5,7.4,Run,0,0,0,0,52.7231,-1.79232,
|
||||
2020-04-27 19:54:22,Faaaaast,4,0,3206,3707,11.7036,10424.3,26.4,Run,0,0,0,0,52.7236,-1.79292,
|
||||
2020-04-26 18:40:17,Evening Run,3,0,3200,3327,11.0592,9830.7,19,Run,0,0,0,0,52.7238,-1.79291,
|
||||
2020-04-25 08:54:20,Morning Run with John,4,0,3407,3661,11.0304,10438.8,26.2,Run,0,0,0,0,52.7239,-1.79291,
|
||||
2020-04-24 08:58:35,Morning Run,2,0,1961,2289,10.9404,5960.4,14,Run,0,0,0,0,52.7235,-1.79266,
|
||||
2020-04-23 08:07:33,Morning Run,7,2,3755,4342,10.5768,11031.7,11.1,Run,0,0,0,0,52.7237,-1.79315,
|
||||
2020-04-22 08:15:06,Morning Run,4,0,3645,4286,10.4976,10629.2,26.3,Run,0,0,0,0,52.7238,-1.79265,
|
||||
2020-04-15 08:19:59,Morning Run,5,1,2589,3123,11.2176,8068.3,13.2,Run,0,0,0,0,52.7236,-1.79276,
|
||||
2020-04-14 08:04:11,No dog!,3,0,2683,3252,10.3212,7691.3,19,Run,0,0,0,0,52.7239,-1.79267,
|
||||
2020-04-08 16:09:40,Afternoon Run,3,0,1683,2081,10.2024,4770,17.9,Run,0,0,0,0,52.7236,-1.79325,
|
||||
2020-04-07 08:03:23,Morning Run,2,0,1780,1939,10.242,5064.6,7.9,Run,0,0,0,0,52.7236,-1.79284,
|
||||
2020-04-01 08:29:55,Morning Run,4,0,1047,1354,10.6128,3086.5,8.5,Run,0,0,0,0,52.7237,-1.79346,
|
||||
2020-03-24 08:49:23,Old dog said “fuck off”,3,0,711,1869,10.368,2047.8,7.1,Run,0,0,0,0,52.7237,-1.79273,
|
||||
2020-03-23 09:45:23,Morning Run,3,0,2444,3102,10.0512,6824.6,21,Run,0,0,0,0,52.7237,-1.79292,
|
||||
2020-03-22 09:03:31,2nd run with dog ,3,0,1960,2380,9.2556,5038.9,13,Run,0,0,0,0,52.7236,-1.79295,
|
||||
2020-03-21 08:08:29,Morning Run,3,0,2243,2464,9.9684,6211.2,19.1,Run,0,0,0,0,52.7237,-1.79305,
|
||||
2020-03-18 09:53:50,Morning Run,3,0,2506,4499,10.242,7129.7,24.6,Run,0,0,0,0,51.4855,-0.099882,
|
||||
2020-01-16 07:46:20,Morning Run,2,0,1560,1751,10.6776,4626.7,0,Run,0,0,0,0,51.4854,-0.100159,
|
||||
2020-01-01 06:54:01,Morning Run,5,2,1332,1339,9.9324,3675.5,0,Run,0,0,0,0,51.509,-0.211662,
|
||||
2019-12-26 11:53:11,Lunch Run,4,2,1534,1623,10.17,4332.8,8.3,Run,0,0,0,0,52.724,-1.79266,
|
||||
2019-12-24 08:48:43,Floods floods floods ,4,3,3581,4199,10.8036,10745.4,36.2,Run,0,0,0,0,52.7241,-1.79235,
|
||||
2019-11-24 11:19:13,Slow before brunch ,3,0,3046,3460,9.756,8253.3,35.5,Run,0,0,0,0,48.1656,11.5786,
|
||||
2019-11-20 18:38:14,Evening Run,3,0,2465,2620,10.5696,7238.1,36.6,Run,0,0,0,0,48.1658,11.5788,
|
||||
2019-11-14 19:07:36,Evening Run,2,0,1683,1995,10.2924,4811.3,25.7,Run,0,0,0,0,48.1657,11.5791,
|
||||
2019-10-27 08:10:05,Morning Run,3,1,1832,1986,10.0296,5103.3,28,Run,0,0,0,0,48.1658,11.5786,
|
||||
2019-10-22 17:16:12,Trying to up the pace.,3,1,2635,2736,11.5416,8447.3,45.4,Run,0,0,0,0,48.1659,11.5786,
|
||||
2019-10-16 17:36:59,First run home ,13,13,6549,6827,9.9288,18064.5,92.7,Run,0,0,0,0,48.2666,11.6779,
|
||||
2019-09-28 07:37:43,Morning Run,12,8,6703,7407,10.4292,19415.7,103.6,Run,0,0,0,0,51.5022,-0.178004,
|
||||
2019-09-14 08:04:35,Morning Run,4,0,3320,3486,10.7172,9883.5,44.8,Run,0,0,0,0,51.5017,-0.178264,
|
||||
2019-09-08 07:29:47,Morning Run,3,0,6773,6856,9.612,18083.8,26.3,Run,0,0,0,0,51.4855,-0.100098,
|
||||
2019-08-27 08:05:54,Morning Run,2,2,1807,1995,9.9576,4998.2,62.5,Run,0,0,0,0,43.7695,4.12122,
|
||||
2019-08-01 19:06:10,Evening Run,4,0,2262,2410,10.4184,6547.2,8.6,Run,0,0,0,0,51.4855,-0.100036,
|
||||
2019-07-29 18:06:05,Evening Run,4,0,3083,3184,9.3456,8004.7,3.6,Run,0,0,0,0,51.4854,-0.100064,
|
||||
2019-07-27 19:17:40,Evening Run,3,0,3405,3405,10.6272,10051.1,8.8,Run,0,0,0,0,51.4855,-0.100043,
|
||||
2019-07-24 20:52:05,Evening Run,3,0,3763,3822,9.792,10234.3,5.4,Run,0,0,0,0,51.4855,-0.100164,
|
||||
2019-07-19 06:40:22,Morning Run,3,0,2484,4760,8.9892,6203.1,4.9,Run,0,0,0,0,51.4855,-0.099988,
|
||||
2019-07-16 07:32:00,Morning Run,2,0,1403,1563,10.9872,4282.4,4.2,Run,0,0,0,0,51.4854,-0.100072,
|
||||
2019-07-13 07:45:57,Morning Run,4,0,2597,3672,10.2708,7409.1,3,Run,0,0,0,0,51.4854,-0.100068,
|
||||
2019-07-07 20:33:12,Evening Run,3,0,2670,3068,9.4356,6996.9,3.7,Run,0,0,0,0,51.4852,-0.1,
|
||||
2019-07-04 07:57:04,Morning Run,4,1,2559,3220,9.8244,6984.3,5.9,Run,0,0,0,0,51.4854,-0.099969,
|
||||
2019-07-03 21:32:10,Night Run,2,0,1344,1370,11.4876,4288.4,4.2,Run,0,0,0,0,51.4853,-0.099947,
|
||||
2019-06-22 08:04:48,Morning Run,4,2,4129,7715,9.0252,10353.1,8.4,Run,0,0,0,0,51.4855,-0.100104,
|
||||
2019-06-18 18:06:07,Evening Run,3,1,1663,1663,11.466,5295.9,28.2,Run,0,0,0,0,51.4996,-0.179553,
|
||||
2019-06-06 17:09:56,Afternoon Run,4,4,2466,2801,10.7712,7377.4,42.2,Run,0,0,0,0,51.4997,-0.179654,
|
||||
2019-05-31 20:06:06,Evening Run,2,0,1725,1934,10.7244,5138.7,2.1,Run,0,0,0,0,51.4854,-0.100012,
|
||||
2019-04-29 17:19:41,Afternoon Run,2,2,2190,2427,9.7308,5919.6,5.3,Run,0,0,0,0,51.4841,-0.096963,
|
||||
2019-03-18 19:13:37,Evening Run,4,4,3113,3356,11.8512,10247.3,35.5,Run,0,0,0,0,51.4337,-0.20562,
|
||||
2019-02-27 19:22:14,Evening Run,5,2,3473,3700,10.7604,10381,22.4,Run,0,0,0,0,51.4723,-0.191091,
|
||||
2019-01-16 20:05:22,Evening Run,3,0,2502,2599,9.9036,6884,9.2,Run,0,0,0,0,51.4724,-0.191177,
|
||||
2018-12-11 21:15:42,Night Ride,3,1,3624,5868,9.3816,9442.5,9.4,Ride,0,0,0,0,51.4724,-0.191304,
|
||||
2018-11-14 18:52:29,Evening Run,2,2,1484,1582,9.6732,3987.8,9.1,Run,0,0,0,0,51.4724,-0.190851,
|
||||
2018-04-13 19:56:26,Evening Run,3,1,1659,1706,8.8236,4066.8,10.5,Run,0,0,0,0,52.2079,0.119915,
|
||||
2017-11-17 18:37:35,Evening Run,4,0,3336,3507,9.3816,8693.8,17.9,Run,0,0,0,0,52.2079,0.119746,
|
||||
2017-11-05 19:05:59,Evening Run,4,0,2267,2312,9.5328,6003.3,11.1,Run,0,0,0,0,52.2079,0.119759,
|
||||
2017-11-03 19:43:21,Evening Run,4,0,2871,2871,10.5084,8379.4,17.6,Run,0,0,0,0,52.208,0.119788,
|
||||
2017-09-17 18:43:40,Evening Run,3,3,3698,3968,9.558,9818.5,20.2,Run,0,0,0,0,52.7238,-1.79279,
|
||||
2017-05-03 17:28:45,Afternoon Run,4,0,4390,4469,9.54,11635.6,23.6,Run,0,0,0,0,52.2099,0.120085,
|
||||
2017-04-23 19:01:35,Evening Run,4,0,2899,2948,10.6128,8547.3,17.8,Run,0,0,0,0,52.208,0.119659,
|
||||
2017-03-06 18:35:40,Evening Run,4,3,2950,2972,11.3328,9287.6,12,Run,0,0,0,0,52.208,0.119585,
|
||||
2017-02-14 19:15:36,Evening Run,4,0,3166,3286,9.9144,8717.6,17.7,Run,0,0,0,0,52.2079,0.119709,
|
||||
2017-01-30 19:10:27,Evening Run,4,0,3059,3172,10.1196,8598,17.7,Run,0,0,0,0,52.2081,0.119615,
|
||||
2017-01-16 18:19:07,Evening Run,4,4,3216,3478,9.6588,8627.4,17.7,Run,0,0,0,0,52.2078,0.119573,
|
|
BIN
assets/blog/running/time_vs_distance.png
Normal file
After Width: | Height: | Size: 22 KiB |
1528
assets/blog/running/time_vs_distance.svg
Normal file
After Width: | Height: | Size: 62 KiB |
1998
assets/blog/running/time_vs_distance_plus_hist.svg
Normal file
After Width: | Height: | Size: 74 KiB |
10
assets/blog/running/vdot.csv
Normal file
@ -0,0 +1,10 @@
|
||||
VDOT, 1500m, mile, 3000, 2_mile, 5000, 10K, 15K, half_marathon, marathon
|
||||
30, 8:30, 9:11, 17:56, 19:19, 30:40, 63:46, 98:14, 2:21:04, 4:49:17
|
||||
31, 8:15, 8:55, 17:27, 18:48, 29:51, 62:04, 95:36, 2:17:21, 4:41:57
|
||||
32, 8:02, 8:41, 16:59, 18:18, 29:05, 60:26, 93:07, 2:13:49, 4:34:59
|
||||
33, 7:49, 8:27, 16:33, 17:50, 28:21, 58:54, 90:45, 2:10:27, 4:28:22
|
||||
34, 7:37, 8:14, 16:09, 17:24, 27:39, 57:26, 88:30, 2:07:16, 4:22:03
|
||||
35, 7:25, 8:01, 15:45, 16:58, 27:00, 56:03, 86:22, 2:04:13, 4:16:03
|
||||
36, 7:14, 7:49, 15:23, 16:34, 26:22, 54:44, 84:20, 2:01:19, 4:10:19
|
||||
37, 7:04, 7:38, 15:01, 16:11, 25:46, 53:29, 82:24, 1:58:34, 4:04:50
|
||||
38, 6:54, 7:27, 14:41, 15:49, 25:12, 52:17, 80:33, 1:55:55, 3:59:35
|
|
BIN
assets/blog/shelves/model/env.jpg
Normal file
After Width: | Height: | Size: 3.6 MiB |
BIN
assets/blog/shelves/model/shelves.glb
Normal file
BIN
assets/blog/shelves/model/shelves.png
Normal file
After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 892 KiB |
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
BIN
assets/blog/vector_magnet/aircraft_workshop_01_1k.hdr
Normal file
BIN
assets/blog/vector_magnet/section_view.png
Normal file
After Width: | Height: | Size: 624 KiB |
BIN
assets/blog/vector_magnet/test_section.glb
Normal file
BIN
assets/blog/vector_magnet/test_whole.glb
Normal file
BIN
assets/blog/vector_magnet/vector_magnet.glb
Normal file
BIN
assets/blog/vector_magnet/vector_magnet.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
assets/blog/vector_magnet/vector_magnet_section.glb
Normal file
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 112 KiB |
10
cv.html
@ -15,6 +15,14 @@ or have a look at my <a href="/blog">blog</a>. Click any item for a little more
|
||||
</div>
|
||||
|
||||
{% for entry in work %}
|
||||
{% if entry.image_markup %}
|
||||
{% assign image_markup = entry.image_markup %}
|
||||
{% else %}
|
||||
{% capture image_markup %}
|
||||
<img src="{{ entry.image }}" alt="{{ entry.alt }}">
|
||||
{% endcapture %}
|
||||
{% endif %}
|
||||
|
||||
<details class="{{topic.id}}">
|
||||
<summary class="cv"><time>{{entry.period}}</time>
|
||||
<div class = "title-column">
|
||||
@ -24,7 +32,7 @@ or have a look at my <a href="/blog">blog</a>. Click any item for a little more
|
||||
</summary>
|
||||
<div class = "details-container">
|
||||
<div class = "details-img">
|
||||
<a href="{{entry.url}}"><img src="{{entry.image}}" alt="{{entry.alt}}"></a>
|
||||
<a href="{{entry.url}}">{{ image_markup }}</a>
|
||||
</div>
|
||||
<div class = "details-text">
|
||||
{{entry.excerpt}}
|
||||
|
@ -1,4 +0,0 @@
|
||||
---
|
||||
title: Home
|
||||
redirect_to: /blog
|
||||
---
|
@ -1,7 +1,9 @@
|
||||
---
|
||||
layout: default
|
||||
title: Blog
|
||||
permalink: /blog/
|
||||
layout: default
|
||||
permalink: /
|
||||
redirect_from:
|
||||
- /blog/
|
||||
---
|
||||
{% for post in site.posts %}
|
||||
<article class="h-entry">
|
||||
@ -10,4 +12,4 @@ permalink: /blog/
|
||||
<summary class="p-summary">{{ post.excerpt | markdownify | remove: '<p>' | remove: '</p>' }}</summary>
|
||||
<figure {% if post.hide_image %} style="display:none;" {% endif %} class="blogroll"><img class="u-photo" src = "{{post.image}}"></figure>
|
||||
</article>
|
||||
{% endfor %}
|
||||
{% endfor %}
|