From 24639575c32e48a3db46e06be6a3a25cd80e8991 Mon Sep 17 00:00:00 2001 From: eug-vs Date: Thu, 21 Apr 2022 15:04:56 +0300 Subject: refactor: change prject structure --- README.md | 1 - articles/taskwarrior.md | 74 ------- blog/2021-07-02.md | 17 -- blog/2021-07-03.md | 98 --------- blog/2021-07-15.md | 141 ------------- blog/2021-08-14.md | 80 -------- blog/2021-08-18.md | 81 -------- blog/2021-09-10.md | 22 -- blog/2021-09-21.md | 24 --- blog/2021-10-06.md | 17 -- blog/2021-10-27.md | 34 ---- blog/2021-10-28.md | 11 - blog/2022-02-26.md | 5 - blog/2022-03-17.md | 14 -- blog/2022-03-24.md | 14 -- blog/2022-03-26.md | 62 ------ blog/2022-04-02.md | 83 -------- blog/2022-04-17.md | 51 ----- blog/2022-04-18.md | 48 ----- blog/index.md | 43 ---- gruvbox.theme | 225 --------------------- head.html | 1 - header.html | 7 - index.md | 40 ---- openring-template.html | 47 ----- public/brainlet-dreams-big-brain.png | Bin 113106 -> 0 bytes public/desktop-screenshots/2020-12-08_01-49-30.jpg | Bin 99232 -> 0 bytes public/desktop-screenshots/2021-01-06_18-57-32.jpg | Bin 97229 -> 0 bytes public/desktop-screenshots/2021-03-10_21-14-09.jpg | Bin 97525 -> 0 bytes public/desktop-screenshots/2021-03-27_01-26-27.jpg | Bin 99263 -> 0 bytes public/desktop-screenshots/2021-04-26_00-06-32.jpg | Bin 98996 -> 0 bytes public/desktop-screenshots/2021-06-04_08-52-16.jpg | Bin 98300 -> 0 bytes public/desktop-screenshots/2021-06-25_16-19-05.jpg | Bin 98729 -> 0 bytes public/desktop-screenshots/2021-06-28_19-12-39.jpg | Bin 95178 -> 0 bytes public/desktop-screenshots/2021-07-15_14-20-16.jpg | Bin 98325 -> 0 bytes public/desktop-screenshots/2021-07-22_09-50-48.jpg | Bin 98381 -> 0 bytes public/desktop-screenshots/2021-08-14_02-29-30.jpg | Bin 98773 -> 0 bytes public/desktop-screenshots/2021-10-07_13-11-59.jpg | Bin 99087 -> 0 bytes public/desktop-screenshots/2021-10-17_16-17-55.jpg | Bin 97142 -> 0 bytes public/desktop-screenshots/2021-11-06_15-24-35.jpg | Bin 99036 -> 0 bytes public/desktop-screenshots/2021-12-05_21-38-36.jpg | Bin 97695 -> 0 bytes public/desktop-screenshots/2022-03-21_20-01-58.jpg | Bin 98920 -> 0 bytes public/desktop-screenshots/2022-04-01_18-44-17.jpg | Bin 99936 -> 0 bytes public/desktop-screenshots/2022-04-02_14-59-33.jpg | Bin 99231 -> 0 bytes public/docker-on-rpi.jpg | Bin 212401 -> 0 bytes public/emoji/ansible.png | Bin 51275 -> 0 bytes public/emoji/belarus.png | Bin 20717 -> 0 bytes public/emoji/benzin.svg | 108 ---------- public/emoji/brave-bat.svg | 84 -------- public/emoji/brave.svg | 1 - public/emoji/circleci.svg | 54 ----- public/emoji/gentoo.png | Bin 175104 -> 0 bytes public/emoji/git.png | Bin 26063 -> 0 bytes public/emoji/github.svg | 43 ---- public/emoji/imagemagick.png | Bin 107974 -> 0 bytes public/emoji/instagram.svg | 1 - public/emoji/markdown.png | Bin 736 -> 0 bytes public/emoji/monero.svg | 1 - public/emoji/python.svg | 1 - public/emoji/raspberry-pi.svg | 1 - public/emoji/rust.svg | 43 ---- public/emoji/taskwarrior.png | Bin 7444 -> 0 bytes public/emoji/telegram.svg | 1 - public/eug-vs.png | Bin 32216 -> 0 bytes public/fonts/Bitter-Regular.woff | Bin 32460 -> 0 bytes public/git-remote-meme.png | Bin 278392 -> 0 bytes public/icon-64.png | Bin 2648 -> 0 bytes public/meat.png | Bin 809274 -> 0 bytes public/monero-qr.png | Bin 7547 -> 0 bytes public/pan.png | Bin 633999 -> 0 bytes public/pepe-smug.png | Bin 57911 -> 0 bytes public/stickerpicker.png | Bin 60292 -> 0 bytes public/summer-2021/bonfire.jpg | Bin 2520359 -> 0 bytes public/summer-2021/burndown.png | Bin 28566 -> 0 bytes public/summer-2021/kayaking.jpg | Bin 333985 -> 0 bytes public/wojak-brainchair.png | Bin 80111 -> 0 bytes src/blog/2021-07-02.md | 17 ++ src/blog/2021-07-03.md | 98 +++++++++ src/blog/2021-07-15.md | 141 +++++++++++++ src/blog/2021-08-14.md | 80 ++++++++ src/blog/2021-08-18.md | 81 ++++++++ src/blog/2021-09-10.md | 22 ++ src/blog/2021-09-21.md | 24 +++ src/blog/2021-10-06.md | 17 ++ src/blog/2021-10-27.md | 34 ++++ src/blog/2021-10-28.md | 11 + src/blog/2022-02-26.md | 5 + src/blog/2022-03-17.md | 14 ++ src/blog/2022-03-24.md | 14 ++ src/blog/2022-03-26.md | 62 ++++++ src/blog/2022-04-02.md | 83 ++++++++ src/blog/2022-04-17.md | 51 +++++ src/blog/2022-04-18.md | 48 +++++ src/blog/index.md | 43 ++++ src/index.md | 40 ++++ src/public/brainlet-dreams-big-brain.png | Bin 0 -> 113106 bytes .../desktop-screenshots/2020-12-08_01-49-30.jpg | Bin 0 -> 99232 bytes .../desktop-screenshots/2021-01-06_18-57-32.jpg | Bin 0 -> 97229 bytes .../desktop-screenshots/2021-03-10_21-14-09.jpg | Bin 0 -> 97525 bytes .../desktop-screenshots/2021-03-27_01-26-27.jpg | Bin 0 -> 99263 bytes .../desktop-screenshots/2021-04-26_00-06-32.jpg | Bin 0 -> 98996 bytes .../desktop-screenshots/2021-06-04_08-52-16.jpg | Bin 0 -> 98300 bytes .../desktop-screenshots/2021-06-25_16-19-05.jpg | Bin 0 -> 98729 bytes .../desktop-screenshots/2021-06-28_19-12-39.jpg | Bin 0 -> 95178 bytes .../desktop-screenshots/2021-07-15_14-20-16.jpg | Bin 0 -> 98325 bytes .../desktop-screenshots/2021-07-22_09-50-48.jpg | Bin 0 -> 98381 bytes .../desktop-screenshots/2021-08-14_02-29-30.jpg | Bin 0 -> 98773 bytes .../desktop-screenshots/2021-10-07_13-11-59.jpg | Bin 0 -> 99087 bytes .../desktop-screenshots/2021-10-17_16-17-55.jpg | Bin 0 -> 97142 bytes .../desktop-screenshots/2021-11-06_15-24-35.jpg | Bin 0 -> 99036 bytes .../desktop-screenshots/2021-12-05_21-38-36.jpg | Bin 0 -> 97695 bytes .../desktop-screenshots/2022-03-21_20-01-58.jpg | Bin 0 -> 98920 bytes .../desktop-screenshots/2022-04-01_18-44-17.jpg | Bin 0 -> 99936 bytes .../desktop-screenshots/2022-04-02_14-59-33.jpg | Bin 0 -> 99231 bytes src/public/docker-on-rpi.jpg | Bin 0 -> 212401 bytes src/public/emoji/ansible.png | Bin 0 -> 51275 bytes src/public/emoji/belarus.png | Bin 0 -> 20717 bytes src/public/emoji/benzin.svg | 108 ++++++++++ src/public/emoji/brave-bat.svg | 84 ++++++++ src/public/emoji/brave.svg | 1 + src/public/emoji/circleci.svg | 54 +++++ src/public/emoji/gentoo.png | Bin 0 -> 175104 bytes src/public/emoji/git.png | Bin 0 -> 26063 bytes src/public/emoji/github.svg | 43 ++++ src/public/emoji/imagemagick.png | Bin 0 -> 107974 bytes src/public/emoji/instagram.svg | 1 + src/public/emoji/markdown.png | Bin 0 -> 736 bytes src/public/emoji/monero.svg | 1 + src/public/emoji/python.svg | 1 + src/public/emoji/raspberry-pi.svg | 1 + src/public/emoji/rust.svg | 43 ++++ src/public/emoji/taskwarrior.png | Bin 0 -> 7444 bytes src/public/emoji/telegram.svg | 1 + src/public/eug-vs.png | Bin 0 -> 32216 bytes src/public/fonts/Bitter-Regular.woff | Bin 0 -> 32460 bytes src/public/git-remote-meme.png | Bin 0 -> 278392 bytes src/public/icon-64.png | Bin 0 -> 2648 bytes src/public/meat.png | Bin 0 -> 809274 bytes src/public/monero-qr.png | Bin 0 -> 7547 bytes src/public/pan.png | Bin 0 -> 633999 bytes src/public/pepe-smug.png | Bin 0 -> 57911 bytes src/public/stickerpicker.png | Bin 0 -> 60292 bytes src/public/style.css | 144 +++++++++++++ src/public/summer-2021/bonfire.jpg | Bin 0 -> 2520359 bytes src/public/summer-2021/burndown.png | Bin 0 -> 28566 bytes src/public/summer-2021/kayaking.jpg | Bin 0 -> 333985 bytes src/public/wojak-brainchair.png | Bin 0 -> 80111 bytes style.css | 144 ------------- templates/openring-template.html | 23 +++ templates/page.html | 14 ++ urls | 4 - 151 files changed, 1404 insertions(+), 1726 deletions(-) delete mode 120000 README.md delete mode 100644 articles/taskwarrior.md delete mode 100644 blog/2021-07-02.md delete mode 100644 blog/2021-07-03.md delete mode 100644 blog/2021-07-15.md delete mode 100644 blog/2021-08-14.md delete mode 100644 blog/2021-08-18.md delete mode 100644 blog/2021-09-10.md delete mode 100644 blog/2021-09-21.md delete mode 100644 blog/2021-10-06.md delete mode 100644 blog/2021-10-27.md delete mode 100644 blog/2021-10-28.md delete mode 100644 blog/2022-02-26.md delete mode 100644 blog/2022-03-17.md delete mode 100644 blog/2022-03-24.md delete mode 100644 blog/2022-03-26.md delete mode 100644 blog/2022-04-02.md delete mode 100644 blog/2022-04-17.md delete mode 100644 blog/2022-04-18.md delete mode 100644 blog/index.md delete mode 100644 gruvbox.theme delete mode 100755 head.html delete mode 100755 header.html delete mode 100755 index.md delete mode 100644 openring-template.html delete mode 100644 public/brainlet-dreams-big-brain.png delete mode 100644 public/desktop-screenshots/2020-12-08_01-49-30.jpg delete mode 100644 public/desktop-screenshots/2021-01-06_18-57-32.jpg delete mode 100644 public/desktop-screenshots/2021-03-10_21-14-09.jpg delete mode 100644 public/desktop-screenshots/2021-03-27_01-26-27.jpg delete mode 100644 public/desktop-screenshots/2021-04-26_00-06-32.jpg delete mode 100644 public/desktop-screenshots/2021-06-04_08-52-16.jpg delete mode 100644 public/desktop-screenshots/2021-06-25_16-19-05.jpg delete mode 100644 public/desktop-screenshots/2021-06-28_19-12-39.jpg delete mode 100644 public/desktop-screenshots/2021-07-15_14-20-16.jpg delete mode 100644 public/desktop-screenshots/2021-07-22_09-50-48.jpg delete mode 100644 public/desktop-screenshots/2021-08-14_02-29-30.jpg delete mode 100644 public/desktop-screenshots/2021-10-07_13-11-59.jpg delete mode 100644 public/desktop-screenshots/2021-10-17_16-17-55.jpg delete mode 100644 public/desktop-screenshots/2021-11-06_15-24-35.jpg delete mode 100644 public/desktop-screenshots/2021-12-05_21-38-36.jpg delete mode 100644 public/desktop-screenshots/2022-03-21_20-01-58.jpg delete mode 100644 public/desktop-screenshots/2022-04-01_18-44-17.jpg delete mode 100644 public/desktop-screenshots/2022-04-02_14-59-33.jpg delete mode 100644 public/docker-on-rpi.jpg delete mode 100644 public/emoji/ansible.png delete mode 100644 public/emoji/belarus.png delete mode 100644 public/emoji/benzin.svg delete mode 100644 public/emoji/brave-bat.svg delete mode 100644 public/emoji/brave.svg delete mode 100644 public/emoji/circleci.svg delete mode 100644 public/emoji/gentoo.png delete mode 100644 public/emoji/git.png delete mode 100644 public/emoji/github.svg delete mode 100644 public/emoji/imagemagick.png delete mode 100644 public/emoji/instagram.svg delete mode 100644 public/emoji/markdown.png delete mode 100644 public/emoji/monero.svg delete mode 100644 public/emoji/python.svg delete mode 100644 public/emoji/raspberry-pi.svg delete mode 100644 public/emoji/rust.svg delete mode 100644 public/emoji/taskwarrior.png delete mode 100644 public/emoji/telegram.svg delete mode 100644 public/eug-vs.png delete mode 100644 public/fonts/Bitter-Regular.woff delete mode 100644 public/git-remote-meme.png delete mode 100644 public/icon-64.png delete mode 100755 public/meat.png delete mode 100644 public/monero-qr.png delete mode 100755 public/pan.png delete mode 100644 public/pepe-smug.png delete mode 100644 public/stickerpicker.png delete mode 100644 public/summer-2021/bonfire.jpg delete mode 100644 public/summer-2021/burndown.png delete mode 100644 public/summer-2021/kayaking.jpg delete mode 100644 public/wojak-brainchair.png create mode 100644 src/blog/2021-07-02.md create mode 100644 src/blog/2021-07-03.md create mode 100644 src/blog/2021-07-15.md create mode 100644 src/blog/2021-08-14.md create mode 100644 src/blog/2021-08-18.md create mode 100644 src/blog/2021-09-10.md create mode 100644 src/blog/2021-09-21.md create mode 100644 src/blog/2021-10-06.md create mode 100644 src/blog/2021-10-27.md create mode 100644 src/blog/2021-10-28.md create mode 100644 src/blog/2022-02-26.md create mode 100644 src/blog/2022-03-17.md create mode 100644 src/blog/2022-03-24.md create mode 100644 src/blog/2022-03-26.md create mode 100644 src/blog/2022-04-02.md create mode 100644 src/blog/2022-04-17.md create mode 100644 src/blog/2022-04-18.md create mode 100644 src/blog/index.md create mode 100755 src/index.md create mode 100644 src/public/brainlet-dreams-big-brain.png create mode 100644 src/public/desktop-screenshots/2020-12-08_01-49-30.jpg create mode 100644 src/public/desktop-screenshots/2021-01-06_18-57-32.jpg create mode 100644 src/public/desktop-screenshots/2021-03-10_21-14-09.jpg create mode 100644 src/public/desktop-screenshots/2021-03-27_01-26-27.jpg create mode 100644 src/public/desktop-screenshots/2021-04-26_00-06-32.jpg create mode 100644 src/public/desktop-screenshots/2021-06-04_08-52-16.jpg create mode 100644 src/public/desktop-screenshots/2021-06-25_16-19-05.jpg create mode 100644 src/public/desktop-screenshots/2021-06-28_19-12-39.jpg create mode 100644 src/public/desktop-screenshots/2021-07-15_14-20-16.jpg create mode 100644 src/public/desktop-screenshots/2021-07-22_09-50-48.jpg create mode 100644 src/public/desktop-screenshots/2021-08-14_02-29-30.jpg create mode 100644 src/public/desktop-screenshots/2021-10-07_13-11-59.jpg create mode 100644 src/public/desktop-screenshots/2021-10-17_16-17-55.jpg create mode 100644 src/public/desktop-screenshots/2021-11-06_15-24-35.jpg create mode 100644 src/public/desktop-screenshots/2021-12-05_21-38-36.jpg create mode 100644 src/public/desktop-screenshots/2022-03-21_20-01-58.jpg create mode 100644 src/public/desktop-screenshots/2022-04-01_18-44-17.jpg create mode 100644 src/public/desktop-screenshots/2022-04-02_14-59-33.jpg create mode 100644 src/public/docker-on-rpi.jpg create mode 100644 src/public/emoji/ansible.png create mode 100644 src/public/emoji/belarus.png create mode 100644 src/public/emoji/benzin.svg create mode 100644 src/public/emoji/brave-bat.svg create mode 100644 src/public/emoji/brave.svg create mode 100644 src/public/emoji/circleci.svg create mode 100644 src/public/emoji/gentoo.png create mode 100644 src/public/emoji/git.png create mode 100644 src/public/emoji/github.svg create mode 100644 src/public/emoji/imagemagick.png create mode 100644 src/public/emoji/instagram.svg create mode 100644 src/public/emoji/markdown.png create mode 100644 src/public/emoji/monero.svg create mode 100644 src/public/emoji/python.svg create mode 100644 src/public/emoji/raspberry-pi.svg create mode 100644 src/public/emoji/rust.svg create mode 100644 src/public/emoji/taskwarrior.png create mode 100644 src/public/emoji/telegram.svg create mode 100644 src/public/eug-vs.png create mode 100644 src/public/fonts/Bitter-Regular.woff create mode 100644 src/public/git-remote-meme.png create mode 100644 src/public/icon-64.png create mode 100755 src/public/meat.png create mode 100644 src/public/monero-qr.png create mode 100755 src/public/pan.png create mode 100644 src/public/pepe-smug.png create mode 100644 src/public/stickerpicker.png create mode 100644 src/public/style.css create mode 100644 src/public/summer-2021/bonfire.jpg create mode 100644 src/public/summer-2021/burndown.png create mode 100644 src/public/summer-2021/kayaking.jpg create mode 100644 src/public/wojak-brainchair.png delete mode 100644 style.css create mode 100644 templates/openring-template.html create mode 100644 templates/page.html delete mode 100644 urls diff --git a/README.md b/README.md deleted file mode 120000 index dd0ea36..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -index.md \ No newline at end of file diff --git a/articles/taskwarrior.md b/articles/taskwarrior.md deleted file mode 100644 index 02681d9..0000000 --- a/articles/taskwarrior.md +++ /dev/null @@ -1,74 +0,0 @@ -# TaskWarrior :taskwarrior: is all you need to be productive - -Nowadays there is an **ocean** of different productivity tools, systems and methodologies. The secret is - you only need one! - -# The problem -I always wanted to come up with a standartized system to manage my life. I bet you too! - -## TickTick -I've tried different approaches and tools and finally ended up with [TickTick](https://ticktick.com) (*and even bought a premium subscription*). - -It provided me with many features, including: - - *Calendar* - this was a must-have to me, I wanted to be able to see top-down view of my week and be able to do "time blocking" - - *Disctinction between tasks and notes* - that was important because back then I already wanted to start accumulating my knowledge somewhere - - *Markdown support* - plaintext is good, but `Markdown` is just so much better for notetaking - - *Arbitrary folder hierarchy* - allowed me to have full control over the structure - - *Tags and complex filtering system* - -It has even more cool stuff, like reminding you about tasks when you arrive at their location, voice input and excellent UI/UX. - -## So why did I switch? -`TickTick` covered all my use-cases (*and even more*), so why did I switch? - -Well, there are a couple reasons for that: - - They have all your data. Ideally I want my management system to be **private** and available offline. - - Keeping notes there just felt like it's too much. The question is: how is it different from writing in plaintext `Markdown` files on mobile phone or laptop? - -# Discovering Vimwiki -At this point I was already using `Vim` a lot and when I learned about [vimwiki](https://githbu.com/vimwiki/vimwiki) I immediately migrated all my notes into the local folder on my computer. -It provides you with much broader functionality than just keeping notes - well, this website is build using `vimwiki`, but I won't go into details here, because I plan to do a separate article about it. - -Also, vimwiki provides you with folder hierarchy for free! Why overuse any other software when your filesystem has it covered? - - -# Discovering TaskWarrior -After using `TickTick` for two years, I finally discovered [TaskWarrior](https://taskwarrior.org): - - Terminal application (*but it has frontends if you can't live without it*) - - Deadly simple - - Data is stored locally - - Scriptable and hackable - - Methodology-agnostic - - Focused on doing one thing - -

- -

- -When I saw it first time - I knew that was it. You see, since I was already not keeping notes in `TickTick`, I was only using it only to keep track of my tasks. And `TaskWarrior` actually does a better job in managing tasks - it's the software that follows *Unix philosophy* - **it does one thing and does it well**. - -I won't do a guide about `TaskWarrior` here, because they have an amazing documentation on their website. I suggest you go ahead and [learn this powerful tool](https://taskwarrior.org/docs/30second.html) in 30 seconds! - -# Choosing methodology -Having `TaskWarrior` ready, you may get stunned by the amount of choice you have in managing your tasks. It's time to choose a methodology and stick to it. I prefer [Getting Things Done](https://hamberg.no/gtd) (or **GTD**) - it has a very precise set of rules that you have to follow and they acutally make sense. - -**GTD** is focused, well, on *getting things done*. It's a general approach to organizing tasks and projects. I'd say it's an **interface** which can have multiple **implementations** (like in `TickTick`, `Google Calendar`, `TaskWarrior` etc.). -It's aim is to make you have 100% trust in a system for collecting tasks, ideas, and projects. - -Main advantage of **GTD** is that it only works with **actionable** visible items. E.g. you don't keep a task `Get a driver lisence` - it's stupid from such point of view. "Do I get it right now or what?" Instead you create a project `driver-lisence` with following tasks: - - Ask Michael to recommend a driving course - - Assign to driving course - - Pass rules exam - - Pass driving exam - - Pass final exam - -Hopefully you get the point. Learn more about GTD [here](https://hamberg.no/gtd). - -# Putting it all together -`TaskWarrior` + `vimwiki` is an ultimate replacement for `TickTick` or any other productivity tool you can imagine. **GTD** eliminates the problem with calendar - according to **GTD**, you only assign deadlines to the tasks that actually have them. With that considered, TaskWarrior's built-in calendar works perfectly. - -And the good thing is: you don't need be using `vimwiki` for it to work - you can write your notes any way you like (*I actually suggest pen & paper*). The same for methodology - if you don't like *GTD* - choose any system that fits you (or adapt already existing one). The point is: **TaskWarrior will play nicely with everything**. It's an ultimate tool that you only have to learn once in your life. - -# PS -There's also **TimeWarrior**, but I recommend getting familliar with **TaskWarrior** first. The main difference - TaskWarrior focuses on the tasks you have to do in future, while TimeWarrior analyzes the past. - -I will do an artcile focused specifically on my productivity workflow later, stay tuned! diff --git a/blog/2021-07-02.md b/blog/2021-07-02.md deleted file mode 100644 index 48ef972..0000000 --- a/blog/2021-07-02.md +++ /dev/null @@ -1,17 +0,0 @@ -# My plans for this website -Welcome to [eug-vs.xyz](https://eug-vs.xyz)! This is my personal website where I plan to set up a bunch of cool things, namely: - - SearX instance - - Email server (*already up and running!*) - - [TaskWarrior](https://taskwarrior.org) server - - This blog - - Knowledge base - -I decided that I will write content for this website in `Markdown`, since it's the way of writing I am already so used to. -I use [vimwiki](https://github.com/vimwiki/vimwiki) for writing and then I just pipe my `.md` files into `pandoc` which gives me nice static web pages. No bullshit, ads, trackers or client-side JavaScript here. - -# Structure -Vimwiki provides a very good notes structure out of the box: you have your **main wiki** and **diary**: - - **Main wiki** will be represented as a knowledge base, where I'll put things that I consider important and worth being indexed - - **Diary** will form this blog - where I'll put everything that does not fit into the main wiki but still worth sharing - -This way I can keep my writing workflow the same, I don't have to switch to the new patterns or anything else. diff --git a/blog/2021-07-03.md b/blog/2021-07-03.md deleted file mode 100644 index 7b97329..0000000 --- a/blog/2021-07-03.md +++ /dev/null @@ -1,98 +0,0 @@ -# What's wrong with Numerology -Numerology is a strange thing you may encounter at some point in your life. While you can believe into anything, it's of course -important to not take it too serious as some people do. You should be able to detect if something completely random is trying to mimic the science. - -

- -

- -# Background -Lately I've been on the party where I met a girl who was making money by doing numerologic predictions for people. I've never had a chance -to have a conversation with such people, and I was very excited when I finally got it. One of the first questions I asked was a sanity check: "*you know that you are tricking people, right?*" - -She seemed pretty intelligent to me and I thought that it's just a way to make money for her - it's of course bad to trick people -into such things, but well, we are not judging here. - -Surprisingly, she turned out to be **strong** believer and she really thought that she's making world a -better place by doing this. -I thought, well, maybe she's right, let's find out! We had a long conversation, let's jump straight into key points. I will express some parts of our dialogue as shortened Q&A's. - -# Do numbers matter? -Basically as she explained, they convert everything into numbers in numerology (pretty much like we do in programming). I have no problem with, for example, converting -my name into some number and than working with it. So, according to this theory, numbers have special meaning. - - Is it the number that matters, or the digits it consists of? - - The number itself - -This absolutely makes sense - since we can have an infinite amount of numeral systems. E.g 11 is eleven in base 10, but at the same time these digits can express number three in binary (base 2). - -So, ultimately this theory must be a subset of [determinism](https://en.wikipedia.org/wiki/Determinism) - numbers affect our life in a specific way - they produce more numbers and the cycle continues. -She agreed with that, and since there's no way to prove this deterministic aspect - I'm ok with that. If we know we can't prove it - you can only believe it (or not). Who knows, maybe numbers really have -special meaning. But the problem isn't here... - - -# Which numbers matter? -Everything above is perfectly valid, but the question naturally arises: - - How do we choose, which numbers matter? - - There are special numbers in your life! E.g your name/surname/etc, your birthday, your [*try not to laugh*] **passport number**! The time of specific events also matters. - -

- -

- -As soon as I heard that, I was 100% sure it's a total bullshit, but how do I prove it? I've started with simple things. - - What if I change my name? - - Your destiny changes along with it! - - Ok, what if I don't have a name? What if I live in the woods and don't know what the passport is? - - In this case only date of your birth matters! - -Ok, first of all, she seems to not understand that passport is a thing that only exists in a specific context: civilized society, jurisdiction, ability to print - just to name a few. - - There were no passports back then, did people not have destiny? - - But they had names! - - Well, let's go back to cavemen - they didn't have names. So... Numerology didn't work in those times, did it? - - It does not matter! If no one could speak or even had a name - they didn't care about numerology so it could not work. But it works now! Or there was a different Numerology... - - This last argument is pretty interesting. The problem is - well, if your science (or any set of laws) works - it works every time. If you have **Numerology v1** for ancient people and - **Numerology v2** for a modern society - it's not a one science - it's two! - -# A "proof" - Here's somewhat formal proof that such form of Numerology can't exist: - - We'll define Numerology as a *mapping* which maps the space of **numbers in your life** into the space of **possible outcomes** - - Assume there only exists one valid Numerology. If there are more valid "Numerologies" - it means we can choose any of those as we need and make up any result. - - Assume we can only account for finite amount of **numbers in our life**. If it's not true, such Numerology is useless - we can't make any predictions if the amount of factors is infinite! - - Consider some point in one's life. It can be described with the finite amount of **N numbers** - e.g current time, current passport name, amount of money in bank account, etc. - - Let's go back in time to the point where this person had no bank account - it means now there are only **N-1** meaningful factors - - Go back further to the point where the person didn't have a passport (maybe he was just born). It's **N-2** now - - We can keep decreasing N as much as we want, all the way to 0. Even the most "abstract" concepts, such as time, were invented by humans and we can go back where they didn't know how to measure time, it means there were no origin (or no one has defined it). As a number, time only exists as an interval - from `START` to `END`. If there's no single `START` - we can take any point and choose arbitrary number! One can argue that we can take *BIG BANG* as a `START`. But well, in this case, what unit do we use to measure time? Do we use seconds, minutes or what? - - We have now **N** different valid versions of Numerology! It contradicts with our assumption that there's only one valid Numerology. - -The "proof" above is of course not 100% correctly formulated, but hopefully you get the idea and reasoning behind it. The better and shorter version might be: - -*For any given outcome `S` for the person `P`, there exists a "version" of Numerology `V` that picks a finite amount of specific factors for that person, such that `V(P) = S`* - -It basically means that since we have infinitely many factors to measure in our life (and we can make up infinitely many measuring units) - we can generate any sequence of numbers to **make up** specific result. Of course, we can not make any predictions based on that - this is a complete bullshit. This is also backed up by the fact that there's no single "repository" or "sourse of truth" for Numerology. Everyone just comes up with their own version! Even if there is some hidden secret knowledge base it's also totally made up and as invalid as any other. - -# Why she thinks she's right - - How do you know which parameters to account? - - It's **statistics** and **high-level maths!** [*Here she started explaining me how they accumulated huge amount of data and analyzed that etc. etc.*] - -Yes, she may understands the **math** that transforms the numbers into results. The problem is - math is only doing the mapping! If the source of mapping is incorrect, the result can't be correct too! Information follows this path: - 1. Reality - 2. Numerology picks [arbitrary] N factors - 3. Super-advanced math functions - 4. Resulting prediction - -She knows that step 3 and 4 work, but what she doesn't understand is that step 2 can give arbitrary results! Therefore steps 3 and 4 do not matter as they act on the results of step 2. This is exactly what **misleads** people and makes them trust the system! They are so focused on verifying steps 3 and 4, they completely forget about step 2! - -# Few words about statistics -They may gather as much data as they want. There's such thing as the [Law of large numbers](https://en.wikipedia.org/wiki/Law_of_large_numbers). It's usually enough to debunk any sort of fraudelent predictors - and this is not the exception. - -# PS -These guys always sound so convincing because usually they believe the theory themselves. Always make sure to perform a "sanity check" on such things. Some of them require deeper thoughts, but usually you can "smell" the trickstery (or foolishness) right away. A *common sense* is all that you need in order to avoid getting tricked by them. - -

- -

- -Fun fact: **almost all** numbers are *normal* yet *uncomputable* - in practice it means we can't even write them down! If you, for example, measure something (except for counting instances of objects) in real world with a fixed unit of measurement - it's almost never going to be rational number. Do you think every single one of those uncountably infinitely many numbers has its own "special meaning"? See [this video](https://www.youtube.com/watch?v=5TkIe60y2GI) for detailed explanation. There are of course more inconsistencies to it that I missed. - - diff --git a/blog/2021-07-15.md b/blog/2021-07-15.md deleted file mode 100644 index 2ea0bd5..0000000 --- a/blog/2021-07-15.md +++ /dev/null @@ -1,141 +0,0 @@ -# CircleCI :circleci: in daily life: how I improved Matrix stickerpicker - -[CircleCI](https://circleci.com) is a great tool that everyone seems to skip and I don't know exactly why. -I'm gonna quickly show you how I've automated adding stickers to the [Matrix](https://matrix.org) messenger. - -## What is CircleCI? -`CircleCI` is a cloud platform that can run automated jobs when different events occur. The most common use-case is -running tests in the cloud when you push a commit to the `GitHub` repo. But the possibilities are endless, -you can literally automate everything with it - I even used it to compile `.exe` file **in the cloud** and include -a **zipped binary** into the release package. Don't ask me why I had to compile `.exe`, better ask why the guys from my -University **made a deal with** [**the Devil**](https://microsoft.com). - -## Matrix -[Matrix](https://matrix.org) is a messaging protocol which I'm currently trying to replace **Telegram** with. -It's in itself a separate topic for discussion, but what's important for today is that **Matrix** lacks such -a huge collection of stickers as there is in **Telegram**. I'm a big fan of **Wojak** stickers and many other ones, -so I had to do something about it. - -![stickerpicker](/public/stickerpicker.png) - -# Matrix Stickerpicker -Stickers work in a slightly weird way in **Matrix**. Basically you have to deploy your own sticker "server" -(*don't worry, it's just a static site*) where you can add your stickers - it will be used as a widget inside your client. - -There's an amazing tool for that - [stickerpicker](https://github.com/maunium/stickerpicker). It's written in `Python` and the author -of course took care of the import feature - you can provide a link to a **Telegram** sticker pack - it will re-upload it -to your `Matrix` server and then generate a web UI using GitHub Pages that you can integrate as a widget in your client. Your friends -can use it too. - -The problem is that each time you want to add new sticker pack to your collection you have to run a `Python` script. -I'm lazy and I don't wanna do that - so let's automate it! - -## Automation -Main idea of my solution is to have a single plaintext file `telegram-packs.txt` which will contain links to all -sticker packs I import from **Telegram**. Then every time I update it `CircleCI` will run a job that will run this `Python` script for me. Deadly simple. - -This approach ships with few bonuses by default: - - You can edit the file from anywhere (even from phone :laughing:) - - If someone from your friends uses your stickers collection and wants to add a new pack, they simply have to open a PR which adds the pack URL to `telegram-packs.txt`. - -There are two problems of running this `Python` script automatically: - - You have to log into your `Matrix` account - - You have to log into your `Telegram` account - -## Config -Here's my fork of the repo: https://github.com/eug-vs/stickerpicker - -`CircleCI` is fully controlled by a config file `.circleci/config.yml`. It uses `YAML` which is really picky about indentation, so be careful with that. - -Ok so let's start outlining our job, we'll be using default CircleCI `Python` image: -```YAML -defaults: &defaults - working_directory: ~/repo - docker: - - image: cimg/python:3.9.5 - -jobs: - upload_stickers: - <<: *defaults - steps: -``` - -The `defaults` part might look scary, but you could just move everything from defaults directly under `upload_stickers` job. -Defaults are useful when you have multiple jobs, and I planned to have 2 initially. Let's now move to the `steps`: -```YAML -- checkout - -- run: - name: Install python dependencies - command: pip3 install . -``` -Obviously we checkout our code first, and then install all the dependencies for our `Python` script. - -Now let's solve the first problem we found. Instead of logging into `Matrix` manually, you can supply a `config.json` file with your credentials. So I prepared a template for this file (`config.template.json`): -```JSON -{"homeserver": "$HOMESERVER", "user_id": "$USER_ID", "access_token": "$ACCESS_TOKEN"} -``` -You might think how am I gonna put the actual variables in here? Well, there's a tool for that called `envsubst`. It does exactly what you think - substitutes environment variable names with the actual values. -We will put the actual values of `$HOMESERVER`, `$USER_ID` and `$ACCESS_TOKEN` in our `CircleCI` environment (as secrets), and the template can be safely pushed to the GitHub repo. - -There's a little problem - `envsubst` is not installed in the image that we use (`cimg/python:3.9.5`). Solution to it is [orbs](https://circleci.com/developer/orbs) - basically plugins for your CircleCI needs. -Let's add `envsubst` orb at the top of our config: -```YAML -orbs: - envsubst: sawadashota/envsubst@1.1.0 -``` - -Now back to the steps. Let's install the tool and use it to generate our `config.json`: -```YAML -- envsubst/install - -- run: - name: Create config.json from template - command: envsubst < config.template.json > config.json -``` - -Ok so we can now login into `Matrix`, but what about `Telegram`? The script uses `Telethon` package under the hood which works with a `sticker-import.session` file. This is basically an `SQL` database, and I don't really -wanna mess around with creating it from scratch (*although I could!*). Instead, I will just encrypt it with `GPG` and push to the repo. That's just me being lazy, but you know, that is what automation is about! -Of course, someone could try to decrypt my `Telethon` session since it's now publicly available, but I can just revoke it at any time. I will probably improve this at some point, but now it's not a big deal for me. - -Our next steps in config will be to decrypt the session and finally pipe our `telegram-packs.txt` to the script using `xargs`: -```YAML -- run: - name: Decrypt telethon session - command: gpg --batch --passphrase $PASSPHRASE --decrypt sticker-import.session.gpg > sticker-import.session - -- run: - name: Reupload and install stickers - command: cat telegram-packs.txt | xargs sticker-import -``` - -At this point, the stickers are uploaded to the server, but the UI is updated via it's own `.json` file which contains information about uploaded stickers. It's already updated by the script, we just have to push it to our repo. -For that I've created a new SSH key and added it to `CircleCI` secrets so that it can push commits to my repository. So the final steps would be: -```YAML -- add_ssh_keys - -- run: - name: Add github to known_hosts - command: | - mkdir -p ~/.ssh - ssh-keyscan github.com >> ~/.ssh/known_hosts -- run: - name: Commit stickerpack JSON's - command: | - git config --global user.email "eug-vs@keemail.me" - git config --global user.name "eug-vs" - git add . - git commit -m "feat: add stickerpacks with CircleCI [ci [skip](skip.md)]" - git push -u -``` - -The `[ci skip]` flag tells Circle to avoid running on this commit, otherwise it would have to run once again since we pushed a new commit with it. - -One thing that I didn't mention is that I did not actually -need to check the **new** packs in the `telegram-packs.txt` - the script is actually smart enough to skip already existing ones. Otherwise I would have to use `git diff` to find only the new ones. - -And that's it! Now every time I add new URLs to the `telegram-packs.txt`, they will automatically appear in my widget within a minute or so. Enjoy your stickers! - -![wojak-brain-chair](/public/wojak-brainchair.png) - -You can find full version of the config here: https://github.com/eug-vs/stickerpicker/blob/master/.circleci/config.yml diff --git a/blog/2021-08-14.md b/blog/2021-08-14.md deleted file mode 100644 index e98d78f..0000000 --- a/blog/2021-08-14.md +++ /dev/null @@ -1,80 +0,0 @@ -# Using imagemagick :imagemagick: to crop soy faces -I'm pretty sure everyone knows that sometimes finding a good **PNG** can be very hard, while there's always a bunch of the same **JPEG** images with the white background. -After searching for 10 minutes, you decide to remove background yourself - using [GIMP](https://gimp.org) or something like `Photoshop` or `PAINT.NET` if you are on Windows. **Forget about it!** I'm gonna show you how you can use [imagemagick](https://imagemagick.org/) to automate basic tasks like removing background and cropping images. - -# Telegram sticker pack -Every time I use Telegram stickers, I feel tired scrolling through many different packs trying to find the sticker I want. Sometimes, you just want them all to be in one place. That's why I created **Based Wojak** - a sticker pack which is automatically generated from random source images that I find on the internet. - -![based-wojak](https://user-images.githubusercontent.com/51545008/129426994-2a787714-772d-4010-b295-6ae00346bdbc.png) - -It doesn't matter if the image has a white background or wrong resolution, I just put it in the `src` folder and then magic :imagemagick: happens. For example, these are the source images used to generate the stickers above: - -![based-wojak-sources](https://user-images.githubusercontent.com/51545008/129427152-e01bc830-06e4-441a-9d8c-3dccbfb4d025.png) - -The collection itself is very small right now as you can see, but I plan to extend it as I need more stickers. Add this pack: - -https://t.me/addstickers/BasedWojak - - -# Imagemagick -Now, let's see how I've done that. Here's the GitHub :github: repo so you can follow: - -https://github.com/eug-vs/telegram-based-wojak - -You know, I love Makefiles. I use them everywhere (where they're appropriate), even this website is generated by a `Makefile`. Let's have a look at the `Makefile` for `telegram-based-wojak`: - -```Makefile -# Makefile -SOURCES=$(wildcard src/*) -OUTPUTS=$(patsubst src/%.png, out/%.png, $(patsubst src/%.jpg, out/%.png, $(SOURCES))) - -SIZE=512x512 -FUZZ=50% - -VIEW_COMMAND=sxiv -t - - -all: $(OUTPUTS) - -view: all - $(VIEW_COMMAND) out - -viewsrc: - $(VIEW_COMMAND) src - -out/%.png: src/%.* - @mkdir -p out - magick $< \ - -fuzz $(FUZZ) -fill none \ - -floodfill +0+0 white \ - -floodfill "+%[fx:w-1]+0" white \ - -trim +repage \ - -resize $(SIZE) $@ - -clean: - rm -rf out -``` - -On the first two lines I just create variables for input and output images. Then I define the `SIZE` - Telegram expects sticker's largest side to be `512px`. The value of `FUZZ` determines the sensitivity of removing the background - I use `50%`, but that's just something you can play with. - -Now let's have a closer look at the recipe for creating `out/%.png` from `src/%.*`. I use `magick` on the input file (denoted by `$<`), then pass a whole bunch of parameters to it, and finally provide the output file (`$@`). If you are confused by `$<` and `$@`, check out [Makefile cheatsheet](https://devhints.io/makefile). - -![imagemagick-logo](/public/emoji/imagemagick.png) - - -## Removing the background -To remove background, I use `-floodfill`, here's how [imagemagick wiki](https://imagemagick.org/script/command-line-options.php) describes it: -> -floodfill {+-}x{+-}y color -> -> Floodfill the image with color at the specified offset. -> -> Flood fill starts from the given 'seed point' which is not gravity affected. Any color that matches within -fuzz color distance of the given color argument, connected to that 'seed point' will be replaced with the current -fill color. - -I use it two times: one in the top-left corner and one in the top-right. Top-left corner pixel obviously has a coordinate `+0+0`. To get the X coordinate of right-most pixel I have to use this expression: `+%[fx:w-1]`, Y coordinate stays at `0` of course. Since I already supplied `-fuzz` and `-fill none`, both operations will replace the white background with `none`, starting from two top corners of the image using the supplied fuzziness value. - -## Cropping the image -After we removed background, most of the time we can trim a lot of extra space so that our image size corresponds to its content. Simple `-trim +repage` does the trick. - -## Adjusting the size -All we have to do now is to make sure the sticker respects the size with `-resize` option. It will resize it in a way so it fits into `512x512` box without changing the aspect ratio (largest side will always be `512px`). - diff --git a/blog/2021-08-18.md b/blog/2021-08-18.md deleted file mode 100644 index f048106..0000000 --- a/blog/2021-08-18.md +++ /dev/null @@ -1,81 +0,0 @@ -# Python :python: in real life -Recently I had a chance to solve an accounting problem. And as always, Python saved me some time and nerve cells. - -## The problem -In accounting you sum things up a lot. And sometimes, you forget what were the terms you used to compute the sum, especially when there are a lot of them. This is exactly the scenario I faced recently: - - There's a price list for certain items - - There's a total sum that was made up from **some** of these prices - - You have to find out what prices were used to calculate total sum - -And this problem appears many times, same price list but different totals. I immediately knew I am not gonna do this manually, so first thing I did was creating a new script and writing my first two lines with the input data: -```python -prices = [561.6, 134.24, 561.6, 345.6, 2292, 22.08, 61.2, 87.41, 37.08, 37.8, 25.44, 246] -totals = [271.01, 1078.61, 3333.44] -``` - -## Thinking -Now, let's analyze the problem a bit. There are **12** prices in the list. Let's suppose our total was made up from 2 prices. It could be any 2 numbers from the list, in fact there are a lot of possible pairs. To be precise, there are **66** of them! Luckily Python has an amazing package `itertools` which allows you to work with combinatorics. We can now list all these pairs: - -```python -from itertools import combinations - - -prices = [561.6, 134.24, 561.6, 345.6, 2292, 22.08, 61.2, 87.41, 37.08, 37.8, 25.44, 246] -pairs = list(combinations(prices, 2)) -print(pairs) -``` - -Output: -```python -[(561.6, 134.24), (561.6, 561.6), (561.6, 345.6), (561.6, 2292), (561.6, 22.08), (561.6, 61.2), (561.6, 87.41), (561.6, 37.08), (561.6, 37.8), (561.6, 25.44), (561.6, 246), (134.24, 561.6), (134.24, 345.6), (134.24, 2292), (134.24, 22.08), (134.24, 61.2), (134.24, 87.41), (134.24, 37.08), (134.24, 37.8), (134.24, 25.44), (134.24, 246), (561.6, 345.6), (561.6, 2292), (561.6, 22.08), (561.6, 61.2), (561.6, 87.41), (561.6, 37.08), (561.6, 37.8), (561.6, 25.44), (561.6, 246), (345.6, 2292), (345.6, 22.08), (345.6, 61.2), (345.6, 87.41), (345.6, 37.08), (345.6, 37.8), (345.6, 25.44), (345.6, 246), (2292, 22.08), (2292, 61.2), (2292, 87.41), (2292, 37.08), (2292, 37.8), (2292, 25.44), (2292, 246), (22.08, 61.2), (22.08, 87.41), (22.08, 37.08), (22.08, 37.8), (22.08, 25.44), (22.08, 246), (61.2, 87.41), (61.2, 37.08), (61.2, 37.8), (61.2, 25.44), (61.2, 246), (87.41, 37.08), (87.41, 37.8), (87.41, 25.44), (87.41, 246), (37.08, 37.8), (37.08, 25.44), (37.08, 246), (37.8, 25.44), (37.8, 246), (25.44, 246)] -``` - -Here we converted the result of `combinations(prices, 2)` to a `list`, but that's actually only to be able to `print` it. In fact, the original result was a [generator](https://wiki.python.org/moin/Generators) - it wasn't storing the whole list in memory, only the instructions how you should iterate over it. And that's exactly what we want to do - iterate over this list, taking the sum and see if it matches the result, something like this: - -```python -for prices_combination in combinations(prices, 2): - if sum(prices_combination) == total: - return prices_combination -``` - -# The solution -Of course, our `total` doesn't have to be a sum of 2 terms, it can be 3, 4, 5 or more. Also, `total` might not exactly equal the sum, there can be a slight difference due to rounding or human error. Let's say this difference is no more than `0.01`. This will be the final solution: -```python -#!/usr/bin/python -from itertools import combinations - - -prices = [561.6, 134.24, 561.6, 345.6, 2292, 22.08, 61.2, 87.41, 37.08, 37.8, 25.44, 246] -totals = [271.01, 1078.61, 3333.44] - -def decompose(total, terms): - for count in range(1, len(terms)): - for combination in combinations(terms, count): - if abs(total - sum(combination)) < 0.01: - return combination - -for total in totals: - combination = decompose(total, prices) - print(f'{total} = sum{combination}') -``` - -Which will produce a nice output in less then **0.03** seconds: -```python -271.01 = sum(22.08, 61.2, 87.41, 37.08, 37.8, 25.44) -1078.61 = sum(561.6, 22.08, 61.2, 87.41, 37.08, 37.8, 25.44, 246) -3333.44 = sum(561.6, 134.24, 345.6, 2292) -``` - -Notice that the only list stored in memory was the original one. Each combination only appeared in memory when it was needed to calculate the sum, and immediately disappeared after that. That's why it's (relatively) fast! - -# Takeaway -Of course this script isn't by any means optimal! Essentially it's a brute force, we are just checking all the possible combinations. But we are doing it in a **clean and efficient way** (credit to generators). - -When you are solving real-life problems, you are not in algorithms class and you don't have to write a hardcore algo, you just have to correctly utilize amazing toolkit that this language has. I've spend no more than 5 minutes writing this and I already have the answer to my problem - that's the beauty of Python :python:! - -## Now imagine writing and compiling a C++ program for that! -I can only describe it with this image: - -![meme](/public/brainlet-dreams-big-brain.png) - -Programming languages are tools, and different situations require different tools. diff --git a/blog/2021-09-10.md b/blog/2021-09-10.md deleted file mode 100644 index de1d7a0..0000000 --- a/blog/2021-09-10.md +++ /dev/null @@ -1,22 +0,0 @@ -# Summer 2021 - retrospective -This summer was one of the greatest I ever had! - -# Achievements -During this summer I have: - - [X] Set up a Raspberry Pi :raspberry-pi: - - [X] Created this website - - [X] Configured personal email server - - [X] Configured personal TaskWarrior server :taskwarrior: - - [X] Passed some university exams - -# Productivity -Here's my TaskWarrior burndown: -![burndown](/public/summer-2021/burndown.png) -I'm pretty happy with how it looks, definitely can spot some progress going on. - -# Lifestyle -It was very active! I got into kayaking which was unforgettable :fire:, big thanks to my friends! - -![bonfire](/public/summer-2021/bonfire.jpg) - -![kayaking](/public/summer-2021/kayaking.jpg) diff --git a/blog/2021-09-21.md b/blog/2021-09-21.md deleted file mode 100644 index d3a5f8f..0000000 --- a/blog/2021-09-21.md +++ /dev/null @@ -1,24 +0,0 @@ -# I'm back on Carnivore! :meat_on_bone: -This weekend I bought a new high-quality pan and now I just can't resist going back to carnivore diet. - -![pan](/public/pan.png) - -You really see the difference in the cooking process - the surface is big, heat is distributed evenly, it produces less smoke - it all adds up to a much better cooking experience :fire: - -![meat](/public/meat.png) - -I've been thinking of going back to carnivore for a long time already, but this pan finally pushed me to do it. I'm not going **full carnivore** though, this is the list of the food I'm planning to eat: - - All sorts of meat :meat_on_bone: - - Liver (~1-2 times a week) - - Fish (~once a week) :fish: - - Eggs :egg: - - Coffee :coffee: - - Diary: - - Cheese :cheese: - - Cottage cheese - - Butter :butter: - - Sour-cream - - Bananas :banana: - - Lemon :lemon: - -This is of course not a perfect list, ideally I would remove bananas and diary from here, but I'll start with this because I already used it for ~3 months before. I find lemon really important to support the levels of vitamin C. But that's what works for me, it might now work for you of course. diff --git a/blog/2021-10-06.md b/blog/2021-10-06.md deleted file mode 100644 index 4611853..0000000 --- a/blog/2021-10-06.md +++ /dev/null @@ -1,17 +0,0 @@ -# You should start using `ssh-copy-id` now! -Over the last couple of weeks I had to simultaneously manage up to 4 virtual machines in the Cloud. Holy shit, I've lost so much time just trying to log into them - picking up the correct server IP, then finding the password for it, and then finally `ssh`-ing into it. That's such a painful process, especially when you have to repeat it over and over again. - -Luckily, there's a solution! Simply run `ssh-copy-id username@password` (the same way you would do with `ssh`, just replacing it by `ssh-copy-id`), enter your password and it will remember it. Of course you gotta have your keys set up, but I think everyone has. - -Well, as a bonus, to not mess with the IPs, you can also use `~/.ssh/config` like that: -```bash -Host - HostName - User -``` -You might guess what it's doing: running `ssh ` will now expand to `ssh @`! - -Of course you can add as much hosts as you want to your config. Combined with `ssh-copy-id`, you get a perfect solution for managing multiple web servers. - -## PS -If you are familiar with `tmux`, I highly recommend installing it right away on your server, and doing everything in a session. Even simple `tmux new` / `tmux a` will make your life even more easy! diff --git a/blog/2021-10-27.md b/blog/2021-10-27.md deleted file mode 100644 index 06b9a0d..0000000 --- a/blog/2021-10-27.md +++ /dev/null @@ -1,34 +0,0 @@ -# Ray marching in Rust :rust: ! -I'm currently learning Rust for fun and re-writing my [ascii-renderer](https://github.com/eug-vs/ascii-3d-renderer) from Python :python:. I'm using Ray Marching this time, here's how it looks (if you are on mobile, use desktop version of the site): - -[![asciicast](https://asciinema.org/a/jsDqGeMkRwLeYhVIMqNbaec0M.svg)](https://asciinema.org/a/jsDqGeMkRwLeYhVIMqNbaec0M) - -You can see that Ray Marching allows for some cool stuff like smooth surface blending and proper shadowing. - -# Ray marching -Usually 3d renderers use a triangular mesh to describe objects in a scene. In Python version of `ascii-renderer` I defined each object as a set of points -(i.e object is defined by a function `__contains__` that determines whether the given point is in this object). It allowed me for some cool Ray Tracing stuff, but that was just me toying around. - -Behold - Ray Marching! It's a cool rendering technique where you describe your scene with a *Distance Field* - each point in this field contains a distance from that point to the scene. -Well, actually it's a *Signed Distance Field* - the distance to the object is considered negative *inside* the object, and positive *outside*. - -What's cool about Ray Marching is that since the whole scene is defined with mathematical expression, I can apply any mathematical transformations to it. For example I can make an object wavy -using a `sin`, or make it repeat forever with `%` operator. Also, `SDF` allows for different ways to combine objects - I can find a `union`, `difference`, and `intersection` for free! - - - -## Performance -Currently it's rendering 4 shapes at ~19 FPS, which is pretty bad. That's probably due to my dirty and inefficient code :laughing: - I'm nowhere near a good understanding of Rust :rust: patterns. - -My goal is to render 8 shapes at 24 FPS: - - 24 FPS is OK for a human eye - - 8 distinct shapes is usually enough to create a complex scene (ray marching allows for cool tricks that can multiply amount of your shapes without performance decrease) - - -# Plans - - Cleanup the code and increase performance - - Build an actually usable API - - Use `ncurses` instead of just printing to `STDOUT` - - Create an `ncurses` GUI for building a scene - - Allow importing/exporting scenes in `JSON` - - Do some magic :star: and expose API to the browser using `WebAssembly` diff --git a/blog/2021-10-28.md b/blog/2021-10-28.md deleted file mode 100644 index aece45f..0000000 --- a/blog/2021-10-28.md +++ /dev/null @@ -1,11 +0,0 @@ -# Pistol :gun: - yet another ASCII renderer -In [previous blog post](./2021-10-27) I've shown you my beginnings with Rust :rust: - today I wanna share some progress! -The project is now officially called **Pistol** :gun: - -## Showcase -Thanks to `NCurses` it supports camera navigation using `VIM`-keys. Here's how it looks: - -[![asciicast](https://asciinema.org/a/Wo3mWNQUTYAeZkAYob2gKzv4h.svg)](https://asciinema.org/a/Wo3mWNQUTYAeZkAYob2gKzv4h) - -# Source code -Project source is now available [on GitHub](https://github.com/eug-vs/pistol) :github: diff --git a/blog/2022-02-26.md b/blog/2022-02-26.md deleted file mode 100644 index bd759f2..0000000 --- a/blog/2022-02-26.md +++ /dev/null @@ -1,5 +0,0 @@ -# Слава Україні! :ukraine: - -Russian government is doing terrible things to Ukraine. No excuse. - -Russian citizens, do not fall for propaganda! diff --git a/blog/2022-03-17.md b/blog/2022-03-17.md deleted file mode 100644 index 59d9e71..0000000 --- a/blog/2022-03-17.md +++ /dev/null @@ -1,14 +0,0 @@ -# Жыве Беларусь! :belarus: - -Belarus citizens meet a lot of hatred outside the country. But are not the same as our government! - - -## Current situation -Most people in Belarus are against the regime. Actual support of Lukashenko in 2020 was ~3%. - -Elections were stolen! Our freedom is stolen! People were fighting against it, but [the protests were brutally stopped by a bloody regime](https://en.wikipedia.org/wiki/2020%E2%80%932021_Belarusian_protests). - -## Goergia :georgia: -And here I am, writing this from T'bilisi, Georgia :georgia: , **forced** to leave my country. - -Belarussian government supports Russia's war. But no citizen in Belarus does, and no one wants to fight against our brothers in Ukraine :ukraine:, myself included. If you are Georgian, please think about it when blaming random people on the streets. diff --git a/blog/2022-03-24.md b/blog/2022-03-24.md deleted file mode 100644 index 7359978..0000000 --- a/blog/2022-03-24.md +++ /dev/null @@ -1,14 +0,0 @@ -# Here comes my git server :fire: -I've mirrored all of my important projects from GitHub :github: (along with some unpublished ones) to my personal git server: https://git.eug-vs.xyz - -It includes: - - My [dotfiles](https://git.eug-vs.xyz/eug-vs/dotfiles/) - - My builds of [suckless sotftware](https://suckless.org) - - [Source code](https://git.eug-vs.xyz/eug-vs/eug-vs-xyz/) for this website - - My [homelab infrastructure](https://git.eug-vs.xyz/eug-vs/infrastructure/) (subject for the upcoming blog post) - - And [more](https://git.eug-vs.xyz)... - -![git remote meme](/public/git-remote-meme.png) - -I'm using [cgit](https://git.zx2c4.com/cgit/) as a web fronted to it. There still is some misconfiguration here and there, but it works. Check it out! - diff --git a/blog/2022-03-26.md b/blog/2022-03-26.md deleted file mode 100644 index 1bc09b2..0000000 --- a/blog/2022-03-26.md +++ /dev/null @@ -1,62 +0,0 @@ -# Agent-less infrastructure management with Ansible :ansible: -As I explore new things and grow my homelab :raspberry-pi: infrastructure things start to get a little messy. I've reached the point where I should start using more advanced deployment strategy than just manually setting up servers via SSH or `rsync`-ing a bunch of files into them. The goal is to reach [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code). - -# But what about Docker? :whale: -[Docker](https://www.docker.com/) is an amazing tool that solves particularly nasty problem - isolating your application from environment and **reliably** running it on any platform. You just pack your application into the container and ship it anywhere you want! It makes your app **scalable**! - -I use Docker on my daily job and I can't imagine it otherwise. But here, in my tiny homelab (which is just one RaspberryPI :raspberry-pi: at this point), this is not world-class production problems, so it might be an overkill. - -Docker requires your servers to run a *daemon* - e.g extra software layer (and it's dependencies) between your applications and the metal. It will run in the background and make your fan work a bit louder :helicopter: in the upcoming summer nights to compensate for those extra couple degrees. - -![meme](/public/docker-on-rpi.jpg) - -# Introducting Ansible :ansible: -[Here it comes](https://ansible.com) - **agent-less** deployment tool that doesn't require your server to run anymore bullshit than good old Python :python: and open SSH port. - -In Ansible you define so called playbooks - `YAML` specs of your tasks. Then you just feed the `YAML` to `ansible-playbook` and voila! It's already SSHing into your machines and doing your job now! - -Ansible is not the tool you should learn, it's so simple that you can use it right away! - -# Examples from my infrastructure :raspberry-pi: -Ansible has a bunch of built-in convenience commands that make your life even more enjoyable. - -![meme](/public/pepe-smug.png) - -This is how easy it is to setup a cron-job: -```YAML - - name: Setup auto-renewing certificates - become: true - cron: - name: "Auto-renew certificates" - minute: "0" - hour: "12" - job: "/usr/bin/certbot renew --quiet" -``` - -Transferring files: -```YAML - - name: Copy nginx configuration - become: true - copy: - src: ./files/nginx/website - dest: /etc/nginx/sites-available -``` - -Installing packages: -```YAML - - name: Install build tools - apt: - pkg: - - gcc - - make - - cmake - - gnutls-dev - - uuid-dev -``` - -...and many many more. Check out source code of my playbooks here: - - https://git.eug-vs.xyz/eug-vs/infrastructure/ - -The notable ones are: - - Installing [taskd](https://git.eug-vs.xyz/eug-vs/infrastructure/tree/taskd.yaml) (migth be worth a separate post) - - Installing [git server along with cgit](https://git.eug-vs.xyz/eug-vs/infrastructure/tree/git-server.yaml) diff --git a/blog/2022-04-02.md b/blog/2022-04-02.md deleted file mode 100644 index 6f8a9a2..0000000 --- a/blog/2022-04-02.md +++ /dev/null @@ -1,83 +0,0 @@ -# DWM - useless gaps are useless! -Many people in Linux community spend too much time *"ricing"* their desktops. Here are few points I came to after using minimal window managers for 2 years: - - Screen real estate **matters** - - Gaps are **useless** (unless you care about your wallpaper) - - Wallpapers draw too much of your **attention** - - You **don't need** to constantly see your CPU temperature, battery percentage etc. - - **Less** windows is **better** - -And from that I can derive an advice on how to stay functional, productive and efficient with minimal window managers: - - **Get rid** of gaps - - **Stop** caring about your wallpaper - - **Don't** put many windows on your screen at once. You probably only need one. Two is ok, sometimes three. More windows = less focus - - Try **removing** window borders (or using `1px black` border). You won't be able to see which window is focused this way, and that will naturally encourage you to keep less windows on the screen - - **Decrease** the number of available workspaces / tags - - **Hide** your status bar when you don't need it - -Following these steps leads you to super-productive no-distraction fullscreen experience. You still get all the advantages of your window manager though. - -**Try it!** (you can always switch back) - - -# Evolution of my desktop -Here's my journey to my current WM philosophy - represented in random screenshots with a couple of comments. - -If you want to replicate a setup on the screenshot - lookup it's date and checkout the corresponding commit of my [dwm build](https://git.eug-vs.xyz/suckless/dwm/). - -## i3 -I've been happy user of `i3` with a lot of "ricing" for a long time. I liked transparent windows, blur and shadows: - -![screenshot](/public/desktop-screenshots/2020-12-08_01-49-30.jpg) - -![screenshot](/public/desktop-screenshots/2021-01-06_18-57-32.jpg) - - -## DWM -But then I decided to switch to suckless `dwm`. The functional approach was so much better then manual window management in i3 - as a perfectionist I always spent extra time arranging windows "in a cool way". DWM solved this problem entirely, but I still couldn't live without beautiful wallpaper and gaps. - -![screenshot](/public/desktop-screenshots/2021-03-10_21-14-09.jpg) - -![screenshot](/public/desktop-screenshots/2021-03-27_01-26-27.jpg) - -![screenshot](/public/desktop-screenshots/2021-04-26_00-06-32.jpg) - -![screenshot](/public/desktop-screenshots/2021-06-04_08-52-16.jpg) - -![screenshot](/public/desktop-screenshots/2021-06-25_16-19-05.jpg) - -![screenshot](/public/desktop-screenshots/2021-06-28_19-12-39.jpg) - -![screenshot](/public/desktop-screenshots/2021-07-15_14-20-16.jpg) - - -## Fuck gaps! -After ~4 months of `dwm` (and ~year of using minimal window managers) I realized - gaps are just taking too much of my screen real estate! Let's try removing them entirely: - -![screenshot](/public/desktop-screenshots/2021-07-22_09-50-48.jpg) - -As a bonus you stop caring about your nice wallpaper because you only see it once - when you first boot your machine. You can also get rid of your composite manager now. Finally, get rid of that bright orange: - -![screenshot](/public/desktop-screenshots/2021-08-14_02-29-30.jpg) - -![screenshot](/public/desktop-screenshots/2021-10-07_13-11-59.jpg) - -![screenshot](/public/desktop-screenshots/2021-10-17_16-17-55.jpg) - -![screenshot](/public/desktop-screenshots/2021-11-06_15-24-35.jpg) - -![screenshot](/public/desktop-screenshots/2021-12-05_21-38-36.jpg) - -That setup was untouched for 4 months! Finally rollback some patches to get that beautiful default status bar (that color though!): - -![screenshot](/public/desktop-screenshots/2022-03-21_20-01-58.jpg) - - -## Current state -That lived for 3 more months and now I use gray as the accent color and all my borders are black! Also I decreased the number of available tags. - -![screenshot](/public/desktop-screenshots/2022-04-02_14-59-33.jpg) - -Most of the time I hide status-bar anyway. - -![screenshot](/public/desktop-screenshots/2022-04-01_18-44-17.jpg) - diff --git a/blog/2022-04-17.md b/blog/2022-04-17.md deleted file mode 100644 index d6ca637..0000000 --- a/blog/2022-04-17.md +++ /dev/null @@ -1,51 +0,0 @@ -# Running Gentoo :gentoo: on multiple workstations -Last week I've migrated my daily-driver laptop :computer: from [Artix Linux](https://artixlinux.org/) to [Gentoo](https://www.gentoo.org/). I also have Gentoo-powered PC for a ~half a year already, so some experience has accumulated. -I always wanted to do that, but there was a fear of unknown: - - Is my CPU performance sufficient for compiling packages? - - What if I don't have time to compile a package (e.g at work)? - - How am I gonna manage the USE flags? - -Of course, none of that shit can stop me! - -# My CPU is weak :cry: -My laptop has a pretty weak CPU (**Intel i3**) compared to flagship models. My PC has **Intel i5**, so obviously compiling packages on laptop will be even slower. That is definitely gonna be a problem... - -But wait, why don't we use **both CPU's** for compilation? :thinking: - - -## Introducing `distcc` -From [Gentoo wiki](https://wiki.gentoo.org/wiki/Distcc): -> Distcc is a program designed to distribute compiling tasks across a network to participating hosts. It comprises a server, distccd, and a client program, distcc. Distcc can work transparently with ccache, Portage, and Automake with a small amount of setup. - -Installation and usage is of course covered in the wiki along with instructions on bootstrapping new machine. Thanks to `distcc` installing Gentoo on my laptop was even faster than on more performant PC. - -Basically my PC runs a `distccd` server in my **LAN** and my laptop connects to it, sending compilation requests. Now every time I want to compile some heavy packages I just wait to come home and do it at almost twice the speed. There are more optional benefits: - - I can bring my RaspberryPI :raspberry-pi: to the compilation network (not without some cross-architecture magic) - - I can pull up some more old rusty metal, connect it to my **LAN** and have my packages compiled *even faster* :fire: - - I can setup [ccache](https://wiki.gentoo.org/wiki/Ccache) and share compilation cache within my network, making heavy package updates finish in seconds - - -# What if I'm outside and don't have time for compilation? :scream: -Actually turns out it's a very hypothetical situation. Most of the time you already have your toolkit installed anyway. It's only annoying if you want to try something new - for that I recommend remote or virtual machines (yes, `docker` still exists). - -In any case, if such an urgent situation occurs, **you can just get a binary!** There are also ways to setup your own [binary package server](https://wiki.gentoo.org/wiki/Binary_package_guide). - -# Managing portage configuration across workstations :hammer_and_wrench: -[Portage](https://wiki.gentoo.org/wiki/Portage) is **the best** package manager I ever used. The obvious benefit is an ability to split your packages into [sets](https://wiki.gentoo.org/wiki/Package_sets). I can define as many sets as I want, for example here's my `/etc/portage/sets/base`: -```bash -app-admin/doas -app-admin/stow -app-editors/neovim -app-shells/dash -app-shells/zsh -dev-vcs/git -app-misc/vifm -net-misc/ntp -``` - -I can install everything from this set with `emerge --ask --verbose @base`. Or if I want to install everything development-related, I can just install `@development` set. As easy as it gets! - -This way I can categorize my packages by purpose, compilation time, shared libraries, *etc*. Each package can belong to many sets. And most importantly, package set is **just a plaintext file**! You can manually edit it, you can store it under `git`, and you can share it across your workstations. - -Since portage is fully configurable via plaintext files, the same works for USE flags, keywords, accepted keywords and licenses. - diff --git a/blog/2022-04-18.md b/blog/2022-04-18.md deleted file mode 100644 index 4f817a8..0000000 --- a/blog/2022-04-18.md +++ /dev/null @@ -1,48 +0,0 @@ -# Patching Gentoo :gentoo: packages in the wild -Everyone who has ever used **st** - [suckless terminal](https://st.suckless.org) - has experienced [weird crash](https://github.com/LukeSmithxyz/voidrice/issues/284) when trying to render some very specific unicode characters. In this short post I'm showing how easy it is to solve this problem on Gentoo with the help of patches. - -# libXft -The original problem is solved by installing a couple of fallback fonts and a **patched version** of `libXft`. Guys from Arch Linux can just install patched version [libxft-bgra from aur](https://aur.archlinux.org/packages/libxft-bgra), why don't we have something similar on Gentoo? :thinking: - -We don't need it! Here's the process *of me* solving this problem in a matter of 5 minutes: - -1. Find patched version from comments on GitHub - https://github.com/uditkarode/libxft-bgra -2. Find upstream source code - https://gitlab.freedesktop.org/xorg/lib/libxft -3. Clone the patched repo and pull tags from upstream: - ```bash - git clone git@github.com:uditkarode/libxft-bgra.git - git remote add upstream git@gitlab.freedesktop.org:xorg/lib/libxft.git - git pull upstream --tags - ``` -4. Checking `git log --oneline` on `master` branch, looks like we are only interested in commit `72e54c0` (the actual *PATCH*). The latest tag before the patch seems to be **2.3.3**. - ```bash - 072cd20 (HEAD -> master, origin/master, origin/HEAD) README: instructions i guess - 72e54c0 [PATCH] Add support for BGRA glyphs display and scaling - 6e7da3c Remove call to FcNameRegisterObjectTypes - 26a3a49 Skip 'render' pattern elements with invalid type - 972fa05 build-fix for c89 - 86c2355 minor typography fix - ed8bb96 fix most type-conversion warnings from gcc-normal, without obje - ct-file changes - a266847 (tag: libXft-2.3.3) libXft 2.3.3 - fab5adf Add description of libXft to README.md - b397ffb Update configure.ac bug URL for gitlab migration - ``` - -5. Create patches from the diff: `git format-patch libXft-2.3.3` -6. Move the generated `.patch` to `/etc/portage/patches/x11-libs/libXft` -7. Reinstall libXft: `emerge -av libXft` -8. Profit!!! - -Well, actually, I did something on top of that - I *rebased* patched branch to the latest **2.3.4** tag to make sure that the patch still works with the latest version of the library. If it wasn't the case - I could just pin the version when emerging: `emerge -av "=libXft-2.3.3"` because we know that the patch is working on that version. - -From now on, I will keep receiving updates to my `libXft` from Portage and each new version will be patched (hopefully successfully) until the fix is released to the upstream. - -# Grab the patch -Well, everything above was "head-on" way. Taking a closer look to the upstream repo, there's already a [merge request](https://gitlab.freedesktop.org/xorg/lib/libxft/-/merge_requests/1) with our fix, so we don't have to do git magic and we can easily grab the raw diff by appending `.patch` to the URL: - -https://gitlab.freedesktop.org/xorg/lib/libxft/-/merge_requests/1.patch - -# See also - - [Running Gentoo :gentoo: on multiple workstations](2022-04-17.md) - - [DWM - useless gaps are useless!](2022-04-02.md) diff --git a/blog/index.md b/blog/index.md deleted file mode 100644 index d9c72fe..0000000 --- a/blog/index.md +++ /dev/null @@ -1,43 +0,0 @@ -# Blog - -## 2022 - -### April - -- [Patching Gentoo :gentoo: packages in the wild](2022-04-18.md) -- [Running Gentoo :gentoo: on multiple workstations](2022-04-17.md) -- [DWM - useless gaps are useless!](2022-04-02.md) - -### March - -- [Agent-less infrastructure management with Ansible :ansible:](2022-03-26.md) -- [Here comes my git server :fire:](2022-03-24.md) -- [Жыве Беларусь! :belarus:](2022-03-17.md) - -### February - -- [Слава Україні! :ukraine:](2022-02-26.md) - -## 2021 - -### October - -- [Pistol :gun: - yet another ASCII renderer](2021-10-28.md) -- [Ray marching in Rust :rust: !](2021-10-27.md) -- [You should start using `ssh-copy-id` now!](2021-10-06.md) - -### September - -- [I'm back on Carnivore! :meat_on_bone:](2021-09-21.md) -- [Summer 2021 - retrospective](2021-09-10.md) - -### August - -- [Python :python: in real life](2021-08-18.md) -- [Using imagemagick :imagemagick: to crop soy faces](2021-08-14.md) - -### July - -- [CircleCI :circleci: in daily life: how I improved Matrix stickerpicker](2021-07-15.md) -- [What's wrong with Numerology](2021-07-03.md) -- [My plans for this website](2021-07-02.md) diff --git a/gruvbox.theme b/gruvbox.theme deleted file mode 100644 index a945bf6..0000000 --- a/gruvbox.theme +++ /dev/null @@ -1,225 +0,0 @@ -{ - "text-color": "#ebdbb2", - "background-color": "#1d2021", - "line-number-color": "#7a7c7d", - "line-number-background-color": "#232629", - "text-styles": { - "Annotation": { - "text-color": "#3f8058", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Information": { - "text-color": "#c45b00", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Keyword": { - "text-color": "#cfcfc2", - "background-color": null, - "bold": true, - "italic": false, - "underline": false - }, - "SpecialChar": { - "text-color": "#b16286", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Preprocessor": { - "text-color": "#27ae60", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Constant": { - "text-color": "#fabd2f", - "background-color": null, - "bold": true, - "italic": false, - "underline": false - }, - "CommentVar": { - "text-color": "#7a7c7d", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Alert": { - "text-color": "#95da4c", - "background-color": "#4d1f24", - "bold": true, - "italic": false, - "underline": false - }, - "Comment": { - "text-color": "#928374", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Normal": { - "text-color": "#cfcfc2", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Float": { - "text-color": "#d79921", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Operator": { - "text-color": "#ffffff", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Import": { - "text-color": "#689d6a", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "ControlFlow": { - "text-color": "#fdbc4b", - "background-color": null, - "bold": true, - "italic": false, - "underline": false - }, - "Documentation": { - "text-color": "#a43340", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Function": { - "text-color": "#d79921", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "RegionMarker": { - "text-color": "#2980b9", - "background-color": "#153042", - "bold": false, - "italic": false, - "underline": false - }, - "Warning": { - "text-color": "#da4453", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "VerbatimString": { - "text-color": "#da4453", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Other": { - "text-color": "#27ae60", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Attribute": { - "text-color": "#2980b9", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "SpecialString": { - "text-color": "#da4453", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "BuiltIn": { - "text-color": "#7f8c8d", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Extension": { - "text-color": "#c45b00", - "background-color": null, - "bold": true, - "italic": false, - "underline": false - }, - "DecVal": { - "text-color": "#f67400", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Variable": { - "text-color": "#27aeae", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "BaseN": { - "text-color": "#f67400", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "DataType": { - "text-color": "#d3869b", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Char": { - "text-color": "#b16286", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - }, - "Error": { - "text-color": "#da4453", - "background-color": null, - "bold": false, - "italic": false, - "underline": true - }, - "String": { - "text-color": "#fabd2f", - "background-color": null, - "bold": false, - "italic": false, - "underline": false - } - } -} diff --git a/head.html b/head.html deleted file mode 100755 index bbc0a2d..0000000 --- a/head.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/header.html b/header.html deleted file mode 100755 index 38a2f3b..0000000 --- a/header.html +++ /dev/null @@ -1,7 +0,0 @@ -
- - eug-vs -

Eugene's Space

-
-
- diff --git a/index.md b/index.md deleted file mode 100755 index 70bc94b..0000000 --- a/index.md +++ /dev/null @@ -1,40 +0,0 @@ -# About me -I'm **Eugene** - software developer, enthusiast, free spirit and a cool guy. Here I share information based on my experience in different topics. I'm interested in tech, math, privacy, linguistics, nutrition, health, psychology and philosophy. - -# About this website -This website runs on my local [Raspberry Pi :raspberry-pi:](https://www.raspberrypi.org/) along with many other services. - -It's nothing more than a series of interlinked wiki pages that I write in **Markdown** :markdown: when I'm too lazy to do something productive. Checkout more info on my [blog post](/blog/2021-07-02.md). - -No bullshit, ads, trackers or client-side JavaScript here. - -Subscribe to my [:rss: RSS feed](https://eug-vs.xyz/blog/index.xml). - -# My projects -I enjoy writing software, from fullstack web applications to 3D renderers in low-level languages. I'm also building my home [infrastructure](https://git.eug-vs.xyz/eug-vs/infrastructure/). - -You can find my projects on my [:git: git server](https://git.eug-vs.xyz). - -# Recent blog posts - - [See all...](./blog/index.md) - -# Articles - - [TaskWarrior :taskwarrior: is all you need to be productive!](./articles/taskwarrior.md) - -# Contacts - - :email: eugene@eug-vs.xyz - - :telegram: [Telegram](https://t.me/eug_vs) - - :github: [GitHub](https://github.com/eug-vs) - - :instagram: [Instagram](https://instagram.com/eug.vs) - -# Support me -## :brave-bat: Brave rewards -I accept tips via **Brave Rewards**. [How to send a tip?](https://support.brave.com/hc/en-us/articles/360021123971-How-do-I-tip-websites-and-Content-Creators-in-Brave-Rewards-) - -## :monero: Monero -My Monero donation address: - -![monero-qr](/public/monero-qr.png) - -`48WZbWqmbyuKhoFkbac4mNYSSFop5LqJz2PFsW1PMLgdYrGpvvZtTrwUgQs5Tgf5EXJWcgmp53TdxBnTapajAbMuLuGqBf2` - diff --git a/openring-template.html b/openring-template.html deleted file mode 100644 index 675c623..0000000 --- a/openring-template.html +++ /dev/null @@ -1,47 +0,0 @@ -
-

Articles from blogs I read

-
- {{range .Articles}} -
-

- {{.Title}} -

-

{{.Summary}}

- -
{{.Date | datef "January 2, 2006"}}
-
- {{end}} -
-
- - Generated by - openring - -
-
- diff --git a/public/brainlet-dreams-big-brain.png b/public/brainlet-dreams-big-brain.png deleted file mode 100644 index 0c808e8..0000000 Binary files a/public/brainlet-dreams-big-brain.png and /dev/null differ diff --git a/public/desktop-screenshots/2020-12-08_01-49-30.jpg b/public/desktop-screenshots/2020-12-08_01-49-30.jpg deleted file mode 100644 index 2e7b808..0000000 Binary files a/public/desktop-screenshots/2020-12-08_01-49-30.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-01-06_18-57-32.jpg b/public/desktop-screenshots/2021-01-06_18-57-32.jpg deleted file mode 100644 index 2f88d6d..0000000 Binary files a/public/desktop-screenshots/2021-01-06_18-57-32.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-03-10_21-14-09.jpg b/public/desktop-screenshots/2021-03-10_21-14-09.jpg deleted file mode 100644 index 58596df..0000000 Binary files a/public/desktop-screenshots/2021-03-10_21-14-09.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-03-27_01-26-27.jpg b/public/desktop-screenshots/2021-03-27_01-26-27.jpg deleted file mode 100644 index c05a7bb..0000000 Binary files a/public/desktop-screenshots/2021-03-27_01-26-27.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-04-26_00-06-32.jpg b/public/desktop-screenshots/2021-04-26_00-06-32.jpg deleted file mode 100644 index e0780af..0000000 Binary files a/public/desktop-screenshots/2021-04-26_00-06-32.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-06-04_08-52-16.jpg b/public/desktop-screenshots/2021-06-04_08-52-16.jpg deleted file mode 100644 index 5fea913..0000000 Binary files a/public/desktop-screenshots/2021-06-04_08-52-16.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-06-25_16-19-05.jpg b/public/desktop-screenshots/2021-06-25_16-19-05.jpg deleted file mode 100644 index 374aafb..0000000 Binary files a/public/desktop-screenshots/2021-06-25_16-19-05.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-06-28_19-12-39.jpg b/public/desktop-screenshots/2021-06-28_19-12-39.jpg deleted file mode 100644 index 0a2302b..0000000 Binary files a/public/desktop-screenshots/2021-06-28_19-12-39.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-07-15_14-20-16.jpg b/public/desktop-screenshots/2021-07-15_14-20-16.jpg deleted file mode 100644 index f431f2e..0000000 Binary files a/public/desktop-screenshots/2021-07-15_14-20-16.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-07-22_09-50-48.jpg b/public/desktop-screenshots/2021-07-22_09-50-48.jpg deleted file mode 100644 index 9b8b08f..0000000 Binary files a/public/desktop-screenshots/2021-07-22_09-50-48.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-08-14_02-29-30.jpg b/public/desktop-screenshots/2021-08-14_02-29-30.jpg deleted file mode 100644 index 625d6c1..0000000 Binary files a/public/desktop-screenshots/2021-08-14_02-29-30.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-10-07_13-11-59.jpg b/public/desktop-screenshots/2021-10-07_13-11-59.jpg deleted file mode 100644 index 699f848..0000000 Binary files a/public/desktop-screenshots/2021-10-07_13-11-59.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-10-17_16-17-55.jpg b/public/desktop-screenshots/2021-10-17_16-17-55.jpg deleted file mode 100644 index cfe7c3a..0000000 Binary files a/public/desktop-screenshots/2021-10-17_16-17-55.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-11-06_15-24-35.jpg b/public/desktop-screenshots/2021-11-06_15-24-35.jpg deleted file mode 100644 index fdec28a..0000000 Binary files a/public/desktop-screenshots/2021-11-06_15-24-35.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2021-12-05_21-38-36.jpg b/public/desktop-screenshots/2021-12-05_21-38-36.jpg deleted file mode 100644 index 7bea66f..0000000 Binary files a/public/desktop-screenshots/2021-12-05_21-38-36.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2022-03-21_20-01-58.jpg b/public/desktop-screenshots/2022-03-21_20-01-58.jpg deleted file mode 100644 index baa4ea6..0000000 Binary files a/public/desktop-screenshots/2022-03-21_20-01-58.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2022-04-01_18-44-17.jpg b/public/desktop-screenshots/2022-04-01_18-44-17.jpg deleted file mode 100644 index fcee63f..0000000 Binary files a/public/desktop-screenshots/2022-04-01_18-44-17.jpg and /dev/null differ diff --git a/public/desktop-screenshots/2022-04-02_14-59-33.jpg b/public/desktop-screenshots/2022-04-02_14-59-33.jpg deleted file mode 100644 index 28eca8e..0000000 Binary files a/public/desktop-screenshots/2022-04-02_14-59-33.jpg and /dev/null differ diff --git a/public/docker-on-rpi.jpg b/public/docker-on-rpi.jpg deleted file mode 100644 index fbfd8ed..0000000 Binary files a/public/docker-on-rpi.jpg and /dev/null differ diff --git a/public/emoji/ansible.png b/public/emoji/ansible.png deleted file mode 100644 index 591746a..0000000 Binary files a/public/emoji/ansible.png and /dev/null differ diff --git a/public/emoji/belarus.png b/public/emoji/belarus.png deleted file mode 100644 index 7050279..0000000 Binary files a/public/emoji/belarus.png and /dev/null differ diff --git a/public/emoji/benzin.svg b/public/emoji/benzin.svg deleted file mode 100644 index be5b465..0000000 --- a/public/emoji/benzin.svg +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/public/emoji/brave-bat.svg b/public/emoji/brave-bat.svg deleted file mode 100644 index f222910..0000000 --- a/public/emoji/brave-bat.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - -logo -Created with Sketch. - - - - - - - - - - -logo diff --git a/public/emoji/brave.svg b/public/emoji/brave.svg deleted file mode 100644 index 8a59702..0000000 --- a/public/emoji/brave.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/emoji/circleci.svg b/public/emoji/circleci.svg deleted file mode 100644 index e66e45c..0000000 --- a/public/emoji/circleci.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - -image/svg+xml diff --git a/public/emoji/gentoo.png b/public/emoji/gentoo.png deleted file mode 100644 index d5e5ad1..0000000 Binary files a/public/emoji/gentoo.png and /dev/null differ diff --git a/public/emoji/git.png b/public/emoji/git.png deleted file mode 100644 index 78bccc4..0000000 Binary files a/public/emoji/git.png and /dev/null differ diff --git a/public/emoji/github.svg b/public/emoji/github.svg deleted file mode 100644 index b54b845..0000000 --- a/public/emoji/github.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - diff --git a/public/emoji/imagemagick.png b/public/emoji/imagemagick.png deleted file mode 100644 index 4b67ed6..0000000 Binary files a/public/emoji/imagemagick.png and /dev/null differ diff --git a/public/emoji/instagram.svg b/public/emoji/instagram.svg deleted file mode 100644 index 278f024..0000000 --- a/public/emoji/instagram.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/emoji/markdown.png b/public/emoji/markdown.png deleted file mode 100644 index 14550d1..0000000 Binary files a/public/emoji/markdown.png and /dev/null differ diff --git a/public/emoji/monero.svg b/public/emoji/monero.svg deleted file mode 100644 index af777a4..0000000 --- a/public/emoji/monero.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/emoji/python.svg b/public/emoji/python.svg deleted file mode 100644 index a16973b..0000000 --- a/public/emoji/python.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/emoji/raspberry-pi.svg b/public/emoji/raspberry-pi.svg deleted file mode 100644 index cad8033..0000000 --- a/public/emoji/raspberry-pi.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/emoji/rust.svg b/public/emoji/rust.svg deleted file mode 100644 index bf42fbc..0000000 --- a/public/emoji/rust.svg +++ /dev/null @@ -1,43 +0,0 @@ - -Rust programming language logoimage/svg+xml diff --git a/public/emoji/taskwarrior.png b/public/emoji/taskwarrior.png deleted file mode 100644 index 7a745b8..0000000 Binary files a/public/emoji/taskwarrior.png and /dev/null differ diff --git a/public/emoji/telegram.svg b/public/emoji/telegram.svg deleted file mode 100644 index 080818f..0000000 --- a/public/emoji/telegram.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/eug-vs.png b/public/eug-vs.png deleted file mode 100644 index f853fed..0000000 Binary files a/public/eug-vs.png and /dev/null differ diff --git a/public/fonts/Bitter-Regular.woff b/public/fonts/Bitter-Regular.woff deleted file mode 100644 index 8060e0a..0000000 Binary files a/public/fonts/Bitter-Regular.woff and /dev/null differ diff --git a/public/git-remote-meme.png b/public/git-remote-meme.png deleted file mode 100644 index 1613d8c..0000000 Binary files a/public/git-remote-meme.png and /dev/null differ diff --git a/public/icon-64.png b/public/icon-64.png deleted file mode 100644 index 2e4a66f..0000000 Binary files a/public/icon-64.png and /dev/null differ diff --git a/public/meat.png b/public/meat.png deleted file mode 100755 index edca1d8..0000000 Binary files a/public/meat.png and /dev/null differ diff --git a/public/monero-qr.png b/public/monero-qr.png deleted file mode 100644 index 3d50bf5..0000000 Binary files a/public/monero-qr.png and /dev/null differ diff --git a/public/pan.png b/public/pan.png deleted file mode 100755 index 905305e..0000000 Binary files a/public/pan.png and /dev/null differ diff --git a/public/pepe-smug.png b/public/pepe-smug.png deleted file mode 100644 index 0cfa035..0000000 Binary files a/public/pepe-smug.png and /dev/null differ diff --git a/public/stickerpicker.png b/public/stickerpicker.png deleted file mode 100644 index a8ebcd8..0000000 Binary files a/public/stickerpicker.png and /dev/null differ diff --git a/public/summer-2021/bonfire.jpg b/public/summer-2021/bonfire.jpg deleted file mode 100644 index 1f06cdb..0000000 Binary files a/public/summer-2021/bonfire.jpg and /dev/null differ diff --git a/public/summer-2021/burndown.png b/public/summer-2021/burndown.png deleted file mode 100644 index bbea2fb..0000000 Binary files a/public/summer-2021/burndown.png and /dev/null differ diff --git a/public/summer-2021/kayaking.jpg b/public/summer-2021/kayaking.jpg deleted file mode 100644 index 309354f..0000000 Binary files a/public/summer-2021/kayaking.jpg and /dev/null differ diff --git a/public/wojak-brainchair.png b/public/wojak-brainchair.png deleted file mode 100644 index 39ffa32..0000000 Binary files a/public/wojak-brainchair.png and /dev/null differ diff --git a/src/blog/2021-07-02.md b/src/blog/2021-07-02.md new file mode 100644 index 0000000..48ef972 --- /dev/null +++ b/src/blog/2021-07-02.md @@ -0,0 +1,17 @@ +# My plans for this website +Welcome to [eug-vs.xyz](https://eug-vs.xyz)! This is my personal website where I plan to set up a bunch of cool things, namely: + - SearX instance + - Email server (*already up and running!*) + - [TaskWarrior](https://taskwarrior.org) server + - This blog + - Knowledge base + +I decided that I will write content for this website in `Markdown`, since it's the way of writing I am already so used to. +I use [vimwiki](https://github.com/vimwiki/vimwiki) for writing and then I just pipe my `.md` files into `pandoc` which gives me nice static web pages. No bullshit, ads, trackers or client-side JavaScript here. + +# Structure +Vimwiki provides a very good notes structure out of the box: you have your **main wiki** and **diary**: + - **Main wiki** will be represented as a knowledge base, where I'll put things that I consider important and worth being indexed + - **Diary** will form this blog - where I'll put everything that does not fit into the main wiki but still worth sharing + +This way I can keep my writing workflow the same, I don't have to switch to the new patterns or anything else. diff --git a/src/blog/2021-07-03.md b/src/blog/2021-07-03.md new file mode 100644 index 0000000..7b97329 --- /dev/null +++ b/src/blog/2021-07-03.md @@ -0,0 +1,98 @@ +# What's wrong with Numerology +Numerology is a strange thing you may encounter at some point in your life. While you can believe into anything, it's of course +important to not take it too serious as some people do. You should be able to detect if something completely random is trying to mimic the science. + +

+ +

+ +# Background +Lately I've been on the party where I met a girl who was making money by doing numerologic predictions for people. I've never had a chance +to have a conversation with such people, and I was very excited when I finally got it. One of the first questions I asked was a sanity check: "*you know that you are tricking people, right?*" + +She seemed pretty intelligent to me and I thought that it's just a way to make money for her - it's of course bad to trick people +into such things, but well, we are not judging here. + +Surprisingly, she turned out to be **strong** believer and she really thought that she's making world a +better place by doing this. +I thought, well, maybe she's right, let's find out! We had a long conversation, let's jump straight into key points. I will express some parts of our dialogue as shortened Q&A's. + +# Do numbers matter? +Basically as she explained, they convert everything into numbers in numerology (pretty much like we do in programming). I have no problem with, for example, converting +my name into some number and than working with it. So, according to this theory, numbers have special meaning. + - Is it the number that matters, or the digits it consists of? + - The number itself + +This absolutely makes sense - since we can have an infinite amount of numeral systems. E.g 11 is eleven in base 10, but at the same time these digits can express number three in binary (base 2). + +So, ultimately this theory must be a subset of [determinism](https://en.wikipedia.org/wiki/Determinism) - numbers affect our life in a specific way - they produce more numbers and the cycle continues. +She agreed with that, and since there's no way to prove this deterministic aspect - I'm ok with that. If we know we can't prove it - you can only believe it (or not). Who knows, maybe numbers really have +special meaning. But the problem isn't here... + + +# Which numbers matter? +Everything above is perfectly valid, but the question naturally arises: + - How do we choose, which numbers matter? + - There are special numbers in your life! E.g your name/surname/etc, your birthday, your [*try not to laugh*] **passport number**! The time of specific events also matters. + +

+ +

+ +As soon as I heard that, I was 100% sure it's a total bullshit, but how do I prove it? I've started with simple things. + - What if I change my name? + - Your destiny changes along with it! + - Ok, what if I don't have a name? What if I live in the woods and don't know what the passport is? + - In this case only date of your birth matters! + +Ok, first of all, she seems to not understand that passport is a thing that only exists in a specific context: civilized society, jurisdiction, ability to print - just to name a few. + - There were no passports back then, did people not have destiny? + - But they had names! + - Well, let's go back to cavemen - they didn't have names. So... Numerology didn't work in those times, did it? + - It does not matter! If no one could speak or even had a name - they didn't care about numerology so it could not work. But it works now! Or there was a different Numerology... + + This last argument is pretty interesting. The problem is - well, if your science (or any set of laws) works - it works every time. If you have **Numerology v1** for ancient people and + **Numerology v2** for a modern society - it's not a one science - it's two! + +# A "proof" + Here's somewhat formal proof that such form of Numerology can't exist: + - We'll define Numerology as a *mapping* which maps the space of **numbers in your life** into the space of **possible outcomes** + - Assume there only exists one valid Numerology. If there are more valid "Numerologies" - it means we can choose any of those as we need and make up any result. + - Assume we can only account for finite amount of **numbers in our life**. If it's not true, such Numerology is useless - we can't make any predictions if the amount of factors is infinite! + - Consider some point in one's life. It can be described with the finite amount of **N numbers** - e.g current time, current passport name, amount of money in bank account, etc. + - Let's go back in time to the point where this person had no bank account - it means now there are only **N-1** meaningful factors + - Go back further to the point where the person didn't have a passport (maybe he was just born). It's **N-2** now + - We can keep decreasing N as much as we want, all the way to 0. Even the most "abstract" concepts, such as time, were invented by humans and we can go back where they didn't know how to measure time, it means there were no origin (or no one has defined it). As a number, time only exists as an interval - from `START` to `END`. If there's no single `START` - we can take any point and choose arbitrary number! One can argue that we can take *BIG BANG* as a `START`. But well, in this case, what unit do we use to measure time? Do we use seconds, minutes or what? + - We have now **N** different valid versions of Numerology! It contradicts with our assumption that there's only one valid Numerology. + +The "proof" above is of course not 100% correctly formulated, but hopefully you get the idea and reasoning behind it. The better and shorter version might be: + +*For any given outcome `S` for the person `P`, there exists a "version" of Numerology `V` that picks a finite amount of specific factors for that person, such that `V(P) = S`* + +It basically means that since we have infinitely many factors to measure in our life (and we can make up infinitely many measuring units) - we can generate any sequence of numbers to **make up** specific result. Of course, we can not make any predictions based on that - this is a complete bullshit. This is also backed up by the fact that there's no single "repository" or "sourse of truth" for Numerology. Everyone just comes up with their own version! Even if there is some hidden secret knowledge base it's also totally made up and as invalid as any other. + +# Why she thinks she's right + - How do you know which parameters to account? + - It's **statistics** and **high-level maths!** [*Here she started explaining me how they accumulated huge amount of data and analyzed that etc. etc.*] + +Yes, she may understands the **math** that transforms the numbers into results. The problem is - math is only doing the mapping! If the source of mapping is incorrect, the result can't be correct too! Information follows this path: + 1. Reality + 2. Numerology picks [arbitrary] N factors + 3. Super-advanced math functions + 4. Resulting prediction + +She knows that step 3 and 4 work, but what she doesn't understand is that step 2 can give arbitrary results! Therefore steps 3 and 4 do not matter as they act on the results of step 2. This is exactly what **misleads** people and makes them trust the system! They are so focused on verifying steps 3 and 4, they completely forget about step 2! + +# Few words about statistics +They may gather as much data as they want. There's such thing as the [Law of large numbers](https://en.wikipedia.org/wiki/Law_of_large_numbers). It's usually enough to debunk any sort of fraudelent predictors - and this is not the exception. + +# PS +These guys always sound so convincing because usually they believe the theory themselves. Always make sure to perform a "sanity check" on such things. Some of them require deeper thoughts, but usually you can "smell" the trickstery (or foolishness) right away. A *common sense* is all that you need in order to avoid getting tricked by them. + +

+ +

+ +Fun fact: **almost all** numbers are *normal* yet *uncomputable* - in practice it means we can't even write them down! If you, for example, measure something (except for counting instances of objects) in real world with a fixed unit of measurement - it's almost never going to be rational number. Do you think every single one of those uncountably infinitely many numbers has its own "special meaning"? See [this video](https://www.youtube.com/watch?v=5TkIe60y2GI) for detailed explanation. There are of course more inconsistencies to it that I missed. + + diff --git a/src/blog/2021-07-15.md b/src/blog/2021-07-15.md new file mode 100644 index 0000000..2ea0bd5 --- /dev/null +++ b/src/blog/2021-07-15.md @@ -0,0 +1,141 @@ +# CircleCI :circleci: in daily life: how I improved Matrix stickerpicker + +[CircleCI](https://circleci.com) is a great tool that everyone seems to skip and I don't know exactly why. +I'm gonna quickly show you how I've automated adding stickers to the [Matrix](https://matrix.org) messenger. + +## What is CircleCI? +`CircleCI` is a cloud platform that can run automated jobs when different events occur. The most common use-case is +running tests in the cloud when you push a commit to the `GitHub` repo. But the possibilities are endless, +you can literally automate everything with it - I even used it to compile `.exe` file **in the cloud** and include +a **zipped binary** into the release package. Don't ask me why I had to compile `.exe`, better ask why the guys from my +University **made a deal with** [**the Devil**](https://microsoft.com). + +## Matrix +[Matrix](https://matrix.org) is a messaging protocol which I'm currently trying to replace **Telegram** with. +It's in itself a separate topic for discussion, but what's important for today is that **Matrix** lacks such +a huge collection of stickers as there is in **Telegram**. I'm a big fan of **Wojak** stickers and many other ones, +so I had to do something about it. + +![stickerpicker](/public/stickerpicker.png) + +# Matrix Stickerpicker +Stickers work in a slightly weird way in **Matrix**. Basically you have to deploy your own sticker "server" +(*don't worry, it's just a static site*) where you can add your stickers - it will be used as a widget inside your client. + +There's an amazing tool for that - [stickerpicker](https://github.com/maunium/stickerpicker). It's written in `Python` and the author +of course took care of the import feature - you can provide a link to a **Telegram** sticker pack - it will re-upload it +to your `Matrix` server and then generate a web UI using GitHub Pages that you can integrate as a widget in your client. Your friends +can use it too. + +The problem is that each time you want to add new sticker pack to your collection you have to run a `Python` script. +I'm lazy and I don't wanna do that - so let's automate it! + +## Automation +Main idea of my solution is to have a single plaintext file `telegram-packs.txt` which will contain links to all +sticker packs I import from **Telegram**. Then every time I update it `CircleCI` will run a job that will run this `Python` script for me. Deadly simple. + +This approach ships with few bonuses by default: + - You can edit the file from anywhere (even from phone :laughing:) + - If someone from your friends uses your stickers collection and wants to add a new pack, they simply have to open a PR which adds the pack URL to `telegram-packs.txt`. + +There are two problems of running this `Python` script automatically: + - You have to log into your `Matrix` account + - You have to log into your `Telegram` account + +## Config +Here's my fork of the repo: https://github.com/eug-vs/stickerpicker + +`CircleCI` is fully controlled by a config file `.circleci/config.yml`. It uses `YAML` which is really picky about indentation, so be careful with that. + +Ok so let's start outlining our job, we'll be using default CircleCI `Python` image: +```YAML +defaults: &defaults + working_directory: ~/repo + docker: + - image: cimg/python:3.9.5 + +jobs: + upload_stickers: + <<: *defaults + steps: +``` + +The `defaults` part might look scary, but you could just move everything from defaults directly under `upload_stickers` job. +Defaults are useful when you have multiple jobs, and I planned to have 2 initially. Let's now move to the `steps`: +```YAML +- checkout + +- run: + name: Install python dependencies + command: pip3 install . +``` +Obviously we checkout our code first, and then install all the dependencies for our `Python` script. + +Now let's solve the first problem we found. Instead of logging into `Matrix` manually, you can supply a `config.json` file with your credentials. So I prepared a template for this file (`config.template.json`): +```JSON +{"homeserver": "$HOMESERVER", "user_id": "$USER_ID", "access_token": "$ACCESS_TOKEN"} +``` +You might think how am I gonna put the actual variables in here? Well, there's a tool for that called `envsubst`. It does exactly what you think - substitutes environment variable names with the actual values. +We will put the actual values of `$HOMESERVER`, `$USER_ID` and `$ACCESS_TOKEN` in our `CircleCI` environment (as secrets), and the template can be safely pushed to the GitHub repo. + +There's a little problem - `envsubst` is not installed in the image that we use (`cimg/python:3.9.5`). Solution to it is [orbs](https://circleci.com/developer/orbs) - basically plugins for your CircleCI needs. +Let's add `envsubst` orb at the top of our config: +```YAML +orbs: + envsubst: sawadashota/envsubst@1.1.0 +``` + +Now back to the steps. Let's install the tool and use it to generate our `config.json`: +```YAML +- envsubst/install + +- run: + name: Create config.json from template + command: envsubst < config.template.json > config.json +``` + +Ok so we can now login into `Matrix`, but what about `Telegram`? The script uses `Telethon` package under the hood which works with a `sticker-import.session` file. This is basically an `SQL` database, and I don't really +wanna mess around with creating it from scratch (*although I could!*). Instead, I will just encrypt it with `GPG` and push to the repo. That's just me being lazy, but you know, that is what automation is about! +Of course, someone could try to decrypt my `Telethon` session since it's now publicly available, but I can just revoke it at any time. I will probably improve this at some point, but now it's not a big deal for me. + +Our next steps in config will be to decrypt the session and finally pipe our `telegram-packs.txt` to the script using `xargs`: +```YAML +- run: + name: Decrypt telethon session + command: gpg --batch --passphrase $PASSPHRASE --decrypt sticker-import.session.gpg > sticker-import.session + +- run: + name: Reupload and install stickers + command: cat telegram-packs.txt | xargs sticker-import +``` + +At this point, the stickers are uploaded to the server, but the UI is updated via it's own `.json` file which contains information about uploaded stickers. It's already updated by the script, we just have to push it to our repo. +For that I've created a new SSH key and added it to `CircleCI` secrets so that it can push commits to my repository. So the final steps would be: +```YAML +- add_ssh_keys + +- run: + name: Add github to known_hosts + command: | + mkdir -p ~/.ssh + ssh-keyscan github.com >> ~/.ssh/known_hosts +- run: + name: Commit stickerpack JSON's + command: | + git config --global user.email "eug-vs@keemail.me" + git config --global user.name "eug-vs" + git add . + git commit -m "feat: add stickerpacks with CircleCI [ci [skip](skip.md)]" + git push -u +``` + +The `[ci skip]` flag tells Circle to avoid running on this commit, otherwise it would have to run once again since we pushed a new commit with it. + +One thing that I didn't mention is that I did not actually +need to check the **new** packs in the `telegram-packs.txt` - the script is actually smart enough to skip already existing ones. Otherwise I would have to use `git diff` to find only the new ones. + +And that's it! Now every time I add new URLs to the `telegram-packs.txt`, they will automatically appear in my widget within a minute or so. Enjoy your stickers! + +![wojak-brain-chair](/public/wojak-brainchair.png) + +You can find full version of the config here: https://github.com/eug-vs/stickerpicker/blob/master/.circleci/config.yml diff --git a/src/blog/2021-08-14.md b/src/blog/2021-08-14.md new file mode 100644 index 0000000..e98d78f --- /dev/null +++ b/src/blog/2021-08-14.md @@ -0,0 +1,80 @@ +# Using imagemagick :imagemagick: to crop soy faces +I'm pretty sure everyone knows that sometimes finding a good **PNG** can be very hard, while there's always a bunch of the same **JPEG** images with the white background. +After searching for 10 minutes, you decide to remove background yourself - using [GIMP](https://gimp.org) or something like `Photoshop` or `PAINT.NET` if you are on Windows. **Forget about it!** I'm gonna show you how you can use [imagemagick](https://imagemagick.org/) to automate basic tasks like removing background and cropping images. + +# Telegram sticker pack +Every time I use Telegram stickers, I feel tired scrolling through many different packs trying to find the sticker I want. Sometimes, you just want them all to be in one place. That's why I created **Based Wojak** - a sticker pack which is automatically generated from random source images that I find on the internet. + +![based-wojak](https://user-images.githubusercontent.com/51545008/129426994-2a787714-772d-4010-b295-6ae00346bdbc.png) + +It doesn't matter if the image has a white background or wrong resolution, I just put it in the `src` folder and then magic :imagemagick: happens. For example, these are the source images used to generate the stickers above: + +![based-wojak-sources](https://user-images.githubusercontent.com/51545008/129427152-e01bc830-06e4-441a-9d8c-3dccbfb4d025.png) + +The collection itself is very small right now as you can see, but I plan to extend it as I need more stickers. Add this pack: + +https://t.me/addstickers/BasedWojak + + +# Imagemagick +Now, let's see how I've done that. Here's the GitHub :github: repo so you can follow: + +https://github.com/eug-vs/telegram-based-wojak + +You know, I love Makefiles. I use them everywhere (where they're appropriate), even this website is generated by a `Makefile`. Let's have a look at the `Makefile` for `telegram-based-wojak`: + +```Makefile +# Makefile +SOURCES=$(wildcard src/*) +OUTPUTS=$(patsubst src/%.png, out/%.png, $(patsubst src/%.jpg, out/%.png, $(SOURCES))) + +SIZE=512x512 +FUZZ=50% + +VIEW_COMMAND=sxiv -t + + +all: $(OUTPUTS) + +view: all + $(VIEW_COMMAND) out + +viewsrc: + $(VIEW_COMMAND) src + +out/%.png: src/%.* + @mkdir -p out + magick $< \ + -fuzz $(FUZZ) -fill none \ + -floodfill +0+0 white \ + -floodfill "+%[fx:w-1]+0" white \ + -trim +repage \ + -resize $(SIZE) $@ + +clean: + rm -rf out +``` + +On the first two lines I just create variables for input and output images. Then I define the `SIZE` - Telegram expects sticker's largest side to be `512px`. The value of `FUZZ` determines the sensitivity of removing the background - I use `50%`, but that's just something you can play with. + +Now let's have a closer look at the recipe for creating `out/%.png` from `src/%.*`. I use `magick` on the input file (denoted by `$<`), then pass a whole bunch of parameters to it, and finally provide the output file (`$@`). If you are confused by `$<` and `$@`, check out [Makefile cheatsheet](https://devhints.io/makefile). + +![imagemagick-logo](/public/emoji/imagemagick.png) + + +## Removing the background +To remove background, I use `-floodfill`, here's how [imagemagick wiki](https://imagemagick.org/script/command-line-options.php) describes it: +> -floodfill {+-}x{+-}y color +> +> Floodfill the image with color at the specified offset. +> +> Flood fill starts from the given 'seed point' which is not gravity affected. Any color that matches within -fuzz color distance of the given color argument, connected to that 'seed point' will be replaced with the current -fill color. + +I use it two times: one in the top-left corner and one in the top-right. Top-left corner pixel obviously has a coordinate `+0+0`. To get the X coordinate of right-most pixel I have to use this expression: `+%[fx:w-1]`, Y coordinate stays at `0` of course. Since I already supplied `-fuzz` and `-fill none`, both operations will replace the white background with `none`, starting from two top corners of the image using the supplied fuzziness value. + +## Cropping the image +After we removed background, most of the time we can trim a lot of extra space so that our image size corresponds to its content. Simple `-trim +repage` does the trick. + +## Adjusting the size +All we have to do now is to make sure the sticker respects the size with `-resize` option. It will resize it in a way so it fits into `512x512` box without changing the aspect ratio (largest side will always be `512px`). + diff --git a/src/blog/2021-08-18.md b/src/blog/2021-08-18.md new file mode 100644 index 0000000..f048106 --- /dev/null +++ b/src/blog/2021-08-18.md @@ -0,0 +1,81 @@ +# Python :python: in real life +Recently I had a chance to solve an accounting problem. And as always, Python saved me some time and nerve cells. + +## The problem +In accounting you sum things up a lot. And sometimes, you forget what were the terms you used to compute the sum, especially when there are a lot of them. This is exactly the scenario I faced recently: + - There's a price list for certain items + - There's a total sum that was made up from **some** of these prices + - You have to find out what prices were used to calculate total sum + +And this problem appears many times, same price list but different totals. I immediately knew I am not gonna do this manually, so first thing I did was creating a new script and writing my first two lines with the input data: +```python +prices = [561.6, 134.24, 561.6, 345.6, 2292, 22.08, 61.2, 87.41, 37.08, 37.8, 25.44, 246] +totals = [271.01, 1078.61, 3333.44] +``` + +## Thinking +Now, let's analyze the problem a bit. There are **12** prices in the list. Let's suppose our total was made up from 2 prices. It could be any 2 numbers from the list, in fact there are a lot of possible pairs. To be precise, there are **66** of them! Luckily Python has an amazing package `itertools` which allows you to work with combinatorics. We can now list all these pairs: + +```python +from itertools import combinations + + +prices = [561.6, 134.24, 561.6, 345.6, 2292, 22.08, 61.2, 87.41, 37.08, 37.8, 25.44, 246] +pairs = list(combinations(prices, 2)) +print(pairs) +``` + +Output: +```python +[(561.6, 134.24), (561.6, 561.6), (561.6, 345.6), (561.6, 2292), (561.6, 22.08), (561.6, 61.2), (561.6, 87.41), (561.6, 37.08), (561.6, 37.8), (561.6, 25.44), (561.6, 246), (134.24, 561.6), (134.24, 345.6), (134.24, 2292), (134.24, 22.08), (134.24, 61.2), (134.24, 87.41), (134.24, 37.08), (134.24, 37.8), (134.24, 25.44), (134.24, 246), (561.6, 345.6), (561.6, 2292), (561.6, 22.08), (561.6, 61.2), (561.6, 87.41), (561.6, 37.08), (561.6, 37.8), (561.6, 25.44), (561.6, 246), (345.6, 2292), (345.6, 22.08), (345.6, 61.2), (345.6, 87.41), (345.6, 37.08), (345.6, 37.8), (345.6, 25.44), (345.6, 246), (2292, 22.08), (2292, 61.2), (2292, 87.41), (2292, 37.08), (2292, 37.8), (2292, 25.44), (2292, 246), (22.08, 61.2), (22.08, 87.41), (22.08, 37.08), (22.08, 37.8), (22.08, 25.44), (22.08, 246), (61.2, 87.41), (61.2, 37.08), (61.2, 37.8), (61.2, 25.44), (61.2, 246), (87.41, 37.08), (87.41, 37.8), (87.41, 25.44), (87.41, 246), (37.08, 37.8), (37.08, 25.44), (37.08, 246), (37.8, 25.44), (37.8, 246), (25.44, 246)] +``` + +Here we converted the result of `combinations(prices, 2)` to a `list`, but that's actually only to be able to `print` it. In fact, the original result was a [generator](https://wiki.python.org/moin/Generators) - it wasn't storing the whole list in memory, only the instructions how you should iterate over it. And that's exactly what we want to do - iterate over this list, taking the sum and see if it matches the result, something like this: + +```python +for prices_combination in combinations(prices, 2): + if sum(prices_combination) == total: + return prices_combination +``` + +# The solution +Of course, our `total` doesn't have to be a sum of 2 terms, it can be 3, 4, 5 or more. Also, `total` might not exactly equal the sum, there can be a slight difference due to rounding or human error. Let's say this difference is no more than `0.01`. This will be the final solution: +```python +#!/usr/bin/python +from itertools import combinations + + +prices = [561.6, 134.24, 561.6, 345.6, 2292, 22.08, 61.2, 87.41, 37.08, 37.8, 25.44, 246] +totals = [271.01, 1078.61, 3333.44] + +def decompose(total, terms): + for count in range(1, len(terms)): + for combination in combinations(terms, count): + if abs(total - sum(combination)) < 0.01: + return combination + +for total in totals: + combination = decompose(total, prices) + print(f'{total} = sum{combination}') +``` + +Which will produce a nice output in less then **0.03** seconds: +```python +271.01 = sum(22.08, 61.2, 87.41, 37.08, 37.8, 25.44) +1078.61 = sum(561.6, 22.08, 61.2, 87.41, 37.08, 37.8, 25.44, 246) +3333.44 = sum(561.6, 134.24, 345.6, 2292) +``` + +Notice that the only list stored in memory was the original one. Each combination only appeared in memory when it was needed to calculate the sum, and immediately disappeared after that. That's why it's (relatively) fast! + +# Takeaway +Of course this script isn't by any means optimal! Essentially it's a brute force, we are just checking all the possible combinations. But we are doing it in a **clean and efficient way** (credit to generators). + +When you are solving real-life problems, you are not in algorithms class and you don't have to write a hardcore algo, you just have to correctly utilize amazing toolkit that this language has. I've spend no more than 5 minutes writing this and I already have the answer to my problem - that's the beauty of Python :python:! + +## Now imagine writing and compiling a C++ program for that! +I can only describe it with this image: + +![meme](/public/brainlet-dreams-big-brain.png) + +Programming languages are tools, and different situations require different tools. diff --git a/src/blog/2021-09-10.md b/src/blog/2021-09-10.md new file mode 100644 index 0000000..de1d7a0 --- /dev/null +++ b/src/blog/2021-09-10.md @@ -0,0 +1,22 @@ +# Summer 2021 - retrospective +This summer was one of the greatest I ever had! + +# Achievements +During this summer I have: + - [X] Set up a Raspberry Pi :raspberry-pi: + - [X] Created this website + - [X] Configured personal email server + - [X] Configured personal TaskWarrior server :taskwarrior: + - [X] Passed some university exams + +# Productivity +Here's my TaskWarrior burndown: +![burndown](/public/summer-2021/burndown.png) +I'm pretty happy with how it looks, definitely can spot some progress going on. + +# Lifestyle +It was very active! I got into kayaking which was unforgettable :fire:, big thanks to my friends! + +![bonfire](/public/summer-2021/bonfire.jpg) + +![kayaking](/public/summer-2021/kayaking.jpg) diff --git a/src/blog/2021-09-21.md b/src/blog/2021-09-21.md new file mode 100644 index 0000000..d3a5f8f --- /dev/null +++ b/src/blog/2021-09-21.md @@ -0,0 +1,24 @@ +# I'm back on Carnivore! :meat_on_bone: +This weekend I bought a new high-quality pan and now I just can't resist going back to carnivore diet. + +![pan](/public/pan.png) + +You really see the difference in the cooking process - the surface is big, heat is distributed evenly, it produces less smoke - it all adds up to a much better cooking experience :fire: + +![meat](/public/meat.png) + +I've been thinking of going back to carnivore for a long time already, but this pan finally pushed me to do it. I'm not going **full carnivore** though, this is the list of the food I'm planning to eat: + - All sorts of meat :meat_on_bone: + - Liver (~1-2 times a week) + - Fish (~once a week) :fish: + - Eggs :egg: + - Coffee :coffee: + - Diary: + - Cheese :cheese: + - Cottage cheese + - Butter :butter: + - Sour-cream + - Bananas :banana: + - Lemon :lemon: + +This is of course not a perfect list, ideally I would remove bananas and diary from here, but I'll start with this because I already used it for ~3 months before. I find lemon really important to support the levels of vitamin C. But that's what works for me, it might now work for you of course. diff --git a/src/blog/2021-10-06.md b/src/blog/2021-10-06.md new file mode 100644 index 0000000..4611853 --- /dev/null +++ b/src/blog/2021-10-06.md @@ -0,0 +1,17 @@ +# You should start using `ssh-copy-id` now! +Over the last couple of weeks I had to simultaneously manage up to 4 virtual machines in the Cloud. Holy shit, I've lost so much time just trying to log into them - picking up the correct server IP, then finding the password for it, and then finally `ssh`-ing into it. That's such a painful process, especially when you have to repeat it over and over again. + +Luckily, there's a solution! Simply run `ssh-copy-id username@password` (the same way you would do with `ssh`, just replacing it by `ssh-copy-id`), enter your password and it will remember it. Of course you gotta have your keys set up, but I think everyone has. + +Well, as a bonus, to not mess with the IPs, you can also use `~/.ssh/config` like that: +```bash +Host + HostName + User +``` +You might guess what it's doing: running `ssh ` will now expand to `ssh @`! + +Of course you can add as much hosts as you want to your config. Combined with `ssh-copy-id`, you get a perfect solution for managing multiple web servers. + +## PS +If you are familiar with `tmux`, I highly recommend installing it right away on your server, and doing everything in a session. Even simple `tmux new` / `tmux a` will make your life even more easy! diff --git a/src/blog/2021-10-27.md b/src/blog/2021-10-27.md new file mode 100644 index 0000000..06b9a0d --- /dev/null +++ b/src/blog/2021-10-27.md @@ -0,0 +1,34 @@ +# Ray marching in Rust :rust: ! +I'm currently learning Rust for fun and re-writing my [ascii-renderer](https://github.com/eug-vs/ascii-3d-renderer) from Python :python:. I'm using Ray Marching this time, here's how it looks (if you are on mobile, use desktop version of the site): + +[![asciicast](https://asciinema.org/a/jsDqGeMkRwLeYhVIMqNbaec0M.svg)](https://asciinema.org/a/jsDqGeMkRwLeYhVIMqNbaec0M) + +You can see that Ray Marching allows for some cool stuff like smooth surface blending and proper shadowing. + +# Ray marching +Usually 3d renderers use a triangular mesh to describe objects in a scene. In Python version of `ascii-renderer` I defined each object as a set of points +(i.e object is defined by a function `__contains__` that determines whether the given point is in this object). It allowed me for some cool Ray Tracing stuff, but that was just me toying around. + +Behold - Ray Marching! It's a cool rendering technique where you describe your scene with a *Distance Field* - each point in this field contains a distance from that point to the scene. +Well, actually it's a *Signed Distance Field* - the distance to the object is considered negative *inside* the object, and positive *outside*. + +What's cool about Ray Marching is that since the whole scene is defined with mathematical expression, I can apply any mathematical transformations to it. For example I can make an object wavy +using a `sin`, or make it repeat forever with `%` operator. Also, `SDF` allows for different ways to combine objects - I can find a `union`, `difference`, and `intersection` for free! + + + +## Performance +Currently it's rendering 4 shapes at ~19 FPS, which is pretty bad. That's probably due to my dirty and inefficient code :laughing: - I'm nowhere near a good understanding of Rust :rust: patterns. + +My goal is to render 8 shapes at 24 FPS: + - 24 FPS is OK for a human eye + - 8 distinct shapes is usually enough to create a complex scene (ray marching allows for cool tricks that can multiply amount of your shapes without performance decrease) + + +# Plans + - Cleanup the code and increase performance + - Build an actually usable API + - Use `ncurses` instead of just printing to `STDOUT` + - Create an `ncurses` GUI for building a scene + - Allow importing/exporting scenes in `JSON` + - Do some magic :star: and expose API to the browser using `WebAssembly` diff --git a/src/blog/2021-10-28.md b/src/blog/2021-10-28.md new file mode 100644 index 0000000..aece45f --- /dev/null +++ b/src/blog/2021-10-28.md @@ -0,0 +1,11 @@ +# Pistol :gun: - yet another ASCII renderer +In [previous blog post](./2021-10-27) I've shown you my beginnings with Rust :rust: - today I wanna share some progress! +The project is now officially called **Pistol** :gun: + +## Showcase +Thanks to `NCurses` it supports camera navigation using `VIM`-keys. Here's how it looks: + +[![asciicast](https://asciinema.org/a/Wo3mWNQUTYAeZkAYob2gKzv4h.svg)](https://asciinema.org/a/Wo3mWNQUTYAeZkAYob2gKzv4h) + +# Source code +Project source is now available [on GitHub](https://github.com/eug-vs/pistol) :github: diff --git a/src/blog/2022-02-26.md b/src/blog/2022-02-26.md new file mode 100644 index 0000000..bd759f2 --- /dev/null +++ b/src/blog/2022-02-26.md @@ -0,0 +1,5 @@ +# Слава Україні! :ukraine: + +Russian government is doing terrible things to Ukraine. No excuse. + +Russian citizens, do not fall for propaganda! diff --git a/src/blog/2022-03-17.md b/src/blog/2022-03-17.md new file mode 100644 index 0000000..59d9e71 --- /dev/null +++ b/src/blog/2022-03-17.md @@ -0,0 +1,14 @@ +# Жыве Беларусь! :belarus: + +Belarus citizens meet a lot of hatred outside the country. But are not the same as our government! + + +## Current situation +Most people in Belarus are against the regime. Actual support of Lukashenko in 2020 was ~3%. + +Elections were stolen! Our freedom is stolen! People were fighting against it, but [the protests were brutally stopped by a bloody regime](https://en.wikipedia.org/wiki/2020%E2%80%932021_Belarusian_protests). + +## Goergia :georgia: +And here I am, writing this from T'bilisi, Georgia :georgia: , **forced** to leave my country. + +Belarussian government supports Russia's war. But no citizen in Belarus does, and no one wants to fight against our brothers in Ukraine :ukraine:, myself included. If you are Georgian, please think about it when blaming random people on the streets. diff --git a/src/blog/2022-03-24.md b/src/blog/2022-03-24.md new file mode 100644 index 0000000..7359978 --- /dev/null +++ b/src/blog/2022-03-24.md @@ -0,0 +1,14 @@ +# Here comes my git server :fire: +I've mirrored all of my important projects from GitHub :github: (along with some unpublished ones) to my personal git server: https://git.eug-vs.xyz + +It includes: + - My [dotfiles](https://git.eug-vs.xyz/eug-vs/dotfiles/) + - My builds of [suckless sotftware](https://suckless.org) + - [Source code](https://git.eug-vs.xyz/eug-vs/eug-vs-xyz/) for this website + - My [homelab infrastructure](https://git.eug-vs.xyz/eug-vs/infrastructure/) (subject for the upcoming blog post) + - And [more](https://git.eug-vs.xyz)... + +![git remote meme](/public/git-remote-meme.png) + +I'm using [cgit](https://git.zx2c4.com/cgit/) as a web fronted to it. There still is some misconfiguration here and there, but it works. Check it out! + diff --git a/src/blog/2022-03-26.md b/src/blog/2022-03-26.md new file mode 100644 index 0000000..1bc09b2 --- /dev/null +++ b/src/blog/2022-03-26.md @@ -0,0 +1,62 @@ +# Agent-less infrastructure management with Ansible :ansible: +As I explore new things and grow my homelab :raspberry-pi: infrastructure things start to get a little messy. I've reached the point where I should start using more advanced deployment strategy than just manually setting up servers via SSH or `rsync`-ing a bunch of files into them. The goal is to reach [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code). + +# But what about Docker? :whale: +[Docker](https://www.docker.com/) is an amazing tool that solves particularly nasty problem - isolating your application from environment and **reliably** running it on any platform. You just pack your application into the container and ship it anywhere you want! It makes your app **scalable**! + +I use Docker on my daily job and I can't imagine it otherwise. But here, in my tiny homelab (which is just one RaspberryPI :raspberry-pi: at this point), this is not world-class production problems, so it might be an overkill. + +Docker requires your servers to run a *daemon* - e.g extra software layer (and it's dependencies) between your applications and the metal. It will run in the background and make your fan work a bit louder :helicopter: in the upcoming summer nights to compensate for those extra couple degrees. + +![meme](/public/docker-on-rpi.jpg) + +# Introducting Ansible :ansible: +[Here it comes](https://ansible.com) - **agent-less** deployment tool that doesn't require your server to run anymore bullshit than good old Python :python: and open SSH port. + +In Ansible you define so called playbooks - `YAML` specs of your tasks. Then you just feed the `YAML` to `ansible-playbook` and voila! It's already SSHing into your machines and doing your job now! + +Ansible is not the tool you should learn, it's so simple that you can use it right away! + +# Examples from my infrastructure :raspberry-pi: +Ansible has a bunch of built-in convenience commands that make your life even more enjoyable. + +![meme](/public/pepe-smug.png) + +This is how easy it is to setup a cron-job: +```YAML + - name: Setup auto-renewing certificates + become: true + cron: + name: "Auto-renew certificates" + minute: "0" + hour: "12" + job: "/usr/bin/certbot renew --quiet" +``` + +Transferring files: +```YAML + - name: Copy nginx configuration + become: true + copy: + src: ./files/nginx/website + dest: /etc/nginx/sites-available +``` + +Installing packages: +```YAML + - name: Install build tools + apt: + pkg: + - gcc + - make + - cmake + - gnutls-dev + - uuid-dev +``` + +...and many many more. Check out source code of my playbooks here: + - https://git.eug-vs.xyz/eug-vs/infrastructure/ + +The notable ones are: + - Installing [taskd](https://git.eug-vs.xyz/eug-vs/infrastructure/tree/taskd.yaml) (migth be worth a separate post) + - Installing [git server along with cgit](https://git.eug-vs.xyz/eug-vs/infrastructure/tree/git-server.yaml) diff --git a/src/blog/2022-04-02.md b/src/blog/2022-04-02.md new file mode 100644 index 0000000..6f8a9a2 --- /dev/null +++ b/src/blog/2022-04-02.md @@ -0,0 +1,83 @@ +# DWM - useless gaps are useless! +Many people in Linux community spend too much time *"ricing"* their desktops. Here are few points I came to after using minimal window managers for 2 years: + - Screen real estate **matters** + - Gaps are **useless** (unless you care about your wallpaper) + - Wallpapers draw too much of your **attention** + - You **don't need** to constantly see your CPU temperature, battery percentage etc. + - **Less** windows is **better** + +And from that I can derive an advice on how to stay functional, productive and efficient with minimal window managers: + - **Get rid** of gaps + - **Stop** caring about your wallpaper + - **Don't** put many windows on your screen at once. You probably only need one. Two is ok, sometimes three. More windows = less focus + - Try **removing** window borders (or using `1px black` border). You won't be able to see which window is focused this way, and that will naturally encourage you to keep less windows on the screen + - **Decrease** the number of available workspaces / tags + - **Hide** your status bar when you don't need it + +Following these steps leads you to super-productive no-distraction fullscreen experience. You still get all the advantages of your window manager though. + +**Try it!** (you can always switch back) + + +# Evolution of my desktop +Here's my journey to my current WM philosophy - represented in random screenshots with a couple of comments. + +If you want to replicate a setup on the screenshot - lookup it's date and checkout the corresponding commit of my [dwm build](https://git.eug-vs.xyz/suckless/dwm/). + +## i3 +I've been happy user of `i3` with a lot of "ricing" for a long time. I liked transparent windows, blur and shadows: + +![screenshot](/public/desktop-screenshots/2020-12-08_01-49-30.jpg) + +![screenshot](/public/desktop-screenshots/2021-01-06_18-57-32.jpg) + + +## DWM +But then I decided to switch to suckless `dwm`. The functional approach was so much better then manual window management in i3 - as a perfectionist I always spent extra time arranging windows "in a cool way". DWM solved this problem entirely, but I still couldn't live without beautiful wallpaper and gaps. + +![screenshot](/public/desktop-screenshots/2021-03-10_21-14-09.jpg) + +![screenshot](/public/desktop-screenshots/2021-03-27_01-26-27.jpg) + +![screenshot](/public/desktop-screenshots/2021-04-26_00-06-32.jpg) + +![screenshot](/public/desktop-screenshots/2021-06-04_08-52-16.jpg) + +![screenshot](/public/desktop-screenshots/2021-06-25_16-19-05.jpg) + +![screenshot](/public/desktop-screenshots/2021-06-28_19-12-39.jpg) + +![screenshot](/public/desktop-screenshots/2021-07-15_14-20-16.jpg) + + +## Fuck gaps! +After ~4 months of `dwm` (and ~year of using minimal window managers) I realized - gaps are just taking too much of my screen real estate! Let's try removing them entirely: + +![screenshot](/public/desktop-screenshots/2021-07-22_09-50-48.jpg) + +As a bonus you stop caring about your nice wallpaper because you only see it once - when you first boot your machine. You can also get rid of your composite manager now. Finally, get rid of that bright orange: + +![screenshot](/public/desktop-screenshots/2021-08-14_02-29-30.jpg) + +![screenshot](/public/desktop-screenshots/2021-10-07_13-11-59.jpg) + +![screenshot](/public/desktop-screenshots/2021-10-17_16-17-55.jpg) + +![screenshot](/public/desktop-screenshots/2021-11-06_15-24-35.jpg) + +![screenshot](/public/desktop-screenshots/2021-12-05_21-38-36.jpg) + +That setup was untouched for 4 months! Finally rollback some patches to get that beautiful default status bar (that color though!): + +![screenshot](/public/desktop-screenshots/2022-03-21_20-01-58.jpg) + + +## Current state +That lived for 3 more months and now I use gray as the accent color and all my borders are black! Also I decreased the number of available tags. + +![screenshot](/public/desktop-screenshots/2022-04-02_14-59-33.jpg) + +Most of the time I hide status-bar anyway. + +![screenshot](/public/desktop-screenshots/2022-04-01_18-44-17.jpg) + diff --git a/src/blog/2022-04-17.md b/src/blog/2022-04-17.md new file mode 100644 index 0000000..d6ca637 --- /dev/null +++ b/src/blog/2022-04-17.md @@ -0,0 +1,51 @@ +# Running Gentoo :gentoo: on multiple workstations +Last week I've migrated my daily-driver laptop :computer: from [Artix Linux](https://artixlinux.org/) to [Gentoo](https://www.gentoo.org/). I also have Gentoo-powered PC for a ~half a year already, so some experience has accumulated. +I always wanted to do that, but there was a fear of unknown: + - Is my CPU performance sufficient for compiling packages? + - What if I don't have time to compile a package (e.g at work)? + - How am I gonna manage the USE flags? + +Of course, none of that shit can stop me! + +# My CPU is weak :cry: +My laptop has a pretty weak CPU (**Intel i3**) compared to flagship models. My PC has **Intel i5**, so obviously compiling packages on laptop will be even slower. That is definitely gonna be a problem... + +But wait, why don't we use **both CPU's** for compilation? :thinking: + + +## Introducing `distcc` +From [Gentoo wiki](https://wiki.gentoo.org/wiki/Distcc): +> Distcc is a program designed to distribute compiling tasks across a network to participating hosts. It comprises a server, distccd, and a client program, distcc. Distcc can work transparently with ccache, Portage, and Automake with a small amount of setup. + +Installation and usage is of course covered in the wiki along with instructions on bootstrapping new machine. Thanks to `distcc` installing Gentoo on my laptop was even faster than on more performant PC. + +Basically my PC runs a `distccd` server in my **LAN** and my laptop connects to it, sending compilation requests. Now every time I want to compile some heavy packages I just wait to come home and do it at almost twice the speed. There are more optional benefits: + - I can bring my RaspberryPI :raspberry-pi: to the compilation network (not without some cross-architecture magic) + - I can pull up some more old rusty metal, connect it to my **LAN** and have my packages compiled *even faster* :fire: + - I can setup [ccache](https://wiki.gentoo.org/wiki/Ccache) and share compilation cache within my network, making heavy package updates finish in seconds + + +# What if I'm outside and don't have time for compilation? :scream: +Actually turns out it's a very hypothetical situation. Most of the time you already have your toolkit installed anyway. It's only annoying if you want to try something new - for that I recommend remote or virtual machines (yes, `docker` still exists). + +In any case, if such an urgent situation occurs, **you can just get a binary!** There are also ways to setup your own [binary package server](https://wiki.gentoo.org/wiki/Binary_package_guide). + +# Managing portage configuration across workstations :hammer_and_wrench: +[Portage](https://wiki.gentoo.org/wiki/Portage) is **the best** package manager I ever used. The obvious benefit is an ability to split your packages into [sets](https://wiki.gentoo.org/wiki/Package_sets). I can define as many sets as I want, for example here's my `/etc/portage/sets/base`: +```bash +app-admin/doas +app-admin/stow +app-editors/neovim +app-shells/dash +app-shells/zsh +dev-vcs/git +app-misc/vifm +net-misc/ntp +``` + +I can install everything from this set with `emerge --ask --verbose @base`. Or if I want to install everything development-related, I can just install `@development` set. As easy as it gets! + +This way I can categorize my packages by purpose, compilation time, shared libraries, *etc*. Each package can belong to many sets. And most importantly, package set is **just a plaintext file**! You can manually edit it, you can store it under `git`, and you can share it across your workstations. + +Since portage is fully configurable via plaintext files, the same works for USE flags, keywords, accepted keywords and licenses. + diff --git a/src/blog/2022-04-18.md b/src/blog/2022-04-18.md new file mode 100644 index 0000000..4f817a8 --- /dev/null +++ b/src/blog/2022-04-18.md @@ -0,0 +1,48 @@ +# Patching Gentoo :gentoo: packages in the wild +Everyone who has ever used **st** - [suckless terminal](https://st.suckless.org) - has experienced [weird crash](https://github.com/LukeSmithxyz/voidrice/issues/284) when trying to render some very specific unicode characters. In this short post I'm showing how easy it is to solve this problem on Gentoo with the help of patches. + +# libXft +The original problem is solved by installing a couple of fallback fonts and a **patched version** of `libXft`. Guys from Arch Linux can just install patched version [libxft-bgra from aur](https://aur.archlinux.org/packages/libxft-bgra), why don't we have something similar on Gentoo? :thinking: + +We don't need it! Here's the process *of me* solving this problem in a matter of 5 minutes: + +1. Find patched version from comments on GitHub - https://github.com/uditkarode/libxft-bgra +2. Find upstream source code - https://gitlab.freedesktop.org/xorg/lib/libxft +3. Clone the patched repo and pull tags from upstream: + ```bash + git clone git@github.com:uditkarode/libxft-bgra.git + git remote add upstream git@gitlab.freedesktop.org:xorg/lib/libxft.git + git pull upstream --tags + ``` +4. Checking `git log --oneline` on `master` branch, looks like we are only interested in commit `72e54c0` (the actual *PATCH*). The latest tag before the patch seems to be **2.3.3**. + ```bash + 072cd20 (HEAD -> master, origin/master, origin/HEAD) README: instructions i guess + 72e54c0 [PATCH] Add support for BGRA glyphs display and scaling + 6e7da3c Remove call to FcNameRegisterObjectTypes + 26a3a49 Skip 'render' pattern elements with invalid type + 972fa05 build-fix for c89 + 86c2355 minor typography fix + ed8bb96 fix most type-conversion warnings from gcc-normal, without obje + ct-file changes + a266847 (tag: libXft-2.3.3) libXft 2.3.3 + fab5adf Add description of libXft to README.md + b397ffb Update configure.ac bug URL for gitlab migration + ``` + +5. Create patches from the diff: `git format-patch libXft-2.3.3` +6. Move the generated `.patch` to `/etc/portage/patches/x11-libs/libXft` +7. Reinstall libXft: `emerge -av libXft` +8. Profit!!! + +Well, actually, I did something on top of that - I *rebased* patched branch to the latest **2.3.4** tag to make sure that the patch still works with the latest version of the library. If it wasn't the case - I could just pin the version when emerging: `emerge -av "=libXft-2.3.3"` because we know that the patch is working on that version. + +From now on, I will keep receiving updates to my `libXft` from Portage and each new version will be patched (hopefully successfully) until the fix is released to the upstream. + +# Grab the patch +Well, everything above was "head-on" way. Taking a closer look to the upstream repo, there's already a [merge request](https://gitlab.freedesktop.org/xorg/lib/libxft/-/merge_requests/1) with our fix, so we don't have to do git magic and we can easily grab the raw diff by appending `.patch` to the URL: + +https://gitlab.freedesktop.org/xorg/lib/libxft/-/merge_requests/1.patch + +# See also + - [Running Gentoo :gentoo: on multiple workstations](2022-04-17.md) + - [DWM - useless gaps are useless!](2022-04-02.md) diff --git a/src/blog/index.md b/src/blog/index.md new file mode 100644 index 0000000..d9c72fe --- /dev/null +++ b/src/blog/index.md @@ -0,0 +1,43 @@ +# Blog + +## 2022 + +### April + +- [Patching Gentoo :gentoo: packages in the wild](2022-04-18.md) +- [Running Gentoo :gentoo: on multiple workstations](2022-04-17.md) +- [DWM - useless gaps are useless!](2022-04-02.md) + +### March + +- [Agent-less infrastructure management with Ansible :ansible:](2022-03-26.md) +- [Here comes my git server :fire:](2022-03-24.md) +- [Жыве Беларусь! :belarus:](2022-03-17.md) + +### February + +- [Слава Україні! :ukraine:](2022-02-26.md) + +## 2021 + +### October + +- [Pistol :gun: - yet another ASCII renderer](2021-10-28.md) +- [Ray marching in Rust :rust: !](2021-10-27.md) +- [You should start using `ssh-copy-id` now!](2021-10-06.md) + +### September + +- [I'm back on Carnivore! :meat_on_bone:](2021-09-21.md) +- [Summer 2021 - retrospective](2021-09-10.md) + +### August + +- [Python :python: in real life](2021-08-18.md) +- [Using imagemagick :imagemagick: to crop soy faces](2021-08-14.md) + +### July + +- [CircleCI :circleci: in daily life: how I improved Matrix stickerpicker](2021-07-15.md) +- [What's wrong with Numerology](2021-07-03.md) +- [My plans for this website](2021-07-02.md) diff --git a/src/index.md b/src/index.md new file mode 100755 index 0000000..70bc94b --- /dev/null +++ b/src/index.md @@ -0,0 +1,40 @@ +# About me +I'm **Eugene** - software developer, enthusiast, free spirit and a cool guy. Here I share information based on my experience in different topics. I'm interested in tech, math, privacy, linguistics, nutrition, health, psychology and philosophy. + +# About this website +This website runs on my local [Raspberry Pi :raspberry-pi:](https://www.raspberrypi.org/) along with many other services. + +It's nothing more than a series of interlinked wiki pages that I write in **Markdown** :markdown: when I'm too lazy to do something productive. Checkout more info on my [blog post](/blog/2021-07-02.md). + +No bullshit, ads, trackers or client-side JavaScript here. + +Subscribe to my [:rss: RSS feed](https://eug-vs.xyz/blog/index.xml). + +# My projects +I enjoy writing software, from fullstack web applications to 3D renderers in low-level languages. I'm also building my home [infrastructure](https://git.eug-vs.xyz/eug-vs/infrastructure/). + +You can find my projects on my [:git: git server](https://git.eug-vs.xyz). + +# Recent blog posts + - [See all...](./blog/index.md) + +# Articles + - [TaskWarrior :taskwarrior: is all you need to be productive!](./articles/taskwarrior.md) + +# Contacts + - :email: eugene@eug-vs.xyz + - :telegram: [Telegram](https://t.me/eug_vs) + - :github: [GitHub](https://github.com/eug-vs) + - :instagram: [Instagram](https://instagram.com/eug.vs) + +# Support me +## :brave-bat: Brave rewards +I accept tips via **Brave Rewards**. [How to send a tip?](https://support.brave.com/hc/en-us/articles/360021123971-How-do-I-tip-websites-and-Content-Creators-in-Brave-Rewards-) + +## :monero: Monero +My Monero donation address: + +![monero-qr](/public/monero-qr.png) + +`48WZbWqmbyuKhoFkbac4mNYSSFop5LqJz2PFsW1PMLgdYrGpvvZtTrwUgQs5Tgf5EXJWcgmp53TdxBnTapajAbMuLuGqBf2` + diff --git a/src/public/brainlet-dreams-big-brain.png b/src/public/brainlet-dreams-big-brain.png new file mode 100644 index 0000000..0c808e8 Binary files /dev/null and b/src/public/brainlet-dreams-big-brain.png differ diff --git a/src/public/desktop-screenshots/2020-12-08_01-49-30.jpg b/src/public/desktop-screenshots/2020-12-08_01-49-30.jpg new file mode 100644 index 0000000..2e7b808 Binary files /dev/null and b/src/public/desktop-screenshots/2020-12-08_01-49-30.jpg differ diff --git a/src/public/desktop-screenshots/2021-01-06_18-57-32.jpg b/src/public/desktop-screenshots/2021-01-06_18-57-32.jpg new file mode 100644 index 0000000..2f88d6d Binary files /dev/null and b/src/public/desktop-screenshots/2021-01-06_18-57-32.jpg differ diff --git a/src/public/desktop-screenshots/2021-03-10_21-14-09.jpg b/src/public/desktop-screenshots/2021-03-10_21-14-09.jpg new file mode 100644 index 0000000..58596df Binary files /dev/null and b/src/public/desktop-screenshots/2021-03-10_21-14-09.jpg differ diff --git a/src/public/desktop-screenshots/2021-03-27_01-26-27.jpg b/src/public/desktop-screenshots/2021-03-27_01-26-27.jpg new file mode 100644 index 0000000..c05a7bb Binary files /dev/null and b/src/public/desktop-screenshots/2021-03-27_01-26-27.jpg differ diff --git a/src/public/desktop-screenshots/2021-04-26_00-06-32.jpg b/src/public/desktop-screenshots/2021-04-26_00-06-32.jpg new file mode 100644 index 0000000..e0780af Binary files /dev/null and b/src/public/desktop-screenshots/2021-04-26_00-06-32.jpg differ diff --git a/src/public/desktop-screenshots/2021-06-04_08-52-16.jpg b/src/public/desktop-screenshots/2021-06-04_08-52-16.jpg new file mode 100644 index 0000000..5fea913 Binary files /dev/null and b/src/public/desktop-screenshots/2021-06-04_08-52-16.jpg differ diff --git a/src/public/desktop-screenshots/2021-06-25_16-19-05.jpg b/src/public/desktop-screenshots/2021-06-25_16-19-05.jpg new file mode 100644 index 0000000..374aafb Binary files /dev/null and b/src/public/desktop-screenshots/2021-06-25_16-19-05.jpg differ diff --git a/src/public/desktop-screenshots/2021-06-28_19-12-39.jpg b/src/public/desktop-screenshots/2021-06-28_19-12-39.jpg new file mode 100644 index 0000000..0a2302b Binary files /dev/null and b/src/public/desktop-screenshots/2021-06-28_19-12-39.jpg differ diff --git a/src/public/desktop-screenshots/2021-07-15_14-20-16.jpg b/src/public/desktop-screenshots/2021-07-15_14-20-16.jpg new file mode 100644 index 0000000..f431f2e Binary files /dev/null and b/src/public/desktop-screenshots/2021-07-15_14-20-16.jpg differ diff --git a/src/public/desktop-screenshots/2021-07-22_09-50-48.jpg b/src/public/desktop-screenshots/2021-07-22_09-50-48.jpg new file mode 100644 index 0000000..9b8b08f Binary files /dev/null and b/src/public/desktop-screenshots/2021-07-22_09-50-48.jpg differ diff --git a/src/public/desktop-screenshots/2021-08-14_02-29-30.jpg b/src/public/desktop-screenshots/2021-08-14_02-29-30.jpg new file mode 100644 index 0000000..625d6c1 Binary files /dev/null and b/src/public/desktop-screenshots/2021-08-14_02-29-30.jpg differ diff --git a/src/public/desktop-screenshots/2021-10-07_13-11-59.jpg b/src/public/desktop-screenshots/2021-10-07_13-11-59.jpg new file mode 100644 index 0000000..699f848 Binary files /dev/null and b/src/public/desktop-screenshots/2021-10-07_13-11-59.jpg differ diff --git a/src/public/desktop-screenshots/2021-10-17_16-17-55.jpg b/src/public/desktop-screenshots/2021-10-17_16-17-55.jpg new file mode 100644 index 0000000..cfe7c3a Binary files /dev/null and b/src/public/desktop-screenshots/2021-10-17_16-17-55.jpg differ diff --git a/src/public/desktop-screenshots/2021-11-06_15-24-35.jpg b/src/public/desktop-screenshots/2021-11-06_15-24-35.jpg new file mode 100644 index 0000000..fdec28a Binary files /dev/null and b/src/public/desktop-screenshots/2021-11-06_15-24-35.jpg differ diff --git a/src/public/desktop-screenshots/2021-12-05_21-38-36.jpg b/src/public/desktop-screenshots/2021-12-05_21-38-36.jpg new file mode 100644 index 0000000..7bea66f Binary files /dev/null and b/src/public/desktop-screenshots/2021-12-05_21-38-36.jpg differ diff --git a/src/public/desktop-screenshots/2022-03-21_20-01-58.jpg b/src/public/desktop-screenshots/2022-03-21_20-01-58.jpg new file mode 100644 index 0000000..baa4ea6 Binary files /dev/null and b/src/public/desktop-screenshots/2022-03-21_20-01-58.jpg differ diff --git a/src/public/desktop-screenshots/2022-04-01_18-44-17.jpg b/src/public/desktop-screenshots/2022-04-01_18-44-17.jpg new file mode 100644 index 0000000..fcee63f Binary files /dev/null and b/src/public/desktop-screenshots/2022-04-01_18-44-17.jpg differ diff --git a/src/public/desktop-screenshots/2022-04-02_14-59-33.jpg b/src/public/desktop-screenshots/2022-04-02_14-59-33.jpg new file mode 100644 index 0000000..28eca8e Binary files /dev/null and b/src/public/desktop-screenshots/2022-04-02_14-59-33.jpg differ diff --git a/src/public/docker-on-rpi.jpg b/src/public/docker-on-rpi.jpg new file mode 100644 index 0000000..fbfd8ed Binary files /dev/null and b/src/public/docker-on-rpi.jpg differ diff --git a/src/public/emoji/ansible.png b/src/public/emoji/ansible.png new file mode 100644 index 0000000..591746a Binary files /dev/null and b/src/public/emoji/ansible.png differ diff --git a/src/public/emoji/belarus.png b/src/public/emoji/belarus.png new file mode 100644 index 0000000..7050279 Binary files /dev/null and b/src/public/emoji/belarus.png differ diff --git a/src/public/emoji/benzin.svg b/src/public/emoji/benzin.svg new file mode 100644 index 0000000..be5b465 --- /dev/null +++ b/src/public/emoji/benzin.svg @@ -0,0 +1,108 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/public/emoji/brave-bat.svg b/src/public/emoji/brave-bat.svg new file mode 100644 index 0000000..f222910 --- /dev/null +++ b/src/public/emoji/brave-bat.svg @@ -0,0 +1,84 @@ + + + + + +logo +Created with Sketch. + + + + + + + + + + +logo diff --git a/src/public/emoji/brave.svg b/src/public/emoji/brave.svg new file mode 100644 index 0000000..8a59702 --- /dev/null +++ b/src/public/emoji/brave.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/public/emoji/circleci.svg b/src/public/emoji/circleci.svg new file mode 100644 index 0000000..e66e45c --- /dev/null +++ b/src/public/emoji/circleci.svg @@ -0,0 +1,54 @@ + + + +image/svg+xml diff --git a/src/public/emoji/gentoo.png b/src/public/emoji/gentoo.png new file mode 100644 index 0000000..d5e5ad1 Binary files /dev/null and b/src/public/emoji/gentoo.png differ diff --git a/src/public/emoji/git.png b/src/public/emoji/git.png new file mode 100644 index 0000000..78bccc4 Binary files /dev/null and b/src/public/emoji/git.png differ diff --git a/src/public/emoji/github.svg b/src/public/emoji/github.svg new file mode 100644 index 0000000..b54b845 --- /dev/null +++ b/src/public/emoji/github.svg @@ -0,0 +1,43 @@ + + + + + + diff --git a/src/public/emoji/imagemagick.png b/src/public/emoji/imagemagick.png new file mode 100644 index 0000000..4b67ed6 Binary files /dev/null and b/src/public/emoji/imagemagick.png differ diff --git a/src/public/emoji/instagram.svg b/src/public/emoji/instagram.svg new file mode 100644 index 0000000..278f024 --- /dev/null +++ b/src/public/emoji/instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/public/emoji/markdown.png b/src/public/emoji/markdown.png new file mode 100644 index 0000000..14550d1 Binary files /dev/null and b/src/public/emoji/markdown.png differ diff --git a/src/public/emoji/monero.svg b/src/public/emoji/monero.svg new file mode 100644 index 0000000..af777a4 --- /dev/null +++ b/src/public/emoji/monero.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/public/emoji/python.svg b/src/public/emoji/python.svg new file mode 100644 index 0000000..a16973b --- /dev/null +++ b/src/public/emoji/python.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/public/emoji/raspberry-pi.svg b/src/public/emoji/raspberry-pi.svg new file mode 100644 index 0000000..cad8033 --- /dev/null +++ b/src/public/emoji/raspberry-pi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/public/emoji/rust.svg b/src/public/emoji/rust.svg new file mode 100644 index 0000000..bf42fbc --- /dev/null +++ b/src/public/emoji/rust.svg @@ -0,0 +1,43 @@ + +Rust programming language logoimage/svg+xml diff --git a/src/public/emoji/taskwarrior.png b/src/public/emoji/taskwarrior.png new file mode 100644 index 0000000..7a745b8 Binary files /dev/null and b/src/public/emoji/taskwarrior.png differ diff --git a/src/public/emoji/telegram.svg b/src/public/emoji/telegram.svg new file mode 100644 index 0000000..080818f --- /dev/null +++ b/src/public/emoji/telegram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/public/eug-vs.png b/src/public/eug-vs.png new file mode 100644 index 0000000..f853fed Binary files /dev/null and b/src/public/eug-vs.png differ diff --git a/src/public/fonts/Bitter-Regular.woff b/src/public/fonts/Bitter-Regular.woff new file mode 100644 index 0000000..8060e0a Binary files /dev/null and b/src/public/fonts/Bitter-Regular.woff differ diff --git a/src/public/git-remote-meme.png b/src/public/git-remote-meme.png new file mode 100644 index 0000000..1613d8c Binary files /dev/null and b/src/public/git-remote-meme.png differ diff --git a/src/public/icon-64.png b/src/public/icon-64.png new file mode 100644 index 0000000..2e4a66f Binary files /dev/null and b/src/public/icon-64.png differ diff --git a/src/public/meat.png b/src/public/meat.png new file mode 100755 index 0000000..edca1d8 Binary files /dev/null and b/src/public/meat.png differ diff --git a/src/public/monero-qr.png b/src/public/monero-qr.png new file mode 100644 index 0000000..3d50bf5 Binary files /dev/null and b/src/public/monero-qr.png differ diff --git a/src/public/pan.png b/src/public/pan.png new file mode 100755 index 0000000..905305e Binary files /dev/null and b/src/public/pan.png differ diff --git a/src/public/pepe-smug.png b/src/public/pepe-smug.png new file mode 100644 index 0000000..0cfa035 Binary files /dev/null and b/src/public/pepe-smug.png differ diff --git a/src/public/stickerpicker.png b/src/public/stickerpicker.png new file mode 100644 index 0000000..a8ebcd8 Binary files /dev/null and b/src/public/stickerpicker.png differ diff --git a/src/public/style.css b/src/public/style.css new file mode 100644 index 0000000..b6f5b7d --- /dev/null +++ b/src/public/style.css @@ -0,0 +1,144 @@ +@font-face { + font-family: "Bitter"; + src: url(/public/fonts/Bitter-Regular.woff) format("truetype"); +} +html { + font-family: "Open Sans", sans-serif; + color: #ebdbb2; + background-color: #282828; +} +body { + margin: 0 auto; + max-width: 1100px; + padding-left: 50px; + padding-right: 50px; + padding-top: 50px; + padding-bottom: 50px; + word-wrap: break-word; + text-rendering: optimizeLegibility; + font-kerning: normal; + font-size: 16px; +} +@media (max-width: 600px) { + body { + padding: 1em; + } +} +p { + margin: 1em 0; +} +a { + color: #fabd2f; + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +img { + max-width: 100%; +} +h1 { + font-weight: normal; +} +h2, h3, h4, h5, h6 { + font-family: "Bitter", serif; + font-weight: normal; + line-height: 1.1; + margin-top: 1.4em; +} +h2 { + border-bottom: 1px solid rgba(255, 255, 255, 0.12); +} +h3 { + font-size: 21px; +} +ol, ul { + padding-left: 1.7em; + margin-top: 1em; +} +li > ol, li > ul { + margin-top: 0; +} +blockquote { + margin: 1em 0 1em 1.7em; + padding-left: 1em; + border-left: 2px solid #e6e6e6; + color: rgba(255, 255, 255, 0.75); + font-style: italic; +} +code { + font-family: monospace; + font-size: 90%; + margin: 0; + padding: 2px; + background: #1d2021; + border-radius: 4px; + border: 1px solid rgba(255, 255, 255, 0.12); +} +pre { + margin: 1em 0; + overflow: auto; + padding: 16px 8px; +} +pre code { + overflow: visible; +} +.sourceCode { + background-color: transparent; + overflow: visible; + border-radius: 4px; +} +div.sourceCode { + border: 1px solid rgba(255, 255, 255, 0.12); +} +code.sourceCode { + padding: 0; + border: none; +} +hr { + background-color: #1a1a1a; + border: none; + height: 1px; + margin: 1em 0; +} +table { + margin: 1em 0; + border-collapse: collapse; + width: 100%; + overflow-x: auto; + display: block; + font-variant-numeric: lining-nums tabular-nums; +} +table caption { + margin-bottom: 0.75em; +} +tbody { + margin-top: 0.5em; + border-top: 1px solid #1a1a1a; + border-bottom: 1px solid #1a1a1a; +} +th { + border-top: 1px solid #1a1a1a; + padding: 0.25em 0.5em 0.25em 0.5em; +} +td { + padding: 0.125em 0.5em 0.25em 0.5em; +} +header { + margin-bottom: 4em; + text-align: center; +} +#TOC li { + list-style: none; +} +#TOC a:not(:hover) { + text-decoration: none; +} +code{white-space: pre-wrap;} +span.smallcaps{font-variant: small-caps;} +span.underline{text-decoration: underline;} +div.column{display: inline-block; vertical-align: top; width: 50%;} +div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} +ul.task-list{list-style: none;} +.display.math{display: block; text-align: center; margin: 0.5rem auto;} + diff --git a/src/public/summer-2021/bonfire.jpg b/src/public/summer-2021/bonfire.jpg new file mode 100644 index 0000000..1f06cdb Binary files /dev/null and b/src/public/summer-2021/bonfire.jpg differ diff --git a/src/public/summer-2021/burndown.png b/src/public/summer-2021/burndown.png new file mode 100644 index 0000000..bbea2fb Binary files /dev/null and b/src/public/summer-2021/burndown.png differ diff --git a/src/public/summer-2021/kayaking.jpg b/src/public/summer-2021/kayaking.jpg new file mode 100644 index 0000000..309354f Binary files /dev/null and b/src/public/summer-2021/kayaking.jpg differ diff --git a/src/public/wojak-brainchair.png b/src/public/wojak-brainchair.png new file mode 100644 index 0000000..39ffa32 Binary files /dev/null and b/src/public/wojak-brainchair.png differ diff --git a/style.css b/style.css deleted file mode 100644 index b6f5b7d..0000000 --- a/style.css +++ /dev/null @@ -1,144 +0,0 @@ -@font-face { - font-family: "Bitter"; - src: url(/public/fonts/Bitter-Regular.woff) format("truetype"); -} -html { - font-family: "Open Sans", sans-serif; - color: #ebdbb2; - background-color: #282828; -} -body { - margin: 0 auto; - max-width: 1100px; - padding-left: 50px; - padding-right: 50px; - padding-top: 50px; - padding-bottom: 50px; - word-wrap: break-word; - text-rendering: optimizeLegibility; - font-kerning: normal; - font-size: 16px; -} -@media (max-width: 600px) { - body { - padding: 1em; - } -} -p { - margin: 1em 0; -} -a { - color: #fabd2f; - text-decoration: none; -} -a:hover { - text-decoration: underline; -} -img { - max-width: 100%; -} -h1 { - font-weight: normal; -} -h2, h3, h4, h5, h6 { - font-family: "Bitter", serif; - font-weight: normal; - line-height: 1.1; - margin-top: 1.4em; -} -h2 { - border-bottom: 1px solid rgba(255, 255, 255, 0.12); -} -h3 { - font-size: 21px; -} -ol, ul { - padding-left: 1.7em; - margin-top: 1em; -} -li > ol, li > ul { - margin-top: 0; -} -blockquote { - margin: 1em 0 1em 1.7em; - padding-left: 1em; - border-left: 2px solid #e6e6e6; - color: rgba(255, 255, 255, 0.75); - font-style: italic; -} -code { - font-family: monospace; - font-size: 90%; - margin: 0; - padding: 2px; - background: #1d2021; - border-radius: 4px; - border: 1px solid rgba(255, 255, 255, 0.12); -} -pre { - margin: 1em 0; - overflow: auto; - padding: 16px 8px; -} -pre code { - overflow: visible; -} -.sourceCode { - background-color: transparent; - overflow: visible; - border-radius: 4px; -} -div.sourceCode { - border: 1px solid rgba(255, 255, 255, 0.12); -} -code.sourceCode { - padding: 0; - border: none; -} -hr { - background-color: #1a1a1a; - border: none; - height: 1px; - margin: 1em 0; -} -table { - margin: 1em 0; - border-collapse: collapse; - width: 100%; - overflow-x: auto; - display: block; - font-variant-numeric: lining-nums tabular-nums; -} -table caption { - margin-bottom: 0.75em; -} -tbody { - margin-top: 0.5em; - border-top: 1px solid #1a1a1a; - border-bottom: 1px solid #1a1a1a; -} -th { - border-top: 1px solid #1a1a1a; - padding: 0.25em 0.5em 0.25em 0.5em; -} -td { - padding: 0.125em 0.5em 0.25em 0.5em; -} -header { - margin-bottom: 4em; - text-align: center; -} -#TOC li { - list-style: none; -} -#TOC a:not(:hover) { - text-decoration: none; -} -code{white-space: pre-wrap;} -span.smallcaps{font-variant: small-caps;} -span.underline{text-decoration: underline;} -div.column{display: inline-block; vertical-align: top; width: 50%;} -div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} -ul.task-list{list-style: none;} -.display.math{display: block; text-align: center; margin: 0.5rem auto;} - diff --git a/templates/openring-template.html b/templates/openring-template.html new file mode 100644 index 0000000..be91912 --- /dev/null +++ b/templates/openring-template.html @@ -0,0 +1,23 @@ + +

Articles from blogs I read

+
+ {{range .Articles}} +
+

+ {{.Title}} +

+

{{.Summary}}

+ +
{{.Date | datef "January 2, 2006"}}
+
+ {{end}} +
+
+ + Generated by + openring + +
+ diff --git a/templates/page.html b/templates/page.html new file mode 100644 index 0000000..3600409 --- /dev/null +++ b/templates/page.html @@ -0,0 +1,14 @@ + + + + + +
+ + eug-vs

Eugene's Space

+
+
+
+
+ + diff --git a/urls b/urls deleted file mode 100644 index e7d6fb2..0000000 --- a/urls +++ /dev/null @@ -1,4 +0,0 @@ -https://lukesmith.xyz/rss.xml -https://drewdevault.com/blog/index.xml -https://blog.codinghorror.com/rss/ -https://100r.co/links/rss.xml -- cgit v1.2.3