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 @@ -
+

{{ post.title }}

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 @@ + + + + + + + + + + + + Py<T> + + 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