diff --git a/Gemfile b/Gemfile
index 2aee9db..049ff09 100644
--- a/Gemfile
+++ b/Gemfile
@@ -8,7 +8,7 @@ group :jekyll_plugins do
gem 'jekyll-feed'
gem 'jekyll-redirect-from'
gem 'jekyll_flexible_include'
- gem "kramdown-syntax-coderay", "~> 1.0"
+ # gem "kramdown-syntax-coderay", "~> 1.0"
gem "jekyll-last-modified-at"
end
diff --git a/_config.yml b/_config.yml
index a1f514e..b150181 100644
--- a/_config.yml
+++ b/_config.yml
@@ -22,9 +22,13 @@ collections:
output: true
kramdown:
- syntax_highlighter: coderay
+ syntax_highlighter: rouge
syntax_highlighter_opts:
line_numbers: false
+ css_class: 'highlight'
+ span:
+ wrap: span
+
flexible_include:
die_on_flexible_include_error: false
@@ -36,7 +40,7 @@ plugins:
# - jekyll-feed
- jekyll-redirect-from
- flexible_include
- - kramdown-syntax-coderay
+ # - kramdown-syntax-coderay
- jekyll-last-modified-at
diff --git a/_includes/default_head_tags.html b/_includes/default_head_tags.html
index fe03894..2b366a3 100644
--- a/_includes/default_head_tags.html
+++ b/_includes/default_head_tags.html
@@ -26,6 +26,12 @@
+
+
+
+
+
+
{% if page.excerpt %}
diff --git a/_includes/post_summary.html b/_includes/post_summary.html
index 20d8d01..16784b9 100644
--- a/_includes/post_summary.html
+++ b/_includes/post_summary.html
@@ -21,7 +21,7 @@
-
+
diff --git a/_posts/2025-05-26-PyO3-smart-pointers.md b/_posts/2025-05-26-PyO3-smart-pointers.md
new file mode 100644
index 0000000..0dfd694
--- /dev/null
+++ b/_posts/2025-05-26-PyO3-smart-pointers.md
@@ -0,0 +1,39 @@
+---
+title: Bind, Borrow, Deref
+layout: post
+excerpt: Safely sharing objects between Python and Rust using PyO3
+draft: False
+
+assets: /assets/blog/pyo3-smart-pointers
+thumbnail: /assets/blog/pyo3-smart-pointers/thumbnail.svg
+social_image: /assets/blog/pyo3-smart-pointers/thumbnail.png
+alt:
+image_class: invertable
+---
+
+
+This article works for the rust package PyO3 `v0.25`, check the [migration guide](https://pyo3.rs/latest/migration.html) if you're working with a newer version as the project is changing quickly and I imagine the advent of free-threaded python will lead to some changes.
+
+
+If you're doing Rust <-> Python interfaces with PyO3 you'll have to work with PyO3's model of how owning python objects in rust. I'm still on my way to fully getting this but here are my notes on the topic so far.
+
+If `T`{:.language-rust} is a python type (in rust) then `Py`{:.language-rust} is the 'loosest' handle we can have on it. This is the only one you can store in a struct.
+
+The next level up is talking to the python interpreter. To do this you need to 'bind' to the interpreter. In pre-3.13 python, only one thread can get the GIL at a time and so holding the GIL means you have the exclusive right to talk to the Python interpreter. In free-threaded python, multiple threads can talk to the interpreter but they still need to `bind` to it.
+
+
+Why do we still have to bind in free-threaded python?
+My understanding is that, even in free-threaded python, we still a need a mechanism to keep track of which threads are currently bound to the interpreter because the python garbage collector can only run when no threads are bound to the interpreter. Presumably this means we need to be careful to give the GC a chance to run every now and then but I haven't looked deeply into this aspect.
+
+
+Binding requires a `py` which is a token in PyO3 that represents the python interpreter. Calling `let bound = value.bind(py)`{:.language-rust} converts our `Py`{:.language-rust} to a `Bound<'py, T>`{:.language-rust}.
+
+A `Bound<'py, T>`{:.language-rust} is basically a smart pointer like `Rc`{:.language-rust} or `Arc`{:.language-rust} but the reference counting and garbage collection of the value it points to is managed by the Python interpreter instead of Rust. To actually use the value T we need to borrow the `Bound<'py, T>`{:.language-rust} with `bound.borrow()` giving us a `PyRef<'py, T>`{:.language-rust}. This increments the reference count in Python world and gives us a `PyRef<'py, T>`{:.language-rust}. Note that in python there's no distinction between a mutable reference and an immutable one so once we have borrowed we can read or write.
+
+Finally `PyRef<'py, T>`{:.language-rust} implements the `Deref`{:.language-rust} trait so we can use the value as if it were a `T`{:.language-rust} while still having some useful context information about where we borrowed the `T`{:.language-rust} from.
+
+So in summary:
+
+1. Bind a `Py`{:.language-rust} to the GIL to get a `Bound<'py, T>`{:.language-rust}
+1. Borrow a `Bound<'py, T>`{:.language-rust} to get a `PyRef<'py, T>`{:.language-rust}
+1. Use a `PyRef<'py, T>`{:.language-rust} just like a `T`{:.language-rust}.
diff --git a/_projects/montys_website.md b/_projects/montys_website.md
new file mode 100644
index 0000000..54e0abf
--- /dev/null
+++ b/_projects/montys_website.md
@@ -0,0 +1,54 @@
+---
+title: A Portfolio Website
+layout: project
+excerpt: A portfolio website for a friend of mine who is an artist and musician. He did the art I just added CSS.
+permalink: /projects/montys_website
+assets: /assets/projects/montys_website
+date: 2023-11-12
+draft: True
+
+img:
+ alt:
+ class: invertable
+ src: /assets/projects/montys_website/thumbnail.svg
+
+social_image: /assets/projects/montys_website/bio_pic.png
+
+head: |
+
+---
+
+
+
+
+
+
+
+Click to zoom
+
+
+
+
+
+
+
+
+
diff --git a/_sass/article.scss b/_sass/article.scss
index 9f62dd3..9b0a6b6 100644
--- a/_sass/article.scss
+++ b/_sass/article.scss
@@ -41,4 +41,32 @@ span.icon {
span.icon svg {
width: .75em;
+}
+
+// aside details summary element
+//
+// Why do we still have to bind in free-threaded python?
+// My understanding is that, even in free-threaded python, we still a need a mechanism to keep track of which threads are currently bound to the interpreter because the python garbage collector can only run when no threads are bound to the interpreter. Presumably this means we would need to be careful to give the GC a chance to run every now and then but I haven't looked deeply into this aspect.
+//
+
+details.aside:open > summary {
+ margin-bottom: 0.5em;
+}
+
+details.aside {
+ summary {
+ display: flex;
+ justify-content: space-between;
+ font-weight: 700;
+ }
+
+
+ p {
+ margin: 0;
+ }
+ padding: 1em;
+ margin-top: 1em;
+ margin-bottom: 1em;
+ background-color: var(--theme-highlight-color-transparent);
+ border-radius: 10px;
}
\ No newline at end of file
diff --git a/_sass/base.scss b/_sass/base.scss
index 2ef21b8..daf10ef 100644
--- a/_sass/base.scss
+++ b/_sass/base.scss
@@ -13,20 +13,49 @@
@import "mastodon_timeline";
@import "night_mode_toggle";
@import "highlights";
-@import "tables"; // The syntax highlighting css
-// generated with rougify style bw > code_style_bw.scss
-// @import "code_style_bw";
-@import "code_style_github";
+@import "tables";
+
+@import "rouge_theme_github.scss";
@import "d2";
-* {
- box-sizing: border-box;
- font-family: $font_stack;
- text-rendering: geometricPrecision;
+@font-face {
+ font-family: "JetBrains Mono";
+ src: url("/assets/fonts/JetBrainsMono.woff2") format("woff2");
+ font-weight: normal;
+ font-style: normal;
+
}
+@font-face {
+ font-family: "Inter";
+ src: url("/assets/fonts/Inter.woff2") format("woff2");
+ // font-weight: normal;
+ // font-style: normal;
+}
+
+// @font-face {
+// font-family: "Inter";
+// src: url("/assets/fonts/Inter.woff2") format("woff2");
+// font-weight: normal;
+// font-style: italic;
+// font-variation-settings: "ital" 1;
+// font-synthesis: none;
+// }
+
+@font-face {
+ font-family: "Space Grotesk";
+ src: url('/assets/fonts/SpaceGrotesk.woff2') format('woff2');
+ font-weight: normal;
+ font-style: normal;
+}
+
+
:root {
+ --body-font: 'Inter', 'IBM Plex Sans', sans-serif;
+ --title-font: Impact, Haettenschweiler, "Franklin Gothic Bold", Charcoal, "Helvetica Inserat", "Bitstream Vera Sans Bold", "Arial Black", "sans serif", HelveticaNeue-CondensedBlack;
+ --mono-font: "JetBrains Mono", "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace;
+
--theme-text-color: #222;
--theme-bg-color: #fcfcfc;
--theme-model-line-color: #222;
@@ -34,7 +63,7 @@
--theme-subtle-outline: oklch(90% 0 50);
--theme-subtle-background: rgba(128, 128, 128, 0.05);
--theme-highlight-color: hsl(338, 75%, 60%);
- --theme-highlight-color-transparent: hsla(338, 75%, 60%, 33%);
+ --theme-highlight-color-transparent: hsla(338, 75%, 60%, 20%);
--theme-subtle-text-color: #606984;
--night-mode-fade-time: 0.5s;
@@ -71,9 +100,23 @@
--border-color: var(--color-dark-alpha);
}
+* {
+ box-sizing: border-box;
+ text-rendering: geometricPrecision;
+}
+
+h2 {
+ font-family: var(--body-font);
+ font-variation-settings: "wght" 700;
+}
+
html {
width: 100vw;
scroll-behavior: smooth;
+ font-family: var(--body-font);
+ font-size: 0.9em;
+
+
}
body {
@@ -121,6 +164,22 @@ main {
}
}
+// All code both inline and block
+code {
+ font-family: var(--mono-font);
+ font-size: 0.9rem;
+}
+
+// Inline blocks
+:not(pre) > code {
+}
+
+
+// Block code
+pre.highlight code {
+}
+
+
hr.heading {
width: 100%;
@@ -164,6 +223,7 @@ section.title-icon-container {
section.byline-time {
display: flex;
+ justify-content: space-between;
time {
text-align: right;
@include time-text;
@@ -184,7 +244,7 @@ section.byline {
p,
figcaption {
font-size: 1em;
- line-height: 1.3em;
+ line-height: 1.4em;
}
main :is(p, h1, h2, h3, h4, h5, h6) {
@@ -293,18 +353,17 @@ figure.multiple {
}
section.note {
- a {
- color: purple;
- }
+
p {
margin: 0;
}
padding: 1em;
- margin-top: 1em;
- margin-bottom: 1em;
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
background-color: var(--theme-highlight-color-transparent);
border-radius: 10px;
- color: black;
}
section.center {
@@ -314,15 +373,19 @@ section.center {
margin-bottom: 1em;
}
-div.CodeRay {
+
+
+div.highlighter-rouge {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono,
Courier New, Courier, monospace;
font-size: 12px;
line-height: 1.4;
- padding: 1em;
- background-color: var(--theme-subtle-background);
border-radius: 5px;
+ div.highlight {
+ padding: 1em;
+ }
+
// Override background colors from the theme.
span {
background-color: unset !important;
@@ -388,11 +451,13 @@ body:not(.has-wc) .has-wc {
}
// Make code a bit smaller so it doesn't wrap as much
- div.CodeRay {
+ pre.highlight code {
font-size: 0.8rem;
}
}
+
+
.hidden {
display: none;
}
@@ -430,11 +495,15 @@ svg {
--button-color: var(--color-dark);
--border-color: var(--color-light-alpha);
+
+
+
body {
--theme-text-color: #fcfcfc;
--theme-bg-color: #222;
--theme-subtle-outline: oklch(50% 0 50);
--theme-subtle-background: rgba(255, 255, 255, 0.05);
+ --theme-highlight-color-transparent: hsl(338, 85%, 21%);
}
// Two main image classes are "invertable" i.e look good inverted
@@ -463,11 +532,13 @@ svg {
:root:not([data-user-color-scheme]) {
@include night-mode;
+ // @import "rouge_theme_gruvbox.dark.scss";
}
}
[data-user-color-scheme="dark"] {
@include night-mode;
+ @import "rouge_theme_gruvbox.dark.scss";
}
@media (prefers-reduced-motion: no-preference) {
diff --git a/_sass/code_style_bw.scss b/_sass/code_style_bw.scss
deleted file mode 100644
index c823dac..0000000
--- a/_sass/code_style_bw.scss
+++ /dev/null
@@ -1,66 +0,0 @@
-.highlight table td { padding: 5px; }
-.highlight table pre { margin: 0; }
-.highlight, .highlight .w {
- color: #000000;
- background-color: #ffffff;
-}
-.highlight .c, .highlight .ch, .highlight .cd, .highlight .cm, .highlight .cpf, .highlight .c1, .highlight .cs {
- font-style: italic;
-}
-.highlight .cp {
-}
-.highlight .k, .highlight .kc, .highlight .kd, .highlight .kn, .highlight .kr, .highlight .kv {
- font-weight: bold;
-}
-.highlight .kp {
-}
-.highlight .kt {
-}
-.highlight .o, .highlight .ow {
- font-weight: bold;
-}
-.highlight .nc {
- font-weight: bold;
-}
-.highlight .nn {
- font-weight: bold;
-}
-.highlight .ne {
- font-weight: bold;
-}
-.highlight .ni {
- font-weight: bold;
-}
-.highlight .nt {
- font-weight: bold;
-}
-.highlight .s, .highlight .sb, .highlight .sc, .highlight .dl, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .sr, .highlight .s1, .highlight .ss {
- font-style: italic;
-}
-.highlight .sa {
- font-weight: bold;
-}
-.highlight .si {
- font-weight: bold;
-}
-.highlight .se {
- font-weight: bold;
-}
-.highlight .gh {
- font-weight: bold;
-}
-.highlight .gu {
- font-weight: bold;
-}
-.highlight .ge {
- font-style: italic;
-}
-.highlight .gs {
- font-weight: bold;
-}
-.highlight .gp {
- font-weight: bold;
-}
-.highlight .err {
- color: #FF0000;
-}
diff --git a/_sass/code_style_github.scss b/_sass/code_style_github.scss
deleted file mode 100644
index 6ede4b5..0000000
--- a/_sass/code_style_github.scss
+++ /dev/null
@@ -1,233 +0,0 @@
-.highlight {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono,
- Courier New, Courier, monospace;
- font-size: 12px;
- line-height: 1.4;
-}
-
-.highlight table td {
- padding: 5px;
-}
-.highlight table pre {
- margin: 0;
-}
-.highlight .cm {
- color: #999988;
- font-style: italic;
-}
-.highlight .cp {
- color: #999999;
- font-weight: bold;
-}
-.highlight .c1 {
- color: #999988;
- font-style: italic;
-}
-.highlight .cs {
- color: #999999;
- font-weight: bold;
- font-style: italic;
-}
-.highlight .c,
-.highlight .ch,
-.highlight .cd,
-.highlight .cpf {
- color: #999988;
- font-style: italic;
-}
-.highlight .err {
- color: #a61717;
- background-color: #e3d2d2;
-}
-.highlight .gd {
- color: #000000;
- background-color: #ffdddd;
-}
-.highlight .ge {
- color: #000000;
- font-style: italic;
-}
-.highlight .gr {
- color: #aa0000;
-}
-.highlight .gh {
- color: #999999;
-}
-.highlight .gi {
- color: #000000;
- background-color: #ddffdd;
-}
-.highlight .go {
- color: #888888;
-}
-.highlight .gp {
- color: #555555;
-}
-.highlight .gs {
- font-weight: bold;
-}
-.highlight .gu {
- color: #aaaaaa;
-}
-.highlight .gt {
- color: #aa0000;
-}
-.highlight .kc {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kd {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kn {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kp {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kr {
- color: #000000;
- font-weight: bold;
-}
-.highlight .kt {
- color: #445588;
- font-weight: bold;
-}
-.highlight .k,
-.highlight .kv {
- color: #000000;
- font-weight: bold;
-}
-.highlight .mf {
- color: #009999;
-}
-.highlight .mh {
- color: #009999;
-}
-.highlight .il {
- color: #009999;
-}
-.highlight .mi {
- color: #009999;
-}
-.highlight .mo {
- color: #009999;
-}
-.highlight .m,
-.highlight .mb,
-.highlight .mx {
- color: #009999;
-}
-.highlight .sa {
- color: #000000;
- font-weight: bold;
-}
-.highlight .sb {
- color: #d14;
-}
-.highlight .sc {
- color: #d14;
-}
-.highlight .sd {
- color: #d14;
-}
-.highlight .s2 {
- color: #d14;
-}
-.highlight .se {
- color: #d14;
-}
-.highlight .sh {
- color: #d14;
-}
-.highlight .si {
- color: #d14;
-}
-.highlight .sx {
- color: #d14;
-}
-.highlight .sr {
- color: #009926;
-}
-.highlight .s1 {
- color: #d14;
-}
-.highlight .ss {
- color: #990073;
-}
-.highlight .s,
-.highlight .dl {
- color: #d14;
-}
-.highlight .na {
- color: #008080;
-}
-.highlight .bp {
- color: #999999;
-}
-.highlight .nb {
- color: #0086b3;
-}
-.highlight .nc {
- color: #445588;
- font-weight: bold;
-}
-.highlight .no {
- color: #008080;
-}
-.highlight .nd {
- color: #3c5d5d;
- font-weight: bold;
-}
-.highlight .ni {
- color: #800080;
-}
-.highlight .ne {
- color: #990000;
- font-weight: bold;
-}
-.highlight .nf,
-.highlight .fm {
- color: #990000;
- font-weight: bold;
-}
-.highlight .nl {
- color: #990000;
- font-weight: bold;
-}
-.highlight .nn {
- color: #555555;
-}
-.highlight .nt {
- color: #000080;
-}
-.highlight .vc {
- color: #008080;
-}
-.highlight .vg {
- color: #008080;
-}
-.highlight .vi {
- color: #008080;
-}
-.highlight .nv,
-.highlight .vm {
- color: #008080;
-}
-.highlight .ow {
- color: #000000;
- font-weight: bold;
-}
-.highlight .o {
- color: #000000;
- font-weight: bold;
-}
-.highlight .w {
- color: #bbbbbb;
-}
-.highlight {
- background-color: #f8f8f8;
-}
diff --git a/_sass/header.scss b/_sass/header.scss
index 0d68647..c0cd468 100644
--- a/_sass/header.scss
+++ b/_sass/header.scss
@@ -44,7 +44,7 @@ header {
h1,
h2 {
- font-family: $title_font_stack;
+ font-family: var(--title-font);
}
a {
diff --git a/_sass/highlights.scss b/_sass/highlights.scss
index ebb6fd0..7249e50 100644
--- a/_sass/highlights.scss
+++ b/_sass/highlights.scss
@@ -25,3 +25,7 @@ section.highlights {
font-size: 1.25rem;
}
}
+
+section.transition-container {
+ width: 100%;
+}
\ No newline at end of file
diff --git a/_sass/projects.scss b/_sass/projects.scss
index 67a2853..5b8dc81 100644
--- a/_sass/projects.scss
+++ b/_sass/projects.scss
@@ -31,6 +31,8 @@ article.project {
}
section.header {
+ width: 100%;
+
h1 {
font-size: clamp(20px, 20px * 100vw / 300px, 25px);
}
diff --git a/_sass/rouge_theme_github.scss b/_sass/rouge_theme_github.scss
new file mode 100644
index 0000000..042c344
--- /dev/null
+++ b/_sass/rouge_theme_github.scss
@@ -0,0 +1,233 @@
+.highlighter-rouge {
+ background-color: var(--theme-subtle-background);
+}
+
+code.highlighter-rouge {
+ padding-right: 0.3em;
+ padding-left: 0.3em;
+ border-radius: 0.3em;
+}
+
+.highlight,
+.highlighter-rouge {
+ table td {
+ padding: 5px;
+ }
+ table pre {
+ margin: 0;
+ }
+ .cm {
+ color: #999988;
+ font-style: italic;
+ }
+ .cp {
+ color: #999999;
+ font-weight: bold;
+ }
+ .c1 {
+ color: #999988;
+ font-style: italic;
+ }
+ .cs {
+ color: #999999;
+ font-weight: bold;
+ font-style: italic;
+ }
+ .c,
+ .ch,
+ .cd,
+ .cpf {
+ color: #999988;
+ font-style: italic;
+ }
+ .err {
+ color: #a61717;
+ // background-color: unset;
+ }
+ .gd {
+ color: #000000;
+ background-color: #ffdddd;
+ }
+ .ge {
+ color: #000000;
+ font-style: italic;
+ }
+ .gr {
+ color: #aa0000;
+ }
+ .gh {
+ color: #999999;
+ }
+ .gi {
+ color: #000000;
+ background-color: #ddffdd;
+ }
+ .go {
+ color: #888888;
+ }
+ .gp {
+ color: #555555;
+ }
+ .gs {
+ font-weight: bold;
+ }
+ .gu {
+ color: #aaaaaa;
+ }
+ .gt {
+ color: #aa0000;
+ }
+ .kc {
+ color: #000000;
+ font-weight: bold;
+ }
+ .kd {
+ color: #000000;
+ font-weight: bold;
+ }
+ .kn {
+ color: #000000;
+ font-weight: bold;
+ }
+ .kp {
+ color: #000000;
+ font-weight: bold;
+ }
+ .kr {
+ color: #000000;
+ font-weight: bold;
+ }
+ .kt {
+ color: #445588;
+ font-weight: bold;
+ }
+ .k,
+ .kv {
+ color: #000000;
+ font-weight: bold;
+ }
+ .mf {
+ color: #009999;
+ }
+ .mh {
+ color: #009999;
+ }
+ .il {
+ color: #009999;
+ }
+ .mi {
+ color: #009999;
+ }
+ .mo {
+ color: #009999;
+ }
+ .m,
+ .mb,
+ .mx {
+ color: #009999;
+ }
+ .sb {
+ color: #d14;
+ }
+ .sc {
+ color: #d14;
+ }
+ .sd {
+ color: #d14;
+ }
+ .s2 {
+ color: #d14;
+ }
+ .se {
+ color: #d14;
+ }
+ .sh {
+ color: #d14;
+ }
+ .si {
+ color: #d14;
+ }
+ .sx {
+ color: #d14;
+ }
+ .sr {
+ color: #009926;
+ }
+ .s1 {
+ color: #d14;
+ }
+ .ss {
+ color: #990073;
+ }
+ .s,
+ .sa,
+ .dl {
+ color: #d14;
+ }
+ .na {
+ color: #008080;
+ }
+ .bp {
+ color: #999999;
+ }
+ .nb {
+ color: #0086b3;
+ }
+ .nc {
+ color: #445588;
+ font-weight: bold;
+ }
+ .no {
+ color: #008080;
+ }
+ .nd {
+ color: #3c5d5d;
+ font-weight: bold;
+ }
+ .ni {
+ color: #800080;
+ }
+ .ne {
+ color: #990000;
+ font-weight: bold;
+ }
+ .nf,
+ .fm {
+ color: #990000;
+ font-weight: bold;
+ }
+ .nl {
+ color: #990000;
+ font-weight: bold;
+ }
+ .nn {
+ color: #555555;
+ }
+ .nt {
+ color: #000080;
+ }
+ .vc {
+ color: #008080;
+ }
+ .vg {
+ color: #008080;
+ }
+ .vi {
+ color: #008080;
+ }
+ .nv,
+ .vm {
+ color: #008080;
+ }
+ .ow {
+ color: #000000;
+ font-weight: bold;
+ }
+ .o {
+ color: #000000;
+ font-weight: bold;
+ }
+ .w {
+ color: #bbbbbb;
+ }
+}
diff --git a/_sass/rouge_theme_gruvbox.dark.scss b/_sass/rouge_theme_gruvbox.dark.scss
new file mode 100644
index 0000000..8ce68bc
--- /dev/null
+++ b/_sass/rouge_theme_gruvbox.dark.scss
@@ -0,0 +1,123 @@
+.highlight,
+.highlighter-rouge {
+ table td {
+ padding: 5px;
+ }
+ table pre {
+ margin: 0;
+ }
+ .highlight,
+ .w {
+ color: #fbf1c7;
+ background-color: unset;
+ }
+ .err {
+ color: #fb4934;
+ background-color: #282828;
+ font-weight: bold;
+ }
+ .c,
+ .ch,
+ .cd,
+ .cm,
+ .cpf,
+ .c1,
+ .cs {
+ color: #928374;
+ font-style: italic;
+ }
+ .cp {
+ color: #8ec07c;
+ }
+ .nt {
+ color: #fb4934;
+ }
+ .n {
+ color: #fbf1c7;
+ }
+ .o,
+ .ow {
+ color: #fbf1c7;
+ }
+ .p,
+ .pi {
+ color: #fbf1c7;
+ }
+ .gi {
+ color: #b8bb26;
+ background-color: #282828;
+ }
+ .gd {
+ color: #fb4934;
+ background-color: #282828;
+ }
+ .gh {
+ color: #b8bb26;
+ font-weight: bold;
+ }
+ .k,
+ .kn,
+ .kp,
+ .kr,
+ .kv {
+ color: #fb4934;
+ }
+ .kc {
+ color: #d3869b;
+ }
+ .kt {
+ color: #fabd2f;
+ }
+ .kd {
+ color: #fe8019;
+ }
+ .s,
+ .sa,
+ .sb,
+ .sc,
+ .dl,
+ .sd,
+ .s2,
+ .sh,
+ .sx,
+ .s1 {
+ color: #b8bb26;
+ font-style: italic;
+ }
+ .si {
+ color: #b8bb26;
+ font-style: italic;
+ }
+ .sr {
+ color: #b8bb26;
+ font-style: italic;
+ }
+ .se {
+ color: #fe8019;
+ }
+ .nn {
+ color: #8ec07c;
+ }
+ .nc {
+ color: #8ec07c;
+ }
+ .no {
+ color: #d3869b;
+ }
+ .na {
+ color: #b8bb26;
+ }
+ .m,
+ .mb,
+ .mf,
+ .mh,
+ .mi,
+ .il,
+ .mo,
+ .mx {
+ color: #d3869b;
+ }
+ .ss {
+ color: #83a598;
+ }
+}
diff --git a/assets/blog/pyo3-smart-pointers/thumbnail.png b/assets/blog/pyo3-smart-pointers/thumbnail.png
new file mode 100644
index 0000000..1f66672
Binary files /dev/null and b/assets/blog/pyo3-smart-pointers/thumbnail.png differ
diff --git a/assets/blog/pyo3-smart-pointers/thumbnail.svg b/assets/blog/pyo3-smart-pointers/thumbnail.svg
new file mode 100644
index 0000000..454fef6
--- /dev/null
+++ b/assets/blog/pyo3-smart-pointers/thumbnail.svg
@@ -0,0 +1,75 @@
+
+
+
+
diff --git a/assets/fonts/Inter-Italic-VariableFont_opsz,wght.ttf b/assets/fonts/Inter-Italic-VariableFont_opsz,wght.ttf
new file mode 100644
index 0000000..43ed4f5
Binary files /dev/null and b/assets/fonts/Inter-Italic-VariableFont_opsz,wght.ttf differ
diff --git a/assets/fonts/Inter-VariableFont_opsz,wght.ttf b/assets/fonts/Inter-VariableFont_opsz,wght.ttf
new file mode 100644
index 0000000..e31b51e
Binary files /dev/null and b/assets/fonts/Inter-VariableFont_opsz,wght.ttf differ
diff --git a/assets/fonts/Inter.woff2 b/assets/fonts/Inter.woff2
new file mode 100644
index 0000000..2bcd222
Binary files /dev/null and b/assets/fonts/Inter.woff2 differ
diff --git a/assets/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf b/assets/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf
new file mode 100644
index 0000000..994761f
Binary files /dev/null and b/assets/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf differ
diff --git a/assets/fonts/JetBrainsMono-VariableFont_wght.ttf b/assets/fonts/JetBrainsMono-VariableFont_wght.ttf
new file mode 100644
index 0000000..1b3d7f2
Binary files /dev/null and b/assets/fonts/JetBrainsMono-VariableFont_wght.ttf differ
diff --git a/assets/fonts/JetBrainsMono.woff2 b/assets/fonts/JetBrainsMono.woff2
new file mode 100644
index 0000000..9afa76b
Binary files /dev/null and b/assets/fonts/JetBrainsMono.woff2 differ
diff --git a/assets/fonts/SpaceGrotesk-VariableFont_wght.ttf b/assets/fonts/SpaceGrotesk-VariableFont_wght.ttf
new file mode 100644
index 0000000..2c6cc59
Binary files /dev/null and b/assets/fonts/SpaceGrotesk-VariableFont_wght.ttf differ
diff --git a/assets/fonts/SpaceGrotesk.woff2 b/assets/fonts/SpaceGrotesk.woff2
new file mode 100644
index 0000000..e235b0d
Binary files /dev/null and b/assets/fonts/SpaceGrotesk.woff2 differ
diff --git a/assets/projects/montys_website/bio_page.png b/assets/projects/montys_website/bio_page.png
new file mode 100644
index 0000000..1e2e633
Binary files /dev/null and b/assets/projects/montys_website/bio_page.png differ
diff --git a/assets/projects/montys_website/bio_pic.png b/assets/projects/montys_website/bio_pic.png
new file mode 100644
index 0000000..ea3c330
Binary files /dev/null and b/assets/projects/montys_website/bio_pic.png differ
diff --git a/assets/projects/montys_website/map_page.png b/assets/projects/montys_website/map_page.png
new file mode 100644
index 0000000..8379363
Binary files /dev/null and b/assets/projects/montys_website/map_page.png differ
diff --git a/assets/projects/montys_website/music_page.png b/assets/projects/montys_website/music_page.png
new file mode 100644
index 0000000..a3ca82a
Binary files /dev/null and b/assets/projects/montys_website/music_page.png differ
diff --git a/assets/projects/montys_website/test.glb b/assets/projects/montys_website/test.glb
new file mode 100644
index 0000000..3f3cc7b
Binary files /dev/null and b/assets/projects/montys_website/test.glb differ
diff --git a/assets/projects/montys_website/test2.glb b/assets/projects/montys_website/test2.glb
new file mode 100644
index 0000000..2f87e7f
Binary files /dev/null and b/assets/projects/montys_website/test2.glb differ
diff --git a/assets/projects/montys_website/test3.glb b/assets/projects/montys_website/test3.glb
new file mode 100644
index 0000000..2f87e7f
Binary files /dev/null and b/assets/projects/montys_website/test3.glb differ
diff --git a/assets/projects/montys_website/thumbnail.svg b/assets/projects/montys_website/thumbnail.svg
new file mode 100644
index 0000000..1151d4d
--- /dev/null
+++ b/assets/projects/montys_website/thumbnail.svg
@@ -0,0 +1,49 @@
+
+
+
+
diff --git a/project_ideas.md b/project_ideas.md
index 21f18fe..e875042 100644
--- a/project_ideas.md
+++ b/project_ideas.md
@@ -9,6 +9,8 @@ mathjax: false
# Project Ideas
+* Take on board some ideas from https://plainvanillaweb.com/index.html
+
* get https://www.feather.art/ and try out the line rendering for nice 3D annotations
* small telegram/whatsapp server that you can forward an audio message to and get a transcription