v2
@@ -0,0 +1 @@
|
|||||||
|
debug/
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
+++
|
|
||||||
title = "About"
|
|
||||||
template = "about.html"
|
|
||||||
date = "2010-01-01"
|
|
||||||
|
|
||||||
[taxonomies]
|
|
||||||
type = ["page"]
|
|
||||||
+++
|
|
||||||
|
|
||||||
# About
|
|
||||||
|
|
||||||
todo
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
+++
|
|
||||||
title = "discord bot"
|
|
||||||
+++
|
|
||||||
|
|
||||||
# todo
|
|
||||||
everything
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
+++
|
|
||||||
title = "todo"
|
|
||||||
+++
|
|
||||||
|
|
||||||
Compare k8s go performance on a 1 cpu when specifying the
|
|
||||||
env variable GOMAXPROCS and GOMAXMEMORY (or something like that)
|
|
||||||
using limits.cpu and limits.memory.
|
|
||||||
|
|
||||||
Should be night and day.
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
+++
|
|
||||||
title = "configure endeavouros"
|
|
||||||
+++
|
|
||||||
|
|
||||||
All configs, files to edit for commong things like
|
|
||||||
configure volume change, keyboard, luminosity change, mouse / trackpad behaviour, etc.
|
|
||||||
|
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
+++
|
||||||
|
title = "Brice Bernard - Books"
|
||||||
|
template = "singlepage.html"
|
||||||
|
date = "2010-01-01"
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
type = ["page"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
<div class="main">
|
||||||
|
<section class="best year section">
|
||||||
|
<h1 class="subtitle">My favorite books</h1>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/books/remembrance.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="remembrance of eath's past - three body problem" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://literal.club/book/cixin-liu-remembrance-of-earths-past-05a69" target="_blank">Remembrance of Earth's Past</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Liu Cixin</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2008</p>
|
||||||
|
<p>Science-Fiction</p>
|
||||||
|
<p>Epic</p>
|
||||||
|
<p>Grandiose</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>After a spate of apparent suicides among elite scientists, Beijing police ask nanotech engineer Wang Miao to infiltrate a secretive cabal that styles itself the Frontiers of Science. During the course of his investigation, Wang is inducted into a mysterious online game that immerses him in a virtual world ruled by the intractable and unpredictable interaction of its three suns. This is the Three-Body Problem and it is the key to everything. The key to humanity's place in the cosmos and the key to the extinction-level threat it now faces.</i></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/books/tapischeveux.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="the carpet makers" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://literal.club/book/the-carpet-makers-3qdyg" target="_blank">The Carpet Makers</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Andrea Eschbach</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2013</p>
|
||||||
|
<p>Science-Fiction</p>
|
||||||
|
<p>Adventure</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>Since the time of pre-history, carpetmakers tie intricate knots to form carpets for the court of the Emperor. These carpets are made from the hairs of wives and daughters; they are so detailed and fragile that each carpetmaker finishes only one single carpet in his entire lifetime. This art descends from father to son, since the beginning of time itself. But one day the empire of the God Emperor vanishes, and strangers begin to arrive from the stars to follow the trace of the hair carpets. What these strangers discover is beyond all belief, more than anything they could have ever imagined...</i></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/books/thestand.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="the stand" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://literal.club/book/stephen-king-the-stand-yumjf" target="_blank">The Stand</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Stephen King</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>1978</p>
|
||||||
|
<p>Post-Apocalyptic</p>
|
||||||
|
<p>Dark Fantasy</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>First came the days of the plague. Then came the dreams. Dark dreams that warned of the coming of the dark man. The apostate of death, his worn-down boot heels tramping the night roads. The warlord of the charnel house and Prince of Evil. His time is at hand. His empire grows in the west and the Apocalypse looms.</i></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
@@ -1,15 +1,24 @@
|
|||||||
+++
|
+++
|
||||||
title = "Contact"
|
title = "Brice Bernard - Contact"
|
||||||
template = "about.html"
|
template = "singlepage.html"
|
||||||
date = "2010-01-01"
|
date = "2010-01-01"
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
type = ["page"]
|
type = ["page"]
|
||||||
+++
|
+++
|
||||||
|
|
||||||
# Contact
|
<div class="main">
|
||||||
|
<p class="subtitle">contact</p>
|
||||||
You can contact me on:
|
<p>Happy to discuss software, books, movies or almost anything.</p>
|
||||||
- [git](https://git.bricebernard.dev/mimu)
|
<p>Available for interesting missions and ambitious projects.</p>
|
||||||
- by email: <span class="contact">bricecontact</span><span class="contact-middle">[at]</span><span class="contact">fastmail.com</span>
|
<p>I'm not on any social media but you can email me at <a href="mailto:bricecontact@fastmail.com">bricecontact@fastmail.com</a>.</p>
|
||||||
|
<div class="elsewhere">
|
||||||
|
<p class="subtitle">elsewhere</p>
|
||||||
|
<div class="links">
|
||||||
|
<a href="https://git.bricebernard.dev/Mimu" target="_blank" rel="noopener noreferrer">Gitea</a><br>
|
||||||
|
<a href="https://www.linkedin.com/in/brice-bernard-05130518/" target="_blank" rel="noopener noreferrer">Linkedin</a><br>
|
||||||
|
<a href="https://letterboxd.com/Mimuuu/" target="_blank" rel="noopener noreferrer">Letterboxd</a><br>
|
||||||
|
<a href="https://literal.club/mimuuu" target="_blank" rel="noopener noreferrer">Literal</a><br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,179 @@
|
|||||||
|
+++
|
||||||
|
title = "Brice Bernard - Films"
|
||||||
|
template = "singlepage.html"
|
||||||
|
date = "2010-01-01"
|
||||||
|
|
||||||
|
[taxonomies]
|
||||||
|
type = ["page"]
|
||||||
|
+++
|
||||||
|
|
||||||
|
<div class="main">
|
||||||
|
<section class="best year section">
|
||||||
|
<h1 class="subtitle">Best films I've seen in 2026</h1>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/movies/cestcalamour.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="c'est ca l'amour" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://letterboxd.com/film/real-love/" target="_blank">C'est ça l'amour</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Claire Burger</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2018</p>
|
||||||
|
<p>Drama</p>
|
||||||
|
<p>Comedy</p>
|
||||||
|
<p>Family</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>After his wife leaves, a father and his two teenage daughters struggle through adolescence and
|
||||||
|
abandomnent together.</i></p>
|
||||||
|
<p>A touching, moving and inspiring portrait of fatherhood I haven't seen since
|
||||||
|
<a href="https://letterboxd.com/film/girl-2018/" target="_blank">Girl</a>. The two daughters are
|
||||||
|
portraying the rollercoaster of emotions that teenagehood is with a sensitivity rarely seen on screen.</p>
|
||||||
|
<p>This is one of the best film I've seen, period. This is why I love cinema.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/movies/arco.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="arco" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://letterboxd.com/film/arco/" target="_blank">Arco</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Ugo Bienvenu</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2025</p>
|
||||||
|
<p>Adventure</p>
|
||||||
|
<p>Animation</p>
|
||||||
|
<p>Science-fiction</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>What if rainbows were people from the future traveling in time? 10-year-old Arco
|
||||||
|
lives in a far future. During his first flight in his rainbow suit, he loses control and falls into
|
||||||
|
the past. Iris, a girl his age from 2075, comes to his rescue and tries by all means to help send him
|
||||||
|
back to his era.</i></p>
|
||||||
|
<p>A common description of this movie is Miyazaki meet Interstellar. Arco is a huge breath of fresh air,
|
||||||
|
filled with colors, kindness, beautiful music and a lot of emotions. From sadness to joy, through
|
||||||
|
laughters, goofiness and adventure. The hand-drawn animation convey all of that and more, it's like
|
||||||
|
jumping back in time to sit in a very cozy and relaxing nostalgia for ninety minutes.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/movies/misssloane.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="miss sloane" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://letterboxd.com/film/miss-sloane/" target="_blank">Miss Sloane</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">John Madden</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2016</p>
|
||||||
|
<p>Thriller</p>
|
||||||
|
<p>Crime</p>
|
||||||
|
<p>Drama</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>A mastermind lobbyist end up facing the gun lobby in an attempt to pass gun control legislation.</i></p>
|
||||||
|
<p>I believe this movie is underrated by being and looking so mainstream. Jessica Chastain
|
||||||
|
is very charismatic, the pacing is immaculate, we're on the edge the entire time. This could still
|
||||||
|
simply be a very well executed hollywood movie, but I mention it because of the last scene. Even though
|
||||||
|
we know exactly what will happen, the delivery is so good we still have goosebumps.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/movies/theinvite.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="theinvite" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://letterboxd.com/film/the-invite-2026/" target="_blank">The Invite</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Olivia Wilde</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2026</p>
|
||||||
|
<p>Romance</p>
|
||||||
|
<p>Drama</p>
|
||||||
|
<p>Comedy</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>Joe and Angela’s marriage is on thin ice. When they invite their enigmatic upstairs
|
||||||
|
neighbors for a dinner party, the night spirals into unexpected places.</i></p>
|
||||||
|
<p>I love films set in one location, The Invite is a very good one. The story is almost irrelevant,
|
||||||
|
the chemistry between the characters (especially the main couple) is making this movie great. Constant
|
||||||
|
back and forth of never dull and unexpected dialogs, very entertaining.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="best unknown section">
|
||||||
|
<h1 class="subtitle">Must watch films that are hopefully relatively unknown</h1>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/movies/capernaum.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="capernaum" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://letterboxd.com/film/capernaum/" target="_blank">کفرناحوم (Capernaum)</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Nadine Labaki</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2018</p>
|
||||||
|
<p>Drama</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>After running away from his negligent parents, committing a violent crime and
|
||||||
|
being sentenced to five years in jail, a hardened, streetwise 12-year-old Lebanese boy sues his
|
||||||
|
parents in protest of the life they have given him.</i></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/movies/stationeleven.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="station eleven" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://letterboxd.com/film/station-eleven/" target="_blank">Station Eleven</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Hiro Murai, Jeremy Podeswa, Helen Shaver, Lucy Tcherniak</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2021</p>
|
||||||
|
<p>Mini-Series</p>
|
||||||
|
<p>Drama</p>
|
||||||
|
<p>Poetic</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>The survivors of a devastating flu attempt to rebuild and reimagine the world anew
|
||||||
|
– while holding on to the best of what’s been lost.</i></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="entry">
|
||||||
|
<!-- {% set image = resize_image(path="/static/movies/dalva.jpg", width=170, op="fit_width") %} -->
|
||||||
|
<img src="{{ image.url }}" title="dalva" />
|
||||||
|
<div>
|
||||||
|
<h2><a href="https://letterboxd.com/film/love-according-to-dalva/" target="_blank">Dalva</a></h2>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="author">Emanuelle Nicot</p>
|
||||||
|
<p class="middot">·</p>
|
||||||
|
<div class="tags">
|
||||||
|
<p>2022</p>
|
||||||
|
<p>Drama</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="opinion">
|
||||||
|
<p class="plot"><i>One evening, Dalva is suddenly taken away from her father’s house. Dumbfounded and
|
||||||
|
outraged at first, she later meets Jayden, a social worker, and Samia, a teen with a temper. A new
|
||||||
|
life seems to start for Dalva, that of a girl her age.</i></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
+++
|
+++
|
||||||
title = "Unintented Fraud - Blog"
|
title = "Brice Bernard - Journal"
|
||||||
sort_by = "date"
|
sort_by = "date"
|
||||||
template = "blog.html"
|
template = "blog.html"
|
||||||
page_template = "blog_page.html"
|
page_template = "blog_page.html"
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
+++
|
+++
|
||||||
title = "Speed-up angularjs (v1) - remove watchers"
|
title = "Speed-up angularjs (v1) - remove watchers"
|
||||||
date = 2015-03-12
|
date = 2015-03-12
|
||||||
|
description = "Sneaky way to manipulate angular watchers to only keep the ones on screen and drastically improve performance."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
tags = ["angularjs", "javascript", "sneaky"]
|
tags = ["angularjs", "javascript", "sneaky"]
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
+++
|
+++
|
||||||
title = "Understanding Go context"
|
title = "Understanding Go context"
|
||||||
date = 2024-03-11
|
date = 2024-03-11
|
||||||
|
description = "Exploration of go context and how you can use them."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
tags = ["go", "learning", "context", "channels"]
|
tags = ["go", "learning", "context", "channels"]
|
||||||
@@ -30,10 +31,16 @@ If you want to have more details and visualise it, I would recommend this talk:
|
|||||||
|
|
||||||
Let's see in our own examples how to use context, for timeouts and adding data to a request.
|
Let's see in our own examples how to use context, for timeouts and adding data to a request.
|
||||||
|
|
||||||
1. [Overview of our simple server](#1-overview-of-our-simple-server)
|
## Table of contents
|
||||||
2. [Use context to pass request-related data to the endpoint](#2-use-context-to-pass-request-related-data-to-the-endpoint)
|
|
||||||
3. [Use context for timeout](#3-use-context-for-timeout)
|
<div class="table-of-contents">
|
||||||
4. [Some tweaked examples](#4-some-tweaked-examples)
|
|
||||||
|
[1. Overview of our simple server](#1-overview-of-our-simple-server)
|
||||||
|
[2. Use context to pass request-related data to the endpoint](#2-use-context-to-pass-request-related-data-to-the-endpoint)
|
||||||
|
[3. Use context for timeout](#3-use-context-for-timeout)
|
||||||
|
[4. Some tweaked examples](#4-some-tweaked-examples)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
## 1. Overview of our simple server
|
## 1. Overview of our simple server
|
||||||
|
|
||||||
@@ -296,7 +303,7 @@ We can see that we got the correct response, at the right time.
|
|||||||
|
|
||||||
Below are more examples when I tweaked some values, see what happens.
|
Below are more examples when I tweaked some values, see what happens.
|
||||||
|
|
||||||
### 4.1 Increate the timeout to 8 seconds
|
### Increate the timeout to 8 seconds
|
||||||
We should get a successful response after 5 seconds.
|
We should get a successful response after 5 seconds.
|
||||||
```go
|
```go
|
||||||
func handleGetValue(next http.Handler) http.Handler {
|
func handleGetValue(next http.Handler) http.Handler {
|
||||||
@@ -327,7 +334,7 @@ curl localhost:8080/get-value
|
|||||||
```
|
```
|
||||||
As expected, we get a successful response 5 seconds after initiating the query, no timeout happened.
|
As expected, we get a successful response 5 seconds after initiating the query, no timeout happened.
|
||||||
|
|
||||||
### 4.2 simulatingOperation returns an error
|
### simulatingOperation returns an error
|
||||||
Keeping it as it is now, make the goroutine returns an error instead.
|
Keeping it as it is now, make the goroutine returns an error instead.
|
||||||
```go
|
```go
|
||||||
func simulatingOperation() chan error {
|
func simulatingOperation() chan error {
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
+++
|
+++
|
||||||
title = "Rustlings - Solutions"
|
title = "Rustlings - Solutions"
|
||||||
date = 2024-02-10
|
date = 2024-02-10
|
||||||
|
description = "My solutions for the rustlings exercices."
|
||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
tags = ["rust", "learning"]
|
tags = ["rust", "learning"]
|
||||||
@@ -14,6 +15,10 @@ presented with a failing program and should fix it in order to compile.
|
|||||||
|
|
||||||
Below are my solutions, maybe it'll help someone, possibly future me who knows.
|
Below are my solutions, maybe it'll help someone, possibly future me who knows.
|
||||||
|
|
||||||
|
## Table of contents
|
||||||
|
|
||||||
|
<div class="table-of-contents rustlings">
|
||||||
|
|
||||||
[intro2.rs](#intro2-rs)
|
[intro2.rs](#intro2-rs)
|
||||||
|
|
||||||
[variables1.rs](#variables-variables1-rs)
|
[variables1.rs](#variables-variables1-rs)
|
||||||
@@ -91,6 +96,8 @@ Below are my solutions, maybe it'll help someone, possibly future me who knows.
|
|||||||
|
|
||||||
TBC.
|
TBC.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
### intro2.rs
|
### intro2.rs
|
||||||
Needed to add an argument to the `println` macro. Or remove the expected argument I guess.
|
Needed to add an argument to the `println` macro. Or remove the expected argument I guess.
|
||||||
|
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"title": "Dune Messiah (Dune #2)",
|
||||||
|
"author": "Frank Herbert",
|
||||||
|
"year": "1969",
|
||||||
|
"url": "https://app.thestorygraph.com/books/d80920a1-ec27-4881-9b5c-6de212a94927"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "The Scar (New Crobuzon #2)",
|
||||||
|
"author": "China Miéville",
|
||||||
|
"year": "2002",
|
||||||
|
"url": "https://app.thestorygraph.com/books/3f653dd2-9e44-4523-afa1-554dd9938a75"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Tau Zero",
|
||||||
|
"author": "Poul Anderson",
|
||||||
|
"year": "1970",
|
||||||
|
"url": "https://app.thestorygraph.com/books/52df9370-3ee5-4888-9fdc-930f3e78c60c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Le Dixième Vaisseau",
|
||||||
|
"author": "Pierre Bordage",
|
||||||
|
"year": "2024",
|
||||||
|
"url": "https://app.thestorygraph.com/books/0317de72-fe78-4c59-8e5f-d9709f8d614c"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"title": "The Death of Robin Hood",
|
||||||
|
"director": "Michael Sarnoski",
|
||||||
|
"year": "2026",
|
||||||
|
"url": "https://letterboxd.com/film/the-death-of-robin-hood/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Tully",
|
||||||
|
"director": "Jason Reitman",
|
||||||
|
"year": "2018",
|
||||||
|
"url": "https://letterboxd.com/film/tully-2018/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Zoolander",
|
||||||
|
"director": "Ben Stiller",
|
||||||
|
"year": "2001",
|
||||||
|
"url": "https://letterboxd.com/film/zoolander/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "One Night Only",
|
||||||
|
"director": "Will Gluck",
|
||||||
|
"year": "2026",
|
||||||
|
"url": "https://letterboxd.com/film/one-night-only-2026/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Mutiny",
|
||||||
|
"director": "Jean-François Richet",
|
||||||
|
"year": "2026",
|
||||||
|
"url": "https://letterboxd.com/film/mutiny-2026/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 521 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 18 KiB |
@@ -1,402 +1,504 @@
|
|||||||
$columnleft: 12rem;
|
/* purple green yellow */
|
||||||
$gap: 1.875rem;
|
$spaceindigo: #3D315B;
|
||||||
|
$duskblue: #444B6E;
|
||||||
|
$dustyolive: #708B75;
|
||||||
|
$mutedolive: #9AB87A;
|
||||||
|
$limecream: #F8F991;
|
||||||
|
|
||||||
$dark: #0b0b0b;
|
/* blue pink violet */
|
||||||
$grey: #a1a1a1;
|
$oceanblue: #2E86AB;
|
||||||
|
$berryblush: #A23B72;
|
||||||
|
$carrotorange: #F18F01;
|
||||||
|
$redochre: #C73E1D;
|
||||||
|
$midnightviolet: #3B1F2B;
|
||||||
|
|
||||||
$orange: #F39F5A;
|
/* something */
|
||||||
$pink: #AE445A;
|
$grey: #455054;
|
||||||
$bordeaux: #662549;
|
$blue: #308695;
|
||||||
$purple: #451952;
|
$pink: #D45769;
|
||||||
|
$orange: #E69D45;
|
||||||
|
$light: #D4CFC9;
|
||||||
|
|
||||||
$mainBg: #232323;
|
|
||||||
$defaultColor: #c9c9c9;
|
|
||||||
|
|
||||||
|
/* variables */
|
||||||
|
|
||||||
|
$paperblack: #121315;
|
||||||
|
$inkpanel: #17181B;
|
||||||
|
$warmivory: #F3F1EA;
|
||||||
|
$bronzeaccent: #8A7A5A;
|
||||||
|
$colortext: #C8C3B9;
|
||||||
|
|
||||||
|
$font-display: "Instrument Serif", Georgia, serif;
|
||||||
|
$font-body: "Fira Sans", sans-serif;
|
||||||
|
$font-mono: "DM Mono", monospace;
|
||||||
|
|
||||||
|
$maxwidth: 960px;
|
||||||
|
|
||||||
|
/* reset */
|
||||||
|
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, p {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0.75rem 0.75rem 6.25rem 0;
|
|
||||||
background-color: $mainBg;
|
|
||||||
min-height: 100vh;
|
|
||||||
box-sizing: border-box;
|
|
||||||
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 1.125rem;
|
|
||||||
line-height: 1.6;
|
|
||||||
color: $defaultColor;
|
|
||||||
|
|
||||||
a,
|
|
||||||
p,
|
|
||||||
h1,
|
|
||||||
h2,
|
|
||||||
h3,
|
|
||||||
h4 {
|
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
a,
|
background: $inkpanel;
|
||||||
p {
|
color: $colortext;
|
||||||
|
|
||||||
|
font-family: "Fira Sans", sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
line-height: 1.6;
|
line-height: 1.6;
|
||||||
margin: 0.75rem 0;
|
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
|
||||||
|
::selection {
|
||||||
|
background: $bronzeaccent;
|
||||||
|
color: $paperblack;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
textarea {
|
||||||
|
font: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- new ---*/
|
||||||
|
|
||||||
|
.section {
|
||||||
|
margin-bottom: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
max-width: $maxwidth;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top {
|
||||||
|
background-color: $paperblack;
|
||||||
|
border-bottom: 1px solid rgba($light, 0.15);
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
.logo {
|
||||||
color: $orange;
|
font-family: $font-mono;
|
||||||
}
|
font-weight: 700;
|
||||||
|
color: rgba($light, 0.3);
|
||||||
ul,
|
|
||||||
ol {
|
|
||||||
margin: 0.75rem 0;
|
|
||||||
|
|
||||||
li {
|
|
||||||
margin: 0.5rem 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact {
|
|
||||||
color: $pink;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-middle {
|
|
||||||
color: $bordeaux;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
// Main page
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.main {
|
|
||||||
max-width: 62.5rem;
|
|
||||||
margin: 3.125rem auto 0;
|
|
||||||
padding-left: 0.75rem;
|
|
||||||
|
|
||||||
.top {
|
|
||||||
text-align: center;
|
|
||||||
|
|
||||||
h1.name {
|
|
||||||
font-size: 4.5rem;
|
|
||||||
line-height: 1.1;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
|
|
||||||
.firstname {
|
.firstname {
|
||||||
color: $orange;
|
color: rgba($pink, .8);
|
||||||
}
|
}
|
||||||
|
|
||||||
.lastname {
|
.lastname {
|
||||||
|
color: rgba($orange, .8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 14px;
|
||||||
|
margin-left: 72px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
font-family: $font-mono;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: .15em;
|
||||||
|
color: rgba($light, 0.5);
|
||||||
|
transition: transform .2s ease, color .2s ease;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: rgba($light, 1);
|
||||||
|
transform: translateX(4px);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
color: rgba($light, 1);
|
||||||
|
transform: translateX(4px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
a {
|
||||||
color: $pink;
|
color: $pink;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: 2rem;
|
|
||||||
line-height: 1.2;
|
|
||||||
color: $defaultColor;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.skills {
|
|
||||||
color: $defaultColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
color: rgba($defaultColor, 0.6);
|
|
||||||
margin-bottom: 0.75rem;
|
|
||||||
margin-top: 4.375rem;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: $orange;
|
|
||||||
display: inline-block;
|
|
||||||
|
|
||||||
&.main-link {
|
|
||||||
font-size: 1.25rem;
|
|
||||||
margin-left: 1.125rem;
|
|
||||||
margin-right: 1.125rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.movie {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: flex-start;
|
|
||||||
margin-top: 2.25rem;
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
margin-right: 0.75rem;
|
|
||||||
|
|
||||||
&.mobile {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: $orange;
|
|
||||||
font-size: 0.875rem;
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
margin-right: 0.75rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.movie-title {
|
|
||||||
margin-bottom: 0.375rem;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: 1.125rem;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
// Main page — mobile
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
@media (max-width: 37.5rem) {
|
|
||||||
.main {
|
|
||||||
.top h1.name {
|
|
||||||
font-size: 3rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.movie {
|
|
||||||
img {
|
|
||||||
display: none;
|
|
||||||
|
|
||||||
&.mobile {
|
|
||||||
display: block;
|
|
||||||
margin: 0 auto 0.75rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.movie-title {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
// Blog
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
pre {
|
|
||||||
padding: 0.75rem;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
overflow: auto;
|
|
||||||
|
|
||||||
code {
|
|
||||||
padding: 0;
|
|
||||||
background: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
padding: 0.125rem 0.25rem;
|
|
||||||
background: #383838;
|
|
||||||
font-size: 0.875rem;
|
|
||||||
line-height: 1.8;
|
|
||||||
color: $grey;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
// --------------------------------------------------
|
|
||||||
// Blog header
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.header {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: $columnleft minmax(0, 1fr);
|
|
||||||
column-gap: $gap;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
|
|
||||||
a {
|
|
||||||
margin-right: 2rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
display: block;
|
|
||||||
width: $columnleft;
|
|
||||||
padding: 0.3125rem;
|
|
||||||
box-sizing: border-box;
|
|
||||||
text-align: right;
|
|
||||||
color: $orange;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 1.25rem;
|
|
||||||
|
|
||||||
a {
|
|
||||||
.firstname {
|
|
||||||
color: $orange;
|
color: $orange;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-family: $font-mono;
|
||||||
|
font-size: .8rem;
|
||||||
|
letter-spacing: .18em;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lastname {
|
.about {
|
||||||
color: $pink;
|
p {
|
||||||
}
|
margin-bottom: 12px;
|
||||||
|
|
||||||
&:hover {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.latest-writing {
|
||||||
// --------------------------------------------------
|
|
||||||
// Blog entries
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
.blog {
|
|
||||||
margin-top: 1.5rem;
|
|
||||||
max-width: 75rem;
|
|
||||||
|
|
||||||
p.tag-link {
|
|
||||||
color: rgba($orange, 0.6);
|
|
||||||
margin-top: 0.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.entry {
|
.entry {
|
||||||
display: grid;
|
|
||||||
grid-template-columns: $columnleft minmax(0, 1fr);
|
|
||||||
column-gap: $gap;
|
|
||||||
align-items: start;
|
|
||||||
margin-bottom: 2.25rem;
|
|
||||||
|
|
||||||
.column-left {
|
|
||||||
color: $grey;
|
|
||||||
margin-top: 0.25rem;
|
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
align-items: center;
|
||||||
align-items: flex-end;
|
|
||||||
|
|
||||||
line-height: 0;
|
.date {
|
||||||
|
margin-right: 24px;
|
||||||
p {
|
opacity: .5;
|
||||||
margin: 0 0 0.375rem;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.column-right {
|
|
||||||
min-width: 0;
|
|
||||||
|
|
||||||
.mobile {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 1.625rem;
|
|
||||||
line-height: 1.3;
|
|
||||||
margin-bottom: 0.375rem;
|
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: $defaultColor;
|
color: $light;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.post {
|
|
||||||
min-width: 0;
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 2.5rem;
|
|
||||||
line-height: 1.2;
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: 1.125rem;
|
|
||||||
line-height: 1.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2,
|
|
||||||
h3 {
|
h3 {
|
||||||
margin-top: 3rem;
|
margin: 0;
|
||||||
}
|
font-weight: 400;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.latest-reading,
|
||||||
// --------------------------------------------------
|
.latest-films {
|
||||||
// Blog — mobile
|
|
||||||
// --------------------------------------------------
|
|
||||||
|
|
||||||
@media (max-width: 37.5rem) {
|
|
||||||
padding-left: 0.75rem;
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin: 0.75rem 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
display: block;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
text-align: left;
|
|
||||||
width: auto;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.blog {
|
|
||||||
.entry {
|
.entry {
|
||||||
display: block;
|
margin-bottom: 24px;
|
||||||
|
|
||||||
.column-left {
|
h3 {
|
||||||
display: none;
|
margin: 0;
|
||||||
|
font-weight: 400;
|
||||||
}
|
}
|
||||||
|
|
||||||
.column-right {
|
a {
|
||||||
.mobile {
|
color: $light;
|
||||||
display: block;
|
}
|
||||||
|
|
||||||
.tags {
|
.author {
|
||||||
|
opacity: .5;
|
||||||
|
|
||||||
|
.middot {
|
||||||
|
margin: 0 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.opportunities {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
align-items: center;
|
||||||
margin-bottom: 0.75rem;
|
font-family: $font-mono;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: .8rem;
|
||||||
|
margin-bottom: 48px;
|
||||||
|
|
||||||
> p {
|
.available {
|
||||||
margin: 0 0.75rem 0 0;
|
text-transform: uppercase;
|
||||||
|
color: $pink;
|
||||||
|
letter-spacing: .1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.location {
|
||||||
|
margin-left: 24px;
|
||||||
|
color: rgba($light, .6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.elsewhere {
|
||||||
|
margin-top: 48px;
|
||||||
|
|
||||||
|
.links {
|
||||||
|
padding: 4px 14px;
|
||||||
|
border-left: 3px solid rgba($orange, .4);
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $light;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.post {
|
.best {
|
||||||
h1 {
|
margin-bottom: 96px;
|
||||||
|
|
||||||
|
.subtitle {
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.entry {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 24px;
|
||||||
|
margin-bottom: 48px;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
margin: 0;
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
a {
|
||||||
font-size: 1.125rem;
|
color: $light;
|
||||||
line-height: 1.7;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meta {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
opacity: .6;
|
||||||
|
font-size: 1rem;
|
||||||
|
|
||||||
|
.middot {
|
||||||
|
margin: 0 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tags {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
> p {
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.opinion {
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-bottom: 4px;
|
||||||
|
|
||||||
|
&.plot {
|
||||||
|
border-left: 3px solid rgba($light, .4);
|
||||||
|
padding-left: 12px;
|
||||||
|
margin: 12px 0 6px 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $pink;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.journal {
|
||||||
|
.entry {
|
||||||
|
margin: 24px 0;
|
||||||
|
border-bottom: 1px solid rgba($light, .05);
|
||||||
|
padding: 0 0 24px 0;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
margin-bottom: 0;
|
||||||
|
|
||||||
|
> a{
|
||||||
|
color: $light;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
> code {
|
||||||
|
background: rgba($pink, .25);
|
||||||
|
padding: .1rem .2rem;
|
||||||
|
font-size: 85%;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.meta {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
opacity: .6;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
|
||||||
|
.split {
|
||||||
|
margin: 0 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date {
|
||||||
|
font-family: $font-mono;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: .8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tags {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
.tag {
|
||||||
|
font-family: $font-mono;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: .75rem;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.article {
|
||||||
|
.table-of-contents {
|
||||||
|
padding-left: 12px;
|
||||||
|
|
||||||
|
p {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $light;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.rustlings {
|
||||||
|
> p {
|
||||||
|
margin-bottom: 12px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
h1.title {
|
||||||
|
font-size: 3.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
margin-top: 36px;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 2rem;
|
||||||
|
margin: 48px 0 24px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
margin: 24px 0 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
padding: 12px;
|
||||||
|
border: 1px solid rgba($light, .1);
|
||||||
|
overflow: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table {
|
||||||
|
ol {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
li {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: $blue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
padding: 48px 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-family: $font-mono;
|
||||||
|
font-size: .8rem;
|
||||||
|
flex-grow: 1;
|
||||||
|
|
||||||
|
.middot {
|
||||||
|
opacity: .3;
|
||||||
|
margin: 0 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a[target="_blank"]:hover {
|
||||||
|
text-decoration: underline dotted;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- small screens ---
|
||||||
|
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
.top {
|
||||||
|
.header {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-top: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .opportunities {
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.location {
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .latest-writing {
|
||||||
|
.entry {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
margin-top: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.main .best {
|
||||||
|
.entry {
|
||||||
|
img {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
margin: 48px 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 339 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 521 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 18 KiB |
@@ -9,6 +9,9 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&family=Instrument+Serif:ital@0;1&family=Fira+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap&family=Libre+Barcode+39+Text" rel="stylesheet">
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
<link rel="shortcut icon" type="image/png" href="{{ get_url(path='/favicon.png', trailing_slash=false) | safe }}"/>
|
<link rel="shortcut icon" type="image/png" href="{{ get_url(path='/favicon.png', trailing_slash=false) | safe }}"/>
|
||||||
@@ -18,21 +21,32 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<section class="header">
|
<section class="top">
|
||||||
<a href="/">home</a>
|
<div class="header centered">
|
||||||
<a href="/blog">blog</a>
|
<a href="/" class="logo"><span class="firstname">brice</span><span class="lastname">bernard</span>.dev</a>
|
||||||
<a href="/contact">contact</a>
|
<nav>
|
||||||
|
<a href="/" class="{% if current_path == '/' %}active{% endif %}">home</a>
|
||||||
|
<a href="/journal" class="{% if current_path is starting_with(pat='/journal') %}active{% endif %}">journal</a>
|
||||||
|
<a href="/films" class="{% if current_path is starting_with(pat='/films') %}active{% endif %}">films</a>
|
||||||
|
<a href="/books" class="{% if current_path is starting_with(pat='/books') %}active{% endif %}">books</a>
|
||||||
|
<a href="/contact" class="{% if current_path is starting_with(pat='/contact') %}active{% endif %}">contact</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="logo">
|
<section class="content centered">
|
||||||
<a title="blog" href="/blog">
|
{% block content %} {% endblock %}
|
||||||
<span class="firstname">brice</span>
|
|
||||||
<span class="lastname">bernard</span>
|
|
||||||
</a>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section class="footer">
|
||||||
<section class="blog">{% block content %} {% endblock %}</section>
|
<a href="https://git.bricebernard.dev/Mimu" target="_blank" rel="noopener noreferrer">Gitea</a><br>
|
||||||
|
<span class="middot">·</span>
|
||||||
|
<a href="https://www.linkedin.com/in/brice-bernard-05130518/" target="_blank" rel="noopener noreferrer">LinkedIn</a><br>
|
||||||
|
<span class="middot">·</span>
|
||||||
|
<a href="https://letterboxd.com/Mimuuu/" target="_blank" rel="noopener noreferrer">Letterboxd</a><br>
|
||||||
|
<span class="middot">·</span>
|
||||||
|
<a href="https://literal.club/mimuuu" target="_blank" rel="noopener noreferrer">Literal</a><br>
|
||||||
|
</section>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,49 +1,35 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<!-- If you are using pagination, section.pages will be empty. You need to use the paginator object -->
|
|
||||||
{% for page in section.pages %}
|
|
||||||
|
|
||||||
{% if page.taxonomies.type %}
|
<div class="main journal">
|
||||||
|
<h1 class="subtitle">Journal</h1>
|
||||||
|
|
||||||
|
<!-- If you are using pagination, section.pages will be empty. You need to use the paginator object -->
|
||||||
|
{% for page in section.pages %}
|
||||||
|
|
||||||
|
{% if page.taxonomies.type %}
|
||||||
{% set pageType = page.taxonomies.type | first %}
|
{% set pageType = page.taxonomies.type | first %}
|
||||||
{% if pageType == "page" %}
|
{% if pageType == "page" %}
|
||||||
{% continue %}
|
{% continue %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<section class="entry">
|
|
||||||
<div class="column-left">
|
|
||||||
<p>{{ page.date }}</p>
|
|
||||||
|
|
||||||
{% if page.taxonomies.tags %}
|
|
||||||
{% for t in page.taxonomies.tags %}
|
|
||||||
<p class="tag-link">
|
|
||||||
#{{ t }}
|
|
||||||
</p>
|
|
||||||
<br>
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
</div>
|
<section class="entry">
|
||||||
<div class="column-right">
|
<h2><a href="{{ page.permalink | safe }}">{{ page.title }}</a></h2>
|
||||||
<h1><a href="{{ page.permalink | safe }}">{{ page.title }}</a></h1>
|
<div class="meta">
|
||||||
|
<p class="date">{{ page.date | date(format="%d %b %Y") }}</p>
|
||||||
<div class="mobile">
|
<p class="split">·</p>
|
||||||
<p>{{ page.date }}</p>
|
|
||||||
<div class="tags">
|
<div class="tags">
|
||||||
{% if page.taxonomies.tags %}
|
{% if page.taxonomies.tags %}
|
||||||
{% for t in page.taxonomies.tags %}
|
{% for t in page.taxonomies.tags %}
|
||||||
<p class="tag-link">
|
<p class="tag">{{ t }}</p>
|
||||||
#{{ t }}
|
|
||||||
</p>
|
|
||||||
<br>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>{{ page.summary | safe }}</p>
|
<p>{{ page.summary | safe }}</p>
|
||||||
</section>
|
</section>
|
||||||
|
{% endfor %}
|
||||||
{% endfor %}
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
@@ -1,24 +1,27 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<section class="entry">
|
|
||||||
<div class="column-left">
|
|
||||||
<p>{{ page.date }}</p>
|
|
||||||
|
|
||||||
|
<div class="main journal article">
|
||||||
|
<h1 class="subtitle">Journal</h1>
|
||||||
|
|
||||||
|
<div class="entry">
|
||||||
|
<h1 class="title">{{ page.title }}</h1>
|
||||||
|
<div class="meta">
|
||||||
|
<p class="date">{{ page.date | date(format="%d %b %Y") }}</p>
|
||||||
|
<p class="split">·</p>
|
||||||
|
<div class="tags">
|
||||||
{% if page.taxonomies.tags %}
|
{% if page.taxonomies.tags %}
|
||||||
{% for t in page.taxonomies.tags %}
|
{% for t in page.taxonomies.tags %}
|
||||||
<p class="tag-link">
|
<p class="tag">{{ t }}</p>
|
||||||
#{{ t }}
|
|
||||||
</p>
|
|
||||||
<br>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div class="column-right post">
|
<div class="content">
|
||||||
<h1>{{ page.title }}</h1>
|
|
||||||
{{ page.content | safe }}
|
{{ page.content | safe }}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|||||||
@@ -1,156 +1,65 @@
|
|||||||
<!DOCTYPE html>
|
{% extends "base.html" %}
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
{% block content %}
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
||||||
<link rel="shortcut icon" type="image/png" href="{{ get_url(path='/favicon.png', trailing_slash=false) | safe }}"/>
|
|
||||||
<link rel="stylesheet" href="{{ get_url(path='main.css',
|
|
||||||
trailing_slash=false) | safe }}" />
|
|
||||||
<title>{{ section.title }}</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
<div class="main">
|
||||||
<div class="main">
|
<div class="opportunities">
|
||||||
<div class="top">
|
<a href="/contact" class="available">Available for exciting opportunities</a>
|
||||||
<h1 class="name">
|
<p class="location">Amsterdam / Netherlands / Remote</p>
|
||||||
<span class="firstname">Brice</span>
|
|
||||||
<span class="lastname">Bernard</span>
|
|
||||||
</h1>
|
|
||||||
<h2>Software Engineer</h2>
|
|
||||||
<a class="main-link" title="git" target="_blank" rel="noreferrer" href="https://git.bricebernard.dev/mimu">
|
|
||||||
gitea
|
|
||||||
</a>
|
|
||||||
<a class="main-link" href="/blog" title="blog">blog</a>
|
|
||||||
<a class="main-link" title="linkedin" target="_blank" rel="noreferrer" href="https://www.linkedin.com/in/brice-bernard-05130518/">
|
|
||||||
linkedin
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3>#about</h3>
|
<section class="about section">
|
||||||
<p>
|
<h1 class="subtitle">Me</h1>
|
||||||
Software engineer using mostly Go and Typescript.
|
<p>Software Engineer, mostly using <strong>Go</strong>, currently learning <b>Rust</b>.</p>
|
||||||
</p>
|
<p>I spent the last few years building internal tools. I enjoy working closely with the users and the kind of
|
||||||
<p>
|
very varied technical problems it brings.</p>
|
||||||
Coming from a frontend background, I became fullstack in the past 5 years and really enjoy it. My current goal is to
|
<p>The moment when all of the parts fit together in a simple and elegant way is what I like the most about programming.</p>
|
||||||
expand my backend knowledge and even non-web related topics!
|
<p>Lately I'm exploring (simple) game development as a fun way to expand my knowledge and tackle problems that
|
||||||
</p>
|
don't exist in my usual web world. Building something completely offline is also very satisfying.</p>
|
||||||
<p>
|
</section>
|
||||||
You can contact me at: <span class="contact">bricecontact</span><span class="contact-middle">[at]</span><span class="contact">fastmail.com</span>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
Below are a few things I like, in a throwback of what old-school blog were before.
|
|
||||||
Hopefully you'll find something you didn't know you would like!
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h3>#what you should watch</h3>
|
<section class="latest-writing section">
|
||||||
<p>Here's 5 movies I enjoyed recently, check them out!</p>
|
<h1 class="subtitle">Latest writing</h1>
|
||||||
|
{% for page in section.pages %}
|
||||||
<div class="movie">
|
{% if loop.index <= 3 %}
|
||||||
{% set image = resize_image(path="/static/movies/heretic.jpg", width=80, op="fit_width") %}
|
<div class="entry">
|
||||||
<img src="{{ image.url }}" title="Heretic (2024)" />
|
<p class="date">{{ page.date | date(format="%d %b %Y") }}</p>
|
||||||
<div>
|
<h3><a href="{{ page.permalink }}">{{ page.title }}</a></h3>
|
||||||
<div class="movie-title">
|
|
||||||
<h4>Heretic</h4>
|
|
||||||
<a href="https://letterboxd.com/film/heretic-2024/" target="_blank" rel="noreferrer">see on letterboxd</a>
|
|
||||||
</div>
|
</div>
|
||||||
<img class="mobile" src="{{ image.url }}" title="heretic (2024)" />
|
{% endif %}
|
||||||
<p><i>"Two young missionaries are forced to prove their faith when they knock on the wrong door and are
|
{% endfor %}
|
||||||
greeted by a diabolical Mr. Reed."</i>
|
</section>
|
||||||
<br>
|
|
||||||
The first hour of Heretic is one of the best piece of cinema I've experienced. It's a long discussion
|
{% set films = load_data(path="data/films.json") %}
|
||||||
between the three protagonist
|
|
||||||
|
<section class="latest-films section">
|
||||||
|
<h1 class="subtitle">Latest films</h1>
|
||||||
|
|
||||||
|
{% for film in films %}
|
||||||
|
<div class="entry">
|
||||||
|
<h3><a href="{{ film.url }}" target="_blank">{{ film.title }}</a></h3>
|
||||||
|
<p class="author">
|
||||||
|
{{ film.year }}<span class="middot">·</span>{{ film.director }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
<div class="movie">
|
{% set books = load_data(path="data/books.json") %}
|
||||||
{% set image = resize_image(path="/static/movies/movie4.jpg", width=80, op="fit_width") %}
|
|
||||||
<img src="{{ image.url }}" title="station eleven" />
|
<section class="latest-reading section">
|
||||||
<div>
|
<h1 class="subtitle">Latest books</h1>
|
||||||
<div class="movie-title">
|
|
||||||
<h4>Station Eleven</h4>
|
{% for book in books %}
|
||||||
<a href="https://letterboxd.com/film/station-eleven/" target="_blank" rel="noreferrer">see on letterboxd</a>
|
<div class="entry">
|
||||||
</div>
|
<h3><a href="{{ book.url }}" target="_blank">{{ book.title }}</a></h3>
|
||||||
<img class="mobile" src="{{ image.url }}" title="station eleven" />
|
<p class="author">
|
||||||
<p><i>"A post apocalyptic saga spanning multiple timelines telling the stories of survivors of a devastating flu
|
{{ book.year }}<span class="middot">·</span>{{ book.author }}
|
||||||
as they attempt to rebuild and reimagine the world anew while holding on to the best of what’s been lost."</i>
|
|
||||||
<br>
|
|
||||||
Despite what it sounds like, it has nothing to do with covid, it's from a book by Emily St. John Mandel - which I have
|
|
||||||
not read -. The serie is very poetic, there are so many beautiful and emotionnal moments I cannot count them, it is
|
|
||||||
one of the best show I've seen in recent times. At the end I only wish I could erase my memory and watch it again.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
|
</section>
|
||||||
<div class="movie">
|
</div>
|
||||||
{% set image = resize_image(path="/static/movies/movie2.jpg", width=80, op="fit_width") %}
|
|
||||||
<img src="{{ image.url }}" title="miss sloane" />
|
|
||||||
<div>
|
|
||||||
<div class="movie-title">
|
|
||||||
<h4>Miss Sloane</h4>
|
|
||||||
<a href="https://letterboxd.com/film/miss-sloane/" target="_blank" rel="noreferrer">see on letterboxd</a>
|
|
||||||
</div>
|
|
||||||
<img class="mobile" src="{{ image.url }}" title="miss sloane" />
|
|
||||||
<p>A battle between a genius lobbyist fighting for the people vs. the powerful gun lobby. A classic setup and overall
|
|
||||||
a classic sequence of events. However the movie is extremely well made and well acted which makes it a must-see if you enjoy the
|
|
||||||
genre. The ending is one of the most satisfying thing I've seen in a while even though you expect it to happen (which
|
|
||||||
speak even more to the quality of the film I think).</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="movie">
|
|
||||||
{% set image = resize_image(path="/static/movies/movie3.jpg", width=80, op="fit_width") %}
|
|
||||||
<img src="{{ image.url }}" title="maestro" />
|
|
||||||
<div>
|
|
||||||
<div class="movie-title">
|
|
||||||
<h4>Maestro</h4>
|
|
||||||
<a href="https://letterboxd.com/film/maestro-2023/" target="_blank" rel="noreferrer">see on letterboxd</a>
|
|
||||||
</div>
|
|
||||||
<img class="mobile" src="{{ image.url }}" title="maestro" />
|
|
||||||
<p>I watched Maestro during a sneak preview session (one of the best thing ever created). A movie clearly made for the oscars (long, black
|
|
||||||
and white, main theme around what it takes to create amazing art, etc), it stays intense the entire time, both Bradley Cooper and
|
|
||||||
Carey Mulligan are amazing. You'll be moved or you may be a robot.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="movie">
|
|
||||||
{% set image = resize_image(path="/static/movies/movie5.jpg", width=80, op="fit_width") %}
|
|
||||||
<img src="{{ image.url }}" title="columbus" />
|
|
||||||
<div>
|
|
||||||
<div class="movie-title">
|
|
||||||
<h4>Columbus</h4>
|
|
||||||
<a href="https://letterboxd.com/film/columbus-2017/" target="_blank" rel="noreferrer">see on letterboxd</a>
|
|
||||||
</div>
|
|
||||||
<img class="mobile" src="{{ image.url }}" title="columbus" />
|
|
||||||
<p>This is just the last quality movie of a genre I really loved for some reason, aka well directed, beautiful cinematography and
|
|
||||||
a very slow movie where not much happens. Just regular people living and talking. I don't know why but every time those movies
|
|
||||||
make me feel so good and relaxed. If you're the same or if you're curious, Columbus is a sure bet.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h3>#what you should read</h3>
|
|
||||||
<p>Same as above with books although this is probably more what I last read as I read (way) less than I watch movies. (._.)</p>
|
|
||||||
|
|
||||||
<div class="movie">
|
|
||||||
{% set image = resize_image(path="/static/books/3body.jpg", width=80, op="fit_width") %}
|
|
||||||
<img src="{{ image.url }}" title="three body problem" />
|
|
||||||
<div>
|
|
||||||
<div class="movie-title">
|
|
||||||
<h4>The Three-Body Problem Series (Liu Cixin)</h4>
|
|
||||||
</div>
|
|
||||||
<img class="mobile" src="{{ image.url }}" title="three body problem" />
|
|
||||||
<p>I saw this book recommended many times until I finally tried it. It took me a while to really get into it but
|
|
||||||
after the mid-way mark of book one I was completely hooked. I couldn't stop reading. The book touches so many
|
|
||||||
different science-fiction concepts, theories, spanning across millions if not billions of years, it's like a guided
|
|
||||||
meditation in your imagination and intellect. So many times the book ask a seemingly impossible question and explore how to solve it,
|
|
||||||
it truly is fascinating. Plus the author managed to write the story in a way that makes you feel the full size and weight
|
|
||||||
of the entire universe. Masterpiece.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
{% endblock content %}
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="entry">
|
<div class="entry">
|
||||||
<div class="column-left"></div>
|
|
||||||
<div class="column-right">
|
|
||||||
{{ page.content | safe }}
|
{{ page.content | safe }}
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[package]
|
||||||
|
name = "letterboxd-sync"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
reqwest = { version = "0.12", features = ["blocking", "rustls-tls"] }
|
||||||
|
scraper = "0.24"
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
serde_json = "1"
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
use reqwest::blocking::Client;
|
||||||
|
use scraper::{Html, Selector};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
const BASE: &str = "https://letterboxd.com";
|
||||||
|
const LIST: &str = "https://letterboxd.com/mimuuu/list/2026/by/reverse/";
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct FilmJson {
|
||||||
|
name: String,
|
||||||
|
released: Released,
|
||||||
|
directors: Vec<Person>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct Released {
|
||||||
|
year: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
struct Person {
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
struct Film {
|
||||||
|
title: String,
|
||||||
|
year: u16,
|
||||||
|
director: String,
|
||||||
|
url: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let client = Client::builder().user_agent("Mozilla/5.0").build()?;
|
||||||
|
|
||||||
|
// One request: list page (only to discover the 5 film endpoints)
|
||||||
|
let html = client.get(LIST).send()?.text()?;
|
||||||
|
let doc = Html::parse_document(&html);
|
||||||
|
let selector = Selector::parse("li.posteritem div.react-component")?;
|
||||||
|
|
||||||
|
let mut films = Vec::new();
|
||||||
|
|
||||||
|
for node in doc.select(&selector).take(5) {
|
||||||
|
let details = node.value().attr("data-details-endpoint").unwrap();
|
||||||
|
|
||||||
|
let slug = node.value().attr("data-item-link").unwrap();
|
||||||
|
|
||||||
|
// One request per film: JSON metadata
|
||||||
|
let film: FilmJson = client.get(format!("{BASE}{details}")).send()?.json()?;
|
||||||
|
|
||||||
|
films.push(Film {
|
||||||
|
title: film.name,
|
||||||
|
year: film.released.year,
|
||||||
|
director: film
|
||||||
|
.directors
|
||||||
|
.first()
|
||||||
|
.map(|d| d.name.clone())
|
||||||
|
.unwrap_or_default(),
|
||||||
|
url: format!("{BASE}{slug}"),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fs::create_dir_all("data")?;
|
||||||
|
fs::write("data/films.json", serde_json::to_string_pretty(&films)?)?;
|
||||||
|
|
||||||
|
println!("Saved {} films", films.len());
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"rustc_fingerprint":13028192105755907156,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/mimu/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.94.1 (e408947bf 2026-03-25)\nbinary: rustc\ncommit-hash: e408947bfd200af42db322daf0fadfe7e26d3bd1\ncommit-date: 2026-03-25\nhost: x86_64-unknown-linux-gnu\nrelease: 1.94.1\nLLVM version: 21.1.8\n","stderr":""}},"successes":{}}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Signature: 8a477f597d28d172789f06886806bc55
|
||||||
|
# This file is a cache directory tag created by cargo.
|
||||||
|
# For information about cache directory tags see https://bford.info/cachedir/
|
||||||