aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.firebaserc5
-rw-r--r--Makefile25
-rw-r--r--assets/general/alert.svg (renamed from static/alert.svg)0
-rwxr-xr-xconfig.ini21
-rw-r--r--content/2020-12-25-weekly-newsletter.md10
-rw-r--r--firebase.json19
-rw-r--r--newsletter/.editorconfig16
-rw-r--r--newsletter/.gitignore1
-rw-r--r--newsletter/campaigns/2020-52.json75
-rw-r--r--newsletter/campaigns/2020-53.json122
-rw-r--r--newsletter/campaigns/2021-01.json81
-rw-r--r--newsletter/campaigns/template.json15
-rw-r--r--newsletter/generated/2020-52.html88
-rw-r--r--newsletter/generated/2020-53.html326
-rw-r--r--newsletter/generated/2021-01.html198
-rw-r--r--newsletter/generated/index.html37
-rw-r--r--newsletter/package.json20
-rwxr-xr-xnewsletter/send129
-rw-r--r--newsletter/templates/index.hbs37
-rw-r--r--newsletter/templates/mailing.hbs42
-rw-r--r--posts/2015-03-07-curriculum-vitae.md (renamed from content/2015-03-07-curriculum-vitae copy.md)15
-rw-r--r--posts/2017-03-07-golang-profiling-simplified.md (renamed from content/2017-03-07-golang-profiling-simplified.md)14
-rw-r--r--posts/2017-04-17-what-i-ve-learned-developing-ad-server.md (renamed from content/2017-04-17-what-i-ve-learned-developing-ad-server.md)14
-rw-r--r--posts/2017-04-21-profiling-python-web-applications-with-visual-tools.md (renamed from content/2017-04-21-profiling-python-web-applications-with-visual-tools.md)14
-rw-r--r--posts/2017-08-11-simple-iot-application.md (renamed from content/2017-08-11-simple-iot-application.md)14
-rw-r--r--posts/2018-01-16-using-digitalocean-spaces-object-storage-with-fuse.md (renamed from content/2018-01-16-using-digitalocean-spaces-object-storage-with-fuse.md)14
-rw-r--r--posts/2019-01-03-encoding-binary-data-into-dna-sequence.md (renamed from content/2019-01-03-encoding-binary-data-into-dna-sequence.md)14
-rw-r--r--posts/2019-10-14-simplifying-and-reducing-clutter.md (renamed from content/2019-10-14-simplifying-and-reducing-clutter.md)14
-rw-r--r--posts/2019-10-19-using-sentiment-analysis-for-click-bait-detection-in-rss-feeds.md (renamed from content/2019-10-19-using-sentiment-analysis-for-click-bait-detection-in-rss-feeds.md)14
-rw-r--r--posts/2020-03-22-simple-sse-based-pubsub-server.md (renamed from content/2020-03-22-simple-sse-based-pubsub-server.md)14
-rw-r--r--posts/2020-03-27-create-placeholder-images-with-sharp.md (renamed from content/2020-03-27-create-placeholder-images-with-sharp.md)14
-rw-r--r--posts/2020-03-29-the-strange-case-of-elasticsearch-allocation-failure.md (renamed from content/2020-03-29-the-strange-case-of-elasticsearch-allocation-failure.md)14
-rw-r--r--posts/2020-03-30-my-love-and-hate-relationship-with-nodejs copy.md (renamed from content/2020-03-30-my-love-and-hate-relationship-with-nodejs copy.md)14
-rwxr-xr-x[-rw-r--r--]posts/2020-05-05-remote-work.md (renamed from content/2020-04-05-remote-work.md)14
-rw-r--r--posts/2020-08-15-systemd-disable-wake-onmouse.md (renamed from content/2020-08-15-systemd-disable-wake-onmouse.md)14
-rw-r--r--posts/2020-09-06-esp-and-micropython.md (renamed from content/2020-09-06-esp-and-micropython.md)14
-rw-r--r--posts/2020-09-08-bind-warning-on-login.md (renamed from content/2020-09-08-bind-warning-on-login.md)14
-rw-r--r--posts/2020-09-09-digitalocean-sync.md (renamed from content/2020-09-09-digitalocean-sync.md)15
-rw-r--r--static/avatar-512x512.pngbin244569 -> 0 bytes
-rw-r--r--static/avatar-64x64.pngbin16769 -> 0 bytes
-rw-r--r--static/style.css261
-rw-r--r--staticgen.yml21
-rwxr-xr-xtemplate/_footer.html5
-rwxr-xr-xtemplate/_includes.html9
-rwxr-xr-xtemplate/_meta.html9
-rwxr-xr-xtemplate/_navigation.html15
-rw-r--r--template/favicon.icobin0 -> 4286 bytes
-rwxr-xr-xtemplate/index.html51
-rwxr-xr-xtemplate/post.html31
-rwxr-xr-xtemplate/script.js1
-rwxr-xr-xtemplate/style.css275
-rwxr-xr-xtemplate/tag.html61
-rw-r--r--templates/index.twig52
-rw-r--r--templates/page.twig52
-rw-r--r--templates/partials/navigation.twig7
-rw-r--r--templates/partials/posts.twig8
-rw-r--r--templates/partials/preconnect.twig2
-rw-r--r--templates/partials/projects.twig8
-rw-r--r--templates/post.twig73
59 files changed, 626 insertions, 1836 deletions
diff --git a/.firebaserc b/.firebaserc
deleted file mode 100644
index 70a9af1..0000000
--- a/.firebaserc
+++ /dev/null
@@ -1,5 +0,0 @@
1{
2 "projects": {
3 "default": "mitja-felicijan-blog"
4 }
5}
diff --git a/Makefile b/Makefile
index 220378e..186a58c 100644
--- a/Makefile
+++ b/Makefile
@@ -1,22 +1,3 @@
1MAKEFLAGS += -j2 1deploy:
2 2 alternator --build
3dev: server watch 3 cd public && scp -r * root@165.22.87.180:/var/www/html/mitjafelicijan.com/ \ No newline at end of file
4
5watch:
6 find content/* templates/* static/* | entr make generate
7
8server:
9 browser-sync start --server ./public --watch --no-open --no-notify
10
11clean:
12 rm -rf public/*
13
14generate:
15 staticgen --generate
16
17deploy: clean generate copy-weekly-links
18 firebase deploy
19
20copy-weekly-links:
21 mkdir -p public/weekly-newsletter-archive
22 cp -rf newsletter/generated/* public/weekly-newsletter-archive/
diff --git a/static/alert.svg b/assets/general/alert.svg
index 86658ec..86658ec 100644
--- a/static/alert.svg
+++ b/assets/general/alert.svg
diff --git a/config.ini b/config.ini
new file mode 100755
index 0000000..40e73c9
--- /dev/null
+++ b/config.ini
@@ -0,0 +1,21 @@
1[server]
2# port used by HTTP server
3port = 8080
4
5[content]
6# title displayed on index page, otherwise post title is used
7title = Mitja Felicijan
8
9# descriptions displayed on index page, otherwise post description is used
10description = Remote work and how it affects the daily lives of people
11
12[rss]
13
14# domain name for xml feed
15domain = https://mitjafelicijan.com
16
17# author name
18author = Mitja Felicijan
19
20# author email
21email = m@mitjafelicijan.com
diff --git a/content/2020-12-25-weekly-newsletter.md b/content/2020-12-25-weekly-newsletter.md
deleted file mode 100644
index 7f6e873..0000000
--- a/content/2020-12-25-weekly-newsletter.md
+++ /dev/null
@@ -1,10 +0,0 @@
1~ title: Weekly newsletter
2~ slug: /weekly-newsletter.html
3~ date: 2020-12-25
4~ template: page
5~ hide: true
6
7🕵🏼 [You can check old emailing archive sent here.](/weekly-newsletter-archive/)
8
9
10<iframe src="https://cdn.forms-content.sg-form.com/b9a1dea3-465a-11eb-af61-0e1900a266f8" width="610px" height="700" frameborder="0" scrolling="no"></iframe>
diff --git a/firebase.json b/firebase.json
deleted file mode 100644
index 33bfcd9..0000000
--- a/firebase.json
+++ /dev/null
@@ -1,19 +0,0 @@
1{
2 "hosting": {
3 "public": "public",
4 "cleanUrls": false,
5 "ignore": [
6 "firebase.json",
7 "tmp/",
8 "**/.*",
9 "**/node_modules/**"
10 ],
11 "redirects": [
12 {
13 "source": "/experiments/encoding-binary-data-into-dna-sequence.html",
14 "destination": "/encoding-binary-data-into-dna-sequence.html",
15 "type": 301
16 }
17 ]
18 }
19}
diff --git a/newsletter/.editorconfig b/newsletter/.editorconfig
deleted file mode 100644
index 29a570e..0000000
--- a/newsletter/.editorconfig
+++ /dev/null
@@ -1,16 +0,0 @@
1# EditorConfig is awesome: https://EditorConfig.org
2
3# top-most EditorConfig file
4root = true
5
6[*]
7indent_style = space
8indent_size = 2
9end_of_line = lf
10charset = utf-8
11trim_trailing_whitespace = true
12insert_final_newline = true
13
14[*.sh]
15indent_style = tab
16indent_size = 4
diff --git a/newsletter/.gitignore b/newsletter/.gitignore
deleted file mode 100644
index d5a0f97..0000000
--- a/newsletter/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
1sendgrid.env
diff --git a/newsletter/campaigns/2020-52.json b/newsletter/campaigns/2020-52.json
deleted file mode 100644
index 5990b8d..0000000
--- a/newsletter/campaigns/2020-52.json
+++ /dev/null
@@ -1,75 +0,0 @@
1{
2 "categories": [
3 {
4 "name": "General",
5 "links": [
6 {
7 "title": "3x3 SEO tips for JavaScript web apps",
8 "url": "https://www.youtube.com/watch?v=y1UzfahXfao&ab_channel=GoogleChromeDevelopers",
9 "excerpt": "Learn three basic SEO tips for Angular, React, and Vue.js web apps.",
10 "source": "Youtube"
11 },
12 {
13 "title": "Machine Learning & Text Analysis",
14 "url": "https://www.youtube.com/watch?v=y1UzfahXfao&ab_channel=GoogleChromeDevelopers",
15 "excerpt": "Text analysis is the process of obtaining valuable insights from texts. ML can work with different types of textual information such as social media posts, messages, and emails. Special software helps to preprocess and analyze this data.",
16 "source": "Blog"
17 },
18 {
19 "title": "Break a forEach Loop with JavaScript",
20 "url": "https://davidwalsh.name/javascript-array-tricks-3",
21 "excerpt": "He recently ran into another JavaScript trick that blew my mind: how to break a forEach loop, shared by Andrea Giammarchi!",
22 "source": "Blog"
23 },
24 {
25 "title": "Flappy Bird in JavaScript with 25 Lines of Code",
26 "url": "https://www.youtube.com/watch?v=M45iFPVdtj0&ab_channel=CodingTech",
27 "excerpt": "In this tutorial he takes you on the callenge to code a flappy bird clone in a few lines of code as possible.The starting point is an empty HTML canvas and you can follow along all the way to a complete game.",
28 "source": "Youtube"
29 },
30 {
31 "title": "What's new in DevTools",
32 "url": "https://www.youtube.com/watch?v=QsOF9SJJdAA&ab_channel=GoogleChromeDevelopers",
33 "excerpt": "An overview of the latest and greatest features in Chrome DevTools.",
34 "source": "Youtube"
35 },
36 {
37 "title": "Canvas2D is getting an update",
38 "url": "https://www.youtube.com/watch?v=dfOKFSDG7IM&ab_channel=GoogleChromeDevelopers",
39 "excerpt": "Your good, old friend the Canvas2D API has been improving and is worth another look. Hear about all the new features that have been added to the spec.",
40 "source": "Youtube"
41 },
42 {
43 "title": "A web framework for building 3D/AR/VR experiences",
44 "url": "https://aframe.io/",
45 "excerpt": "Make 3D worlds with HTML and Entity-Component For Quest, Rift, WMR, SteamVR, mobile, desktop.",
46 "source": "Product"
47 },
48 {
49 "title": "Introduction to Erlang",
50 "url": "https://serokell.io/blog/introduction-to-erlang",
51 "excerpt": "While Erlang is not as popular as some modern programming languages, it quietly runs applications like WhatsApp and WeChat that serve massive amounts of users every day.",
52 "source": "Blog"
53 },
54 {
55 "title": "Why is processing a sorted array faster than processing an unsorted array?",
56 "url": "https://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-processing-an-unsorted-array",
57 "excerpt": "Here is a piece of C++ code that shows some very peculiar behavior. For some strange reason, sorting the data miraculously makes the code almost six times faster.",
58 "source": "Nugget"
59 },
60 {
61 "title": "30-Second Maths: The 50 Most Mind-Expanding Theories in Mathematics, Each Explained in Half a Minute",
62 "url": "https://www.bookdepository.com/30-Second-Maths-Richard-J-Brown/9781785782886?ref=pd_gw_1_pd_gateway_1_1",
63 "excerpt": "30 Second Maths takes the top 50 most engaging mathematical theories, and explains them to the general reader in half a minute, using nothing more than two pages, 200 words and one picture. Read at your own pace, and discover that maths can be more fascinating than you ever imagined.",
64 "source": "Book"
65 },
66 {
67 "title": "Pomodoro Technique",
68 "url": "https://en.wikipedia.org/wiki/Pomodoro_Technique",
69 "excerpt": "The Pomodoro Technique is a time management method developed by Francesco Cirillo in the late 1980s.",
70 "source": "Nugget"
71 }
72 ]
73 }
74 ]
75}
diff --git a/newsletter/campaigns/2020-53.json b/newsletter/campaigns/2020-53.json
deleted file mode 100644
index de44449..0000000
--- a/newsletter/campaigns/2020-53.json
+++ /dev/null
@@ -1,122 +0,0 @@
1{
2 "categories": [
3 {
4 "name": "General",
5 "links": [
6 {
7 "title": "Transitioning to modern JavaScript",
8 "excerpt": "Over 90% of web traffic comes from browsers that support modern JavaScript, yet most websites ship legacy syntax in order to support a small number of very old browsers.",
9 "url": "https://youtu.be/cLxNdLK--yI",
10 "tags": [
11 "Video",
12 "JavaScript"
13 ]
14 },
15 {
16 "title": "Sign-up form best practices",
17 "excerpt": "Help your users sign up, sign in, and manage their account details with a minimum of fuss.",
18 "url": "https://youtu.be/Ev2mCzJZLtY",
19 "tags": [
20 "Video",
21 "Accessibility"
22 ]
23 },
24 {
25 "title": "AutoKeras",
26 "excerpt": "AutoKeras: An AutoML system based on Keras. It is developed by DATA Lab at Texas A&M University. The goal of AutoKeras is to make machine learning accessible for everyone.",
27 "url": "https://autokeras.com/",
28 "tags": [
29 "Product",
30 "Machine learning"
31 ]
32 },
33 {
34 "title": "Arduino Weather Station",
35 "excerpt": "This Is An Project To Help View Us The Current Temperature And Humidity In Time.",
36 "url": "https://www.hackster.io/m1cr0s0ft/arduino-weather-station-8ec09e",
37 "tags": [
38 "Blog",
39 "Hardware",
40 "Arduino"
41 ]
42 },
43 {
44 "title": "Beyond fast with new performance features",
45 "excerpt": "A whirlwind tour of new features and proposals to improve the performance of your pages.",
46 "url": "https://youtu.be/Z6wjUOSh9Tk",
47 "tags": [
48 "Video",
49 "Web optimization"
50 ]
51 },
52 {
53 "title": "How digital identity protects your software",
54 "excerpt": "Digital identity is the online representation of a person, organization, or a machine, and it is what gives us access to the data we use daily. Here’s a brief overview of identity, why it's vital to information security, and why you should know more about it.",
55 "url": "https://stackoverflow.blog/2020/12/21/how-digital-identity-protects-your-software/",
56 "tags": [
57 "Blog",
58 "Single sign on",
59 "Social login"
60 ]
61 },
62 {
63 "title": "Podcast 295: Diving into headless automation, active monitoring, Playwright and Puppeteer",
64 "excerpt": "This week we chat with Tim Nolet, whose commentary appeared in a previous episode after he complained about Amazon forking his OS service and presenting it as new product without so much as a thanks. Since then the two parties have worked things out, and Tim came on the show to explain what happened, what he builds in the open source world, and the company he runs.",
65 "url": "https://stackoverflow.blog/2020/12/15/podcast-295-diving-into-headless-automation-active-monitoring-playwright-and-puppeteer/",
66 "tags": [
67 "Podcast",
68 "Automation",
69 "DevOps"
70 ]
71 },
72 {
73 "title": "2020 Web Design Year in Review",
74 "excerpt": "A year “like no other” is about to come to a close. 2020 was certainly unique for everyone – web designers included. And it challenged us on several levels.",
75 "url": "https://speckyboy.com/2020-web-design-year-in-review/",
76 "tags": [
77 "Blog",
78 "Looking back"
79 ]
80 },
81 {
82 "title": "The 15 Commandments of Front-End Performance",
83 "excerpt": "This list is the product of many years of experience in the front-end web development field. I maintain this list as a reminder to myself to always follow best practices, and to not compromise on performance, even if I’m in a time crunch.",
84 "url": "https://alexsexton.com/blog/2015/02/the-15-commandments-of-front-end-performance/",
85 "tags": [
86 "Blog",
87 "Front-end",
88 "Best practices"
89 ]
90 },
91 {
92 "title": "Finding Critical Open Source Projects",
93 "excerpt": "Criticality of an open source project is difficult to define; what might be a critical dependency for one consumer of open source software may be entirely absent for another. However, arriving at a shared understanding and framework allows us to have productive conversations about our dependencies. Simply put, we define criticality to be the influence and importance of a project.",
94 "url": "https://opensource.googleblog.com/2020/12/finding-critical-open-source-projects.html",
95 "tags": [
96 "Blog",
97 "Open source"
98 ]
99 },
100 {
101 "title": "HTTP Archive's 10th Anniversary",
102 "excerpt": "Rick meets with Steve Souders, who created the HTTP Archive project 10 years ago this month, to talk about its origins and reflect on it's growth.",
103 "url": "https://www.stitcher.com/show/the-state-of-the-web/episode/http-archives-10th-anniversary-79556890",
104 "tags": [
105 "Podcast",
106 "Performance"
107 ]
108 },
109 {
110 "title": "Cosmic Queries – Medieval Science and History",
111 "excerpt": "When you think Middle Ages, does scientific advancement pop into your head? On this episode of StarTalk Radio, we’re exploring the science and history of medieval times as Neil deGrasse Tyson and comic co-host Matt Kirshen answer fan-submitted Cosmic Queries with Seb Falk, Cambridge Historian of Science and author of The Light Ages: The Surprising Story of Medieval Science.",
112 "url": "https://www.startalkradio.net/show/cosmic-queries-medieval-science-and-history/",
113 "tags": [
114 "Podcast",
115 "Science",
116 "History"
117 ]
118 }
119 ]
120 }
121 ]
122}
diff --git a/newsletter/campaigns/2021-01.json b/newsletter/campaigns/2021-01.json
deleted file mode 100644
index d3756c9..0000000
--- a/newsletter/campaigns/2021-01.json
+++ /dev/null
@@ -1,81 +0,0 @@
1{
2 "categories": [
3 {
4 "name": "General",
5 "links": [
6 {
7 "title": "Fast Inverse Square Root — A Quake III Algorithm",
8 "excerpt": "In this video we will take an in depth look at the fast inverse square root and see where the mysterious number 0x5f3759df comes from. This algorithm became famous after id Software open sourced the engine for Quake III. On the way we will also learn about floating point numbers and newton's method.",
9 "url": "https://www.youtube.com/watch?v=p8u_k2LIZyo",
10 "tags": [
11 "Video",
12 "Quake III"
13 ]
14 },
15 {
16 "title": "Goodbye, Adobe Flash",
17 "excerpt": "A thrice-weekly news show about tech + gaming culture.",
18 "url": "https://www.youtube.com/watch?v=zV2VEOHNCJU",
19 "tags": [
20 "Video",
21 "Tech news"
22 ]
23 },
24 {
25 "title": "The Year's Biggest Breakthroughs in Math and Computer Science",
26 "excerpt": "For mathematicians and computer scientists, 2020 was full of discipline-spanning discoveries and celebrations of creativity. We'd like to take a moment to recognize some of these achievements.",
27 "url": "https://www.youtube.com/watch?v=HL7DEkXV_60",
28 "tags": [
29 "Video",
30 "Math and Computer Science"
31 ]
32 },
33 {
34 "title": "20 Award-Winning 13-Kilobyte JavaScript Games You Can Play in Your Browser",
35 "excerpt": "In this article, I am going to show you 20 award-winning JavaScript games from the JS13kGames competition. So in other words, you're going to see 20 great examples of code from 20 insanely talented developers.",
36 "url": "https://www.freecodecamp.org/news/20-award-winning-games-explained-code-breakdown/",
37 "tags": [
38 "Blog",
39 "Games"
40 ]
41 },
42 {
43 "title": "Espressif's New ESP32-S3 Adds AI Features for IoT Devices",
44 "excerpt": "The very last day of 2020 came with great news for ESP32 fans. The ubiquitous IoT microcontroller is getting a new family member — the ESP32-S3! Espressif's latest introduction includes an updated dual-core MCU, expanded GPIO, AI-focused instructions, and hardware-accelerated security features.",
45 "url": "https://www.hackster.io/news/espressif-s-new-esp32-s3-adds-ai-features-for-iot-devices-b42b902abdf5",
46 "tags": [
47 "Product",
48 "IoT"
49 ]
50 },
51 {
52 "title": "Radioactive materials were once sold in a STORE in the USSR!",
53 "excerpt": "‘Izotopy’ was the name of a specialist store in Moscow that sold radioactive materials. And demand for them was very high. But how was such a thing possible?",
54 "url": "https://www.rbth.com/history/333230-radioactive-materials-sold-ussr",
55 "tags": [
56 "Blog",
57 "Russia"
58 ]
59 },
60 {
61 "title": "Welcome to 2021 with Joel Spolsky",
62 "excerpt": "We are stepping into a new year with a very special guest, Stack Overflow's co-founder and chairman, Joel Spolsky. We chat programming, social networks, and what comes next.",
63 "url": "https://stackoverflow.blog/2021/01/01/podcast-300-welcome-to-2021-with-joel-spolsky/",
64 "tags": [
65 "Podcast",
66 "Stack Overflow"
67 ]
68 },
69 {
70 "title": "The AI companion who cares",
71 "excerpt": "Replika is a #1 chatbot companion powered by artificial intelligence.",
72 "url": "https://replika.ai/",
73 "tags": [
74 "Product",
75 "AI Chatbot"
76 ]
77 }
78 ]
79 }
80 ]
81}
diff --git a/newsletter/campaigns/template.json b/newsletter/campaigns/template.json
deleted file mode 100644
index 56b33c9..0000000
--- a/newsletter/campaigns/template.json
+++ /dev/null
@@ -1,15 +0,0 @@
1{
2 "categories": [
3 {
4 "name": "General",
5 "links": [
6 {
7 "title": "",
8 "url": "",
9 "excerpt": "",
10 "source": ""
11 }
12 ]
13 }
14 ]
15}
diff --git a/newsletter/generated/2020-52.html b/newsletter/generated/2020-52.html
deleted file mode 100644
index 73f79da..0000000
--- a/newsletter/generated/2020-52.html
+++ /dev/null
@@ -1,88 +0,0 @@
1<html>
2
3 <head>
4 <title>2020: Week #52 Links</title>
5 </head>
6
7 <body style="background: #f2f2f2; padding: 60px; color: #222222; line-height: 22px; font-family: sans-serif, system-ui, -apple-system; font-size: 16px;">
8
9 <div style="width: 650px; background: #ffffff; text-align: left; padding: 40px; margin: 0 auto; border-radius: 10px;">
10
11 <div style="margin-bottom: 30px;">
12 <a href="https://www.youtube.com/watch?v&#x3D;y1UzfahXfao&amp;ab_channel&#x3D;GoogleChromeDevelopers" style="color: #3252a8; font-weight: bold;">3x3 SEO tips for JavaScript web apps</a>
13 <div style="margin-block-start: 5px; font-size: 90%;">Learn three basic SEO tips for Angular, React, and Vue.js web apps.</div>
14 <div>
15 </div>
16 </div>
17 <div style="margin-bottom: 30px;">
18 <a href="https://www.youtube.com/watch?v&#x3D;y1UzfahXfao&amp;ab_channel&#x3D;GoogleChromeDevelopers" style="color: #3252a8; font-weight: bold;">Machine Learning &amp; Text Analysis</a>
19 <div style="margin-block-start: 5px; font-size: 90%;">Text analysis is the process of obtaining valuable insights from texts. ML can work with different types of textual information such as social media posts, messages, and emails. Special software helps to preprocess and analyze this data.</div>
20 <div>
21 </div>
22 </div>
23 <div style="margin-bottom: 30px;">
24 <a href="https://davidwalsh.name/javascript-array-tricks-3" style="color: #3252a8; font-weight: bold;">Break a forEach Loop with JavaScript</a>
25 <div style="margin-block-start: 5px; font-size: 90%;">He recently ran into another JavaScript trick that blew my mind: how to break a forEach loop, shared by Andrea Giammarchi!</div>
26 <div>
27 </div>
28 </div>
29 <div style="margin-bottom: 30px;">
30 <a href="https://www.youtube.com/watch?v&#x3D;M45iFPVdtj0&amp;ab_channel&#x3D;CodingTech" style="color: #3252a8; font-weight: bold;">Flappy Bird in JavaScript with 25 Lines of Code</a>
31 <div style="margin-block-start: 5px; font-size: 90%;">In this tutorial he takes you on the callenge to code a flappy bird clone in a few lines of code as possible.The starting point is an empty HTML canvas and you can follow along all the way to a complete game.</div>
32 <div>
33 </div>
34 </div>
35 <div style="margin-bottom: 30px;">
36 <a href="https://www.youtube.com/watch?v&#x3D;QsOF9SJJdAA&amp;ab_channel&#x3D;GoogleChromeDevelopers" style="color: #3252a8; font-weight: bold;">What&#x27;s new in DevTools</a>
37 <div style="margin-block-start: 5px; font-size: 90%;">An overview of the latest and greatest features in Chrome DevTools.</div>
38 <div>
39 </div>
40 </div>
41 <div style="margin-bottom: 30px;">
42 <a href="https://www.youtube.com/watch?v&#x3D;dfOKFSDG7IM&amp;ab_channel&#x3D;GoogleChromeDevelopers" style="color: #3252a8; font-weight: bold;">Canvas2D is getting an update</a>
43 <div style="margin-block-start: 5px; font-size: 90%;">Your good, old friend the Canvas2D API has been improving and is worth another look. Hear about all the new features that have been added to the spec.</div>
44 <div>
45 </div>
46 </div>
47 <div style="margin-bottom: 30px;">
48 <a href="https://aframe.io/" style="color: #3252a8; font-weight: bold;">A web framework for building 3D/AR/VR experiences</a>
49 <div style="margin-block-start: 5px; font-size: 90%;">Make 3D worlds with HTML and Entity-Component For Quest, Rift, WMR, SteamVR, mobile, desktop.</div>
50 <div>
51 </div>
52 </div>
53 <div style="margin-bottom: 30px;">
54 <a href="https://serokell.io/blog/introduction-to-erlang" style="color: #3252a8; font-weight: bold;">Introduction to Erlang</a>
55 <div style="margin-block-start: 5px; font-size: 90%;">While Erlang is not as popular as some modern programming languages, it quietly runs applications like WhatsApp and WeChat that serve massive amounts of users every day.</div>
56 <div>
57 </div>
58 </div>
59 <div style="margin-bottom: 30px;">
60 <a href="https://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-processing-an-unsorted-array" style="color: #3252a8; font-weight: bold;">Why is processing a sorted array faster than processing an unsorted array?</a>
61 <div style="margin-block-start: 5px; font-size: 90%;">Here is a piece of C++ code that shows some very peculiar behavior. For some strange reason, sorting the data miraculously makes the code almost six times faster.</div>
62 <div>
63 </div>
64 </div>
65 <div style="margin-bottom: 30px;">
66 <a href="https://www.bookdepository.com/30-Second-Maths-Richard-J-Brown/9781785782886?ref&#x3D;pd_gw_1_pd_gateway_1_1" style="color: #3252a8; font-weight: bold;">30-Second Maths: The 50 Most Mind-Expanding Theories in Mathematics, Each Explained in Half a Minute</a>
67 <div style="margin-block-start: 5px; font-size: 90%;">30 Second Maths takes the top 50 most engaging mathematical theories, and explains them to the general reader in half a minute, using nothing more than two pages, 200 words and one picture. Read at your own pace, and discover that maths can be more fascinating than you ever imagined.</div>
68 <div>
69 </div>
70 </div>
71 <div style="margin-bottom: 30px;">
72 <a href="https://en.wikipedia.org/wiki/Pomodoro_Technique" style="color: #3252a8; font-weight: bold;">Pomodoro Technique</a>
73 <div style="margin-block-start: 5px; font-size: 90%;">The Pomodoro Technique is a time management method developed by Francesco Cirillo in the late 1980s.</div>
74 <div>
75 </div>
76 </div>
77
78 </div>
79
80 <div style="text-align: center; font-size: 80%; margin-top: 20px;">
81 <a style="color: #666; margin: auto 10px" href="https://mitjafelicijan.com/weekly-newsletter-archive/">weekly links archive</a>
82 <a style="color: #666; margin: auto 10px" href="https://mitjafelicijan.com">mitjafelicijan.com</a>
83 <a style="color: #666; margin: auto 10px" href="https://github.com/mitjafelicijan">github.com/mitjafelicijan</a>
84 </div>
85
86 </body>
87
88</html>
diff --git a/newsletter/generated/2020-53.html b/newsletter/generated/2020-53.html
deleted file mode 100644
index 60c6cef..0000000
--- a/newsletter/generated/2020-53.html
+++ /dev/null
@@ -1,326 +0,0 @@
1<html>
2
3 <head>
4 <title>2020: Week #53 Links</title>
5 </head>
6
7 <body style="background: #f2f2f2; padding: 60px; color: #222222; line-height: 22px; font-family: sans-serif, system-ui, -apple-system; font-size: 16px;">
8
9 <div style="width: 650px; background: #ffffff; text-align: left; padding: 40px; margin: 0 auto; border-radius: 10px;">
10
11 <div style="margin-bottom: 30px;">
12 <a href="https://youtu.be/cLxNdLK--yI" style="color: #3252a8; font-weight: bold;">Transitioning to modern JavaScript</a>
13 <div style="margin-block-start: 5px; font-size: 90%;">Over 90% of web traffic comes from browsers that support modern JavaScript, yet most websites ship legacy syntax in order to support a small number of very old browsers.</div>
14 <div>
15 <span style="background: #e6e6e6;
16 color: #777;
17 border-radius: 3px;
18 padding: 0px 10px;
19 font-size: 70%;
20 display: inline-block;
21 margin-top: 5px;
22 font-weight: 600;">Video</span>
23 <span style="background: #e6e6e6;
24 color: #777;
25 border-radius: 3px;
26 padding: 0px 10px;
27 font-size: 70%;
28 display: inline-block;
29 margin-top: 5px;
30 font-weight: 600;">JavaScript</span>
31 </div>
32 </div>
33 <div style="margin-bottom: 30px;">
34 <a href="https://youtu.be/Ev2mCzJZLtY" style="color: #3252a8; font-weight: bold;">Sign-up form best practices</a>
35 <div style="margin-block-start: 5px; font-size: 90%;">Help your users sign up, sign in, and manage their account details with a minimum of fuss.</div>
36 <div>
37 <span style="background: #e6e6e6;
38 color: #777;
39 border-radius: 3px;
40 padding: 0px 10px;
41 font-size: 70%;
42 display: inline-block;
43 margin-top: 5px;
44 font-weight: 600;">Video</span>
45 <span style="background: #e6e6e6;
46 color: #777;
47 border-radius: 3px;
48 padding: 0px 10px;
49 font-size: 70%;
50 display: inline-block;
51 margin-top: 5px;
52 font-weight: 600;">Accessibility</span>
53 </div>
54 </div>
55 <div style="margin-bottom: 30px;">
56 <a href="https://autokeras.com/" style="color: #3252a8; font-weight: bold;">AutoKeras</a>
57 <div style="margin-block-start: 5px; font-size: 90%;">AutoKeras: An AutoML system based on Keras. It is developed by DATA Lab at Texas A&amp;M University. The goal of AutoKeras is to make machine learning accessible for everyone.</div>
58 <div>
59 <span style="background: #e6e6e6;
60 color: #777;
61 border-radius: 3px;
62 padding: 0px 10px;
63 font-size: 70%;
64 display: inline-block;
65 margin-top: 5px;
66 font-weight: 600;">Product</span>
67 <span style="background: #e6e6e6;
68 color: #777;
69 border-radius: 3px;
70 padding: 0px 10px;
71 font-size: 70%;
72 display: inline-block;
73 margin-top: 5px;
74 font-weight: 600;">Machine learning</span>
75 </div>
76 </div>
77 <div style="margin-bottom: 30px;">
78 <a href="https://www.hackster.io/m1cr0s0ft/arduino-weather-station-8ec09e" style="color: #3252a8; font-weight: bold;">Arduino Weather Station</a>
79 <div style="margin-block-start: 5px; font-size: 90%;">This Is An Project To Help View Us The Current Temperature And Humidity In Time.</div>
80 <div>
81 <span style="background: #e6e6e6;
82 color: #777;
83 border-radius: 3px;
84 padding: 0px 10px;
85 font-size: 70%;
86 display: inline-block;
87 margin-top: 5px;
88 font-weight: 600;">Blog</span>
89 <span style="background: #e6e6e6;
90 color: #777;
91 border-radius: 3px;
92 padding: 0px 10px;
93 font-size: 70%;
94 display: inline-block;
95 margin-top: 5px;
96 font-weight: 600;">Hardware</span>
97 <span style="background: #e6e6e6;
98 color: #777;
99 border-radius: 3px;
100 padding: 0px 10px;
101 font-size: 70%;
102 display: inline-block;
103 margin-top: 5px;
104 font-weight: 600;">Arduino</span>
105 </div>
106 </div>
107 <div style="margin-bottom: 30px;">
108 <a href="https://youtu.be/Z6wjUOSh9Tk" style="color: #3252a8; font-weight: bold;">Beyond fast with new performance features</a>
109 <div style="margin-block-start: 5px; font-size: 90%;">A whirlwind tour of new features and proposals to improve the performance of your pages.</div>
110 <div>
111 <span style="background: #e6e6e6;
112 color: #777;
113 border-radius: 3px;
114 padding: 0px 10px;
115 font-size: 70%;
116 display: inline-block;
117 margin-top: 5px;
118 font-weight: 600;">Video</span>
119 <span style="background: #e6e6e6;
120 color: #777;
121 border-radius: 3px;
122 padding: 0px 10px;
123 font-size: 70%;
124 display: inline-block;
125 margin-top: 5px;
126 font-weight: 600;">Web optimization</span>
127 </div>
128 </div>
129 <div style="margin-bottom: 30px;">
130 <a href="https://stackoverflow.blog/2020/12/21/how-digital-identity-protects-your-software/" style="color: #3252a8; font-weight: bold;">How digital identity protects your software</a>
131 <div style="margin-block-start: 5px; font-size: 90%;">Digital identity is the online representation of a person, organization, or a machine, and it is what gives us access to the data we use daily. Here’s a brief overview of identity, why it&#x27;s vital to information security, and why you should know more about it.</div>
132 <div>
133 <span style="background: #e6e6e6;
134 color: #777;
135 border-radius: 3px;
136 padding: 0px 10px;
137 font-size: 70%;
138 display: inline-block;
139 margin-top: 5px;
140 font-weight: 600;">Blog</span>
141 <span style="background: #e6e6e6;
142 color: #777;
143 border-radius: 3px;
144 padding: 0px 10px;
145 font-size: 70%;
146 display: inline-block;
147 margin-top: 5px;
148 font-weight: 600;">Single sign on</span>
149 <span style="background: #e6e6e6;
150 color: #777;
151 border-radius: 3px;
152 padding: 0px 10px;
153 font-size: 70%;
154 display: inline-block;
155 margin-top: 5px;
156 font-weight: 600;">Social login</span>
157 </div>
158 </div>
159 <div style="margin-bottom: 30px;">
160 <a href="https://stackoverflow.blog/2020/12/15/podcast-295-diving-into-headless-automation-active-monitoring-playwright-and-puppeteer/" style="color: #3252a8; font-weight: bold;">Podcast 295: Diving into headless automation, active monitoring, Playwright and Puppeteer</a>
161 <div style="margin-block-start: 5px; font-size: 90%;">This week we chat with Tim Nolet, whose commentary appeared in a previous episode after he complained about Amazon forking his OS service and presenting it as new product without so much as a thanks. Since then the two parties have worked things out, and Tim came on the show to explain what happened, what he builds in the open source world, and the company he runs.</div>
162 <div>
163 <span style="background: #e6e6e6;
164 color: #777;
165 border-radius: 3px;
166 padding: 0px 10px;
167 font-size: 70%;
168 display: inline-block;
169 margin-top: 5px;
170 font-weight: 600;">Podcast</span>
171 <span style="background: #e6e6e6;
172 color: #777;
173 border-radius: 3px;
174 padding: 0px 10px;
175 font-size: 70%;
176 display: inline-block;
177 margin-top: 5px;
178 font-weight: 600;">Automation</span>
179 <span style="background: #e6e6e6;
180 color: #777;
181 border-radius: 3px;
182 padding: 0px 10px;
183 font-size: 70%;
184 display: inline-block;
185 margin-top: 5px;
186 font-weight: 600;">DevOps</span>
187 </div>
188 </div>
189 <div style="margin-bottom: 30px;">
190 <a href="https://speckyboy.com/2020-web-design-year-in-review/" style="color: #3252a8; font-weight: bold;">2020 Web Design Year in Review</a>
191 <div style="margin-block-start: 5px; font-size: 90%;">A year “like no other” is about to come to a close. 2020 was certainly unique for everyone – web designers included. And it challenged us on several levels.</div>
192 <div>
193 <span style="background: #e6e6e6;
194 color: #777;
195 border-radius: 3px;
196 padding: 0px 10px;
197 font-size: 70%;
198 display: inline-block;
199 margin-top: 5px;
200 font-weight: 600;">Blog</span>
201 <span style="background: #e6e6e6;
202 color: #777;
203 border-radius: 3px;
204 padding: 0px 10px;
205 font-size: 70%;
206 display: inline-block;
207 margin-top: 5px;
208 font-weight: 600;">Looking back</span>
209 </div>
210 </div>
211 <div style="margin-bottom: 30px;">
212 <a href="https://alexsexton.com/blog/2015/02/the-15-commandments-of-front-end-performance/" style="color: #3252a8; font-weight: bold;">The 15 Commandments of Front-End Performance</a>
213 <div style="margin-block-start: 5px; font-size: 90%;">This list is the product of many years of experience in the front-end web development field. I maintain this list as a reminder to myself to always follow best practices, and to not compromise on performance, even if I’m in a time crunch.</div>
214 <div>
215 <span style="background: #e6e6e6;
216 color: #777;
217 border-radius: 3px;
218 padding: 0px 10px;
219 font-size: 70%;
220 display: inline-block;
221 margin-top: 5px;
222 font-weight: 600;">Blog</span>
223 <span style="background: #e6e6e6;
224 color: #777;
225 border-radius: 3px;
226 padding: 0px 10px;
227 font-size: 70%;
228 display: inline-block;
229 margin-top: 5px;
230 font-weight: 600;">Front-end</span>
231 <span style="background: #e6e6e6;
232 color: #777;
233 border-radius: 3px;
234 padding: 0px 10px;
235 font-size: 70%;
236 display: inline-block;
237 margin-top: 5px;
238 font-weight: 600;">Best practices</span>
239 </div>
240 </div>
241 <div style="margin-bottom: 30px;">
242 <a href="https://opensource.googleblog.com/2020/12/finding-critical-open-source-projects.html" style="color: #3252a8; font-weight: bold;">Finding Critical Open Source Projects</a>
243 <div style="margin-block-start: 5px; font-size: 90%;">Criticality of an open source project is difficult to define; what might be a critical dependency for one consumer of open source software may be entirely absent for another. However, arriving at a shared understanding and framework allows us to have productive conversations about our dependencies. Simply put, we define criticality to be the influence and importance of a project.</div>
244 <div>
245 <span style="background: #e6e6e6;
246 color: #777;
247 border-radius: 3px;
248 padding: 0px 10px;
249 font-size: 70%;
250 display: inline-block;
251 margin-top: 5px;
252 font-weight: 600;">Blog</span>
253 <span style="background: #e6e6e6;
254 color: #777;
255 border-radius: 3px;
256 padding: 0px 10px;
257 font-size: 70%;
258 display: inline-block;
259 margin-top: 5px;
260 font-weight: 600;">Open source</span>
261 </div>
262 </div>
263 <div style="margin-bottom: 30px;">
264 <a href="https://www.stitcher.com/show/the-state-of-the-web/episode/http-archives-10th-anniversary-79556890" style="color: #3252a8; font-weight: bold;">HTTP Archive&#x27;s 10th Anniversary</a>
265 <div style="margin-block-start: 5px; font-size: 90%;">Rick meets with Steve Souders, who created the HTTP Archive project 10 years ago this month, to talk about its origins and reflect on it&#x27;s growth.</div>
266 <div>
267 <span style="background: #e6e6e6;
268 color: #777;
269 border-radius: 3px;
270 padding: 0px 10px;
271 font-size: 70%;
272 display: inline-block;
273 margin-top: 5px;
274 font-weight: 600;">Podcast</span>
275 <span style="background: #e6e6e6;
276 color: #777;
277 border-radius: 3px;
278 padding: 0px 10px;
279 font-size: 70%;
280 display: inline-block;
281 margin-top: 5px;
282 font-weight: 600;">Performance</span>
283 </div>
284 </div>
285 <div style="margin-bottom: 30px;">
286 <a href="https://www.startalkradio.net/show/cosmic-queries-medieval-science-and-history/" style="color: #3252a8; font-weight: bold;">Cosmic Queries – Medieval Science and History</a>
287 <div style="margin-block-start: 5px; font-size: 90%;">When you think Middle Ages, does scientific advancement pop into your head? On this episode of StarTalk Radio, we’re exploring the science and history of medieval times as Neil deGrasse Tyson and comic co-host Matt Kirshen answer fan-submitted Cosmic Queries with Seb Falk, Cambridge Historian of Science and author of The Light Ages: The Surprising Story of Medieval Science.</div>
288 <div>
289 <span style="background: #e6e6e6;
290 color: #777;
291 border-radius: 3px;
292 padding: 0px 10px;
293 font-size: 70%;
294 display: inline-block;
295 margin-top: 5px;
296 font-weight: 600;">Podcast</span>
297 <span style="background: #e6e6e6;
298 color: #777;
299 border-radius: 3px;
300 padding: 0px 10px;
301 font-size: 70%;
302 display: inline-block;
303 margin-top: 5px;
304 font-weight: 600;">Science</span>
305 <span style="background: #e6e6e6;
306 color: #777;
307 border-radius: 3px;
308 padding: 0px 10px;
309 font-size: 70%;
310 display: inline-block;
311 margin-top: 5px;
312 font-weight: 600;">History</span>
313 </div>
314 </div>
315
316 </div>
317
318 <div style="text-align: center; font-size: 80%; margin-top: 20px;">
319 <a style="color: #666; margin: auto 10px" href="https://mitjafelicijan.com/weekly-newsletter-archive/">weekly links archive</a>
320 <a style="color: #666; margin: auto 10px" href="https://mitjafelicijan.com">mitjafelicijan.com</a>
321 <a style="color: #666; margin: auto 10px" href="https://github.com/mitjafelicijan">github.com/mitjafelicijan</a>
322 </div>
323
324 </body>
325
326</html>
diff --git a/newsletter/generated/2021-01.html b/newsletter/generated/2021-01.html
deleted file mode 100644
index 440f0db..0000000
--- a/newsletter/generated/2021-01.html
+++ /dev/null
@@ -1,198 +0,0 @@
1<html>
2
3 <head>
4 <title>2021: Week #01 Links</title>
5 </head>
6
7 <body style="background: #f2f2f2; padding: 60px; color: #222222; line-height: 22px; font-family: sans-serif, system-ui, -apple-system; font-size: 16px;">
8
9 <div style="width: 650px; background: #ffffff; text-align: left; padding: 40px; margin: 0 auto; border-radius: 10px;">
10
11 <div style="margin-bottom: 30px;">
12 <a href="https://www.youtube.com/watch?v&#x3D;p8u_k2LIZyo" style="color: #3252a8; font-weight: bold;">Fast Inverse Square Root — A Quake III Algorithm</a>
13 <div style="margin-block-start: 5px; font-size: 90%;">In this video we will take an in depth look at the fast inverse square root and see where the mysterious number 0x5f3759df comes from. This algorithm became famous after id Software open sourced the engine for Quake III. On the way we will also learn about floating point numbers and newton&#x27;s method.</div>
14 <div>
15 <span style="background: #e6e6e6;
16 color: #777;
17 border-radius: 3px;
18 padding: 0px 10px;
19 font-size: 70%;
20 display: inline-block;
21 margin-top: 5px;
22 font-weight: 600;">Video</span>
23 <span style="background: #e6e6e6;
24 color: #777;
25 border-radius: 3px;
26 padding: 0px 10px;
27 font-size: 70%;
28 display: inline-block;
29 margin-top: 5px;
30 font-weight: 600;">Quake III</span>
31 </div>
32 </div>
33 <div style="margin-bottom: 30px;">
34 <a href="https://www.youtube.com/watch?v&#x3D;zV2VEOHNCJU" style="color: #3252a8; font-weight: bold;">Goodbye, Adobe Flash</a>
35 <div style="margin-block-start: 5px; font-size: 90%;">A thrice-weekly news show about tech + gaming culture.</div>
36 <div>
37 <span style="background: #e6e6e6;
38 color: #777;
39 border-radius: 3px;
40 padding: 0px 10px;
41 font-size: 70%;
42 display: inline-block;
43 margin-top: 5px;
44 font-weight: 600;">Video</span>
45 <span style="background: #e6e6e6;
46 color: #777;
47 border-radius: 3px;
48 padding: 0px 10px;
49 font-size: 70%;
50 display: inline-block;
51 margin-top: 5px;
52 font-weight: 600;">Tech news</span>
53 </div>
54 </div>
55 <div style="margin-bottom: 30px;">
56 <a href="https://www.youtube.com/watch?v&#x3D;HL7DEkXV_60" style="color: #3252a8; font-weight: bold;">The Year&#x27;s Biggest Breakthroughs in Math and Computer Science</a>
57 <div style="margin-block-start: 5px; font-size: 90%;">For mathematicians and computer scientists, 2020 was full of discipline-spanning discoveries and celebrations of creativity. We&#x27;d like to take a moment to recognize some of these achievements.</div>
58 <div>
59 <span style="background: #e6e6e6;
60 color: #777;
61 border-radius: 3px;
62 padding: 0px 10px;
63 font-size: 70%;
64 display: inline-block;
65 margin-top: 5px;
66 font-weight: 600;">Video</span>
67 <span style="background: #e6e6e6;
68 color: #777;
69 border-radius: 3px;
70 padding: 0px 10px;
71 font-size: 70%;
72 display: inline-block;
73 margin-top: 5px;
74 font-weight: 600;">Math and Computer Science</span>
75 </div>
76 </div>
77 <div style="margin-bottom: 30px;">
78 <a href="https://www.freecodecamp.org/news/20-award-winning-games-explained-code-breakdown/" style="color: #3252a8; font-weight: bold;">20 Award-Winning 13-Kilobyte JavaScript Games You Can Play in Your Browser</a>
79 <div style="margin-block-start: 5px; font-size: 90%;">In this article, I am going to show you 20 award-winning JavaScript games from the JS13kGames competition. So in other words, you&#x27;re going to see 20 great examples of code from 20 insanely talented developers.</div>
80 <div>
81 <span style="background: #e6e6e6;
82 color: #777;
83 border-radius: 3px;
84 padding: 0px 10px;
85 font-size: 70%;
86 display: inline-block;
87 margin-top: 5px;
88 font-weight: 600;">Blog</span>
89 <span style="background: #e6e6e6;
90 color: #777;
91 border-radius: 3px;
92 padding: 0px 10px;
93 font-size: 70%;
94 display: inline-block;
95 margin-top: 5px;
96 font-weight: 600;">Games</span>
97 </div>
98 </div>
99 <div style="margin-bottom: 30px;">
100 <a href="https://www.hackster.io/news/espressif-s-new-esp32-s3-adds-ai-features-for-iot-devices-b42b902abdf5" style="color: #3252a8; font-weight: bold;">Espressif&#x27;s New ESP32-S3 Adds AI Features for IoT Devices</a>
101 <div style="margin-block-start: 5px; font-size: 90%;">The very last day of 2020 came with great news for ESP32 fans. The ubiquitous IoT microcontroller is getting a new family member — the ESP32-S3! Espressif&#x27;s latest introduction includes an updated dual-core MCU, expanded GPIO, AI-focused instructions, and hardware-accelerated security features.</div>
102 <div>
103 <span style="background: #e6e6e6;
104 color: #777;
105 border-radius: 3px;
106 padding: 0px 10px;
107 font-size: 70%;
108 display: inline-block;
109 margin-top: 5px;
110 font-weight: 600;">Product</span>
111 <span style="background: #e6e6e6;
112 color: #777;
113 border-radius: 3px;
114 padding: 0px 10px;
115 font-size: 70%;
116 display: inline-block;
117 margin-top: 5px;
118 font-weight: 600;">IoT</span>
119 </div>
120 </div>
121 <div style="margin-bottom: 30px;">
122 <a href="https://www.rbth.com/history/333230-radioactive-materials-sold-ussr" style="color: #3252a8; font-weight: bold;">Radioactive materials were once sold in a STORE in the USSR!</a>
123 <div style="margin-block-start: 5px; font-size: 90%;">‘Izotopy’ was the name of a specialist store in Moscow that sold radioactive materials. And demand for them was very high. But how was such a thing possible?</div>
124 <div>
125 <span style="background: #e6e6e6;
126 color: #777;
127 border-radius: 3px;
128 padding: 0px 10px;
129 font-size: 70%;
130 display: inline-block;
131 margin-top: 5px;
132 font-weight: 600;">Blog</span>
133 <span style="background: #e6e6e6;
134 color: #777;
135 border-radius: 3px;
136 padding: 0px 10px;
137 font-size: 70%;
138 display: inline-block;
139 margin-top: 5px;
140 font-weight: 600;">Russia</span>
141 </div>
142 </div>
143 <div style="margin-bottom: 30px;">
144 <a href="https://stackoverflow.blog/2021/01/01/podcast-300-welcome-to-2021-with-joel-spolsky/" style="color: #3252a8; font-weight: bold;">Welcome to 2021 with Joel Spolsky</a>
145 <div style="margin-block-start: 5px; font-size: 90%;">We are stepping into a new year with a very special guest, Stack Overflow&#x27;s co-founder and chairman, Joel Spolsky. We chat programming, social networks, and what comes next.</div>
146 <div>
147 <span style="background: #e6e6e6;
148 color: #777;
149 border-radius: 3px;
150 padding: 0px 10px;
151 font-size: 70%;
152 display: inline-block;
153 margin-top: 5px;
154 font-weight: 600;">Podcast</span>
155 <span style="background: #e6e6e6;
156 color: #777;
157 border-radius: 3px;
158 padding: 0px 10px;
159 font-size: 70%;
160 display: inline-block;
161 margin-top: 5px;
162 font-weight: 600;">Stack Overflow</span>
163 </div>
164 </div>
165 <div style="margin-bottom: 30px;">
166 <a href="https://replika.ai/" style="color: #3252a8; font-weight: bold;">The AI companion who cares</a>
167 <div style="margin-block-start: 5px; font-size: 90%;">Replika is a #1 chatbot companion powered by artificial intelligence.</div>
168 <div>
169 <span style="background: #e6e6e6;
170 color: #777;
171 border-radius: 3px;
172 padding: 0px 10px;
173 font-size: 70%;
174 display: inline-block;
175 margin-top: 5px;
176 font-weight: 600;">Product</span>
177 <span style="background: #e6e6e6;
178 color: #777;
179 border-radius: 3px;
180 padding: 0px 10px;
181 font-size: 70%;
182 display: inline-block;
183 margin-top: 5px;
184 font-weight: 600;">AI Chatbot</span>
185 </div>
186 </div>
187
188 </div>
189
190 <div style="text-align: center; font-size: 80%; margin-top: 20px;">
191 <a style="color: #666; margin: auto 10px" href="https://mitjafelicijan.com/weekly-newsletter-archive/">weekly links archive</a>
192 <a style="color: #666; margin: auto 10px" href="https://mitjafelicijan.com">mitjafelicijan.com</a>
193 <a style="color: #666; margin: auto 10px" href="https://github.com/mitjafelicijan">github.com/mitjafelicijan</a>
194 </div>
195
196 </body>
197
198</html>
diff --git a/newsletter/generated/index.html b/newsletter/generated/index.html
deleted file mode 100644
index bc73a5e..0000000
--- a/newsletter/generated/index.html
+++ /dev/null
@@ -1,37 +0,0 @@
1<!DOCTYPE html>
2<html lang="en">
3
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0">
8 <meta http-equiv="X-UA-Compatible" content="ie=edge">
9
10 <meta name="theme-color" content="#ffffff">
11 <meta name="generator" content="https://github.com/mitjafelicijan/staticgen">
12
13 <title>Mitja Felicijan - Weekly links archive</title>
14
15 <link rel="stylesheet" href="https://mitjafelicijan.com/static/style.css">
16 <link rel="icon" type="image/png" href="https://mitjafelicijan.com/static/avatar-64x64.png">
17
18 </head>
19
20 <body>
21
22 <main>
23
24 <a href="/">⬅ Back home</a>
25
26 <h2>Weekly links archive</h2>
27 <ul class="article-list">
28 <li><a href="/weekly-newsletter-archive/2021-01.html">2021, 01</a></li>
29 <li><a href="/weekly-newsletter-archive/2020-53.html">2020, 53</a></li>
30 <li><a href="/weekly-newsletter-archive/2020-52.html">2020, 52</a></li>
31 </ul>
32
33 </main>
34
35 </body>
36
37</html>
diff --git a/newsletter/package.json b/newsletter/package.json
deleted file mode 100644
index c4c5bc3..0000000
--- a/newsletter/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
1{
2 "name": "weekly-mailing",
3 "version": "1.0.0",
4 "description": "",
5 "main": "index.js",
6 "scripts": {
7 "test": "echo \"Error: no test specified\" && exit 1"
8 },
9 "keywords": [],
10 "author": "",
11 "license": "ISC",
12 "dependencies": {
13 "@sendgrid/mail": "^7.4.0",
14 "axios": "^0.21.1",
15 "dayjs": "^1.9.7",
16 "handlebars": "^4.7.6",
17 "meow": "^8.1.0",
18 "yesno": "^0.3.1"
19 }
20}
diff --git a/newsletter/send b/newsletter/send
deleted file mode 100755
index 66bdeb9..0000000
--- a/newsletter/send
+++ /dev/null
@@ -1,129 +0,0 @@
1#!/usr/bin/env node
2
3const fs = require('fs');
4const path = require('path');
5const axios = require('axios');
6const dayjs = require('dayjs');
7const weekOfYear = require('dayjs/plugin/weekOfYear');
8const handlebars = require('handlebars');
9const yesno = require('yesno');
10const meow = require('meow');
11const { reverse } = require('dns');
12
13dayjs.extend(weekOfYear);
14
15(async function () {
16
17 const cli = meow(`
18 Usage
19 $ ./send <input>
20
21 Options
22 --production, -p Uses production mailing list
23
24 Examples
25 $ ./send campaigns/2020-51.json --production
26 `, {
27 flags: {
28 production: {
29 type: 'boolean',
30 alias: 'p'
31 }
32 }
33 });
34
35 if (cli.input.length === 0) {
36 console.log('You must provide campagin JSON file.');
37 process.exit(1);
38 }
39
40 const campaignJSONFile = cli.input[0];
41 const year = path.basename(cli.input[0]).split('.')[0].split('-')[0];
42 const week = path.basename(cli.input[0]).split('.')[0].split('-')[1];
43 const from = { name: 'Mitja Felicijan', email: 'weekly@mitjafelicijan.com' };
44 const mailingList = cli.flags.production
45 ? { env: 'production', id: 'b03de6fc-ff95-40a0-8707-c0706b3c0b31' }
46 : { env: 'testing', id: '2bbcdedb-49d8-48f3-9f33-df6e04c9e5bf' };
47
48 const headers = {
49 'Authorization': 'Bearer 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',
50 'Content-Type': 'application/json',
51 };
52
53 // gets current week
54 let campaign = null;
55 try {
56 campaign = require(`./${campaignJSONFile}`);
57 } catch (err) {
58 console.error(err);
59 process.exit(1);
60 }
61
62 // gets list subscribers
63 const personalizations = [];
64 const contacts = await axios.get('https://api.sendgrid.com/v3/marketing/contacts', { headers: headers }).catch(error => { console.log(error) });
65 if (contacts) {
66 for (const contact of contacts.data.result) {
67 if (contact.list_ids.includes(mailingList.id)) {
68 personalizations.push({ to: [{ email: contact.email }] });
69 }
70 }
71 }
72
73 // gets handlebars template contents
74 let template = null;
75 try {
76 template = handlebars.compile(fs.readFileSync('templates/mailing.hbs', 'utf8'));
77 template = template({ title: `${year}: Week #${week} Links`, campaign });
78 } catch (e) {
79 console.error(err);
80 process.exit(1);
81 }
82
83 fs.writeFileSync(`generated/${year}-${week}.html`, template);
84
85 // asks for user input to allow sending emails
86 console.log(`\nWill send to ${personalizations.length} subscribers from list "${mailingList.env}":`)
87 for (const subscriber of personalizations) {
88 console.log(' - ', subscriber.to[0].email)
89 }
90
91 const consent = await yesno({
92 question: '\nAre you sure you want to continue?'
93 });
94
95 if (consent) {
96 // send actual emails
97 await axios.post('https://api.sendgrid.com/v3/mail/send', {
98 from,
99 subject: `Week #${week} Links`,
100 personalizations,
101 content: [{
102 type: 'text/html',
103 value: template
104 }]
105 }, { headers: headers }).catch(error => { console.log(error) });
106 }
107
108 console.log('\nAnd we are done.\n');
109
110 // generates index file
111
112 const HTMLFiles = fs.readdirSync('./generated/');
113 const indexFile = HTMLFiles.indexOf('index.html');
114 if (indexFile > -1) HTMLFiles.splice(indexFile, 1);
115
116 HTMLFiles.forEach((item, idx) => {
117 const parts = item.split('.')[0].split('-');
118 HTMLFiles[idx] = {
119 year: parts[0],
120 week: parts[1],
121 file: item,
122 }
123 });
124
125 let indexTemplate = handlebars.compile(fs.readFileSync('templates/index.hbs', 'utf8'));
126 indexTemplate = indexTemplate({ files: HTMLFiles.reverse() });
127 fs.writeFileSync(`generated/index.html`, indexTemplate);
128
129}());
diff --git a/newsletter/templates/index.hbs b/newsletter/templates/index.hbs
deleted file mode 100644
index 8a96125..0000000
--- a/newsletter/templates/index.hbs
+++ /dev/null
@@ -1,37 +0,0 @@
1<!DOCTYPE html>
2<html lang="en">
3
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0">
8 <meta http-equiv="X-UA-Compatible" content="ie=edge">
9
10 <meta name="theme-color" content="#ffffff">
11 <meta name="generator" content="https://github.com/mitjafelicijan/staticgen">
12
13 <title>Mitja Felicijan - Weekly links archive</title>
14
15 <link rel="stylesheet" href="https://mitjafelicijan.com/static/style.css">
16 <link rel="icon" type="image/png" href="https://mitjafelicijan.com/static/avatar-64x64.png">
17
18 </head>
19
20 <body>
21
22 <main>
23
24 <a href="/">⬅ Back home</a>
25
26 <h2>Weekly links archive</h2>
27 <ul class="article-list">
28 {{#each files}}
29 <li><a href="/weekly-newsletter-archive/{{ this.file }}">{{ this.year }}, {{ this.week }}</a></li>
30 {{/each}}
31 </ul>
32
33 </main>
34
35 </body>
36
37</html>
diff --git a/newsletter/templates/mailing.hbs b/newsletter/templates/mailing.hbs
deleted file mode 100644
index d1c8cf4..0000000
--- a/newsletter/templates/mailing.hbs
+++ /dev/null
@@ -1,42 +0,0 @@
1<html>
2
3 <head>
4 <title>{{ title }}</title>
5 </head>
6
7 <body style="background: #f2f2f2; padding: 60px; color: #222222; line-height: 22px; font-family: sans-serif, system-ui, -apple-system; font-size: 16px;">
8
9 <div style="width: 650px; background: #ffffff; text-align: left; padding: 40px; margin: 0 auto; border-radius: 10px;">
10
11 {{#each campaign.categories}}
12 {{#each this.links}}
13 <div style="margin-bottom: 30px;">
14 <a href="{{this.url}}" style="color: #3252a8; font-weight: bold;">{{this.title}}</a>
15 <div style="margin-block-start: 5px; font-size: 90%;">{{this.excerpt}}</div>
16 <div>
17 {{#each this.tags}}
18 <span style="background: #e6e6e6;
19 color: #777;
20 border-radius: 3px;
21 padding: 0px 10px;
22 font-size: 70%;
23 display: inline-block;
24 margin-top: 5px;
25 font-weight: 600;">{{.}}</span>
26 {{/each}}
27 </div>
28 </div>
29 {{/each}}
30 {{/each}}
31
32 </div>
33
34 <div style="text-align: center; font-size: 80%; margin-top: 20px;">
35 <a style="color: #666; margin: auto 10px" href="https://mitjafelicijan.com/weekly-newsletter-archive/">weekly links archive</a>
36 <a style="color: #666; margin: auto 10px" href="https://mitjafelicijan.com">mitjafelicijan.com</a>
37 <a style="color: #666; margin: auto 10px" href="https://github.com/mitjafelicijan">github.com/mitjafelicijan</a>
38 </div>
39
40 </body>
41
42</html>
diff --git a/content/2015-03-07-curriculum-vitae copy.md b/posts/2015-03-07-curriculum-vitae.md
index 1b2fddf..bb082e7 100644
--- a/content/2015-03-07-curriculum-vitae copy.md
+++ b/posts/2015-03-07-curriculum-vitae.md
@@ -1,12 +1,15 @@
1~ title: Curriculum Vitae 1---
2~ slug: /curriculum-vitae.html 2Title: Curriculum Vitae
3~ date: 2018-01-16 3Description: Curriculum Vitae
4~ template: page 4Slug: curriculum-vitae
5~ hide: true 5Listing: false
6Created: ""
7Tags: []
8---
6 9
7**Mitja Felicijan** 10**Mitja Felicijan**
8 11
9*[mitja.felicijan@gmail.com](mailto:mitja.felicijan@gmail.com?subject=Website+CV+Contact)* 12*[m@mitjafelicijan.com](mailto:m@mitjafelicijan.com?subject=Website+CV+Contact)*
10 13
11*Slovenia, EU* 14*Slovenia, EU*
12 15
diff --git a/content/2017-03-07-golang-profiling-simplified.md b/posts/2017-03-07-golang-profiling-simplified.md
index d5a9541..8059aec 100644
--- a/content/2017-03-07-golang-profiling-simplified.md
+++ b/posts/2017-03-07-golang-profiling-simplified.md
@@ -1,9 +1,11 @@
1~ title: Golang profiling simplified 1---
2~ description: Golang profiling demystified 2Title: Golang profiling simplified
3~ slug: /golang-profiling-simplified.html 3Description: Golang profiling simplified
4~ date: 2017-03-07 4Slug: golang-profiling-simplified
5~ template: post 5Listing: true
6~ hide: false 6Created: 2017, March 7
7Tags: []
8---
7 9
8Many posts have been written regarding profiling in Golang and I haven’t found proper tutorial regarding this. Almost all of them are missing some part of important information and it gets pretty frustrating when you have a deadline and are not finding simple distilled solution. 10Many posts have been written regarding profiling in Golang and I haven’t found proper tutorial regarding this. Almost all of them are missing some part of important information and it gets pretty frustrating when you have a deadline and are not finding simple distilled solution.
9 11
diff --git a/content/2017-04-17-what-i-ve-learned-developing-ad-server.md b/posts/2017-04-17-what-i-ve-learned-developing-ad-server.md
index d5f06b3..90fe238 100644
--- a/content/2017-04-17-what-i-ve-learned-developing-ad-server.md
+++ b/posts/2017-04-17-what-i-ve-learned-developing-ad-server.md
@@ -1,9 +1,11 @@
1~ title: What I've learned developing ad server 1---
2~ description: Lessons I learned developing contextual ad server 2Title: What I've learned developing ad server
3~ slug: /what-i-ve-learned-developing-ad-server.html 3Description: Lessons I learned developing contextual ad server
4~ date: 2017-04-17 4Slug: what-i-ve-learned-developing-ad-server
5~ template: post 5Listing: true
6~ hide: false 6Created: 2017, April 17
7Tags: []
8---
7 9
8For the past year and half I have been developing native advertising server that contextually matches ads and displays them in different template forms on variety of websites. This project grew from serving thousands of ads per day to millions. 10For the past year and half I have been developing native advertising server that contextually matches ads and displays them in different template forms on variety of websites. This project grew from serving thousands of ads per day to millions.
9 11
diff --git a/content/2017-04-21-profiling-python-web-applications-with-visual-tools.md b/posts/2017-04-21-profiling-python-web-applications-with-visual-tools.md
index 98a1971..af2c65a 100644
--- a/content/2017-04-21-profiling-python-web-applications-with-visual-tools.md
+++ b/posts/2017-04-21-profiling-python-web-applications-with-visual-tools.md
@@ -1,9 +1,11 @@
1~ title: Profiling Python web applications with visual tools 1---
2~ description: Missing link when debugging and profiling python web application 2Title: Profiling Python web applications with visual tools
3~ slug: /profiling-python-web-applications-with-visual-tools.html 3Description: Missing link when debugging and profiling python web application
4~ date: 2017-04-21 4Slug: profiling-python-web-applications-with-visual-tools
5~ template: post 5Listing: true
6~ hide: false 6Created: 2017, April 21
7Tags: []
8---
7 9
8I have been profiling my software with KCachegrind for a long time now and I was missing this option when I am developing API's or other web services. I always knew that this is possible but never really took the time and dive into it. 10I have been profiling my software with KCachegrind for a long time now and I was missing this option when I am developing API's or other web services. I always knew that this is possible but never really took the time and dive into it.
9 11
diff --git a/content/2017-08-11-simple-iot-application.md b/posts/2017-08-11-simple-iot-application.md
index 1b99eb1..dee5e74 100644
--- a/content/2017-08-11-simple-iot-application.md
+++ b/posts/2017-08-11-simple-iot-application.md
@@ -1,9 +1,11 @@
1~ title: Simple IOT application supported by real-time monitoring and data history 1---
2~ description: Develop simple IOT application with Arduino MKR1000 and Python 2Title: Simple IOT application supported by real-time monitoring and data history
3~ slug: /simple-iot-application.html 3Description: Develop simple IOT application with Arduino MKR1000 and Python
4~ date: 2017-08-11 4Slug: simple-iot-application
5~ template: post 5Listing: true
6~ hide: false 6Created: 2017, August 11
7Tags: []
8---
7 9
8## Initial thoughts 10## Initial thoughts
9 11
diff --git a/content/2018-01-16-using-digitalocean-spaces-object-storage-with-fuse.md b/posts/2018-01-16-using-digitalocean-spaces-object-storage-with-fuse.md
index 93a167e..ae895f7 100644
--- a/content/2018-01-16-using-digitalocean-spaces-object-storage-with-fuse.md
+++ b/posts/2018-01-16-using-digitalocean-spaces-object-storage-with-fuse.md
@@ -1,9 +1,11 @@
1~ title: Using DigitalOcean Spaces Object Storage with FUSE 1---
2~ description: Using DigitalOcean Spaces Object Storage with FUSE 2Title: Using DigitalOcean Spaces Object Storage with FUSE
3~ slug: /using-digitalocean-spaces-object-storage-with-fuse.html 3Description: Using DigitalOcean Spaces Object Storage with FUSE
4~ date: 2018-01-16 4Slug: using-digitalocean-spaces-object-storage-with-fuse
5~ template: post 5Listing: true
6~ hide: false 6Created: 2018, January 16
7Tags: []
8---
7 9
8Couple of months ago [DigitalOcean](https://www.digitalocean.com) introduced new product called [Spaces](https://blog.digitalocean.com/introducing-spaces-object-storage/) which is Object Storage very similar to Amazon's S3. This really peaked my interest, because this was something I was missing and even the thought of going over the internet for such functionality was in no interest to me. Also in fashion with their previous pricing this also is very cheap and pricing page is a no-brainer compared to AWS or GCE. [Prices are clearly and precisely defined and outlined](https://www.digitalocean.com/pricing/). You must love them for that :) 10Couple of months ago [DigitalOcean](https://www.digitalocean.com) introduced new product called [Spaces](https://blog.digitalocean.com/introducing-spaces-object-storage/) which is Object Storage very similar to Amazon's S3. This really peaked my interest, because this was something I was missing and even the thought of going over the internet for such functionality was in no interest to me. Also in fashion with their previous pricing this also is very cheap and pricing page is a no-brainer compared to AWS or GCE. [Prices are clearly and precisely defined and outlined](https://www.digitalocean.com/pricing/). You must love them for that :)
9 11
diff --git a/content/2019-01-03-encoding-binary-data-into-dna-sequence.md b/posts/2019-01-03-encoding-binary-data-into-dna-sequence.md
index 335b868..1bf39ea 100644
--- a/content/2019-01-03-encoding-binary-data-into-dna-sequence.md
+++ b/posts/2019-01-03-encoding-binary-data-into-dna-sequence.md
@@ -1,9 +1,11 @@
1~ title: Encoding binary data into DNA sequence 1---
2~ description: Imagine a world where you could go outside and take a leaf from a tree and put it through your ~ personal DNA sequencer and get data like music, videos or computer programs from it 2Title: Encoding binary data into DNA sequence
3~ slug: /encoding-binary-data-into-dna-sequence.html 3Description: Imagine a world where you could go outside and take a leaf from a tree and put it through your ~ personal DNA sequencer and get data like music, videos or computer programs from it
4~ date: 2019-01-03 4Slug: encoding-binary-data-into-dna-sequence
5~ template: post 5Listing: true
6~ hide: false 6Created: 2019, January 3
7Tags: []
8---
7 9
8## Initial thoughts 10## Initial thoughts
9 11
diff --git a/content/2019-10-14-simplifying-and-reducing-clutter.md b/posts/2019-10-14-simplifying-and-reducing-clutter.md
index 580839b..24c55c6 100644
--- a/content/2019-10-14-simplifying-and-reducing-clutter.md
+++ b/posts/2019-10-14-simplifying-and-reducing-clutter.md
@@ -1,9 +1,11 @@
1~ title: Simplifying and reducing clutter in my life and work 1---
2~ description: Simplifying and reducing clutter in my life and work 2Title: Simplifying and reducing clutter in my life and work
3~ slug: /simplifying-and-reducing-clutter.html 3Description: Simplifying and reducing clutter in my life and work
4~ date: 2019-10-14 4Slug: simplifying-and-reducing-clutter
5~ template: post 5Listing: true
6~ hide: false 6Created: 2019, October 14
7Tags: []
8---
7 9
8I recently moved my main working machine back from Hachintosh to Linux. Well the experiment was interesting and I have done some great work on macOS but it was time to move back. 10I recently moved my main working machine back from Hachintosh to Linux. Well the experiment was interesting and I have done some great work on macOS but it was time to move back.
9 11
diff --git a/content/2019-10-19-using-sentiment-analysis-for-click-bait-detection-in-rss-feeds.md b/posts/2019-10-19-using-sentiment-analysis-for-click-bait-detection-in-rss-feeds.md
index 33e35cb..b975828 100644
--- a/content/2019-10-19-using-sentiment-analysis-for-click-bait-detection-in-rss-feeds.md
+++ b/posts/2019-10-19-using-sentiment-analysis-for-click-bait-detection-in-rss-feeds.md
@@ -1,9 +1,11 @@
1~ title: Using sentiment analysis for click&#8209;bait detection in RSS feeds 1---
2~ description: Using Python with sentiment analysis to detect if titles in RSS feeds are click-bait 2Title: Using sentiment analysis for click&#8209;bait detection in RSS feeds
3~ slug: /using-sentiment-analysis-for-click-bait-detection-in-rss-feeds.html 3Description: Using Python with sentiment analysis to detect if titles in RSS feeds are click-bait
4~ date: 2019-10-19 4Slug: using-sentiment-analysis-for-click-bait-detection-in-rss-feeds
5~ template: post 5Listing: true
6~ hide: false 6Created: 2019, October 19
7Tags: []
8---
7 9
8## Initial thoughts 10## Initial thoughts
9 11
diff --git a/content/2020-03-22-simple-sse-based-pubsub-server.md b/posts/2020-03-22-simple-sse-based-pubsub-server.md
index d7bd451..56a7dfa 100644
--- a/content/2020-03-22-simple-sse-based-pubsub-server.md
+++ b/posts/2020-03-22-simple-sse-based-pubsub-server.md
@@ -1,9 +1,11 @@
1~ title: Simple Server-Sent Events based PubSub Server 1---
2~ description: PubSub server made with Server-Sent Events 2Title: Simple Server-Sent Events based PubSub Server
3~ slug: /simple-server-sent-events-based-pubsub-server.html 3Description: Simple Server-Sent Events based PubSub Server
4~ date: 2020-03-22 4Slug: simple-server-sent-events-based-pubsub-server
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, March 22
7Tags: []
8---
7 9
8## Before we continue ... 10## Before we continue ...
9 11
diff --git a/content/2020-03-27-create-placeholder-images-with-sharp.md b/posts/2020-03-27-create-placeholder-images-with-sharp.md
index e53a7de..ef035c9 100644
--- a/content/2020-03-27-create-placeholder-images-with-sharp.md
+++ b/posts/2020-03-27-create-placeholder-images-with-sharp.md
@@ -1,9 +1,11 @@
1~ title: Create placeholder images with sharp Node.js image processing library 1---
2~ description: Create placeholder images with sharp Node.js image processing library 2Title: Create placeholder images with sharp Node.js image processing library
3~ slug: /create-placeholder-images-with-sharp.html 3Description: Create placeholder images with sharp Node.js image processing library
4~ date: 2020-03-27 4Slug: create-placeholder-images-with-sharp
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, March 27
7Tags: []
8---
7 9
8I have been searching for a solution to pre-generate some placeholder images for image server I needed to develop that resizes images on S3. I though this would be a 15min job and quickly found out how very mistaken I was. 10I have been searching for a solution to pre-generate some placeholder images for image server I needed to develop that resizes images on S3. I though this would be a 15min job and quickly found out how very mistaken I was.
9 11
diff --git a/content/2020-03-29-the-strange-case-of-elasticsearch-allocation-failure.md b/posts/2020-03-29-the-strange-case-of-elasticsearch-allocation-failure.md
index db4f377..7d70a7d 100644
--- a/content/2020-03-29-the-strange-case-of-elasticsearch-allocation-failure.md
+++ b/posts/2020-03-29-the-strange-case-of-elasticsearch-allocation-failure.md
@@ -1,9 +1,11 @@
1~ title: The strange case of Elasticsearch allocation failure 1---
2~ description: Elasticsearch allocation failure on some indices while reporting domain processing 2Title: The strange case of Elasticsearch allocation failure
3~ slug: /the-strange-case-of-elasticsearch-allocation-failure.html 3Description: Elasticsearch allocation failure on some indices while reporting domain processing
4~ date: 2020-03-29 4Slug: the-strange-case-of-elasticsearch-allocation-failure
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, March 29
7Tags: []
8---
7 9
8I've been using Elasticsearch in production for 5 years now and never had a single problem with it. Hell, never even known there could be a problem. Just worked. All this time. The first node that I deployed is still being used in production, never updated, upgraded, touched in anyway. 10I've been using Elasticsearch in production for 5 years now and never had a single problem with it. Hell, never even known there could be a problem. Just worked. All this time. The first node that I deployed is still being used in production, never updated, upgraded, touched in anyway.
9 11
diff --git a/content/2020-03-30-my-love-and-hate-relationship-with-nodejs copy.md b/posts/2020-03-30-my-love-and-hate-relationship-with-nodejs copy.md
index a57e4a6..70e0f51 100644
--- a/content/2020-03-30-my-love-and-hate-relationship-with-nodejs copy.md
+++ b/posts/2020-03-30-my-love-and-hate-relationship-with-nodejs copy.md
@@ -1,9 +1,11 @@
1~ title: My love and hate relationship with Node.js 1---
2~ description: How I found a way to love and hate Node.js with a passion 2Title: My love and hate relationship with Node.js
3~ slug: /my-love-and-hate-relationship-with-nodejs.html 3Description: How I found a way to love and hate Node.js with a passion
4~ date: 2020-03-30 4Slug: my-love-and-hate-relationship-with-nodejs
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, March 30
7Tags: []
8---
7 9
8Previous project I was working on was being coded in [Golang](https://golang.org/). Also was my first project using it. And damn, that was an awesome experience. The whole thing is just superb. From how errors are handled. The C-like way you handle compiling. The way the language is structured making it incredibly versatile and easy to learn. 10Previous project I was working on was being coded in [Golang](https://golang.org/). Also was my first project using it. And damn, that was an awesome experience. The whole thing is just superb. From how errors are handled. The C-like way you handle compiling. The way the language is structured making it incredibly versatile and easy to learn.
9 11
diff --git a/content/2020-04-05-remote-work.md b/posts/2020-05-05-remote-work.md
index e7a1ff0..1588dbe 100644..100755
--- a/content/2020-04-05-remote-work.md
+++ b/posts/2020-05-05-remote-work.md
@@ -1,9 +1,11 @@
1~ title: Remote work and how it affects the daily lives of people 1---
2~ description: Remote work and how it affects the daily lives of people 2Title: Remote work and how it affects the daily lives of people
3~ slug: /remote-work.html 3Description: Remote work and how it affects the daily lives of people
4~ date: 2020-05-05 4Slug: remote-work
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, May 5
7Tags: []
8---
7 9
8I have been working remotely for the past 5 years. I love it. Love the freedom and make your schedule thingy. 10I have been working remotely for the past 5 years. I love it. Love the freedom and make your schedule thingy.
9 11
diff --git a/content/2020-08-15-systemd-disable-wake-onmouse.md b/posts/2020-08-15-systemd-disable-wake-onmouse.md
index dc22220..f4ac0ee 100644
--- a/content/2020-08-15-systemd-disable-wake-onmouse.md
+++ b/posts/2020-08-15-systemd-disable-wake-onmouse.md
@@ -1,9 +1,11 @@
1~ title: Disable mouse wake from suspend with systemd service 1---
2~ description: Disable mouse wake from suspend with systemd service 2Title: Disable mouse wake from suspend with systemd service
3~ slug: /disable-mouse-wake-from-suspend-with-systemd-service.html 3Description: Disable mouse wake from suspend with systemd service
4~ date: 2020-08-15 4Slug: disable-mouse-wake-from-suspend-with-systemd-service
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, August 15
7Tags: []
8---
7 9
8I recently bought [ThinkPad X220](https://www.laptopmag.com/reviews/laptops/lenovo-thinkpad-x220) just as a joke on eBay to test Linux distributions and play around with things and not destroy my main machine. Little to my knowledge I felt in love with it. Man, they really made awesome machines back then. 10I recently bought [ThinkPad X220](https://www.laptopmag.com/reviews/laptops/lenovo-thinkpad-x220) just as a joke on eBay to test Linux distributions and play around with things and not destroy my main machine. Little to my knowledge I felt in love with it. Man, they really made awesome machines back then.
9 11
diff --git a/content/2020-09-06-esp-and-micropython.md b/posts/2020-09-06-esp-and-micropython.md
index b5002ce..1052795 100644
--- a/content/2020-09-06-esp-and-micropython.md
+++ b/posts/2020-09-06-esp-and-micropython.md
@@ -1,9 +1,11 @@
1~ title: Getting started with MicroPython and ESP8266 1---
2~ description: Getting started with MicroPython and ESP8266 2Title: Getting started with MicroPython and ESP8266
3~ slug: /esp8266-and-micropython-guide.html 3Description: Getting started with MicroPython and ESP8266
4~ date: 2020-09-06 4Slug: esp8266-and-micropython-guide
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, September 6
7Tags: []
8---
7 9
8**Table of contents** 10**Table of contents**
9 11
diff --git a/content/2020-09-08-bind-warning-on-login.md b/posts/2020-09-08-bind-warning-on-login.md
index 51f59c7..2ccc3c6 100644
--- a/content/2020-09-08-bind-warning-on-login.md
+++ b/posts/2020-09-08-bind-warning-on-login.md
@@ -1,9 +1,11 @@
1~ title: Fix bind warning in .profile on login in Ubuntu 1---
2~ description: Fix bind warning in .profile on login in Ubuntu 2Title: Fix bind warning in .profile on login in Ubuntu
3~ slug: /bind-warning-on-login-in-ubuntu.html 3Description: Fix bind warning in .profile on login in Ubuntu
4~ date: 2020-09-08 4Slug: bind-warning-on-login-in-ubuntu
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, September 8
7Tags: []
8---
7 9
8Recently I moved back to [bash](https://www.gnu.org/software/bash/) as my default shell. I was previously using [fish](https://fishshell.com/) and got used to the cool features it has. But, regardless of that, I wanted to move to a more standard shell because I was hopping back and forth with exporting variables and stuff like that which got pretty annoying. 10Recently I moved back to [bash](https://www.gnu.org/software/bash/) as my default shell. I was previously using [fish](https://fishshell.com/) and got used to the cool features it has. But, regardless of that, I wanted to move to a more standard shell because I was hopping back and forth with exporting variables and stuff like that which got pretty annoying.
9 11
diff --git a/content/2020-09-09-digitalocean-sync.md b/posts/2020-09-09-digitalocean-sync.md
index 7c5dbbd..eeaf096 100644
--- a/content/2020-09-09-digitalocean-sync.md
+++ b/posts/2020-09-09-digitalocean-sync.md
@@ -1,10 +1,11 @@
1~ title: Using Digitalocean Spaces to sync between computers 1---
2~ description: Using Digitalocean Spaces to sync between computers 2Title: Using Digitalocean Spaces to sync between computers
3~ slug: /digitalocean-spaces-to-sync-between-computers.html 3Description: Using Digitalocean Spaces to sync between computers
4~ date: 2020-09-09 4Slug: digitalocean-spaces-to-sync-between-computers
5~ template: post 5Listing: true
6~ hide: false 6Created: 2020, September 9
7 7Tags: []
8---
8 9
9I've been using [Dropbox](https://www.dropbox.com/) for probably **10+ years** now and I-ve became so used to it that it runs in the background that I don't even imagine a world without it. But it's not without problems. 10I've been using [Dropbox](https://www.dropbox.com/) for probably **10+ years** now and I-ve became so used to it that it runs in the background that I don't even imagine a world without it. But it's not without problems.
10 11
diff --git a/static/avatar-512x512.png b/static/avatar-512x512.png
deleted file mode 100644
index fc34eee..0000000
--- a/static/avatar-512x512.png
+++ /dev/null
Binary files differ
diff --git a/static/avatar-64x64.png b/static/avatar-64x64.png
deleted file mode 100644
index 1406f46..0000000
--- a/static/avatar-64x64.png
+++ /dev/null
Binary files differ
diff --git a/static/style.css b/static/style.css
deleted file mode 100644
index 2265ccd..0000000
--- a/static/style.css
+++ /dev/null
@@ -1,261 +0,0 @@
1@import url('https://fonts.googleapis.com/css?family=PT+Serif:400,400i,700,700i&display=swap&subset=latin-ext');
2
3* {
4 box-sizing: border-box;
5}
6
7body {
8 line-height: 150%;
9 margin-bottom: 100px;
10 font-family: 'PT Serif', serif;
11 font-size: 20px;
12}
13
14a {
15 color: #000;
16 font-style: italic;
17 text-decoration: underline;
18 text-decoration-style: dotted;
19 text-decoration-color: #bbb;
20}
21
22main {
23 max-width: 800px;
24 padding: 20px 30px;
25 margin: 0 auto;
26}
27
28nav {
29 margin-bottom: 50px;
30}
31
32nav a {
33 display: inline-block;
34 margin-right: 20px;
35}
36
37header {
38 margin-block-end: 40px;
39}
40
41p {
42 line-height: 1.5;
43}
44
45p a {
46 text-decoration-color: #333;
47}
48
49blockquote {
50 position: relative;
51 margin-block-start: 30px;
52 margin-block-end: 30px;
53 margin-right: 0;
54}
55
56blockquote:before {
57 content: ' ';
58 background-image: url('/static/alert.svg');
59 background-size: 30px 30px;
60 height: 30px;
61 width: 30px;
62 position: absolute;
63 left: -40px;
64 top: 6px;
65}
66
67blockquote p {
68 padding-left: 10px;
69}
70
71h1 {
72 font-size: 260%;
73 line-height: initial;
74}
75
76h2 {
77 font-size: 180%;
78 line-height: initial;
79}
80
81h3 {
82 font-size: 140%;
83 line-height: initial;
84}
85
86img, video {
87 max-width: 100%;
88 margin: 30px auto;
89 display: block;
90}
91
92ul li {
93 list-style-type: square;
94}
95
96ul.article-list {
97 margin-block-end: 60px;
98}
99
100ul.article-list li {
101 margin-bottom: 25px;
102}
103
104ul.article-list time {
105 display: block;
106 font-size: 85%;
107}
108
109ul.article-list li a {
110 font-size: 120%;
111}
112
113ul.project-list li {
114 margin-bottom: 5px;
115}
116
117article .info {
118 font-style: oblique;
119}
120
121table {
122 width: 100%;
123}
124
125table, th, td {
126 border: 1px solid black;
127 text-align: left;
128}
129
130th, td {
131 padding: 5px 10px;
132}
133
134pre {
135 overflow: auto;
136}
137
138code, pre {
139 font-size: 16px;
140}
141
142code {
143 background: rgb(255, 241, 177);
144 padding: 2px 5px;
145}
146
147pre > code {
148 background: unset;
149 padding: unset;
150}
151
152p.modified {
153 font-style: oblique;
154 font-size: 90%;
155 margin-top: 50px;
156}
157
158.draft {
159 color: #ddd;
160 position: absolute;
161 top: 500px;
162 left: 400px;
163 font-size: 160px;
164 text-transform: uppercase;
165 font-weight: 800;
166 z-index: -1;
167 transform: rotate(-45deg);
168 display: block;
169}
170
171::selection {
172 background: #ff0;
173 color: #000;
174}
175
176::-moz-selection {
177 background: #ff0;
178 color: #000;
179}
180
181#replybox {
182 margin-top: 70px;
183}
184
185@media only screen and (max-width:480px) {
186 body {
187 font-size: 18px;
188 }
189
190 main {
191 padding: 20px;
192 }
193
194 nav {
195 text-align: center;
196 margin-bottom: initial;
197 }
198
199 nav a {
200 margin-bottom: 10px;
201 }
202
203 ul {
204 padding-left: 20px;
205 }
206
207 ul.article-list li {
208 margin-bottom: 20px;
209
210 }
211
212 ul.article-list li div {
213 display: block;
214 margin-top: 15px;
215 }
216
217 ul.article-list a {
218 display: block;
219 margin-top: 5px;
220 }
221
222 h1 {
223 font-size: 220%;
224 }
225
226 h2 {
227 font-size: 180%;
228 }
229
230 h3 {
231 font-size: 160%;
232 }
233
234 code, pre {
235 font-size: 14px;
236 }
237
238 .draft {
239 font-size: 90px;
240 top: 400px;
241 left: 50px;
242 }
243}
244
245@media (prefers-color-scheme: light) {
246 body {
247 background-color: white;
248 color: black;
249 }
250}
251
252@media (prefers-color-scheme: dark) {
253 body {
254 background-color: rgb(30, 30, 30);
255 color: white;
256 }
257
258 a {
259 color: white;
260 }
261}
diff --git a/staticgen.yml b/staticgen.yml
deleted file mode 100644
index e37a3ec..0000000
--- a/staticgen.yml
+++ /dev/null
@@ -1,21 +0,0 @@
1# folders
2content: content/
3public: public/
4templates: templates/
5static: static/
6assets: assets/
7
8# global settings
9title: Mitja Felicijan
10description: Fan of science fiction and dabbler in code
11author: Mitja Felicijan
12email: mitja.felicijan@gmail.com
13domain: https://mitjafelicijan.com
14twitter: "@mitjafelicijan"
15
16# use name of css file without .css extension
17# https://github.com/highlightjs/highlight.js/tree/master/src/styles
18highlightStye: github
19
20# google analytics
21ga: UA-12769079-10
diff --git a/template/_footer.html b/template/_footer.html
new file mode 100755
index 0000000..f137b83
--- /dev/null
+++ b/template/_footer.html
@@ -0,0 +1,5 @@
1<div class="footer">
2 <footer class="wrapper">
3 Generic footer
4 </footer>
5</div>
diff --git a/template/_includes.html b/template/_includes.html
new file mode 100755
index 0000000..1b1d92a
--- /dev/null
+++ b/template/_includes.html
@@ -0,0 +1,9 @@
1<!-- user code -->
2
3<script src="/script.js"></script>
4
5<!-- code highlighting -->
6
7<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/styles/github.min.css">
8<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.18.1/highlight.min.js"></script>
9<script>hljs.initHighlightingOnLoad();</script> \ No newline at end of file
diff --git a/template/_meta.html b/template/_meta.html
new file mode 100755
index 0000000..69ad5fe
--- /dev/null
+++ b/template/_meta.html
@@ -0,0 +1,9 @@
1<meta charset="utf-8">
2<meta name="theme-color" content="#ffffff">
3<meta name="viewport" content="width=device-width, initial-scale=1.0">
4<meta http-equiv="X-UA-Compatible" content="ie=edge">
5
6<link rel="stylesheet" href="/style.css">
7
8<link rel="alternate" type="application/rss+xml" href="/feed.rss">
9<link rel="alternate" type="application/feed+json" href="/feed.json"> \ No newline at end of file
diff --git a/template/_navigation.html b/template/_navigation.html
new file mode 100755
index 0000000..3b21283
--- /dev/null
+++ b/template/_navigation.html
@@ -0,0 +1,15 @@
1<div class="navigation">
2 <header class="wrapper">
3 <h3 class="home">
4 <a href="/" itemprop="url">Mitja Felicijan</a>
5 </h3>
6
7 <nav itemscope itemtype="http://schema.org/SiteNavigationElement" class="main-navigation">
8 <meta itemprop="name" content="Main Menu">
9
10 <a href="/curriculum-vitae.html">CV</a>
11 <a href="https://github.com/mitjafelicijan" target="_blank" rel="noopener nofollow" itemprop="url">Github</a>
12 <a href="/feed.rss" itemprop="url">RSS feed</a>
13 </nav>
14 </header>
15</div> \ No newline at end of file
diff --git a/template/favicon.ico b/template/favicon.ico
new file mode 100644
index 0000000..d6be6ec
--- /dev/null
+++ b/template/favicon.ico
Binary files differ
diff --git a/template/index.html b/template/index.html
new file mode 100755
index 0000000..b9654a1
--- /dev/null
+++ b/template/index.html
@@ -0,0 +1,51 @@
1<!doctype html>
2<html lang="en">
3
4 <head>
5 {{template "_meta.html"}}
6
7 <title>{{.Title}}</title>
8 <meta name="description" content="{{.Description}}">
9 </head>
10
11 <body>
12
13 {{template "_navigation.html"}}
14
15 <main class="wrapper">
16 <h2>Posts</h2>
17 <nav itemscope itemtype="https://schema.org/SiteNavigationElement">
18 <meta itemprop="name" content="Article list">
19
20 <ul class="post-list">
21 {{range $index, $post := .Posts}}
22 <li>
23 <time>{{.Created}}</time>
24
25 <a href="/{{$post.Slug}}" title="{{$post.Title}}" itemprop="url">
26 <h2>{{$post.Title}}</h2>
27 </a>
28
29 </li>
30 {{end}}
31 </ul>
32 </nav>
33
34 <section class="project-list">
35 <h2>Side projects</h2>
36 <ul>
37 <li><a href="https://github.com/mitjafelicijan/redis-marshal" target="_blank" rel="noopener nofollow">redis-marshal - Lightweight Redis data exploration tool</a></li>
38 <li><a href="https://github.com/mitjafelicijan/dna-encoding" target="_blank" rel="noopener nofollow">dna-encoding - Tools for encoding files to DNA sequence</a></li>
39 <li><a href="https://github.com/mitjafelicijan/unfold" target="_blank" rel="noopener nofollow">unfold - Elastic Beanstalk like deployments for DigitalOcean</a></li>
40 <li><a href="https://github.com/mitjafelicijan/vertex" target="_blank" rel="noopener nofollow">vertex - Create mock API's and enrich them with some basic logic and simplify prototyping</a></li>
41 <li><a href="https://github.com/mitjafelicijan/spartan" target="_blank" rel="noopener nofollow">spartan - Spartan minimal UI kit for your applications</a></li>
42 <li><a href="https://github.com/mitjafelicijan/scarecrow" target="_blank" rel="noopener nofollow">scarecrow - Minimal configuration reverse proxy</a></li>
43 </ul>
44 </section>
45 </main>
46
47 {{template "_includes.html"}}
48
49 </body>
50
51</html> \ No newline at end of file
diff --git a/template/post.html b/template/post.html
new file mode 100755
index 0000000..88a2c7f
--- /dev/null
+++ b/template/post.html
@@ -0,0 +1,31 @@
1<!doctype html>
2<html lang="en">
3
4 <head>
5 {{template "_meta.html"}}
6
7 <title>{{.Title}}</title>
8 <meta name="description" content="{{.Description}}">
9 </head>
10
11 <body>
12
13 {{template "_navigation.html"}}
14
15 <main class="wrapper">
16 <article itemtype="http://schema.org/Article">
17 <header>
18 <h1 itemtype="headline">{{.Title}}</h1>
19 <time>{{.Created}}</time>
20 </header>
21 <div>
22 {{.Content}}
23 </div>
24 </article>
25 </main>
26
27 {{template "_includes.html"}}
28
29 </body>
30
31</html> \ No newline at end of file
diff --git a/template/script.js b/template/script.js
new file mode 100755
index 0000000..8b13789
--- /dev/null
+++ b/template/script.js
@@ -0,0 +1 @@
diff --git a/template/style.css b/template/style.css
new file mode 100755
index 0000000..4ca2932
--- /dev/null
+++ b/template/style.css
@@ -0,0 +1,275 @@
1:root {
2 --base-document-width: 740px;
3 --base-font-size: 18px;
4 --base-color: #111111;
5
6 --link-color: #111111;
7 --link-color-hover: #111111;
8
9 --label-color: #828282;
10
11 --border-color: #eeeeee;
12
13 --badge-background-color: #eeeeee;
14 --badge-label-color: #111111;
15}
16
17* {
18 box-sizing: border-box;
19}
20
21body {
22 background: white;
23 font-family: TimesNewRoman,Times New Roman,Times,Baskerville,Georgia,serif;
24 color: var(--base-color);
25 font-size: var(--base-font-size);
26 line-height: 1.7em;
27 padding: 0;
28 margin: 0;
29 padding-bottom: 100px;
30}
31
32
33::selection {
34 background: #ff0;
35 color: #000;
36}
37
38::-moz-selection {
39 background: #ff0;
40 color: #000;
41}
42
43/* width of the page */
44
45.wrapper {
46 max-width: var(--base-document-width);
47 margin: 0 auto;
48}
49
50
51/* headings */
52
53h1 { font-size: 220%; }
54h2 { font-size: 180%; }
55h3 { font-size: 160%; }
56h4 { font-size: 140%; }
57h5 { font-size: 120%; }
58h6 { font-size: 100%; }
59
60h1[itemtype="headline"] {
61 padding-bottom: 0;
62 margin-bottom: 20px;
63 font-size: 260%;
64 line-height: 1.2em;
65}
66
67/* tables */
68
69table {
70 width: 100%;
71}
72
73table, th, td {
74 border: 1px solid black;
75 text-align: left;
76}
77
78th, td {
79 padding: 5px 10px;
80}
81
82
83/* quotes */
84
85blockquote {
86 position: relative;
87 margin-block-start: 30px;
88 margin-block-end: 30px;
89 margin-right: 0;
90}
91
92blockquote:before {
93 content: ' ';
94 background-image: url('/assets/general/alert.svg');
95 background-size: 30px 30px;
96 height: 30px;
97 width: 30px;
98 position: absolute;
99 left: -40px;
100 top: 6px;
101}
102
103blockquote p {
104 padding-left: 10px;
105}
106
107
108/* header navigation */
109
110.navigation {
111 /*border-bottom: 1px dotted var(--border-color);*/
112 margin-bottom: 50px;
113}
114
115.navigation header {
116 display: flex;
117 align-items: center;
118}
119
120.navigation header .home {
121 font-size: 130%;
122}
123
124.navigation header .home a {
125 text-decoration: none;
126 color: var(--base-color);
127}
128
129.navigation header .home a:hover {
130 text-decoration: underline;
131}
132
133.navigation header nav {
134 flex-grow: 1;
135 text-align: right;
136}
137
138.navigation header nav a {
139 padding: 0 10px;
140 text-decoration: none;
141 color: var(--link-color-hover);
142}
143
144.navigation header nav a:hover {
145 text-decoration: underline;
146 color: var(--link-color-hover);
147}
148
149
150/* index post list */
151
152.post-list {
153 list-style-type: none;
154 padding: 0;
155 margin: 0;
156}
157
158.post-list li {
159 margin: 0 0 20px 0;
160 text-decoration: none;
161}
162
163.post-list li a {
164 text-decoration: none;
165 color: var(--link-color);
166}
167
168.post-list li a:hover {
169 text-decoration: underline;
170 color: var(--link-color-hover);
171}
172
173.post-list li a h2 {
174 font-weight: 400;
175 font-size: 130%;
176 margin: 0;
177}
178
179
180/* project list */
181
182.project-list {
183 margin-top: 60px;
184}
185
186.project-list a {
187 text-decoration: none;
188 color: var(--link-color);
189}
190
191.project-list li a:hover {
192 text-decoration: underline;
193 color: var(--link-color-hover);
194}
195
196
197/* tag badges */
198
199.tags {
200 margin-top: 5px;
201}
202
203.tags a {
204 font-size: 80%;
205 padding: 2px 10px;
206 border-radius: 20px;
207
208 background: var(--badge-background-color);
209 color: var(--badge-label-color) !important;
210 text-decoration: none !important;
211}
212
213.tags a:hover {
214 filter: brightness(90%);
215 text-decoration: none !important;
216}
217
218
219/* helpers */
220
221.top-margin {
222 margin-top: 60px;
223}
224
225code {
226 background: rgb(255, 241, 177);
227 padding: 2px 5px;
228 font-size: 14px;
229}
230
231pre > code {
232 background: unset;
233 padding: unset;
234}
235
236pre {
237 font-size: 14px;
238}
239
240img, video {
241 max-width: 100%;
242 margin: 30px auto;
243 display: block;
244}
245
246time {
247 color: var(--label-color);
248 font-size: 90%;
249}
250
251/* footer */
252
253.footer {
254 border-top: 1px solid var(--border-color);
255 margin-top: 70px;
256 padding-top: 20px;
257 padding-bottom: 50px;
258}
259
260
261/* responsive */
262
263@media only screen and (max-width: 960px) {
264 main { padding: 0 20px; }
265 footer { padding: 0 20px; }
266 h1[itemtype="headline"] { font-size: 220%; }
267 .navigation header { padding: 0 20px; }
268}
269
270
271/* light/dark mode */
272
273@media (prefers-color-scheme: light) { }
274
275@media (prefers-color-scheme: dark) { }
diff --git a/template/tag.html b/template/tag.html
new file mode 100755
index 0000000..344ef0b
--- /dev/null
+++ b/template/tag.html
@@ -0,0 +1,61 @@
1<!doctype html>
2<html lang="en">
3
4 <head>
5 {{template "_meta.html"}}
6
7 <title>{{.Title}}</title>
8 <meta name="description" content="{{.Description}}">
9 </head>
10
11 <body>
12
13 {{template "_navigation.html"}}
14
15 <main class="wrapper">
16 <h2>Posts for `{{.Tag}}`</h2>
17 <nav itemscope itemtype="https://schema.org/SiteNavigationElement">
18 <meta itemprop="name" content="Article list">
19
20 <ul class="post-list">
21 {{range $index, $post := .Posts}}
22 <li>
23 <time>{{.Created}}</time>
24
25 <a href="/{{$post.Slug}}" title="{{$post.Title}}" itemprop="url">
26 <h2>{{$post.Title}}</h2>
27 </a>
28
29 <!-- lists all tags available in this posts -->
30 {{if $post.Tags}}
31 <nav class="tags">
32 {{range $post.Tags}}
33 <a href="/tags/{{.}}.html" rel="tag">{{.}}</a>
34 {{end}}
35 </nav>
36 {{end}}
37
38 </li>
39 {{end}}
40 </ul>
41 </nav>
42
43 <!-- lists all tags available in all posts -->
44 {{if .Tags}}
45 <nav class="tags top-margin">
46 <strong>All tags on site:</strong>
47 {{range .Tags}}
48 <a href="/tags/{{.}}.html" rel="tag">{{.}}</a>
49 {{end}}
50 </nav>
51 {{end}}
52
53 </main>
54
55 {{template "_footer.html"}}
56
57 {{template "_includes.html"}}
58
59 </body>
60
61</html>
diff --git a/templates/index.twig b/templates/index.twig
deleted file mode 100644
index f51a793..0000000
--- a/templates/index.twig
+++ /dev/null
@@ -1,52 +0,0 @@
1<!DOCTYPE html>
2<html lang="en">
3
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0">
8 <meta http-equiv="X-UA-Compatible" content="ie=edge">
9
10 <meta name="theme-color" content="#ffffff">
11 <meta name="generator" content="https://github.com/mitjafelicijan/staticgen">
12
13 {% include "partials/preconnect.twig" %}
14
15 <title>{{ global.title }}</title>
16 <meta name="author" content="{{ global.author }}">
17 <meta name="description" content="{{ global.description }}">
18
19 <meta property="og:title" content="{{ global.title }}">
20 <meta property="og:description" content="{{ global.description }}">
21 <meta property="og:url" content="{{ global.domain }}">
22
23 <meta name="twitter:card" content="summary">
24 <meta name="twitter:site" content="{{ global.twitter }}">
25
26 <link rel="alternate" type="application/atom+xml" title="{{ global.author }}'s feed" href="/feed.atom">
27 <link rel="stylesheet" href="/static/style.css?v={{ "now"|date("YmdHi") }}">
28 <link rel="icon" type="image/png" href="/static/avatar-64x64.png?v={{ "now"|date("YmdHi") }}">
29
30 </head>
31
32 <body>
33
34 <main>
35
36 {% include "partials/navigation.twig" %}
37
38 <h2>Posts</h2>
39 {% include "partials/posts.twig" %}
40
41
42 <h2>Side projects</h2>
43 {% include "partials/projects.twig" %}
44
45 </main>
46
47 <!-- google analytics -->
48 {{ global.ga }}
49
50 </body>
51
52</html>
diff --git a/templates/page.twig b/templates/page.twig
deleted file mode 100644
index 9e8773e..0000000
--- a/templates/page.twig
+++ /dev/null
@@ -1,52 +0,0 @@
1<!DOCTYPE html>
2<html lang="en">
3
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0">
8 <meta http-equiv="X-UA-Compatible" content="ie=edge">
9
10 <meta name="theme-color" content="#ffffff">
11 <meta name="generator" content="https://github.com/mitjafelicijan/staticgen">
12
13 {% include "partials/preconnect.twig" %}
14
15 <title>{{ options.title }}</title>
16 <meta name="author" content="{{ global.author }}">
17 <meta name="description" content="{{ options.description }}">
18
19 <meta property="og:title" content="{{ options.title }}">
20 <meta property="og:description" content="{{ options.description }}">
21 <meta property="og:url" content="{{ global.domain }}{{ options.slug }}">
22
23 <meta name="twitter:card" content="summary">
24 <meta name="twitter:site" content="{{ global.twitter }}">
25
26 <link rel="alternate" type="application/atom+xml" title="{{ global.author }}'s feed" href="/feed.atom">
27 <link rel="stylesheet" href="/static/style.css?v={{ "now"|date("YmdHi") }}">
28 <link rel="icon" type="image/png" href="/static/avatar-64x64.png?v={{ "now"|date("YmdHi") }}">
29
30 </head>
31
32 <body>
33
34 <main>
35
36 {% include "partials/navigation.twig" %}
37
38 <article>
39 <header>
40 <h1>{{ options.title }}</h1>
41 </header>
42 {{ content }}
43 </article>
44
45 </main>
46
47 <!-- google analytics -->
48 {{ global.ga }}
49
50 </body>
51
52</html>
diff --git a/templates/partials/navigation.twig b/templates/partials/navigation.twig
deleted file mode 100644
index 32a3814..0000000
--- a/templates/partials/navigation.twig
+++ /dev/null
@@ -1,7 +0,0 @@
1<nav>
2 <a href="/">Mitja Felicijan</a>
3 <a href="/curriculum-vitae.html">CV</a>
4 <a href="https://twitter.com/mitjafelicijan" target="_blank" rel="noopener nofollow">Twitter</a>
5 <a href="https://github.com/mitjafelicijan" target="_blank" rel="noopener nofollow">Github</a>
6 <a href="/weekly-newsletter.html">Weekly newsletter</a>
7</nav>
diff --git a/templates/partials/posts.twig b/templates/partials/posts.twig
deleted file mode 100644
index b900ef6..0000000
--- a/templates/partials/posts.twig
+++ /dev/null
@@ -1,8 +0,0 @@
1<ul class="article-list">
2 {% for item in list %}
3 <li>
4 <time datetime="{{ item.date|date("Y, F j") }}">{{ item.date|date("Y, F j") }}</time>
5 <a href="{{ item.slug }}">{{ item.title }}</a>
6 </li>
7 {% endfor %}
8</ul>
diff --git a/templates/partials/preconnect.twig b/templates/partials/preconnect.twig
deleted file mode 100644
index 800053e..0000000
--- a/templates/partials/preconnect.twig
+++ /dev/null
@@ -1,2 +0,0 @@
1<link rel="preconnect" href="https://www.google-analytics.com">
2<link rel="preconnect" href="https://stats.g.doubleclick.net">
diff --git a/templates/partials/projects.twig b/templates/partials/projects.twig
deleted file mode 100644
index 1601dce..0000000
--- a/templates/partials/projects.twig
+++ /dev/null
@@ -1,8 +0,0 @@
1<ul class="project-list">
2 <li><a href="https://github.com/mitjafelicijan/redis-marshal" target="_blank" rel="noopener nofollow">redis-marshal - Lightweight Redis data exploration tool</a></li>
3 <li><a href="https://github.com/mitjafelicijan/dna-encoding" target="_blank" rel="noopener nofollow">dna-encoding - Tools for encoding files to DNA sequence</a></li>
4 <li><a href="https://github.com/mitjafelicijan/unfold" target="_blank" rel="noopener nofollow">unfold - Elastic Beanstalk like deployments for DigitalOcean</a></li>
5 <li><a href="https://github.com/mitjafelicijan/vertex" target="_blank" rel="noopener nofollow">vertex - Create mock API's and enrich them with some basic logic and simplify prototyping</a></li>
6 <li><a href="https://github.com/mitjafelicijan/spartan" target="_blank" rel="noopener nofollow">spartan - Spartan minimal UI kit for your applications</a></li>
7 <li><a href="https://github.com/mitjafelicijan/scarecrow" target="_blank" rel="noopener nofollow">scarecrow - Minimal configuration reverse proxy</a></li>
8</ul>
diff --git a/templates/post.twig b/templates/post.twig
deleted file mode 100644
index 92e7d28..0000000
--- a/templates/post.twig
+++ /dev/null
@@ -1,73 +0,0 @@
1<!DOCTYPE html>
2<html lang="en">
3
4 <head>
5
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0">
8 <meta http-equiv="X-UA-Compatible" content="ie=edge">
9
10 <meta name="theme-color" content="#ffffff">
11 <meta name="generator" content="https://github.com/mitjafelicijan/staticgen">
12
13 {% include "partials/preconnect.twig" %}
14
15 <title>{{ options.title }}</title>
16 <meta name="author" content="{{ global.author }}">
17 <meta name="description" content="{{ options.description }}">
18
19 <meta property="og:title" content="{{ options.title }}">
20 <meta property="og:description" content="{{ options.description }}">
21 <meta property="og:url" content="{{ global.domain }}{{ options.slug }}">
22
23 <meta name="twitter:card" content="summary">
24 <meta name="twitter:site" content="{{ global.twitter }}">
25
26 <link rel="alternate" type="application/atom+xml" title="{{ global.author }}'s feed" href="/feed.atom">
27 <link rel="stylesheet" href="/static/style.css?v={{ " now"|date("YmdHi") }}">
28 <link rel="icon" type="image/png" href="/static/avatar-64x64.png?v={{ " now"|date("YmdHi") }}">
29
30 </head>
31
32 <body>
33
34 <main>
35
36 {% include "partials/navigation.twig" %}
37
38 <article>
39 <header>
40 <h1>{{ options.title }}</h1>
41 <div class="info">
42 <time datetime="{{ options.date|date(" Y, F j") }}">{{ options.date|date("Y, F j") }}</time>
43 <span>by {{ global.author }}</span>
44 </div>
45 </header>
46
47 {% if options.hide == 'true' %}
48 <div class="draft">Draft</div>
49 {% endif %}
50
51 {{ content }}
52
53 {#<div id="replybox"></div>
54 <script>
55 window.replybox = {
56 site: 'm6gBxwQnbM',
57 };
58 </script>
59 <script src="https://cdn.getreplybox.com/js/embed.js"></script>#}
60
61 </article>
62
63 </main>
64
65 <!-- code highlighting -->
66 {{ global.highlight }}
67
68 <!-- google analytics -->
69 {{ global.ga }}
70
71 </body>
72
73</html>