Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
9a2f9ed2aa | |||
5fe2d8e834 | |||
d91730dd8c | |||
ebca5f980d | |||
abc9cdbe26 | |||
99d42b8de4 | |||
c8264125f0 | |||
0c7ee90547 | |||
46ee4fbb90 | |||
03d5cbe5b5 | |||
84563958a8 | |||
ab47ca8637 | |||
e7bdc41803 | |||
6d17aa3ddf | |||
5434d6686a | |||
c50c6fb927 | |||
561faa3a45 | |||
6f0fb545df | |||
80c31d70f4 | |||
b9632410d2 |
19
.drone.yml
Normal file
@@ -0,0 +1,19 @@
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: install
|
||||
image: node:19.4.0
|
||||
commands:
|
||||
- npm install
|
||||
|
||||
- name: test
|
||||
image: node:19.4.0
|
||||
commands:
|
||||
- npm run test:coverage
|
||||
|
||||
- name: build
|
||||
image: node:19.4.0
|
||||
commands:
|
||||
- npm run build
|
3
.vscode/settings.json
vendored
@@ -1,5 +1,8 @@
|
||||
{
|
||||
"cSpell.words": [
|
||||
"disqus",
|
||||
"fontawesome",
|
||||
"fortawesome",
|
||||
"frontmatter",
|
||||
"slsw"
|
||||
],
|
||||
|
30
CHANGELOG.md
@@ -2,6 +2,36 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
### [1.2.2](https://github.com/mastermindzh/rickvanlieshout.com/compare/v1.2.1...v1.2.2) (2023-04-12)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* .language-text not breaking on mobile ([5fe2d8e](https://github.com/mastermindzh/rickvanlieshout.com/commits/5fe2d8e834a4d7588f04e4a3b1608618253f6d52))
|
||||
|
||||
|
||||
### New content
|
||||
|
||||
* blogpost about flashing lsi 9211 cards ([ebca5f9](https://github.com/mastermindzh/rickvanlieshout.com/commits/ebca5f980d8e1a109494c5db15d2728bcfbc964b))
|
||||
|
||||
### [1.2.1](https://github.com/mastermindzh/rickvanlieshout.com/compare/v1.2.0...v1.2.1) (2023-03-26)
|
||||
|
||||
## [1.2.0](https://github.com/mastermindzh/rickvanlieshout.com/compare/v1.1.0...v1.2.0) (2023-02-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* added social images to the frontmatter of most blogs ([6f0fb54](https://github.com/mastermindzh/rickvanlieshout.com/commits/6f0fb545dfcbb59f677b2408622cdbc4de19325f))
|
||||
* navigate link now always returns to all articles beacuse history can be empty ([80c31d7](https://github.com/mastermindzh/rickvanlieshout.com/commits/80c31d70f43b6d4e41105a7ede5b2ed032e67eb7))
|
||||
* removed the estranged '1' from the description of the latest blogpost ([b963241](https://github.com/mastermindzh/rickvanlieshout.com/commits/b9632410d2369e09300231e7152941d850a4f421))
|
||||
* socialImage code doesnt properly use publicURL ([561faa3](https://github.com/mastermindzh/rickvanlieshout.com/commits/561faa3a4585a73f0dc8aba63d72146dd670b544))
|
||||
|
||||
|
||||
### New content
|
||||
|
||||
* added a picture of Eddy's completed urn. Also changed my function title to Tech Lead ([c50c6fb](https://github.com/mastermindzh/rickvanlieshout.com/commits/c50c6fb9273ddd3fb180609fd977cf6d0dbbdb74))
|
||||
* **blog:** A blog post about my new hobby: Legos ([ab47ca8](https://github.com/mastermindzh/rickvanlieshout.com/commits/ab47ca863779167069030f152569cbfe8cab0e65))
|
||||
|
||||
## [1.1.0](https://github.com/mastermindzh/rickvanlieshout.com/compare/v1.0.0...v1.1.0) (2022-11-07)
|
||||
|
||||
|
||||
|
@@ -2,8 +2,8 @@
|
||||
|
||||
This is the repository for my personal blog/website [rickvanlieshout.com](https://rickvanlieshout.com).
|
||||
|
||||
[](https://ci.mastermindzh.tech/mastermindzh/rickvanlieshout.com)
|
||||
|
||||
## todos
|
||||
|
||||
- Links on printed pages need to display
|
||||
- Combine cookies/disclaimer in menu to make it shorter
|
||||
- Improve/replace menu on mobile (on old phones pages need a few scrolls)
|
||||
|
@@ -3,10 +3,12 @@
|
||||
A list of categories used in the blog
|
||||
|
||||
<!-- prettier-ignore -->
|
||||
| category | What it does |
|
||||
| ------------ | -------------------------------------------------------- |
|
||||
| blog | random blog stuff |
|
||||
| IOT | anything to do with IOT |
|
||||
| Homelab | anything to do with my homelab (including smart home...) |
|
||||
| Development | anything to do with regular development |
|
||||
| exploits | blogs about exploits and bugs in open-source software |
|
||||
| category | What it does |
|
||||
| ----------- | -------------------------------------------------------- |
|
||||
| blog | random blog stuff |
|
||||
| IOT | anything to do with IOT |
|
||||
| Homelab | anything to do with my homelab (including smart home...) |
|
||||
| Development | anything to do with regular development |
|
||||
| exploits | blogs about exploits and bugs in open-source software |
|
||||
| Lego | blogs about Lego |
|
||||
| house | Content about the place I live |
|
||||
|
@@ -37,7 +37,7 @@
|
||||
],
|
||||
"author": {
|
||||
"name": "Rick van Lieshout",
|
||||
"photo": "/me.png",
|
||||
"photo": "/content/me.png",
|
||||
"bio": "I'm a passionate software architect that bifurcates his love between great software development and leading others to learn and adopt new things.",
|
||||
"contacts": {
|
||||
"email": "info@rickvanlieshout.com",
|
||||
|
@@ -20,20 +20,20 @@ template: "page"
|
||||
_Always_<br />
|
||||
A fair share of my private work is done through open-source media. I don't have a portfolio but I have a [Github](https://github.com/mastermindzh) where I share most things.
|
||||
|
||||
**Software architect at INFORIT**<br />
|
||||
**Tech lead at INFORIT**<br />
|
||||
_2018 - Now_<br />
|
||||
At INFORIT I am responsible for the entire technical architecture of the new TFX stack that I launched shortly after 2018. This involves setting up and maintaining a modern event based microservice architecture on a Kubernetes based SaaS cloud solution and migrating to modern programming languages such as dotnetcore and React.
|
||||
At INFORIT I am responsible for the entire technical architecture of the new TFX stack that I launched shortly after 2018. This involves setting up and maintaining a modern event-based microservice architecture on a Kubernetes-based SaaS cloud solution and migrating to modern programming languages such as dotnetcore and React.
|
||||
|
||||
The other main responsibility I have is creating and maintaining a coherent team of lead-developers by sharing knowledge, making decisions, and empowering leads to explore technologies outside of their comfort zone.
|
||||
The other main responsibility I have is creating and maintaining a coherent team of lead developers by sharing knowledge, making decisions, and empowering leads to explore technologies outside of their comfort zone.
|
||||
|
||||
At INFORIT I also help with recruitment of new employees, setting up and maintaining agile strategies including proper test-management, and general software development.
|
||||
During my time at INFORIT we've grown from 5-7 in-house developers to 10, full-sized, SCRUM teams.
|
||||
At INFORIT I also help with the recruitment of new employees, setting up and maintaining agile strategies including proper test management, and general software development.
|
||||
During my time at INFORIT, we've grown from 5-7 in-house developers to 10, full-sized, SCRUM teams.
|
||||
|
||||
Most relevant technologies used: dotnetcore, React, Angular, Kafka, RabbitMQ, Mongo, PostgreSQL, Growthbook, Docker & Kubernetes
|
||||
|
||||
**Hanflex employee**<br />
|
||||
_September 2015 - July 2018_<br />
|
||||
I started working for the HAN (hogeschool van Arnhem en Nijmegen) in 2015. The HAN offers us different jobs (teaching others, open door days, etc) and we are free to reply and take those. I primarily respond to the open door days and the teaching jobs. On the open door days I usually work with 3d printers and a lasercutter.
|
||||
I started working for the HAN (hogeschool van Arnhem en Nijmegen) in 2015. The HAN offers us different jobs (teaching others, open door days, etc) and we are free to reply and take those. I primarily respond to the open-door days and the teaching jobs. On the open-door days, I usually work with 3d printers and a laser cutter.
|
||||
|
||||
**mi-soft.nl**<br />
|
||||
_2006 - January 2019_<br />
|
||||
@@ -50,7 +50,7 @@ _2005 - 2010_
|
||||
|
||||
**HBO ICT / software engineering HAN - Nijmegen**<br />
|
||||
_2014 - 2018_<br />
|
||||
After a few rocky years I enrolled into college and I'm now trying to get a software engineering degree. I finished my first year with an average of 8.3/10 and will graduate in mid 2018.
|
||||
After a few rocky years I enrolled in college and I'm now trying to get a software engineering degree. I finished my first year with an average of 8.3/10 and will graduate in mid-2018.
|
||||
|
||||
**Bilingual Senior General Secondary Education - Maaslandcollege Oss**<br />
|
||||
_2005 - 2010_
|
||||
@@ -65,8 +65,8 @@ I'll list some of the training courses I've had whilst working.
|
||||
Some of these have (official) certificates, some don't, but all have brought value and knowledge.
|
||||
|
||||
- Hiring & interview training ([icm.nl](https://www.icm.nl/opleidingen-en-trainingen/hrm/selectiegesprekken-voeren/))
|
||||
- Conversation techniques & deescalation ([TIJDwinst.com](https://gesprekstechnieken.com/cursus-gesprekstechnieken/)).
|
||||
- Kubernetes
|
||||
- Conversation techniques & de-escalation ([TIJDwinst.com](https://gesprekstechnieken.com/cursus-gesprekstechnieken/)](<https://gesprekstechnieken.com/cursus-gesprekstechnieken/>)).
|
||||
- Kubernetes (NobleProg Certification Kubernetes on Azure (AKS), 26 August 2019 - 27 August 2019)
|
||||
- SEEBURGER b2b integration
|
||||
|
||||
## Projects
|
||||
@@ -82,7 +82,7 @@ All of the code is available on [Github](https://github.com/mastermindzh/han4pi.
|
||||
|
||||
**Solidwinds developer**<br />
|
||||
_2015 - 2016_<br />
|
||||
Set up an architecture and start of an implementation for a scalable metrics collection system for windmills.
|
||||
Set up an architecture and started implementation for a scalable metrics collection system for windmills.
|
||||
|
||||
**Quintor bulk-mail**<br />
|
||||
_April 2016 - June 2016_<br />
|
||||
@@ -96,7 +96,7 @@ The list below is far from complete and unordered but focuses on the skills & te
|
||||
- Teaching, coaching & presenting
|
||||
- Agile development
|
||||
- Docker, Kubernetes & CI/CD
|
||||
- Event based architecture
|
||||
Event-based architecture
|
||||
- Reactive architecture
|
||||
- Typescript (Javascript)
|
||||
- dotnetcore
|
||||
|
@@ -8,6 +8,7 @@ tags:
|
||||
- "school"
|
||||
description: ""
|
||||
disqusId: "10"
|
||||
socialImage: "./media/face.png"
|
||||
---
|
||||
|
||||
## School
|
||||
@@ -24,7 +25,7 @@ Last night a friend of mine tried installing the Numix square theme, something t
|
||||
|
||||
That is why the team behind Numix has requested the package to be removed from the aur. And their request was granted. (as it should have been). Last night however we didn't have the tools handy to be able to make a purchase of the Icon theme, so I sent him my version and he installed that instead. I will however buy a license from them today, since I use the icon theme on pretty much all my machines.
|
||||
|
||||
## Arduino sneak peak.
|
||||
## Arduino sneak peak
|
||||
|
||||
I acquired some new toys for the arduino, two of them being the "Adafruit mini 8x8 LED matrix". To use them I had to install 2 libraries, and with those came "Example sketches". One of those example sketches was a "Robotic eye", naturally with me having 2 new toys I decided to create a little "face" (just eyes) with the prebuilt sketches. Anyways I thought that looked cool so I made a photo which you can view below:
|
||||
|
||||
|
@@ -9,6 +9,7 @@ tags:
|
||||
- "pi"
|
||||
description: "Assembling all the parts and creating a cute little cluster"
|
||||
disqusId: "3"
|
||||
socialImage: "./media/improvising.jpg"
|
||||
---
|
||||
|
||||
So today I finally received the required parts to finish up my Raspberry pi cluster and I was **extremely** excited! To share this excitement with you lot here's a picture of all the parts I'll be using:
|
||||
|
@@ -9,6 +9,7 @@ tags:
|
||||
- "pi"
|
||||
description: "Installing the raspberry pi OS (Raspbian) and prepping for a cluster"
|
||||
disqusId: "4"
|
||||
socialImage: "./media/windows.jpg"
|
||||
---
|
||||
|
||||
Installing an OS for a Raspberry pi is quite different from installing an OS on any other computer. We will have to write an "image" to the SD card rather than actually "installing" anything. Don't worry if you're confused just now, even I don't know what I'm rambling on about at times!
|
||||
|
@@ -9,6 +9,7 @@ tags:
|
||||
- "pi"
|
||||
description: "We're going to set up the master node. The master node will be the one that gives work orders to the slaves."
|
||||
disqusId: "5"
|
||||
socialImage: "./media/pi1-prev.jpg"
|
||||
---
|
||||
|
||||
After installing raspbian to the sd card it's time to plug in that SD card and fire up the Raspberry pi. If everything went well you should end up with a screen similar to mine:
|
||||
|
@@ -9,6 +9,7 @@ tags:
|
||||
- "pi"
|
||||
description: "Today's blog post will be about expanding the cluster with more nodes."
|
||||
disqusId: "6"
|
||||
socialImage: "./media/pidark_full.JPG"
|
||||
---
|
||||
|
||||
In today's post we'll have a look at expanding the cluster with more nodes! We will have a look at how to clone them and how we can set up a universal login using ssh keys.
|
||||
@@ -65,7 +66,7 @@ nano mpi_scripts/machinefile
|
||||
|
||||
Simply add all the other pi's ip addresses to the file (each on a new line).
|
||||
|
||||
## Testing!
|
||||
## Testing
|
||||
|
||||
Now that we've added the pi's ip's to the machinefile we can use them from our master node. To test this we can run the following command:
|
||||
|
||||
|
@@ -10,12 +10,13 @@ tags:
|
||||
- "bug"
|
||||
description: "In today's blog I share my opinion on shellshock and why I think you shouldn't get your panties in a bunch! hah!"
|
||||
disqusId: "8"
|
||||
socialImage: "./media/hackzors.png"
|
||||
---
|
||||
|
||||
On September 24 2014, A Bash vulnerability, known as "Shellshock" was disclosed. This "bug" allows an attacker to run code on your machine, which is bad, very bad.
|
||||
|
||||
<figure class="float-right" style="width: 420px">
|
||||
<img src="/media/hackzors.png" alt="terminal with shellshock exploit">
|
||||
<img src="/media/hackzors.png" alt="terminal with shellshock exploit">
|
||||
</figure>
|
||||
|
||||
Now then, what exactly is "Shellshock". Shellshock is a "bug" (or vulnerability) that can be used to remotely run code on someone's machine by altering an environment variable. The real danger however lies in programs that can alter these variables without requiring root. Thus enabling anyone with access to your computer to run commands.
|
||||
|
@@ -10,6 +10,7 @@ tags:
|
||||
- "raspberry"
|
||||
description: 'The creation process of a Raspberry PI based "game console" and its controllers'
|
||||
disqusId: "14"
|
||||
socialImage: "./media/fritzing_example.png"
|
||||
---
|
||||
|
||||
Even though this week has been extremely busy I wanted to bring you guys a little blog because the things I've been doing are truly wicked.
|
||||
@@ -22,7 +23,7 @@ As some of you know, next semester I will be working on a (school issued) projec
|
||||
|
||||
We do not yet know what this special assignment will entail but one thing we know for sure. WE ARE EXCITED ABOUT IT !
|
||||
|
||||
## Maker thingies !
|
||||
## Maker thingies
|
||||
|
||||
Even though I love software development, deep down I am also still a maker. And a maker likes to "make" things (go figure...), so when I got asked to do a project involving a Raspberry Pi I couldn't refuse. Even though I had no idea what exactly the project was going to entail I enlisted anyways.
|
||||
|
||||
@@ -34,7 +35,7 @@ So we came up with "pong". We are going to create simple controllers (based on p
|
||||
|
||||
Throughout the entire project we will be using a [github repo](https://github.com/Mastermindzh/han4pi) to sync changes. One of the benefits of a github repo, apart from the actual git stuff, is that we automatically share all our code / designs. This means that anyone who is interested can either reproduce or follow along with us.
|
||||
|
||||
## Enough talking, show us something!
|
||||
## Enough talking, show us something
|
||||
|
||||
Well alright then, we've got a couple of things "ready" to show others. The first of which are the design schematics of our controllers and our "hubs".
|
||||
|
||||
|
@@ -11,6 +11,7 @@ tags:
|
||||
- "touchscreen"
|
||||
description: "A look at the new official raspberry pi touchscreen"
|
||||
disqusId: "13"
|
||||
socialImage: "./media/box.jpg"
|
||||
---
|
||||
|
||||
Hey guys, as some of you know I was really, and I mean **really**, excited when they announced the official raspberry pi screen. Now why is that might you ask? Everything the raspberry pi people have released so far has been really solid. The boards, the sd cards, the wifi-dongle, all of them work absolutely fantastic! So as soon as I saw that the official screen was available for pre-order in the UK I ordered myself one and started waiting.
|
||||
@@ -66,7 +67,7 @@ The red and black cables provide power (and ground) to the pi from the logic boa
|
||||
|
||||
The moment had arrived, I plugged the pi into a battery pack (creating a makeshift tablet-like device) and waited. First boot wasn't all that promising... Touch didn't work and I had an annoying little square in the top right. This was however not my first rodeo with a pi and I quickly worked out that the little square indicates insufficient input power. I did a quick update and after rebooting touch worked wonders! The only thing my makeshift tablet test was missing was some sort of input method for the keyboard. For this I used a program called "matchbox", which was available in the default repository. After playing around with touch for a bit I switched to a solid 2 amp power supply and the little, coloured square disappeared, as suspected.
|
||||
|
||||
## That's nice and all... But we want a video...
|
||||
## That's nice and all... But we want a video
|
||||
|
||||
Of course I prepared a little video, wouldn't be a showcase if I hadn't now would it. So here goes:
|
||||
|
||||
|
@@ -8,6 +8,7 @@ tags:
|
||||
- "christmas"
|
||||
description: "A new maker project based on a big piece of lumber that my parents erected 🤔"
|
||||
disqusId: "15"
|
||||
socialImage: "./media/new.jpg"
|
||||
---
|
||||
|
||||
I'm very excited to announce a new maker project to you guys ! It will be simple, and thus reproducible, yet fun and quite possibly even useful. (oh, and a tad crazy)
|
||||
@@ -24,7 +25,7 @@ I got the idea after my parents put up their christmas tree. My mom opted for a
|
||||
|
||||
Of course! All code will be open source! All other stuff (drawings etc.) will also be opened up to the public. Everything can be found on [Github](https://github.com/Mastermindzh/TekTree) once again.
|
||||
|
||||
## Step 1 - Design!
|
||||
## Step 1 - Design
|
||||
|
||||
I've thought long and hard about what kind of "controller" I wanted to use. And of course I immediately wanted to use a Raspberry pi. But I asked myself, why a pi? Why not use something simpler (like an arduino) to control the lights and switches. After some serious brainstorming I decided to go with an arduino in the end. I figured the Raspberry pi zero would be too cumbersome to work with for a simple christmas tree. Besides, I have a lot more uses for a pi zero than I have for an arduino, and I got more arduino's laying around than pi zero's at the moment.
|
||||
|
||||
|
@@ -8,6 +8,7 @@ tags:
|
||||
- "christmas"
|
||||
description: "Dangerous things involving lasers and christmassy figures. Fun!"
|
||||
disqusId: "16"
|
||||
socialImage: "./media/plate.jpg"
|
||||
---
|
||||
|
||||
Last friday I actually got to cut the parts for my TekTree! So excited! This is by far the biggest "piece" I have ever laser cut but luckily everything went well. This in part is thanks to my brilliant friend [Ron](http://www.ronnabuurs.nl) who helped me create the sketches for the laser cutter. Thanks again [Ron](http://www.ronnabuurs.nl)!
|
||||
|
@@ -8,6 +8,7 @@ tags:
|
||||
- "christmas"
|
||||
description: "Read about me being tangled with wires and generally just making a mess of things"
|
||||
disqusId: "17"
|
||||
socialImage: "./media/wiring1.jpg"
|
||||
---
|
||||
|
||||
In the 3rd part of my TekTree project I'll show you guys how to wire everything. This time I even used separate colours for the power,ground and signal wires. So no more complaining ! ^\_^ All in all I think the result looks absolutely wicked. Even without the arduino case which has yet to come in the mail. (and probably won't fit)
|
||||
@@ -24,7 +25,7 @@ The arduino will get power from a regular adaptor. The only modification I did t
|
||||
|
||||
I want the project to be "manageable" for everyone. To do this I kept the wiring as simple as possible. Every LED has 2 prongs, 1 goes to ground 1 goes to the arduino. Simple. Same goes for the potentiometers, 3 legs, 1 power 1 ground 1 signal. The only led's I did bundle together (in terms of wiring) is the star. I did this to create a single star instead of multiple led's.
|
||||
|
||||
## Well you could've made it way prettier... and....
|
||||
## Well you could've made it way prettier... and
|
||||
|
||||
Well yes, as all of us know I'm perfectly capable of designing a [refined build](/images/blogs/han4pi/Front_thumb.png). I didn't want to go with a pcb this time however because that would make the barrier to entry way higher on this project. And that is something I definitely **don't** want.
|
||||
|
||||
|
@@ -7,9 +7,10 @@ tags:
|
||||
- life
|
||||
description: "A brief update of what I've been up to lately "
|
||||
disqusId: "12"
|
||||
socialImage: "./media/mic1.jpg"
|
||||
---
|
||||
|
||||
## My goals....
|
||||
## My goals
|
||||
|
||||
Last blog we talked about a couple of goals I set for myself. As usual, not all of these have been completed. But instead of focusing on the ones I didn't complete I'll focus on the ones I did.
|
||||
|
||||
@@ -31,7 +32,7 @@ I kinda made this goal.... kinda. Hear me out on this one ! When I wrote my last
|
||||
|
||||
Only a few of the goals I had set I haven't reached. I have given up on losing weight and because of the extra portfolio work I didn't really start LSR either. 5 new tutorials is a detable goal. I haven't exactly written 5 tutorials but I have done some work on mi-soft.nl (and still wrote 2 tutorials). And 1 blogpost.... well I'm trying !
|
||||
|
||||
## Losing some of my stuff!
|
||||
## Losing some of my stuff
|
||||
|
||||
As I mentioned before I have lost some of my hardware to a lightning strike. I didn't just lose my motherboard however. I also lost my microphone (blue snowball), my keyboard (razer blackwidow), my xbox controller receiver, 8gb's of ram and some random usb peripherals. Some of the stuff was insured and thus I have gotten some money for it. However I did not simply want to replace the lost stuff, I wanted to upgrade too.
|
||||
|
||||
|
@@ -8,6 +8,7 @@ tags:
|
||||
- "homelab"
|
||||
description: "What was meant to be a simple hard drive migration turned into a long night due to a rogue sata cable"
|
||||
disqusId: "25"
|
||||
socialImage: "./media/sata.jpg"
|
||||
---
|
||||
|
||||
Servers.... Both a joy and a pain. This week my server has just been a pain though.... What should've been a relaxing night with some easy peasy hard drive replacements quickly turned into hours of downtime and lots of yelling and screaming :(
|
||||
@@ -16,7 +17,7 @@ During my holiday stay (at [Tropical Islands](https://www.tropical-islands.de) i
|
||||
|
||||
So, the drives arrived, I ran a quick benchmark followed by a quick drive test and all seemed fine with the first drive. At this point, I decide to open up the server and replace the first 500 GB hard drive. After a lot of gymnastics (trying to read drive labels while the drives are in the drive bays) I finally figured out which drive I should replace and I went to work on that drive. I was careful not to touch any of the other cables to avoid accidentally unplugging them and I thought I had done a good job. I remember thinking: "Drive replaced, cables still connected, not much hassle so far. Let's turn it on". And so I did.
|
||||
|
||||
## Prepare for trouble...
|
||||
## Prepare for trouble
|
||||
|
||||
My good mood was rudely interrupted by a loud beep followed by three, rapid, beeps. At first, I thought it was the regular old "fan not spinning" error (I use several ways to limit fan speed) but on further inspection, I realised that the fan was spinning just fine. Things were about to turn bad....
|
||||
|
||||
|
@@ -10,7 +10,8 @@ tags:
|
||||
- "INFORIT"
|
||||
- "Standard releases"
|
||||
|
||||
description: "A dive into conventional commits and their benefit whilst releasing with standard versions.1"
|
||||
description: "A dive into conventional commits and their benefit whilst releasing with standard versions."
|
||||
socialImage: "./media/husky-error.png"
|
||||
---
|
||||
|
||||
At my place of work, [INFORIT](http://inforit.nl/), we are talking about adopting conventional commits as a company standard.
|
||||
|
@@ -9,11 +9,12 @@ tags:
|
||||
- "dog"
|
||||
|
||||
description: "Today we had to give a lethal injection to my furry friend Eddy. He will be honored appropriately and this post is one of the tools to do that."
|
||||
socialImage: "./media/eddy-2011.jpg"
|
||||
---
|
||||
|
||||

|
||||
|
||||
Unfortunately I've had to put my dog Eddy down today.
|
||||
Unfortunately, I've had to put my dog Eddy down today.
|
||||
Eddy was my best friend. Not just my best furry friend, but my best friend period.
|
||||
He never failed to bring me joy, he was always there when I needed him and he helped me overcome some of life's biggest obstacles just by existing.
|
||||
|
||||
@@ -30,8 +31,8 @@ I love you Eddy. Always have. Always will. Rest in peace my friend.
|
||||
## Why Eddy had to be put down
|
||||
|
||||
<figure class="float-right" style="width: 240px">
|
||||
<img src="/media/eddy-ribbon.jpg" alt="Eddy with a ribbon penetrating his body so the wounds won't close">
|
||||
<figcaption>Such a cute boy with his ribbon, July 2016</figcaption>
|
||||
<img src="/media/eddy-ribbon.jpg" alt="Eddy with a ribbon penetrating his body so the wounds won't close">
|
||||
<figcaption>Such a cute boy with his ribbon, July 2016</figcaption>
|
||||
</figure>
|
||||
|
||||
Of course this isn't the first time Eddy has had some issues with his health.
|
||||
@@ -58,8 +59,8 @@ Though, after some thought I realized something that I'd realized before:
|
||||
> \- from the poem `thoughts` by Rick van Lieshout
|
||||
|
||||
<figure class="float-left" style="width: 240px">
|
||||
<img src="/media/eddy-hat.jpg" alt="Eddy with a beige hat on">
|
||||
<figcaption>Very professional doggy. Early 2022</figcaption>
|
||||
<img src="/media/eddy-hat.jpg" alt="Eddy with a beige hat on">
|
||||
<figcaption>Very professional doggy. Early 2022</figcaption>
|
||||
</figure>
|
||||
|
||||
And though those feelings are true. I also can't help but shake the sorrow I feel.
|
||||
@@ -77,8 +78,14 @@ Now that Eddy has left me completely I will just have to see where life takes me
|
||||
|
||||
## Farewell
|
||||
|
||||
In the end though, I don't think anything can truly replace Eddy.
|
||||
In the end, though, I don't think anything can truly replace Eddy.
|
||||
I got Eddy an [urn](https://www.urnwinkel.nl/fotolijst-dierenurn-zwart.html) so I can have him in my life for the rest of mine.
|
||||
Sleep well friend.
|
||||
Sleep well, friend.
|
||||
|
||||

|
||||
|
||||
## The urn
|
||||
|
||||
It took way too long for the urn to be filled with pictures but in the end, I've gotten it done and I hung Eddy's urn in my bedroom.
|
||||
|
||||

|
||||
|
BIN
content/posts/2022/ode-to-eddy/media/eddy-urn.jpg
Normal file
After Width: | Height: | Size: 1.7 MiB |
92
content/posts/2023/flashing-lsi-9211-with-efi/index.md
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
title: Flashing the LSI-9211 to IT mode using an EFI shell
|
||||
date: "2023-04-12"
|
||||
template: "post"
|
||||
category: "Homelab"
|
||||
tags:
|
||||
- "lsi"
|
||||
- "lsi9211"
|
||||
- "raid card"
|
||||
- "storage"
|
||||
- "SAS2000"
|
||||
- "it mode"
|
||||
description: "Flashing the LSI-9211 used to be way more difficult, luckily the EFI shell makes this task a lot simpler!"
|
||||
socialImage: /media/flash-result.jpg
|
||||
---
|
||||
|
||||
|
||||
I've been building a new storage-oriented server for a while now and have yet again decided to go with (3 +1 backup) LSI 9211 raid controllers.
|
||||
|
||||
The reason I keep going for these specific raid controllers is quite simple. The card can theoretically support (8x500MB) 4GB/s in throughput divided over 8 drives (2x SFF-8087) which is near the maximum for consumer hard drives.
|
||||
|
||||
Using 3 of these will allow me to use 24 drives in a single chassis without an expander whilst getting pretty good performance.
|
||||
The fourth card that I got, and flashed, is simply used as a backup or debug card in case of any errors.
|
||||
|
||||
## Downloading the files
|
||||
|
||||
Before we can start flashing we will need to download some files.
|
||||
The table below lists all the files with a brief description of what we'll use them for.
|
||||
|
||||
| File | Description |
|
||||
| --------------------------------------------------------------- | ------------------------------- |
|
||||
| [EFI flashing utility](https://docs.broadcom.com/docs/12350820) | Flashing utility |
|
||||
| [EFI ROM image](https://docs.broadcom.com/docs/12348628) | Card ROM file |
|
||||
| [SAS2008 Firmware](https://docs.broadcom.com/docs/12350504) | IR and IT firmware for the 9211 |
|
||||
|
||||
## Prepping the flash drive
|
||||
|
||||
Make sure that you have a flash drive that is **32GB** or smaller and that it is formatted as **FAT32**.
|
||||
Next, we'll add the following files to the **root** of the flash drive:
|
||||
|
||||
- `Installer_P20_for_UEFI/sas2flash_efi_ebc_rel/sas2flash.efi`
|
||||
- `UEFI_BSD_P20/uefi_bsd_rel/Signed/x64sas2.efi`
|
||||
- `9210-8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows/sasbios_rel/mptsas2.rom`
|
||||
- `9210-8i_Package_P20_IR_IT_FW_BIOS_for_MSDOS_Windows/Firmware/HBA_9210_8i_IT/2108it.bin`
|
||||
|
||||
## Flashing with EFI
|
||||
|
||||
Because we are going to flash using EFI we don't really need anything besides the built-in EFI shell from our motherboard. Simply insert the flash drive and go into the BIOS or use the "select boot device" functionality to select the EFI shell:
|
||||
|
||||

|
||||
|
||||
After the shell has booted successfully you can use the `map` command to see all available devices. In the image below you'll see that my flash drive is listed as `fs1`:
|
||||
|
||||

|
||||
|
||||
To switch into the drive simply enter the drive name on the command line followed by a semicolon:
|
||||
|
||||
```efi
|
||||
fs1:
|
||||
```
|
||||
|
||||
Next, we'll determine that our adapters are available and we will simultaneously take note of their identifier, we can do so by issuing the following command:
|
||||
|
||||
```efi
|
||||
sas2flash.efi -listall
|
||||
```
|
||||
|
||||

|
||||
|
||||
Next, we can empty the current firmware with the following command:
|
||||
|
||||
```efi
|
||||
sas2flash.efi -o -e 6
|
||||
```
|
||||
|
||||

|
||||
|
||||
Now we'll simply flash the new (IT-mode) firmware on it with the following command:
|
||||
|
||||
```efi
|
||||
sas2flash.efi -o -f 2108it.bin -b mptsas2.rom
|
||||
```
|
||||
|
||||

|
||||
|
||||
Wait patiently until the operations have completed. Note that it might seem like the steps repeat, just wait until it is completely done and exits back to the shell by itself.
|
||||
|
||||
## Multiple cards and conclusion
|
||||
|
||||
You can rerun the commands for different cards (by adding `-c x` where x is the card number from `listall`) or by simply physically switching the current one out for a different one.
|
||||
|
||||
That's all there is too it, if you need any help feel free to hit me up!
|
After Width: | Height: | Size: 2.9 MiB |
After Width: | Height: | Size: 1.4 MiB |
After Width: | Height: | Size: 1.5 MiB |
After Width: | Height: | Size: 1.3 MiB |
After Width: | Height: | Size: 1.8 MiB |
@@ -0,0 +1,98 @@
|
||||
---
|
||||
title: Uncovering a new hobby that might just take over my entire house
|
||||
date: "2023-02-14"
|
||||
template: "post"
|
||||
category: "blog"
|
||||
tags:
|
||||
- "Lego"
|
||||
- "house"
|
||||
description: "What started as a simple decoration piece to fill some empty space in my home quickly grew into a new hobby of which the remnants can be found throughout my house"
|
||||
socialImage: /media/building-the-owl.jpg
|
||||
---
|
||||
|
||||
## The problem
|
||||
|
||||
Even though my house is fully furnished, one could say it's quite light on decorations. You see, I'm not really one for many of the popular decoration pieces like candles, picture frames, animal skins, or decorative statues.
|
||||
|
||||
The only thing I really like is stone and woodwork. This means that I have enough decorations to fill the downstairs, kind off.
|
||||
You see, some of the decorations that I also like are plants (mainly because they go in large stone pots) but I'm not great at keeping them alive.
|
||||
|
||||
(Un)fortunately, there is more to my house than just the downstairs. There are 2 more floors that are, once again, furnished but not really decorated.
|
||||
The only room that is pretty well decorated is my office, which has various little nerdy things on little black shelves and 12 beautiful Displates.
|
||||
|
||||
One of the main problem areas is my bedroom. I don't have any entertainment in my bedroom (by choice.. it's a place to sleep, not watch telly!) but I do have some [FJallbo](https://www.ikea.com/gb/en/p/fjaellbo-shelving-unit-black-70339291/) shelving units.
|
||||
Of course, those shelves are mostly empty... they are only adorned by some books, clothes and a few stuffed animals.
|
||||
|
||||
## The solution, or so I thought
|
||||
|
||||
<figure class="float-right" style="width: 240px">
|
||||
<img src="/media/orchids.jpg" alt="Lego orchids on a wooden table">
|
||||
<figcaption>Pretty little orchids!</figcaption>
|
||||
</figure>
|
||||
|
||||
I don't know when exactly it happened but a few months ago I stumbled across "Lego plants" on Youtube. Plants that look quite good and don't die.
|
||||
The first plant I got was the little bonsai and the second one were the orchids.
|
||||
After that, I quickly picked up the cacti and bouquet.
|
||||
|
||||
And as you can probably figure out by now... a new hobby was born... Lego.
|
||||
Lego allows me to fill up the empty space with whatever I want whilst keeping things interesting and giving me something to do to boot.
|
||||
|
||||
## Christmas time's a coming
|
||||
|
||||
After building a few smaller items I felt ready to tackle a "project", one that would allow me to play with Legos and at the same time get a few friends and family members off my back about not having Christmas decorations.
|
||||
That's right. I set out to build a Christmas village from lego.
|
||||
|
||||
I emptied a shelf, picked up some [white base plates](https://www.lego.com/en-us/product/white-baseplate-11010), procured a string of small Christmas lights, and bought some Christmassy-looking Lego sets:
|
||||
|
||||
- [Holiday main street](https://www.lego.com/en-us/product/holiday-main-street-10308)
|
||||
- [Santa's sleigh](https://www.lego.com/en-nl/product/santa-s-sleigh-40499)
|
||||
- [Santa's visit](https://www.lego.com/en-nl/product/santa-s-visit-10293)
|
||||
- [Winter elve's scene](https://www.lego.com/en-nl/product/winter-elves-scene-40564)
|
||||
- [Winter polar bears](https://www.lego.com/en-us/product/wintertime-polar-bears-40571)
|
||||
- [Santa's workshop](https://www.lego.com/en-nl/product/santa-s-workshop-40565?CMP=AFC-AffiliateUK-lFWN%2FyX1zOg-3425491-124738-1)
|
||||
|
||||
The result of a few days of work and the Christmas village has been completed:
|
||||
|
||||

|
||||
|
||||
## A new room to build Lego
|
||||
|
||||
Now that the Lego virus has taken hold of me I am quickly growing tired of needing to move stuff off my dining table just to build some Legos.
|
||||
Likewise, I dislike having to move half-finished Lego builds just to use my dining table.
|
||||
It was time to upgrade my spare bedroom with a desk and some other things to build a comfortable space.
|
||||
|
||||
I bought the following items:
|
||||
|
||||
- [3x Alex drawers](https://www.ikea.com/gb/en/p/alex-drawer-unit-white-00473546/)
|
||||
- [2x Karlby countertop](https://www.ikea.com/gb/en/p/karlby-worktop-walnut-veneer-30335191/)
|
||||
- [1x Nissafors trolley](https://www.ikea.com/gb/en/p/nissafors-trolley-black-20399777/)
|
||||
- [1x fniss waste bucket](https://www.ikea.com/gb/en/p/fniss-waste-bin-black-60295438/)
|
||||
- [2x SKÅDIS pegboard](https://www.ikea.com/gb/en/p/skadis-pegboard-black-50534378/)
|
||||
- [5x SKÅDIS planks](https://www.ikea.com/gb/en/p/skadis-shelf-white-00320799/)
|
||||
- [3x SKÅDIS cup](https://www.ikea.com/gb/en/p/skadis-container-white-20320798/)
|
||||
- [5x SKÅDIS hooks](https://www.ikea.com/gb/en/p/skadis-hook-white-20320802/)
|
||||
- [1x SKÅDIS storage baskets](https://www.ikea.com/gb/en/p/skadis-storage-basket-set-of-3-white-50517760/)
|
||||
- [2x SKÅDIS containers with lid](https://www.ikea.com/gb/en/p/skadis-container-with-lid-white-80335909/)
|
||||
|
||||
Which, with some effort, got turned into the following room:
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
The space I've created with this Ikea build works very well for building Legos!
|
||||
The mounted desk light (which I got from Amazon) has also proven to be quite handy. I can move the light however I like, be it to shed some more light on the
|
||||
little booklet with instructions or on the build itself to illuminate some of the darker pieces at night. (brown/black)
|
||||
Turning on both lights (there's one hidden behind the monitor/speaker) ensures that there's enough light in the room that I don't have to turn on the main light
|
||||
which makes the room feel nice and cozy.
|
||||
|
||||
## More of my creations
|
||||
|
||||
I'd like to round off this blog post by showing some of the other builds I've since completed:
|
||||
|
||||

|
||||
")
|
||||

|
||||

|
After Width: | Height: | Size: 3.0 MiB |
After Width: | Height: | Size: 2.2 MiB |
After Width: | Height: | Size: 3.3 MiB |
After Width: | Height: | Size: 3.0 MiB |
After Width: | Height: | Size: 2.9 MiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 2.0 MiB |
After Width: | Height: | Size: 2.5 MiB |
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 254 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 3.0 MiB |
After Width: | Height: | Size: 1.9 MiB |
@@ -62,29 +62,27 @@ export default {
|
||||
guid: site.siteMetadata.url + node?.fields?.slug,
|
||||
custom_elements: [{ "content:encoded": node.html }],
|
||||
})),
|
||||
query: `
|
||||
{
|
||||
allMarkdownRemark(
|
||||
limit: 1000,
|
||||
sort: { order: DESC, fields: [frontmatter___date] },
|
||||
filter: { frontmatter: { template: { eq: "post" }, draft: { ne: true } } }
|
||||
) {
|
||||
edges {
|
||||
node {
|
||||
html
|
||||
fields {
|
||||
slug
|
||||
}
|
||||
frontmatter {
|
||||
date
|
||||
title
|
||||
description
|
||||
}
|
||||
query: `{
|
||||
allMarkdownRemark(
|
||||
limit: 1000
|
||||
sort: {frontmatter: {date: DESC}}
|
||||
filter: {frontmatter: {template: {eq: "post"}, draft: {ne: true}}}
|
||||
) {
|
||||
edges {
|
||||
node {
|
||||
html
|
||||
fields {
|
||||
slug
|
||||
}
|
||||
frontmatter {
|
||||
date
|
||||
title
|
||||
description
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
}`,
|
||||
output: "/rss.xml",
|
||||
title: config.title,
|
||||
},
|
||||
@@ -110,7 +108,7 @@ export default {
|
||||
},
|
||||
{
|
||||
resolve: "gatsby-remark-images-medium-zoom",
|
||||
options: { background: "rgb(0, 0, 0,50%)" },
|
||||
options: { background: "rgb(0, 0, 0,70%)" },
|
||||
},
|
||||
"gatsby-remark-autolink-headers",
|
||||
"gatsby-remark-prismjs",
|
||||
@@ -191,6 +189,13 @@ export default {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
resolve: "gatsby-plugin-react-helmet-canonical-urls",
|
||||
options: {
|
||||
siteUrl: config.url,
|
||||
stripQueryString: true,
|
||||
},
|
||||
},
|
||||
"gatsby-plugin-image",
|
||||
"gatsby-plugin-catch-links",
|
||||
"gatsby-plugin-react-helmet",
|
||||
|
@@ -13,12 +13,10 @@ const categoriesQuery = async (graphql: CreatePagesArgs["graphql"]) => {
|
||||
const result = await graphql<CategoriesQueryResult>(`
|
||||
{
|
||||
allMarkdownRemark(
|
||||
filter: {
|
||||
frontmatter: { template: { eq: "post" }, draft: { ne: true } }
|
||||
}
|
||||
sort: { order: DESC, fields: [frontmatter___date] }
|
||||
filter: { frontmatter: { template: { eq: "post" }, draft: { ne: true } } }
|
||||
sort: { frontmatter: { date: DESC } }
|
||||
) {
|
||||
group(field: frontmatter___category) {
|
||||
group(field: { frontmatter: { category: SELECT } }) {
|
||||
fieldValue
|
||||
totalCount
|
||||
}
|
||||
|
@@ -13,11 +13,9 @@ const tagsQuery = async (graphql: CreatePagesArgs["graphql"]) => {
|
||||
const result = await graphql<TagsQueryResult>(`
|
||||
{
|
||||
allMarkdownRemark(
|
||||
filter: {
|
||||
frontmatter: { template: { eq: "post" }, draft: { ne: true } }
|
||||
}
|
||||
filter: { frontmatter: { template: { eq: "post" }, draft: { ne: true } } }
|
||||
) {
|
||||
group(field: frontmatter___tags) {
|
||||
group(field: { frontmatter: { tags: SELECT } }) {
|
||||
fieldValue
|
||||
totalCount
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import contacts from "./contacts";
|
||||
|
||||
export default {
|
||||
photo: "/me.png",
|
||||
photo: "/content/me.png",
|
||||
bio: "",
|
||||
name: "Rick van Lieshout",
|
||||
contacts,
|
||||
|
12884
package-lock.json
generated
138
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "rickvanlieshout-com",
|
||||
"version": "1.1.0",
|
||||
"version": "1.2.2",
|
||||
"description": "My personal blog / website",
|
||||
"keywords": [
|
||||
"gatsby",
|
||||
@@ -49,36 +49,37 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-svg-core": "^6.2.0",
|
||||
"@fortawesome/free-solid-svg-icons": "^6.2.0",
|
||||
"@fortawesome/fontawesome-svg-core": "^6.3.0",
|
||||
"@fortawesome/free-solid-svg-icons": "^6.3.0",
|
||||
"@fortawesome/react-fontawesome": "^0.2.0",
|
||||
"classnames": "^2.3.2",
|
||||
"disqus-react": "^1.1.4",
|
||||
"gatsby": "^4.24.4",
|
||||
"gatsby-link": "^4.24.1",
|
||||
"gatsby-plugin-catch-links": "^4.24.0",
|
||||
"gatsby-plugin-feed": "^4.24.0",
|
||||
"gatsby-plugin-google-gtag": "^4.24.0",
|
||||
"gatsby-plugin-image": "^2.24.0",
|
||||
"gatsby-plugin-manifest": "^4.24.0",
|
||||
"gatsby-plugin-offline": "^5.24.0",
|
||||
"disqus-react": "^1.1.5",
|
||||
"gatsby": "^5.8.0",
|
||||
"gatsby-link": "^5.8.0",
|
||||
"gatsby-plugin-catch-links": "^5.8.0",
|
||||
"gatsby-plugin-feed": "^5.8.0",
|
||||
"gatsby-plugin-google-gtag": "^5.8.0",
|
||||
"gatsby-plugin-image": "^3.8.0",
|
||||
"gatsby-plugin-manifest": "^5.8.0",
|
||||
"gatsby-plugin-offline": "^6.8.0",
|
||||
"gatsby-plugin-optimize-svgs": "^1.0.5",
|
||||
"gatsby-plugin-react-helmet": "^5.24.0",
|
||||
"gatsby-plugin-robots-txt": "^1.7.1",
|
||||
"gatsby-plugin-sass": "^5.24.0",
|
||||
"gatsby-plugin-sharp": "^4.24.0",
|
||||
"gatsby-plugin-sitemap": "^5.24.0",
|
||||
"gatsby-remark-autolink-headers": "^5.24.0",
|
||||
"gatsby-remark-copy-linked-files": "^5.24.0",
|
||||
"gatsby-plugin-react-helmet": "^6.8.0",
|
||||
"gatsby-plugin-react-helmet-canonical-urls": "^1.4.0",
|
||||
"gatsby-plugin-robots-txt": "^1.8.0",
|
||||
"gatsby-plugin-sass": "^6.8.0",
|
||||
"gatsby-plugin-sharp": "^5.8.0",
|
||||
"gatsby-plugin-sitemap": "^6.8.0",
|
||||
"gatsby-remark-autolink-headers": "^6.8.0",
|
||||
"gatsby-remark-copy-linked-files": "^6.8.0",
|
||||
"gatsby-remark-external-links": "0.0.4",
|
||||
"gatsby-remark-images": "^6.24.0",
|
||||
"gatsby-remark-images": "^7.8.0",
|
||||
"gatsby-remark-images-medium-zoom": "^1.7.0",
|
||||
"gatsby-remark-prismjs": "^6.24.0",
|
||||
"gatsby-remark-responsive-iframe": "^5.24.0",
|
||||
"gatsby-remark-smartypants": "^5.24.0",
|
||||
"gatsby-source-filesystem": "^4.24.0",
|
||||
"gatsby-transformer-remark": "^5.24.0",
|
||||
"gatsby-transformer-sharp": "^4.24.0",
|
||||
"gatsby-remark-prismjs": "^7.8.0",
|
||||
"gatsby-remark-responsive-iframe": "^6.8.0",
|
||||
"gatsby-remark-smartypants": "^6.8.0",
|
||||
"gatsby-source-filesystem": "^5.8.0",
|
||||
"gatsby-transformer-remark": "^6.8.0",
|
||||
"gatsby-transformer-sharp": "^5.8.0",
|
||||
"prismjs": "^1.29.0",
|
||||
"react": "^18.2.0",
|
||||
"react-cookie-consent": "^8.0.1",
|
||||
@@ -88,70 +89,69 @@
|
||||
"reading-time": "^1.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/config-conventional": "^17.2.0",
|
||||
"@commitlint/cz-commitlint": "^17.2.0",
|
||||
"@jest/globals": "^29.1.2",
|
||||
"@commitlint/config-conventional": "^17.4.4",
|
||||
"@commitlint/cz-commitlint": "^17.5.0",
|
||||
"@jest/globals": "^29.5.0",
|
||||
"@mastermindzh/eslint-config": "^1.0.2",
|
||||
"@mastermindzh/prettier-config": "^1.0.0",
|
||||
"@semantic-release/exec": "6.0.3",
|
||||
"@semantic-release/git": "10.0.1",
|
||||
"@swc/core": "^1.3.6",
|
||||
"@swc/jest": "^0.2.23",
|
||||
"@swc/core": "^1.3.42",
|
||||
"@swc/jest": "^0.2.24",
|
||||
"@types/gatsby-transformer-remark": "^2.9.1",
|
||||
"@types/jest": "^29.1.2",
|
||||
"@types/node": "^18.8.4",
|
||||
"@types/react": "^18.0.21",
|
||||
"@types/react-dom": "^18.0.6",
|
||||
"@types/react-helmet": "^6.1.5",
|
||||
"@types/jest": "^29.5.0",
|
||||
"@types/node": "^18.15.10",
|
||||
"@types/react": "^18.0.29",
|
||||
"@types/react-dom": "^18.0.11",
|
||||
"@types/react-helmet": "^6.1.6",
|
||||
"@types/react-test-renderer": "^18.0.0",
|
||||
"@types/react-toggle": "^4.0.3",
|
||||
"@types/sass": "^1.43.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.40.0",
|
||||
"@typescript-eslint/parser": "^5.40.0",
|
||||
"autoprefixer": "^10.4.12",
|
||||
"browserslist": "^4.21.4",
|
||||
"@typescript-eslint/eslint-plugin": "^5.56.0",
|
||||
"@typescript-eslint/parser": "^5.56.0",
|
||||
"autoprefixer": "^10.4.14",
|
||||
"browserslist": "^4.21.5",
|
||||
"codecov": "^3.8.3",
|
||||
"commitizen": "^4.2.5",
|
||||
"commitlint": "^17.2.0",
|
||||
"concurrently": "^7.4.0",
|
||||
"eslint": "^8.25.0",
|
||||
"commitizen": "^4.3.0",
|
||||
"commitlint": "^17.5.0",
|
||||
"concurrently": "^7.6.0",
|
||||
"eslint": "^8.36.0",
|
||||
"eslint-config-airbnb": "^19.0.4",
|
||||
"eslint-config-airbnb-typescript": "^17.0.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-config-prettier": "^8.8.0",
|
||||
"eslint-config-react-app": "^7.0.1",
|
||||
"eslint-import-resolver-typescript": "^3.5.1",
|
||||
"eslint-import-resolver-typescript": "^3.5.3",
|
||||
"eslint-plugin-flowtype": "^8.0.3",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jest": "^27.1.1",
|
||||
"eslint-plugin-jsx-a11y": "^6.6.1",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-jest": "^27.2.1",
|
||||
"eslint-plugin-jsx-a11y": "^6.7.1",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"eslint-plugin-react": "^7.31.10",
|
||||
"eslint-plugin-react": "^7.32.2",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"eslint-plugin-simple-import-sort": "^8.0.0",
|
||||
"husky": "8.0.1",
|
||||
"eslint-plugin-simple-import-sort": "^10.0.0",
|
||||
"husky": "^8.0.3",
|
||||
"identity-obj-proxy": "3.0.0",
|
||||
"jest": "^29.1.2",
|
||||
"jest-cli": "^29.1.2",
|
||||
"jest-environment-jsdom": "^29.1.2",
|
||||
"jest": "^29.5.0",
|
||||
"jest-cli": "^29.5.0",
|
||||
"jest-environment-jsdom": "^29.5.0",
|
||||
"jest-svg-transformer": "^1.0.0",
|
||||
"lint-staged": "^13.0.3",
|
||||
"lint-staged": "^13.2.0",
|
||||
"lost": "9.0.1",
|
||||
"markdownlint": "^0.26.2",
|
||||
"postcss": "^8.4.17",
|
||||
"postcss-scss": "^4.0.5",
|
||||
"prettier": "^2.7.1",
|
||||
"prettier-plugin-packagejson": "^2.3.0",
|
||||
"markdownlint": "^0.28.0",
|
||||
"postcss": "^8.4.21",
|
||||
"postcss-scss": "^4.0.6",
|
||||
"prettier": "^2.8.7",
|
||||
"prettier-plugin-packagejson": "^2.4.3",
|
||||
"react-test-renderer": "^18.2.0",
|
||||
"rimraf": "3.0.2",
|
||||
"sass": "^1.55.0",
|
||||
"rimraf": "^4.4.1",
|
||||
"sass": "^1.60.0",
|
||||
"source-map-support": "^0.5.21",
|
||||
"standard-version": "^9.5.0",
|
||||
"stylelint": "^14.13.0",
|
||||
"stylelint-config-recommended-scss": "^7.0.0",
|
||||
"stylelint-order": "^5.0.0",
|
||||
"stylelint-scss": "^4.3.0",
|
||||
"stylelint": "^15.3.0",
|
||||
"stylelint-config-recommended-scss": "^9.0.1",
|
||||
"stylelint-order": "^6.0.3",
|
||||
"stylelint-scss": "^4.6.0",
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "^4.8.4"
|
||||
"typescript": "^5.0.2"
|
||||
},
|
||||
"config": {
|
||||
"commitizen": {
|
||||
|
@@ -6,6 +6,10 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
.language-text {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
@media print {
|
||||
.hideInPrintView {
|
||||
display: none;
|
||||
|
@@ -10,9 +10,16 @@ interface Props {
|
||||
description?: string;
|
||||
socialImage?: string;
|
||||
children: React.ReactNode;
|
||||
noIndex?: boolean;
|
||||
}
|
||||
|
||||
const Layout: React.FC<Props> = ({ children, title, description, socialImage = "" }: Props) => {
|
||||
const Layout: React.FC<Props> = ({
|
||||
children,
|
||||
title,
|
||||
description,
|
||||
socialImage = "",
|
||||
noIndex = false,
|
||||
}: Props) => {
|
||||
const { author, url } = useSiteMetadata();
|
||||
const metaImage = socialImage || author.photo;
|
||||
const metaImageUrl = url + metaImage;
|
||||
@@ -29,6 +36,7 @@ const Layout: React.FC<Props> = ({ children, title, description, socialImage = "
|
||||
<meta name="twitter:title" content={title} />
|
||||
<meta name="twitter:description" content={description} />
|
||||
<meta name="twitter:image" content={metaImageUrl} />
|
||||
{noIndex && <meta name="robots" content="noindex" />}
|
||||
</Helmet>
|
||||
{children}
|
||||
<CookieBar />
|
||||
|
@@ -33,6 +33,7 @@ exports[`Content renders correctly 1`] = `
|
||||
onClick={[Function]}
|
||||
style={
|
||||
{
|
||||
"cursor": "pointer",
|
||||
"lineHeight": "50px",
|
||||
"marginRight": "10px",
|
||||
}
|
||||
@@ -111,7 +112,7 @@ exports[`Content renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -34,6 +34,7 @@ exports[`Post renders correctly 1`] = `
|
||||
onClick={[Function]}
|
||||
style={
|
||||
{
|
||||
"cursor": "pointer",
|
||||
"lineHeight": "50px",
|
||||
"marginRight": "10px",
|
||||
}
|
||||
@@ -112,7 +113,7 @@ exports[`Post renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -24,7 +24,10 @@ export const PostHeader: FunctionComponent<Props> = ({ author }) => {
|
||||
</span>
|
||||
|
||||
<span className="hideInPrintView">
|
||||
<a onClick={() => navigate(-1)} style={{ lineHeight: "50px", marginRight: "10px" }}>
|
||||
<a
|
||||
onClick={() => navigate("/")}
|
||||
style={{ lineHeight: "50px", marginRight: "10px", cursor: "pointer" }}
|
||||
>
|
||||
↩ Back to articles
|
||||
</a>
|
||||
<ThemeSwitcher showLabel={false} />
|
||||
|
@@ -221,7 +221,7 @@ exports[`Sidebar renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -14,17 +14,15 @@ const useCategoriesList = () => {
|
||||
graphql`
|
||||
query CategoriesListQuery {
|
||||
allMarkdownRemark(
|
||||
filter: {
|
||||
frontmatter: { template: { eq: "post" }, draft: { ne: true } }
|
||||
}
|
||||
filter: { frontmatter: { template: { eq: "post" }, draft: { ne: true } } }
|
||||
) {
|
||||
group(field: frontmatter___category) {
|
||||
group(field: { frontmatter: { category: SELECT } }) {
|
||||
fieldValue
|
||||
totalCount
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
`
|
||||
);
|
||||
|
||||
return allMarkdownRemark.group ?? [];
|
||||
|
@@ -14,17 +14,15 @@ const useTagsList = () => {
|
||||
graphql`
|
||||
query TagsListQuery {
|
||||
allMarkdownRemark(
|
||||
filter: {
|
||||
frontmatter: { template: { eq: "post" }, draft: { ne: true } }
|
||||
}
|
||||
filter: { frontmatter: { template: { eq: "post" }, draft: { ne: true } } }
|
||||
) {
|
||||
group(field: frontmatter___tags) {
|
||||
group(field: { frontmatter: { tags: SELECT } }) {
|
||||
fieldValue
|
||||
totalCount
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
`
|
||||
);
|
||||
|
||||
return allMarkdownRemark.group || [];
|
||||
|
@@ -222,7 +222,7 @@ exports[`CategoriesTemplate renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -21,14 +21,11 @@ const CategoryTemplate: React.FC<Props> = ({ data, pageContext }: Props) => {
|
||||
const { title: siteTitle, subtitle: siteSubtitle } = useSiteMetadata();
|
||||
|
||||
const { group, pagination } = pageContext;
|
||||
const { currentPage, prevPagePath, nextPagePath, hasPrevPage, hasNextPage } =
|
||||
pagination;
|
||||
const { currentPage, prevPagePath, nextPagePath, hasPrevPage, hasNextPage } = pagination;
|
||||
|
||||
const { edges } = data.allMarkdownRemark;
|
||||
const pageTitle =
|
||||
currentPage > 0
|
||||
? `${group} - Page ${currentPage} - ${siteTitle}`
|
||||
: `${group} - ${siteTitle}`;
|
||||
currentPage > 0 ? `${group} - Page ${currentPage} - ${siteTitle}` : `${group} - ${siteTitle}`;
|
||||
|
||||
return (
|
||||
<Layout title={pageTitle} description={siteSubtitle}>
|
||||
@@ -52,13 +49,9 @@ export const query = graphql`
|
||||
limit: $limit
|
||||
skip: $offset
|
||||
filter: {
|
||||
frontmatter: {
|
||||
category: { eq: $group }
|
||||
template: { eq: "post" }
|
||||
draft: { ne: true }
|
||||
}
|
||||
frontmatter: { category: { eq: $group }, template: { eq: "post" }, draft: { ne: true } }
|
||||
}
|
||||
sort: { order: DESC, fields: [frontmatter___date] }
|
||||
sort: { frontmatter: { date: DESC } }
|
||||
) {
|
||||
edges {
|
||||
node {
|
||||
|
@@ -222,7 +222,7 @@ exports[`CategoryTemplate renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -46,7 +46,7 @@ export const query = graphql`
|
||||
allMarkdownRemark(
|
||||
limit: $limit
|
||||
skip: $offset
|
||||
sort: { order: DESC, fields: [frontmatter___date] }
|
||||
sort: { frontmatter: { date: DESC } }
|
||||
filter: { frontmatter: { template: { eq: "post" }, draft: { ne: true } } }
|
||||
) {
|
||||
edges {
|
||||
|
@@ -222,7 +222,7 @@ exports[`IndexTemplate renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -222,7 +222,7 @@ exports[`NotFoundTemplate renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -25,7 +25,7 @@ const PageTemplate: React.FC<Props> = ({ data }: Props) => {
|
||||
<Layout
|
||||
title={`${title} - ${siteTitle}`}
|
||||
description={metaDescription}
|
||||
socialImage={socialImage}
|
||||
socialImage={socialImage?.publicURL}
|
||||
>
|
||||
<Sidebar />
|
||||
<Page title={title}>
|
||||
@@ -44,7 +44,9 @@ export const query = graphql`
|
||||
title
|
||||
date
|
||||
description
|
||||
socialImage
|
||||
socialImage {
|
||||
publicURL
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -222,7 +222,7 @@ exports[`PageTemplate renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -23,7 +23,7 @@ const PostTemplate: React.FC<Props> = ({ data }: Props) => {
|
||||
<Layout
|
||||
title={`${title} - ${siteTitle}`}
|
||||
description={metaDescription}
|
||||
socialImage={socialImage}
|
||||
socialImage={socialImage?.publicURL}
|
||||
>
|
||||
<Post post={data.markdownRemark} />
|
||||
</Layout>
|
||||
@@ -47,7 +47,9 @@ export const query = graphql`
|
||||
description
|
||||
tags
|
||||
title
|
||||
socialImage
|
||||
socialImage {
|
||||
publicURL
|
||||
}
|
||||
disqusId
|
||||
}
|
||||
}
|
||||
|
@@ -35,6 +35,7 @@ exports[`PostTemplate renders correctly 1`] = `
|
||||
onClick={[Function]}
|
||||
style={
|
||||
{
|
||||
"cursor": "pointer",
|
||||
"lineHeight": "50px",
|
||||
"marginRight": "10px",
|
||||
}
|
||||
@@ -113,7 +114,7 @@ exports[`PostTemplate renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -21,17 +21,14 @@ const TagTemplate: React.FC<Props> = ({ data, pageContext }: Props) => {
|
||||
const { title: siteTitle, subtitle: siteSubtitle } = useSiteMetadata();
|
||||
|
||||
const { group, pagination } = pageContext;
|
||||
const { currentPage, prevPagePath, nextPagePath, hasPrevPage, hasNextPage } =
|
||||
pagination;
|
||||
const { currentPage, prevPagePath, nextPagePath, hasPrevPage, hasNextPage } = pagination;
|
||||
|
||||
const { edges } = data.allMarkdownRemark;
|
||||
const pageTitle =
|
||||
currentPage > 0
|
||||
? `${group} - Page ${currentPage} - ${siteTitle}`
|
||||
: `${group} - ${siteTitle}`;
|
||||
currentPage > 0 ? `${group} - Page ${currentPage} - ${siteTitle}` : `${group} - ${siteTitle}`;
|
||||
|
||||
return (
|
||||
<Layout title={pageTitle} description={siteSubtitle}>
|
||||
<Layout title={pageTitle} description={siteSubtitle} noIndex>
|
||||
<Sidebar />
|
||||
<Page title={group}>
|
||||
<Feed edges={edges} />
|
||||
@@ -58,13 +55,9 @@ export const query = graphql`
|
||||
limit: $limit
|
||||
skip: $offset
|
||||
filter: {
|
||||
frontmatter: {
|
||||
tags: { in: [$group] }
|
||||
template: { eq: "post" }
|
||||
draft: { ne: true }
|
||||
}
|
||||
frontmatter: { tags: { in: [$group] }, template: { eq: "post" }, draft: { ne: true } }
|
||||
}
|
||||
sort: { order: DESC, fields: [frontmatter___date] }
|
||||
sort: { frontmatter: { date: DESC } }
|
||||
) {
|
||||
edges {
|
||||
node {
|
||||
|
@@ -222,7 +222,7 @@ exports[`TagTemplate renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -222,7 +222,7 @@ exports[`TagsTemplate renders correctly 1`] = `
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM352 256c0 53-43 96-96 96s-96-43-96-96s43-96 96-96s96 43 96 96zm32 0c0-70.7-57.3-128-128-128s-128 57.3-128 128s57.3 128 128 128s128-57.3 128-128z"
|
||||
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
|
||||
fill="currentColor"
|
||||
style={{}}
|
||||
/>
|
||||
|
@@ -5,7 +5,7 @@ interface Frontmatter {
|
||||
template: string;
|
||||
description?: string;
|
||||
tags?: Array<string>;
|
||||
socialImage?: string;
|
||||
socialImage?: { publicURL: string };
|
||||
disqusId?: string;
|
||||
}
|
||||
|
||||
|
@@ -66,6 +66,14 @@ RewriteRule ^(.*)$ http://www.mastermindzh.com/$1 [L,R=301]
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
|
||||
<Files *.html>
|
||||
FileETag None
|
||||
Header unset ETag
|
||||
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
|
||||
Header set Pragma "no-cache"
|
||||
Header set Expires "Thu, 1 Jan 1970 00:00:00 UTC"
|
||||
</Files>
|
||||
|
||||
# redirect old blog pages
|
||||
Redirect /home /
|
||||
Redirect /cookies /pages/legal/cookies
|
||||
|
BIN
static/content/me.png
Normal file
After Width: | Height: | Size: 49 KiB |