Compare commits
4 Commits
8ff3722780
...
053b5784aa
Author | SHA1 | Date |
---|---|---|
Maik de Kruif | 053b5784aa | 1 month ago |
Maik de Kruif | 543522ea7f | 1 month ago |
Maik de Kruif | d92074b59b | 1 month ago |
Maik de Kruif | 537dcd6536 | 1 month ago |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 1.5 MiB |
After Width: | Height: | Size: 5.2 MiB |
After Width: | Height: | Size: 572 KiB |
After Width: | Height: | Size: 174 KiB |
After Width: | Height: | Size: 630 KiB |
@ -0,0 +1,23 @@ |
|||||||
|
+++ |
||||||
|
author = "Maik de Kruif" |
||||||
|
title = "Advent of Code" |
||||||
|
start_date = 2020-10-15 |
||||||
|
end_date = 2099-05-04 |
||||||
|
company_name = "Personal" |
||||||
|
company_url = "https://maik.dev" |
||||||
|
cover = "img/portfolio/adventofcode/screenshot.png" |
||||||
|
description = "Advent of Code is an annual programming event that presents daily coding puzzles. I actively participate in the events, solving the challenges and improving my coding skills." |
||||||
|
source_code = "https://github.com/maikka39/Advent-of-Code" |
||||||
|
skills = [ |
||||||
|
"Problem-solving", |
||||||
|
"Programming efficiency", |
||||||
|
"Time management", |
||||||
|
] |
||||||
|
+++ |
||||||
|
|
||||||
|
|
||||||
|
[Advent of Code](https://adventofcode.com/) is a popular annual programming event that presents a series of coding puzzles, one for each day of December until Christmas. Each puzzle involves solving a problem using a programming language of your choice, with (generally) increasing difficulty as the event progresses. |
||||||
|
|
||||||
|
I actively participate in Advent of Code, relishing the daily challenges and the opportunity to sharpen my coding skills. The puzzles covered a wide range of topics, from string manipulation and data structures to algorithms and game theory. |
||||||
|
|
||||||
|
By consistently solving the puzzles, I hone my problem-solving abilities, improve my understanding of different programming paradigms, and discover new and innovative approaches to coding challenges. |
@ -0,0 +1,26 @@ |
|||||||
|
+++ |
||||||
|
author = "Maik de Kruif" |
||||||
|
title = "Google Foobar" |
||||||
|
start_date = 2020-10-15 |
||||||
|
end_date = 2021-05-04 |
||||||
|
company_name = "Personal" |
||||||
|
company_url = "https://maik.dev" |
||||||
|
cover = "img/portfolio/google-foobar/screenshot.png" |
||||||
|
description = "Google Foobar is a mysterious coding challenge platform launched by Google. I successfully solved all the challenges presented by the platform, showcasing my coding abilities and problem-solving skills." |
||||||
|
source_code = "https://github.com/maikka39/Google-Foobar" |
||||||
|
skills = [ |
||||||
|
"Problem-solving", |
||||||
|
"Algorithm design", |
||||||
|
"Time management", |
||||||
|
] |
||||||
|
+++ |
||||||
|
|
||||||
|
Google Foobar is a mysterious coding challenge platform launched by Google. It's designed to identify exceptional engineering talent through a series of progressively difficult coding problems. The platform's unique approach involves inviting users to solve challenges directly via the Google Search page, adding an element of intrigue and surprise. |
||||||
|
|
||||||
|
I was fortunate enough to receive an invitation to Google Foobar. The initial challenge was a simple warm-up, but subsequent levels escalated in complexity, requiring me to delve into various algorithms and data structures. |
||||||
|
|
||||||
|
Throughout my journey, I faced a diverse range of problems, from graph traversal and dynamic programming to string manipulation and number theory. Each challenge presented a unique opportunity to test my problem-solving skills and explore new coding techniques. |
||||||
|
|
||||||
|
With dedication and perseverance, I managed to successfully solve all the challenges presented by Google Foobar. It was a rewarding experience that allowed me to showcase my coding abilities and learn new maths concepts. |
||||||
|
|
||||||
|
~~If you're a passionate coder looking for a stimulating challenge, Google Foobar is definitely worth exploring. It's a great way to test your skills, learn new concepts, and potentially open doors to exciting opportunities.~~ Unfortunately, Google shut down the platform, and the challenges are no longer available. You can still try them by taking a look at the challenge texts in my GitHub repo, by clicking the link at the top of this post. |
@ -0,0 +1,21 @@ |
|||||||
|
+++ |
||||||
|
author = "Maik de Kruif" |
||||||
|
title = "MailServerSetup" |
||||||
|
start_date = 2021-04-22 |
||||||
|
end_date = 2021-06-24 |
||||||
|
company_name = "Personal" |
||||||
|
company_url = "https://maik.dev" |
||||||
|
description = "A script that automates the grueling process of installing and setting up an email server. It perfectly reproduces my successful steps to ensure the same setup time and time again, now with many improvements." |
||||||
|
source_code = "https://github.com/maikka39/MailServerSetup" |
||||||
|
skills = [ |
||||||
|
"Mailing protocol", |
||||||
|
"SPF, DKIM, DMARC", |
||||||
|
"Bash scripting", |
||||||
|
] |
||||||
|
+++ |
||||||
|
|
||||||
|
A script that automates the grueling process of installing and setting up an email server. It perfectly reproduces my successful steps to ensure the same setup time and time again, now with many improvements. |
||||||
|
|
||||||
|
MailServerSetup ensures a consistent and efficient deployment. It leverages Postfix, Dovecot, and SpamAssassin, providing an all-round email solution. |
||||||
|
|
||||||
|
Simply specify your desired domain, and the script will handle the setup, including generating the necessary SPF, DMARC, and DKIM records and providing them to you. |
@ -0,0 +1,32 @@ |
|||||||
|
+++ |
||||||
|
author = "Maik de Kruif" |
||||||
|
title = "MinecraftClient" |
||||||
|
start_date = 2022-08-30 |
||||||
|
end_date = 2022-12-29 |
||||||
|
company_name = "Personal" |
||||||
|
company_url = "https://maik.dev" |
||||||
|
cover = "img/portfolio/minecraft-client/cover.png" |
||||||
|
description = "A Minecraft client that was designed to overcome a series of challenges presented by a YouTuber named LiveOverflow. The client was built using Kotlin and Fabric, and it featured creative solutions to bypass the server's defenses." |
||||||
|
source_code = "https://github.com/maikka39/MinecraftClient" |
||||||
|
skills = [ |
||||||
|
"Java code injection", |
||||||
|
"Reverse engineering", |
||||||
|
"Java & Gradle", |
||||||
|
] |
||||||
|
+++ |
||||||
|
|
||||||
|
A Minecraft client that was designed to overcome a series of challenges presented by a YouTuber named LiveOverflow. The client was built using Kotlin and Fabric, and it featured creative solutions to bypass the server's defenses. |
||||||
|
|
||||||
|
LiveOverflow set up a secret Minecraft server with a twist: finding it was the first challenge. After some clever detective work, including exploiting a slip-up in one of LiveOverflow's videos, I gained access. |
||||||
|
|
||||||
|
The real fun began with the server's challenges. One required the client to move the player in a way that mimicked a bot, not a human. This meant overcoming the limitations of how computers represent numbers to ensure the server wouldn't detect "human-like" rounding errors. |
||||||
|
|
||||||
|
Another challenge involved reaching a protected chest. The initial solution involved some trickery, but the server was patched. To adapt, the client needed to exploit a loophole in how the server tracked player movement. By manipulating the game's internal state and sending carefully crafted packets, the client achieved imperceptible movements, bypassing the server's defenses. |
||||||
|
|
||||||
|
Reverse engineering the server's code was crucial in finding these exploits. By understanding the server's logic and implementation, I could identify vulnerabilities and devise strategies to exploit them. This process required a deep dive into the Minecraft server's source code and a keen eye for potential weaknesses. |
||||||
|
|
||||||
|
The code for this client was written in Kotlin and injected into the Minecraft client using Fabric. This approach allowed for flexibility and customization, perfectly suited for tackling the server's unique challenges. |
||||||
|
|
||||||
|
This project was a fascinating exploration of Minecraft's inner workings and the creativity required to overcome seemingly impossible challenges. As new challenges emerge, this client was ready to evolve and conquer them! |
||||||
|
|
||||||
|
See also [my post about the experience]({{% ref "posts/liveoverflow-minecraft-server.md" %}}) for a more in-depth explanation. |
@ -0,0 +1,32 @@ |
|||||||
|
+++ |
||||||
|
author = "Maik de Kruif" |
||||||
|
title = "UnEngine" |
||||||
|
start_date = 2022-11-09 |
||||||
|
end_date = 2022-12-22 |
||||||
|
company_name = "Personal" |
||||||
|
company_url = "https://maik.dev" |
||||||
|
cover = "img/portfolio/unengine/screenshot.png" |
||||||
|
description = "Together with three other students, I built a game engine from the ground up using C++. To put our engine to the test, we also developed a fun racing game." |
||||||
|
skills = [ |
||||||
|
"Low level programming", |
||||||
|
"Game engine architecture", |
||||||
|
"Event-driven programming", |
||||||
|
"Networking", |
||||||
|
"Teamwork", |
||||||
|
] |
||||||
|
|
||||||
|
[source_code] |
||||||
|
engine = "https://github.com/Systems-Programming-in-C-Minor/engine" |
||||||
|
game = "https://github.com/Systems-Programming-in-C-Minor/game" |
||||||
|
server = "https://github.com/Systems-Programming-in-C-Minor/server" |
||||||
|
+++ |
||||||
|
|
||||||
|
Together with three other students, I built a game engine from the ground up using C++. To put our engine to the test, we also developed a fun racing game. |
||||||
|
|
||||||
|
The racing game offered a variety of features: AI-controlled opponents that challenged players, controller support for a more immersive experience, local multiplayer for split-screen fun, and online multiplayer capabilities using a game server. |
||||||
|
|
||||||
|
To add variety and replayability, we included multiple maps and game modes. Players could race on different tracks, each with its own unique challenges, obstacles and sound effects. |
||||||
|
|
||||||
|
Our game engine was crafted using C++ and SDL2, and provided the foundation for our racing game. We adopted an event-driven architecture, allowing our engine to efficiently handle various inputs and events. To create a realistic experience, we implemented physics calculations for collisions, speed, and traction. |
||||||
|
|
||||||
|
To enhance the audio experience, we developed a sound engine that allowed us to incorporate a variety of sound effects into our game. To optimize performance and memory usage, we implemented texture pooling, which efficiently manages and reuses textures. Finally, to enable multiplayer functionality, we integrated networking capabilities into our engine, allowing players to connect and compete with each other online. |
@ -1,66 +1,175 @@ |
|||||||
{{ define "main" }} |
{{ define "main" }} |
||||||
<main class="post"> |
<main class="post"> |
||||||
|
|
||||||
<div class="post-info"> |
<div class="post-info"> |
||||||
{{ if .IsTranslated }} |
<p> |
||||||
{{ i18n "postAvailable" }} |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
||||||
{{ range .Translations }} |
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
||||||
<a href="{{ .Permalink }}"><span |
class="feather feather-clock"> |
||||||
class="flag flag-icon flag-icon-{{ index $.Site.Data.langFlags (.Lang) }} flag-icon-squared"></span></a> |
<circle cx="12" cy="12" r="10"></circle> |
||||||
{{ end}} |
<polyline points="12 6 12 12 16 14"></polyline> |
||||||
{{ end }} |
</svg> |
||||||
|
{{ i18n "readingTime" .Page.ReadingTime }} |
||||||
|
|
||||||
|
{{- if .IsTranslated }} | {{ i18n "postAvailable" }} |
||||||
|
{{- range .Translations }} |
||||||
|
<a href="{{ .Permalink }}"><span |
||||||
|
class="flag flag-icon flag-icon-{{ index $.Site.Data.langFlags (.Lang) }} flag-icon-squared"></span></a> |
||||||
|
{{- end}} |
||||||
|
{{- end }} |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
|
||||||
|
<article> |
||||||
|
<h1 class="post-title"> |
||||||
|
<a href="{{ .Permalink }}">{{ .Title | markdownify }}</a> |
||||||
|
</h1> |
||||||
|
{{- with .Params.Subtitle }} |
||||||
|
<p class="post-subtitle">{{ . | markdownify }}</p> |
||||||
|
{{- end }} |
||||||
|
|
||||||
|
{{- if .Params.Cover }} |
||||||
|
{{- partial "image.html" (dict "path" .Params.Cover "alt" (.Title | plainify) "class" "post-cover") }} |
||||||
|
{{- end }} |
||||||
|
|
||||||
|
{{- if .Params.toc }} |
||||||
|
<hr /> |
||||||
|
<aside id="toc"> |
||||||
|
<div class="toc-title">{{ i18n "tableOfContents" }}</div> |
||||||
|
{{ .TableOfContents }} |
||||||
|
</aside> |
||||||
|
<hr /> |
||||||
|
{{- end }} |
||||||
|
|
||||||
|
<div class="post-content"> |
||||||
|
{{ .Content }} |
||||||
</div> |
</div> |
||||||
|
</article> |
||||||
|
|
||||||
<article> |
<hr /> |
||||||
<h2 class="post-title"><a href="{{ .Permalink }}">{{ .Title | markdownify }}</a></h2> |
|
||||||
|
|
||||||
{{- if .Params.toc }} |
<div class="post-info"> |
||||||
<hr /> |
{{- with .Params.tags }} |
||||||
<aside id="toc"> |
<p> |
||||||
<div class="toc-title">{{ i18n "tableOfContents" }}</div> |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
||||||
{{ .TableOfContents }} |
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
||||||
</aside> |
class="feather feather-tag meta-icon"> |
||||||
<hr /> |
<path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path> |
||||||
{{- end }} |
<line x1="7" y1="7" x2="7" y2="7"></line> |
||||||
|
</svg> |
||||||
|
|
||||||
{{- with .Params.Cover }} |
{{- range . -}} |
||||||
{{- partial "image.html" (dict "path" . "alt" "" "class" "post-cover") }} |
<span class="tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}/">{{.}}</a></span> |
||||||
{{- end }} |
{{- end }} |
||||||
|
</p> |
||||||
|
{{- end }} |
||||||
|
|
||||||
<div class="post-content"> |
<p> |
||||||
{{ .Content }} |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
||||||
</div> |
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
||||||
</article> |
class="feather feather-file-text"> |
||||||
|
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> |
||||||
|
<polyline points="14 2 14 8 20 8"></polyline> |
||||||
|
<line x1="16" y1="13" x2="8" y2="13"></line> |
||||||
|
<line x1="16" y1="17" x2="8" y2="17"></line> |
||||||
|
<polyline points="10 9 9 9 8 9"></polyline> |
||||||
|
</svg> |
||||||
|
{{ i18n "wordCount" .Page.WordCount }} |
||||||
|
</p> |
||||||
|
|
||||||
<hr /> |
{{- if and (default true .Params.showPageViews) (default true .Site.Params.showPageViews) }} |
||||||
|
{{- if .Site.Params.goatCounter }} |
||||||
|
<p> |
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
||||||
|
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
||||||
|
class="feather feather-activity"> |
||||||
|
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path> |
||||||
|
<circle cx="12" cy="12" r="3"></circle> |
||||||
|
</svg> |
||||||
|
{{- partial "page_views.html" . -}} |
||||||
|
</p> |
||||||
|
{{- end }} |
||||||
|
{{- end }} |
||||||
|
|
||||||
|
<p> |
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
||||||
|
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
||||||
|
class="feather feather-calendar"> |
||||||
|
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect> |
||||||
|
<line x1="16" y1="2" x2="16" y2="6"></line> |
||||||
|
<line x1="8" y1="2" x2="8" y2="6"></line> |
||||||
|
<line x1="3" y1="10" x2="21" y2="10"></line> |
||||||
|
</svg> |
||||||
|
{{- $dateFormat := default "2006-01-02 15:04 -0700" .Site.Params.dateformNumTime }} |
||||||
|
{{ dateFormat $dateFormat .Date.Local }} |
||||||
|
</p> |
||||||
|
|
||||||
<div class="post-info"> |
{{- if .GitInfo }} |
||||||
{{- with .Params.tags }} |
<p> |
||||||
<p> |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
class="feather feather-git-commit"> |
||||||
class="feather feather-tag meta-icon"> |
<circle cx="12" cy="12" r="4"></circle> |
||||||
<path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path> |
<line x1="1.05" y1="12" x2="7" y2="12"></line> |
||||||
<line x1="7" y1="7" x2="7" y2="7"></line> |
<line x1="17.01" y1="12" x2="22.96" y2="12"></line> |
||||||
</svg> |
</svg> |
||||||
{{- range . -}} |
|
||||||
<span class="tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}">{{.}}</a></span> |
<a href="{{ .Site.Params.gitUrl -}}{{ .GitInfo.Hash }}" target="_blank" |
||||||
{{- end }} |
rel="noopener">{{ .GitInfo.AbbreviatedHash }}</a> |
||||||
</p> |
{{- " @ " -}} |
||||||
{{- end }} |
{{- if .Site.Params.dateformNum -}} |
||||||
|
{{ dateFormat .Site.Params.dateformNum .GitInfo.AuthorDate.Local }} |
||||||
{{- if .GitInfo }} |
{{- else -}} |
||||||
<p><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
{{ dateFormat "2006-01-02" .GitInfo.AuthorDate.Local }} |
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
{{- end }} |
||||||
class="feather feather-git-commit"> |
</p> |
||||||
<circle cx="12" cy="12" r="4"></circle> |
{{- end }} |
||||||
<line x1="1.05" y1="12" x2="7" y2="12"></line> |
</div> |
||||||
<line x1="17.01" y1="12" x2="22.96" y2="12"></line> |
|
||||||
</svg><a href="{{ .Site.Params.gitUrl -}}{{ .GitInfo.Hash }}" target="_blank" |
{{- if .Site.Params.EnableSharingButtons }} |
||||||
rel="noopener">{{ .GitInfo.AbbreviatedHash }}</a> @ |
<hr /> |
||||||
{{ if .Site.Params.dateformNum }}{{ dateFormat .Site.Params.dateformNum .GitInfo.AuthorDate.Local }}{{ else }}{{ dateFormat "2006-01-02" .GitInfo.AuthorDate.Local }}{{ end }} |
<div class="sharing-buttons"> |
||||||
</p> |
{{ partial "sharing-buttons.html" . }} |
||||||
{{- end }} |
</div> |
||||||
|
{{- end }} |
||||||
|
|
||||||
|
{{- if and (not $.Site.Params.DisableReadOtherPosts) (or .NextInSection .PrevInSection) }} |
||||||
|
<div class="pagination"> |
||||||
|
<div class="pagination__title"> |
||||||
|
<span class="pagination__title-h">{{ .Site.Params.ReadOtherPosts }}</span> |
||||||
|
<hr /> |
||||||
</div> |
</div> |
||||||
|
|
||||||
|
<div class="pagination__buttons"> |
||||||
|
{{- if .NextInSection }} |
||||||
|
<span class="button previous"> |
||||||
|
<a href="{{ .NextInSection.Permalink }}"> |
||||||
|
<span class="button__icon">←</span> |
||||||
|
<span class="button__text">{{ .NextInSection.Title }}</span> |
||||||
|
</a> |
||||||
|
</span> |
||||||
|
{{- end }} |
||||||
|
|
||||||
|
{{- if .PrevInSection }} |
||||||
|
<span class="button next"> |
||||||
|
<a href="{{ .PrevInSection.Permalink }}"> |
||||||
|
<span class="button__text">{{ .PrevInSection.Title }}</span> |
||||||
|
<span class="button__icon">→</span> |
||||||
|
</a> |
||||||
|
</span> |
||||||
|
{{- end }} |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
{{- end }} |
||||||
|
|
||||||
|
|
||||||
|
{{- if .Site.Config.Services.Disqus.Shortname }} |
||||||
|
{{- if not (eq .Params.Comments "false") }} |
||||||
|
<div id="comments"> |
||||||
|
{{ template "_internal/disqus.html" . }} |
||||||
|
</div> |
||||||
|
{{- end }} |
||||||
|
{{- end }} |
||||||
|
|
||||||
</main> |
</main> |
||||||
{{ end }} |
{{ end }} |
@ -1,178 +0,0 @@ |
|||||||
{{ define "main" }} |
|
||||||
<main class="post"> |
|
||||||
|
|
||||||
<div class="post-info"> |
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-clock"> |
|
||||||
<circle cx="12" cy="12" r="10"></circle> |
|
||||||
<polyline points="12 6 12 12 16 14"></polyline> |
|
||||||
</svg> |
|
||||||
{{ i18n "readingTime" .Page.ReadingTime }} |
|
||||||
|
|
||||||
{{- if .IsTranslated }} | {{ i18n "postAvailable" }} |
|
||||||
{{- range .Translations }} |
|
||||||
<a href="{{ .Permalink }}"><span |
|
||||||
class="flag flag-icon flag-icon-{{ index $.Site.Data.langFlags (.Lang) }} flag-icon-squared"></span></a> |
|
||||||
{{- end}} |
|
||||||
{{- end }} |
|
||||||
</p> |
|
||||||
</div> |
|
||||||
|
|
||||||
<article> |
|
||||||
<h1 class="post-title"> |
|
||||||
<a href="{{ .Permalink }}">{{ .Title | markdownify }}</a> |
|
||||||
</h1> |
|
||||||
{{- with .Params.Subtitle }} |
|
||||||
<p class="post-subtitle">{{ . | markdownify }}</p> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
{{- if .Params.toc }} |
|
||||||
<hr /> |
|
||||||
<aside id="toc"> |
|
||||||
<div class="toc-title">{{ i18n "tableOfContents" }}</div> |
|
||||||
{{ .TableOfContents }} |
|
||||||
</aside> |
|
||||||
<hr /> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
{{- if .Params.Cover }} |
|
||||||
{{- partial "image.html" (dict "path" .Params.Cover "alt" (.Title | plainify) "class" "post-cover") }} |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
<div class="post-content"> |
|
||||||
{{ .Content }} |
|
||||||
</div> |
|
||||||
</article> |
|
||||||
|
|
||||||
<hr /> |
|
||||||
|
|
||||||
<div class="post-info"> |
|
||||||
{{- with .Params.tags }} |
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-tag meta-icon"> |
|
||||||
<path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path> |
|
||||||
<line x1="7" y1="7" x2="7" y2="7"></line> |
|
||||||
</svg> |
|
||||||
|
|
||||||
{{- range . -}} |
|
||||||
<span class="tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}/">{{.}}</a></span> |
|
||||||
{{- end }} |
|
||||||
</p> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-file-text"> |
|
||||||
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> |
|
||||||
<polyline points="14 2 14 8 20 8"></polyline> |
|
||||||
<line x1="16" y1="13" x2="8" y2="13"></line> |
|
||||||
<line x1="16" y1="17" x2="8" y2="17"></line> |
|
||||||
<polyline points="10 9 9 9 8 9"></polyline> |
|
||||||
</svg> |
|
||||||
{{ i18n "wordCount" .Page.WordCount }} |
|
||||||
</p> |
|
||||||
|
|
||||||
{{- if and (default true .Params.showPageViews) (default true .Site.Params.showPageViews) }} |
|
||||||
{{- if .Site.Params.goatCounter }} |
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-activity"> |
|
||||||
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path> |
|
||||||
<circle cx="12" cy="12" r="3"></circle> |
|
||||||
</svg> |
|
||||||
{{- partial "page_views.html" . -}} |
|
||||||
</p> |
|
||||||
{{- end }} |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-calendar"> |
|
||||||
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect> |
|
||||||
<line x1="16" y1="2" x2="16" y2="6"></line> |
|
||||||
<line x1="8" y1="2" x2="8" y2="6"></line> |
|
||||||
<line x1="3" y1="10" x2="21" y2="10"></line> |
|
||||||
</svg> |
|
||||||
{{- if .Site.Params.dateformNumTime }} |
|
||||||
{{ dateFormat .Site.Params.dateformNumTime .Date.Local }} |
|
||||||
{{- else }} |
|
||||||
{{ dateFormat "2006-01-02 15:04 -0700" .Date.Local }} |
|
||||||
{{- end }} |
|
||||||
</p> |
|
||||||
|
|
||||||
{{- if .GitInfo }} |
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-git-commit"> |
|
||||||
<circle cx="12" cy="12" r="4"></circle> |
|
||||||
<line x1="1.05" y1="12" x2="7" y2="12"></line> |
|
||||||
<line x1="17.01" y1="12" x2="22.96" y2="12"></line> |
|
||||||
</svg> |
|
||||||
|
|
||||||
<a href="{{ .Site.Params.gitUrl -}}{{ .GitInfo.Hash }}" target="_blank" |
|
||||||
rel="noopener">{{ .GitInfo.AbbreviatedHash }}</a> |
|
||||||
{{- " @ " -}} |
|
||||||
{{- if .Site.Params.dateformNum -}} |
|
||||||
{{ dateFormat .Site.Params.dateformNum .GitInfo.AuthorDate.Local }} |
|
||||||
{{- else -}} |
|
||||||
{{ dateFormat "2006-01-02" .GitInfo.AuthorDate.Local }} |
|
||||||
{{- end }} |
|
||||||
</p> |
|
||||||
{{- end }} |
|
||||||
</div> |
|
||||||
|
|
||||||
{{- if .Site.Params.EnableSharingButtons }} |
|
||||||
<hr /> |
|
||||||
<div class="sharing-buttons"> |
|
||||||
{{ partial "sharing-buttons.html" . }} |
|
||||||
</div> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
{{- if and (not $.Site.Params.DisableReadOtherPosts) (or .NextInSection .PrevInSection) }} |
|
||||||
<div class="pagination"> |
|
||||||
<div class="pagination__title"> |
|
||||||
<span class="pagination__title-h">{{ .Site.Params.ReadOtherPosts }}</span> |
|
||||||
<hr /> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="pagination__buttons"> |
|
||||||
{{- if .NextInSection }} |
|
||||||
<span class="button previous"> |
|
||||||
<a href="{{ .NextInSection.Permalink }}"> |
|
||||||
<span class="button__icon">←</span> |
|
||||||
<span class="button__text">{{ .NextInSection.Title }}</span> |
|
||||||
</a> |
|
||||||
</span> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
{{- if .PrevInSection }} |
|
||||||
<span class="button next"> |
|
||||||
<a href="{{ .PrevInSection.Permalink }}"> |
|
||||||
<span class="button__text">{{ .PrevInSection.Title }}</span> |
|
||||||
<span class="button__icon">→</span> |
|
||||||
</a> |
|
||||||
</span> |
|
||||||
{{- end }} |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
|
|
||||||
{{- if .Site.Config.Services.Disqus.Shortname }} |
|
||||||
{{- if not (eq .Params.Comments "false") }} |
|
||||||
<div id="comments"> |
|
||||||
{{ template "_internal/disqus.html" . }} |
|
||||||
</div> |
|
||||||
{{- end }} |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
</main> |
|
||||||
{{ end }} |
|
@ -1,178 +0,0 @@ |
|||||||
{{ define "main" }} |
|
||||||
<main class="post"> |
|
||||||
|
|
||||||
<div class="post-info"> |
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-clock"> |
|
||||||
<circle cx="12" cy="12" r="10"></circle> |
|
||||||
<polyline points="12 6 12 12 16 14"></polyline> |
|
||||||
</svg> |
|
||||||
{{ i18n "readingTime" .Page.ReadingTime }} |
|
||||||
|
|
||||||
{{- if .IsTranslated }} | {{ i18n "postAvailable" }} |
|
||||||
{{- range .Translations }} |
|
||||||
<a href="{{ .Permalink }}"><span |
|
||||||
class="flag flag-icon flag-icon-{{ index $.Site.Data.langFlags (.Lang) }} flag-icon-squared"></span></a> |
|
||||||
{{- end}} |
|
||||||
{{- end }} |
|
||||||
</p> |
|
||||||
</div> |
|
||||||
|
|
||||||
<article> |
|
||||||
<h1 class="post-title"> |
|
||||||
<a href="{{ .Permalink }}">{{ .Title | markdownify }}</a> |
|
||||||
</h1> |
|
||||||
{{- with .Params.Subtitle }} |
|
||||||
<p class="post-subtitle">{{ . | markdownify }}</p> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
{{- if .Params.toc }} |
|
||||||
<hr /> |
|
||||||
<aside id="toc"> |
|
||||||
<div class="toc-title">{{ i18n "tableOfContents" }}</div> |
|
||||||
{{ .TableOfContents }} |
|
||||||
</aside> |
|
||||||
<hr /> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
{{- if .Params.Cover }} |
|
||||||
{{- partial "image.html" (dict "path" .Params.Cover "alt" (.Title | plainify) "class" "post-cover") }} |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
<div class="post-content"> |
|
||||||
{{ .Content }} |
|
||||||
</div> |
|
||||||
</article> |
|
||||||
|
|
||||||
<hr /> |
|
||||||
|
|
||||||
<div class="post-info"> |
|
||||||
{{- with .Params.tags }} |
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-tag meta-icon"> |
|
||||||
<path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"></path> |
|
||||||
<line x1="7" y1="7" x2="7" y2="7"></line> |
|
||||||
</svg> |
|
||||||
|
|
||||||
{{- range . -}} |
|
||||||
<span class="tag"><a href="{{ "tags/" | absLangURL }}{{ . | urlize }}/">{{.}}</a></span> |
|
||||||
{{- end }} |
|
||||||
</p> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-file-text"> |
|
||||||
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path> |
|
||||||
<polyline points="14 2 14 8 20 8"></polyline> |
|
||||||
<line x1="16" y1="13" x2="8" y2="13"></line> |
|
||||||
<line x1="16" y1="17" x2="8" y2="17"></line> |
|
||||||
<polyline points="10 9 9 9 8 9"></polyline> |
|
||||||
</svg> |
|
||||||
{{ i18n "wordCount" .Page.WordCount }} |
|
||||||
</p> |
|
||||||
|
|
||||||
{{- if and (default true .Params.showPageViews) (default true .Site.Params.showPageViews) }} |
|
||||||
{{- if .Site.Params.goatCounter }} |
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-activity"> |
|
||||||
<path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path> |
|
||||||
<circle cx="12" cy="12" r="3"></circle> |
|
||||||
</svg> |
|
||||||
{{- partial "page_views.html" . -}} |
|
||||||
</p> |
|
||||||
{{- end }} |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-calendar"> |
|
||||||
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect> |
|
||||||
<line x1="16" y1="2" x2="16" y2="6"></line> |
|
||||||
<line x1="8" y1="2" x2="8" y2="6"></line> |
|
||||||
<line x1="3" y1="10" x2="21" y2="10"></line> |
|
||||||
</svg> |
|
||||||
{{- if .Site.Params.dateformNumTime }} |
|
||||||
{{ dateFormat .Site.Params.dateformNumTime .Date.Local }} |
|
||||||
{{- else }} |
|
||||||
{{ dateFormat "2006-01-02 15:04 -0700" .Date.Local }} |
|
||||||
{{- end }} |
|
||||||
</p> |
|
||||||
|
|
||||||
{{- if .GitInfo }} |
|
||||||
<p> |
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" |
|
||||||
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" |
|
||||||
class="feather feather-git-commit"> |
|
||||||
<circle cx="12" cy="12" r="4"></circle> |
|
||||||
<line x1="1.05" y1="12" x2="7" y2="12"></line> |
|
||||||
<line x1="17.01" y1="12" x2="22.96" y2="12"></line> |
|
||||||
</svg> |
|
||||||
|
|
||||||
<a href="{{ .Site.Params.gitUrl -}}{{ .GitInfo.Hash }}" target="_blank" |
|
||||||
rel="noopener">{{ .GitInfo.AbbreviatedHash }}</a> |
|
||||||
{{- " @ " -}} |
|
||||||
{{- if .Site.Params.dateformNum -}} |
|
||||||
{{ dateFormat .Site.Params.dateformNum .GitInfo.AuthorDate.Local }} |
|
||||||
{{- else -}} |
|
||||||
{{ dateFormat "2006-01-02" .GitInfo.AuthorDate.Local }} |
|
||||||
{{- end }} |
|
||||||
</p> |
|
||||||
{{- end }} |
|
||||||
</div> |
|
||||||
|
|
||||||
{{- if .Site.Params.EnableSharingButtons }} |
|
||||||
<hr /> |
|
||||||
<div class="sharing-buttons"> |
|
||||||
{{ partial "sharing-buttons.html" . }} |
|
||||||
</div> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
{{- if and (not $.Site.Params.DisableReadOtherPosts) (or .NextInSection .PrevInSection) }} |
|
||||||
<div class="pagination"> |
|
||||||
<div class="pagination__title"> |
|
||||||
<span class="pagination__title-h">{{ .Site.Params.ReadOtherPosts }}</span> |
|
||||||
<hr /> |
|
||||||
</div> |
|
||||||
|
|
||||||
<div class="pagination__buttons"> |
|
||||||
{{- if .NextInSection }} |
|
||||||
<span class="button previous"> |
|
||||||
<a href="{{ .NextInSection.Permalink }}"> |
|
||||||
<span class="button__icon">←</span> |
|
||||||
<span class="button__text">{{ .NextInSection.Title }}</span> |
|
||||||
</a> |
|
||||||
</span> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
{{- if .PrevInSection }} |
|
||||||
<span class="button next"> |
|
||||||
<a href="{{ .PrevInSection.Permalink }}"> |
|
||||||
<span class="button__text">{{ .PrevInSection.Title }}</span> |
|
||||||
<span class="button__icon">→</span> |
|
||||||
</a> |
|
||||||
</span> |
|
||||||
{{- end }} |
|
||||||
</div> |
|
||||||
</div> |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
|
|
||||||
{{- if .Site.Config.Services.Disqus.Shortname }} |
|
||||||
{{- if not (eq .Params.Comments "false") }} |
|
||||||
<div id="comments"> |
|
||||||
{{ template "_internal/disqus.html" . }} |
|
||||||
</div> |
|
||||||
{{- end }} |
|
||||||
{{- end }} |
|
||||||
|
|
||||||
</main> |
|
||||||
{{ end }} |
|