-
+
Full stack engineer FP-curious | λ-affected @@ -13,9 +13,9 @@ Wanna be rustacean 🦀 and/or secops guy 🔒
Experience
-Experience
+- Current position @SamsungFood. Internal tools engineer for data platform ➡ Internal tools engineer for developers. @@ -24,9 +24,9 @@ Fullstack engineer.
Technologies
-Technologies
+Work with:
@@ -43,9 +43,9 @@ Work with:Contacts
-Contacts
+Contact me via:
diff --git a/posts.html b/posts.html index 87fd721..73ce810 100644 --- a/posts.html +++ b/posts.html @@ -1,11 +1,11 @@Posts
-Posts
+Blog index and tags automation
-Blog index and tags automation
+Let's add tags to blog posts
@@ -20,9 +20,9 @@ drafted on 2024-07-05Posts preview
-Posts preview
+Add post preview for OpenGraph cards
@@ -37,9 +37,9 @@ drafted on 2024-06-28Improve code blocks
-Improve code blocks
+Use highlight.js for code syntax highlighting
@@ -54,9 +54,9 @@ drafted on 2024-06-25Org blog with RSS
-Org blog with RSS
+Let's add RSS feed to blog
@@ -71,9 +71,9 @@ drafted on 2024-06-23Org to HTML and back
-Org to HTML and back
+Blog post about publishing my blog with Org Mode
@@ -88,9 +88,9 @@ drafted on 2024-06-22My keyboard journey
-My keyboard journey
+Blog post about my keyboards
@@ -106,33 +106,33 @@ drafted on 2024-06-05Tags
-Tags
+@org-mode (5)
+@org-mode (5)
@elisp (4)
+@elisp (4)
@rss (1)
+@rss (1)
@tags (1)
+@tags (1)
@highlightjs (1)
+@highlightjs (1)
@keeb (1)
+@keeb (1)
@diy (1)
+@diy (1)
@imagemagick (1)
+@imagemagick (1)
Table of Contents
Disclaimer
-Disclaimer
+I'm neither proficient in Org Mode (further on "Org"), nor a good front-end engineer. I think that a simple solution is better than no solution. If you see a mistake, you can contact me via iam@fidonode.me.
What is Org?
-What is Org?
+Your life in plain text @@ -55,9 +55,9 @@ Everything you can do in Org is to write a text. With a special markup, of cours
Why Org Mode?
-Why Org Mode?
+- Plain text. Plain text as a data source offers significant versatility. You can read and understand what happens in org files without needing Emacs. @@ -69,16 +69,16 @@ I do not have a habit of collecting and keeping information. I believe that disc
Render Org to blog or whatever
-Render Org to blog or whatever
+Org already has a way to render files into HTML, allowing you to create simple HTML files with minimal styling. I'm not interesting in styling from org, so I decide to use picocss framework.
Render HTML
-Render HTML
+
I want to change some templates here and there. I've found esxml
package. It is a decent DSL for writing XML/HTML.
Here is how page header and footer look in this DSL.
@@ -183,9 +183,9 @@ So everything is almost done. Time to use our custom publishing function in proj
Static files
-Static files
+Yep, you may want to publish some photos with your blog or any other static files.
@@ -205,9 +205,9 @@ Looks self explanatory.Whole build script
-Whole build script
+
Here is the whole elisp script which I use to publish my blog. It have some additional quirks to work with doomscript ./build-site.el
.
Publish through GitHub Action
-Publish through GitHub Action
+
With all previous preparations, this step sounds simple like: emacs -Q --script ./build-site.el
I've chosen a pretty standard way to publish static sites through GitHub Pages. Since I keep my Org files in a private repo, I need some additional steps to address it. I use the peaceiris/actions-gh-pages@v3
action to publish from my Org repo to the Pages repo.
@@ -375,9 +375,9 @@ However, since I use Doom Emacs
as my configuration framework, we n
Install Emacs
-Install Emacs
+
If you want to run Emacs Lisp
, you need the whole Emacs, at least without GUI. In a GitHub Action, you can simply run:
Just bring everything
-Just bring everything
+I need to take extra steps since I use Doom Emacs and have my configs in Org. You may also need to install dependencies for your configuration.
@@ -426,9 +426,9 @@ Of course, I use a caching step to make the whole process faster:BTW I use GNU Emacs
-BTW I use GNU Emacs
+Here's the whole publishing workflow.
@@ -507,21 +507,21 @@ jobs:What is next
-What is next
+I have a plans to make posts about next features:
RSS Feed
+ -Open Graph image preview
+ - diff --git a/posts/add_rss_to_blog.html b/posts/add_rss_to_blog.html index 9e1c451..22fb6d4 100644 --- a/posts/add_rss_to_blog.html +++ b/posts/add_rss_to_blog.html @@ -2,34 +2,34 @@Table of Contents
Why do you even need RSS?
-Why do you even need RSS?
+RSS might seem like an outdated, marginal thing. But it still has at least one benefit—you can use an RSS feed as a sitemap for search engines. Plus, it's pretty geeky.
Add RSS feed
-Add RSS feed
+So, what's happening here? Let's start by integrating our templating functions into the build.
Use sitemap backend in the build
-Use sitemap backend in the build
+(setq org-publish-project-alist
(list
(list "blog-rss"
@@ -59,9 +59,9 @@ How does it work? As you can see, we use the default sitemap generator from Org
Publishing and formatting functions
-Publishing and formatting functions
+We need a mandatory dependency because we don't want to mess with forming correct XML by ourselves.
diff --git a/posts/blog_index_and_tags_automation.html b/posts/blog_index_and_tags_automation.html index 9653edc..4659761 100644 --- a/posts/blog_index_and_tags_automation.html +++ b/posts/blog_index_and_tags_automation.html @@ -2,31 +2,31 @@Table of Contents
Tags.
-Tags.
+Tags are a nice and easy way to organize posts without explicit search. In the simplest way, you have a list of tags in posts, and each tag links to a page with all posts having the corresponding tag. It is also helpful to have a page with all tags available in the blog. And, of course, I don't want to maintain the list of tags manually.
Automate tags.
-Automate tags.
+Simple idea - go through all files, collect titles, dates and descriptions, render into org files. Easy peazy lemon squezy. Let me show you parts of function body. @@ -113,16 +113,16 @@ Resulting page example: @org-mode
Posts index.
-Posts index.
+Previously, I maintained a list of posts manually. Now that I have more than 5 posts, I no longer want to do it by hand. So, after introducing tags, I've decided to automate the page with the list of posts. The same idea, almost the same data, will be integrated into the same file. Pagination has not yet been implemented and is not planned.
Posts index automation.
-Posts index automation.
+Here is the part of function which renders list of posts and list of tags with number of posts in each tag category.
@@ -170,17 +170,17 @@ Here is an example of resulting page: Posts<Cons.
-Cons.
+Now, with the way the rendering function is integrated into the process, it is called when going through each Org file found by Org-Export. This introduces O(n2) complexity. It's not ideal, but never mind, I will redo it before reaching the 100th post.
Whole config.
-Whole config.
+
As usual, between posts, I decided to tackle a whole bunch of small tasks, so here is the entire config. I'm thinking about splitting the exporter into modules and maybe open-sourcing it properly.
A neat thing I've implemented is a way to filter out unpublished posts using a PUBLISHED
property. This allows me to work on drafts without affecting the blog's current state.
diff --git a/posts/improve_code_blocks.html b/posts/improve_code_blocks.html
index 2ab1ed3..ceee59c 100644
--- a/posts/improve_code_blocks.html
+++ b/posts/improve_code_blocks.html
@@ -2,33 +2,33 @@
Table of Contents
What is the problem with default highlighting?
-What is the problem with default highlighting?
+Htmlize works poorly with headless publishing. It lacks extensibility, including features like line numbers, a copy button, and the ability to highlight predefined parts of the code.
Highlight.js
-Highlight.js
+Change code block template
-Change code block template
+
We need to make small changes in how code blocks are rendered. By default, Org Export exports code blocks as <pre></pre>
. For Highlight.js, we need <pre><code></code></pre>
. Additionally, we need to set the correct language name in the class attribute. Since Highlight.js does not support elisp
, I rewrite it to regular lisp
using the my/replace-substring
function.
Plug Highlight.js
-Plug Highlight.js
+I do not want to load Highlight.js on every page, so I need to check if the initial Org file contains code blocks. Depending on this, we will render the part of the tree with JavaScript or not.
@@ -105,9 +105,9 @@ I do not want to load Highlight.js on every page, so I need to check if the initRespect prefers-color-scheme
-Respect prefers-color-scheme
+
Additionally, I think it's a good idea to respect the prefers-color-scheme
property of the user's browser. We can switch CSS files based on this property. We should also subscribe to changes in this property to handle the edge case when it switches while reading the page.
Whole config
-Whole config
+
In between posts I've switched from sxml
to esxml
so here is the current config.
Table of Contents
My end-game (at least I hope) keyboard
-My end-game (at least I hope) keyboard
+Keebs path
-Keebs path
+Sometimes I think about the long journey I've made with keebs. In childhood, I had decent membrane keyboards, most of which had an ergonomic profile like the MS. Not sure if it somehow affected my taste because I started my career with the simplest, cheapest board and typed countless lines of code on such keebs. Then I heard about clickity-clack mechanical keyboards and decided to try one. It was a simple Chinese keeb with a thick metal body, double-shot caps, and Cherry Brown switches. A decent thing to annoy everyone around you. I think this purchase marked my dive into mech keebs I'm not a geeky aficionado who thinks you can fix everything with a new keyboard, but I built a couple of them. I hope I've finally built the last one for quite some time.
Dactyl manuform
-Dactyl manuform
+Almost all of the time, I struggle with my maximalism. So I decided to build the ultimate mechanical ergonomic split keyboard and chose the Dactyl Manuform. Sounds like a crazy idea. Zero experience with QMK, zero experience with hand-wired keyboards, and zero experience in 3D printing. The last problem was the easiest one; I just asked my friend to print the bodies from PETG polymer, and Bob's your uncle. I got two pieces of rough-layered plastic with all the support structures. God, it was a nightmare to clean these prints from supports and small artifacts, but I was happy.
-
Moonlander
-Moonlander
+Nothing special. Ordered, paid, got it, tried it. Everything worked. Looked good. Happy year of typing. Bored. Annoyed. Too big and chunky. No concave. Quality not the best. Started planning the next one.
-
Custom Corne
-Custom Corne
+This journey started with discovering the Jian keyboard. It is a niche keeb from the Ru community focused on full support of the whole Russian layout. It was originally created by KGOH. I missed the group buy and decided that I could easily patch a Corne board with two additional keys to mimic the Jian. Interesting journey. I learned how to use KiCad, and how to export gerbers.
-
Dactyl manuform again
-Dactyl manuform again
+Two years late I've settled down in new country and decide that I want to bring back my dactyl manuform experience.
-
Hardware
-Hardware
+Body
-Body
+I've choose to use a Ryan's generator and generate body on top of Corne preset with all keys in last row and disabled stagger for the last two columns. Generator preset The body was printed by JLC3DP (JLCPCB printing department). I've choose SLS from nylon. Print has minor artifacts; I expected better quality.
-
Switches and caps
-Switches and caps
+I've chosen Kailh BOX Navy switches. I really like the clickity-clack sound. They have a dedicated clickbar to produce this sound, and the box profile helps with moving down perpendicularly.
-
Controllers
-Controllers
+I used a bootleg Pro Micro called Tenstar Robot, based on the ATmega32u4. It's perfectly supported by QMK, pin-to-pin and size-compatible with the Pro Micro.
-
Amoeba things
-Amoeba things
+During this build, I decided that I did not want to make a big mess of wires and chose Amoeba single-switch PCBs.
-
Software
-Software
+Plain default - QMK
-Plain default - QMK
+Prerequiremets: QMK CLI @@ -309,9 +309,9 @@ You may want to create a separate keyboard entry in QMK.
Make own layout
-Make own layout
+I'll try to go through setting of my personal layout. It is based on Jian layout.
@@ -468,8 +468,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {