serhii.net

In the middle of the desert you can say anything you want

12 Jan 2022

Things learned from my father in law when building additional drawers for an IKEA wardrobe

532 words, ~2 min read

Had an IKEA wardrobe, it was good, but after a year we realized we need more shelves, bought seven. He came to visit and decided to help us building them.

After unpacking, we realized they all were the wrong size, width 100cm instead of 75cm. (No idea what happened there…)

He said it’s no problem to manually make them the right size. Alright, why not, might be fun, when else will I get to do something like this.

The feeling of power from changing the world around you is even stronger than when building standard IKEA stuff accoding to plan. Like, you’re allowed to modify furniture that you own. Strangely empowering.

Some things he did that I really liked and that are the reason for this post:

  • Need $tool of correct size for $job? I’d measure and take that piece of paper to a hardware store. He took an example plank with him to the shop to pick $tool based on the real thing.
  • I’d have blindly trusted that the drawers fit (IKEA, standardization, etc), building one to see that I got the steps right and then parallelizing the rest to do similar steps in a shared context. He built a single drawer first specifically for the purpose of testing it immediately, which is how we found out about the problem.
  • Cutting a drawer is surprisingly easier when it’s assembled! Both physically and knowing-which-part-to-cut-where, since you’re cutting on the same plane three different boards. Not always a good idea but I would have never thought of doing that to begin with. We cut the first assembled drawer without disassembling it.
  • Measuring stuff - I’d have measured a board from a “good” drawer, measured the same thing on the target, drawn a line (between two separately measured points), then cut that. He physically disassembled a ‘good’ drawer, put each board over the corresponding ones from the ‘big’ one, and traced the line over from them. Much easier if you have a lot of drawers. Even if you got the measurements in cm there’s still room for error when you transfer them to each new drawer.
  • When cutting something with a saw, if friction is a problem you can stick something in the already-cut part to increase the distance and decrease friction.1
  • Even if it was 11pm, he really wanted to clean up before going to bed, which connects really well with my usual party “we clean up before we fall asleep while we still have energy because in the morning we won’t”.

A pattern I see in some of the above is getting rid of intermediate steps and making use of natural mappings when available.2

Got a lot of insights in the style of The Art of War, and also now we have 7 new drawers. 10/10 would recommend.


  1. Probably the only bit here that easily applies only to woodworking :) ↩︎

  2. In the sense of “The Design of Everyday Things ”. Reasoning about what to cut where is easier when you’re dealing with an assembled thing - like the book’s “a panel with light switches in the shape of your home, with the switches being in places where the lights they control are” ↩︎

03 Dec 2021

My journey in PKM, Part 2: my current approach

3663 words, ~14 min read

Intro

Hi! Welcome to part 2 of my take on Personal Knowledge Management (PKM).

Part 1 was about things I tried in the past and why I stopped using them, along with what they taught me about my requirements for a PKM system.
Part 2 (this post) will be a description of the things I currently use.

TL; DR

Private notes

My day-to-day activities live in two very long textfiles, one for work (work.md) and one for personal stuff. The inspiration for this was this post: My productivity app is a single .txt file.

My personal notes are written almost exclusively using Obsidian, synchronized to my Android phone. I make heavy use of Obsidian Templater Plugin to pre-fill front matter, put them in its correct place, add tags, etc.

Public notes

The public part of my notes lives on my website, serhii.net, which is a static website on Hugo.

My public notes are written using Obsidian and stored as markdown. They get published on my website at Diensttagebuch - serhii.net and Journal - serhii.net respectively. The Diensttagebuch also generates a Master file, which basically concatenates all the single markdown files into a long page. I use this for quick casual searching.

All of this uses Git for version control.

I have a private VPS, where I run wallabag, that I use to quickly save links from my Android phone.

My current setup

Probably for the first time I’m very very happy with my current solution, it checks all boxes I knew I needed, and ones I had no idea I wanted or were possible.1

Requirements from the previous post

Things I know I need from a PKM system, from the previous post:

  • Data storage:
    • The data’s main location shouldn’t be a webservice. Ideally I should control both the data and the tools needed.
    • The data should live in a future-proof format, readable even without the tools
  • It has to require little upkeep/maintenance
  • Should be flexible and the data it gets and supports:
    • Not just links, but also pictures/files etc
    • free-form text for manual summaries of the items saved
  • Taxonomy:
    • Ideally as flexible as possible, ability to add own attributes
    • Ability to use complex queries when searching
    • Quick feedback for errors or autocomplete for tags/categories
  • Usability:
    • Adding stuff it should be really fast and friction-free. If it takes time and effort to add new info to it you won’t do it often.
    • Both loading times and number of steps should be very very small

Text files

Right as I was starting to work at my first real full-time job, I stumbled upon this link: My productivity app is a single .txt file

It describes using one long text file for organising stuff and notes, and appending to the bottom every day. I loved the idea.

My text files

… and decided to try it for work: most stuff I need to write down was company-specific, confidential and not fitting a wiki format, I was learning it chronologically, it was the perfect case.

Work work.md file

For example, the work file work.md:

  • I start the day by pasting the date and “Today: “2
  • I write my plans, copy-paste any not finished from the days before
  • During the day, I append to that file. I write things like:
    • terminal command, non-trivial errors I had, how I solved them, all ungoogleable stuff
    • Log of what I worked on, to be able to easily come back to a topic or find old files
      • For example: “TICKET-1234. Downloaded dataset to $path, starting training by running $command. Eval results saved to …”
    • Notes from meetings (under the hashtag #meeting) or important conversations with people
  • At the end of the day, I write the plans for tomorrow

Representative sample from work.md:

Small improvements accumulated along the way:

  • Custom VIM colorscheme that:
    • highlights lines starting with TODO, XXX, done to make them easy to parse past.
    • Date block and line starting with \+ have a specific color, to easily parse headers or important stuff
  • Using indentation to separate logical blocks, and then of vim folds with foldmethod=indent.
  • Using special hastags/words to make search easy:
    • #meeting (formal ones), #conversation (informal), STARTED (for starting ML trainings that I’ll need to check up on later), etc.
    • Using initials for people. A line might look like this:
      Today:
      	- ...
      	- 13:00 #meeting with AB and CD about X
      ...
      #meeting with AB and CD about X:
      	Meeting minutes: http://...
      	AB wants to do Y
      		- CD: we can't, why don't we ...
      	...
      
  • Making it open in the same workspace on system startup

Personal / RL file

This worked really well, I soon created a second file for real life stuff. The trigger there was seeing my 80 years old relative have such a paper notebook with daily notes (the day I came was something like “Serhii came to visit; planted cabbages”).

I use it for IBANs, recording payments, gift ideas for people, logistics, list of documents for bureaucracy. Almost everything above applies to it too.

Advantages

I really love these textfiles, and their length is the main proof:

> wc -l work.md
39538 work.md
> wc -l file.md
14063 file.md
  • Work
    • Daily meetings, preparing for sprint reviews etc. is easy, I don’t have to remember what I did.
    • Solving problems is easier too: if I solve a non-trivial issue with internal or external tooling, I document it, and I can look it up next time.
    • It also works as a classic lab log, with experiments, theories, results. Some get copy-pasted into JIRA/Confluence later, but that way I can use the tools I like the most to draft them.
  • Home
    • Excellent log of stuff I don’t do often but need to refer to.
    • For example, last time i needed something from IKEA 30% want available for delivery. Six months later I was ordering something else and quickly found the list of things not bought previously, by searching for “IKEA”.

Why does it work?

  • Low-friction:
    • Really quick to start writing (opens automatically on i3 workspace “10”, switching to that workspace is mechanical memory now (<Win-0>))
    • I love textfiles and I love vim and it’s the lowest-friction way I know of to edit text
    • Searching is instant, including regex-based
  • No-maintenance
    • Version control is automatic
    • No dependencies except a text editor
  • Under my control and future-proof
    • Text is as portable and future-proof as it gets
    • Lives on my local filesystem, I can get a text editor anywhere

What’s missing

  • Not part of its job description, but nevertheless:
    • Not good for saving stuff “for later”: no tags/categories, no way to search by filtering by them
    • No way to easily paste/view pictures etc.
  • Not easily accessible from mobile
  • Any solution to a problem I find and document stays on my hard drive. (Still better than “only in my head”, but still…)

Diensttagebuch / daily log

Live at Diensttagebuch - serhii.net.

Three things happened:

  1. I saw /r/AskHistory thread, where a Dienttagebuch was mentioned as source. In English, I’d translate this as “Work journal/log/notebook”, “Lab notebook”. I thought I’d be a cool idea for a small blog, like the textfiles above but for public stuff.
  2. Also I kept reading about static site generators3.
  3. I also started hating Wordpress4 and was looking for alternatives.

Diensttagebuch basics

So for fun, I started writing a daily log of things I do.

At first I used Jekyll. I liked it. After it got too big, it started to take too much time to build (7-10 seconds). I heard Hugo was supposed to be fast, tried it out, pointing it at the same folder with makdowns as Jekyll (yay open formats), it worked, and took less than a second to do it! Very happy about the move, but of course it’s all still a permanent work in progress. 5

I started using it about at the same time as the textfiles, I started documenting there the things I keep having to google (how do you change the size of matplotlib plots in Jupyter?) along with the answers, and useful snippets. I also kept documenting random bits and pieces that I felt were interesting, but not worth the 20 seconds and mental effort to put into the link wiki (see part 1 of this post).

Representative day:

I wrote it in markdown from the beginning, and could easily paste syntax-highlighted code snippets, picures, clickable links.

At a certain point (after I started using Obsidian, see below) I split day123.md posts containing multiple possibly-unrelated headers (and no tags) into separate YYMMDD-HHmm-post-title.md ones. Now I could give them separate tags, and to link to them from other places! 6

To search for stuff, I created a so-called Master file. Initially it was a bash script that takes all the Days and dumps them into a single file (then also reused as page on Jekyll). I used both the page and the local file to quickly search for stuff (search whatever you want and skip through till you see what you’re looking for).

Advantages

  1. I can quickly look for stuff, and immediately get the answer, usually without having to follow the link. 7
  2. For some topics, easier to read/parse than the long textfile. Syntax highlighting, post titles etc. are nice.
  3. It’s public:
    1. Easy to access myself from anywhere
    2. Easy to share with people. “Yes, I did some jq before. Here’s my short summary of it and links you can follow to go deeper: Day 860 - serhii.net
  4. Now it’s quite a big chunk of material. The directory with the source markdown files has 18.700 lines split into 477 files. It honestly feels good, and I hope I provided some value to other people on the internet.
    1. Sometimes people find stuff mentioned there and write me about it.
    2. Once I got an email asking to add their website to my “excellent list of $topic resources”
    3. At least three times I found my own posts on Google when looking for solutions to a problem! Usually happens with evergreen stuff like Nvidia GPU driver issues

Why does it work?

In bold differences from the textfiles above.

  • Low-friction:
    • The window to write stuff is in my i3 scratchpad, accessible as <Win-minus>
    • I have templates/scripts to create a new file in the correct place, and pre-fill it with sensible values as soon as I give it a name
    • Searching is easy both from the browser and with grep
    • Deploying it is done through a shell script that commits and pushes it, builds the website, and scp-s it to serhii.net
  • No-maintenance
    • Version control is automatic
    • Serving:
      • A static website is trivial to serve and will stay available
    • Accessing:
      • I always have a text editor installed and can read markdown files
    • Building the static website:
      • Hugo is trivial to install, no database required to read the markdown files, it’s a beauty.
  • Under my control and future-proof
    • Text is as portable and future-proof as it gets
    • Lives on my local filesystem, I can get a text editor anywhere

What’s missing

For quite a long time, the ability to drag-n-drop pictures into them, and the ability to edit them on mobile.

Obsidian and digital gardens

My love for Obsidian knows no bounds, but I’m using it heavily as described only for around three months (as of December 2021), much less than the two previous ones (that are more than around two years old). Not stable and mature by my standards, but if there were any deal-breakers or friction I’d have stopped long before that.

Once I went on a rabbit hole and stumbled upon two things I always loved but had no idea they were a thing, or had a name:

  • Learn In Public (post publicly about your progress, create resources you wish you had found)
  • Digital gardens (having a set of pages that get constantly updated as your knowledge grows instead of chronological posts)

I heard Obsidian being mentioned often, and decided to try it out. Fell in love instantly.

Obsidian itself

Obsidian describes itself as “a powerful knowledge base on top of a local folder of plain text Markdown files”, which covers it quite well and instantly ticks the box for “data stays locally in an open format”.

I see it as a layer over markdown files that adds support for a lot of neat things without breaking them too much (still markdown, still roughly readable in whatever you use).

Desktop app

Electron-based, “just works”, dragging and dropping screenshots and it dealing with the rest feels like magic.

Android app

The main value it gives me is easy editing from my phone. Writing markdown by hand on a touchpad is painful, and the Obsidian editor does a really good job at it. And in general navigating through the pages, renaming, moving, following tags, adding templates. It’s also wonderfully configurable, and you can add its mobile toolbar the actions you want in the order you want.

But the two things that make Obsidian really powerful are templates and plugins.

Templates

They are snippets that manipulate text and variables to do some action like enter a date. With the help of Obsidian Templater Plugin, they can do much more.

211203-2305 New obsidian Templates + hotkeys for Garden (IT, RL) and personal notes - serhii.net has an example of one I use that gives an idea of what’s possible:

<% tp.file.move("garden/it/"+tp.date.now("YYMMDD-HHmm")+" "+tp.file.title) %>---
title: "<% tp.file.title %>"
tags:
  - "zc"
  - "zc/it"
  - "<% tp.file.cursor() %>"
fulldate: <% tp.date.now("YYYY-MM-DDTHH:MM:SSZZ") %>
date: <% tp.date.now("YYYY-MM-DD") %>
layout: post
hidden: false
draft: false
---

Works like this:

  1. you create a new file, enter it’s name (let’s say “New file”).
  2. Then you “Insert” that template. It:
    1. Moves that file to /garden/it/211206-1234 New file.md
    2. Inserts front matter, with title: being taken from the new filename
    3. Adds other frontmatter values and tags, puts your cursor at the beginning of the third.

To insert that template, you:

  • on mobile, swipe down, type “ins”, get a list of matching ones; or you could have created a button for entering that template in the mobile toolbar.
    Command palette
  • on desktop, <C-p> opens the command palette, see above. Or you could have defined a hotkey for that.
    Hotkeys

Creating that file on mobile and typing all that would have been hell. You create a template once, then it works both on desktop and the mobile app, and saves you a lot of pain.

Plugins

Obsidian has a lot of plugins, including the above mentioned templater. I use:

This is a nice overview of some plugins: A Few of Our Favorite Obsidian Plugins – The Sweet Setup

Obsidian supports quite advanced search.

It has standard AND/OR/NOT, regexes, and has special search operators to apply that to filenames, paths, tags, lines/blocks/sections, done or not done tasks. There’s also a vantage-obsidian to visually bulid complex queries.

My obsidian workflow

General

I create the files, insert the templates I wrote, add text, switch to the rendered view to easily read the results.

I add a lot of #tags and #tags/with_children and get autocomplete on them both on Linux and Android - no “will I look for this link under #coding or #programming?” anymore!

Is this real?

Integrating with Hugo / Diensttagebuch

I create individual posts with the template I pasted above. I use https://github.com/khalednassar/obyde to convert them into ones Hugo can parse (mostly involves updating pictures directories and stuff). I just added the line python3.8 -m obyde -c ./Scripts/obyde_config_dtb.yaml to the deploy.sh I use to deploy the rest of the blolg.

This part is still shaky and breaks down sometimes.

Personal notes

This is where its Android app especially shines, and I can edit text, task lists, templates for pages etc. I can take pictures and embed them in notes, or embed PDFs.

Last time I was flying, I just created a page where I pasted the pictures of the boarding pass QR codes and linked the obsidian page with my embedded .PDF vaccination certificate. (Usually I’d have all this as separate files in a Telegram chat with myself.)

You said you wanted self-hosted open-source solutions?

That was/is my main doubt. Obsidian is closed source, and building too much of my workflow on that feels against a lot of what I believe in. Let’s analyse.

Chances for Obsidian to survive

Obsidian has a LOT of plugins, which in my world meansa healthy and livng community. They also have paid offerings which give them some clear ways to monetize, which again gives me hope they’ll live.

What happens if it doesn’t?

Obsidian is free for personal use, and is a downloadable app, not a web application. Which means that (in theory) I don’t depend on their servers for anything, unless I use their paid Sync or Publish options. If the company gets hit by a bomb, the local applications itself should continue to work.

Data is stored in markdown, and there are multiple converters available to transform the Obsidian-specific syntax (which I don’t use often) into standard markdown, so there I’m also safe.

Still, why take the risk?

It’s just too awesome to ignore.

Advantages

Markdown, consistent and really good UX on computers and phones, ability to code templates to automate boring stuff, ability to easily sync part of the vault into a public Hugo blog? I never thought I’d see this anywhere.

Especially the android part: being able to write/edit stuff (checklists, personal notes, etc) from my computer and then continue from mobile when I have time has been really a game changer for me.

Why does it work?

  • Low-friction:
    • The window to write stuff is in my i3 scratchpad, accessible as <Win-minus>
    • I wrote a lot of templates to automate away the boring stuff, and they’re quick to insert both from Android and Linux.
    • Searching can be done through Obsidian
    • Deploying it doesn’t require anything special, part of the deploy.sh script
  • No-maintenance
    • The public part totally under control of the Hugo scripts
    • Locally - sync keeps working in the background
  • Under my control and future-proof
    • It doesn’t export notes to markdown, it stores them in markdown. Which is “as portable and future-proof as it gets”
    • I don’t depend on their services:
      • publishing is easy to do with markdown
      • sync is easy to do through git / nextcloud / syncthing, now or in the future
      • the application runs locally, if it can’t I can use anything to edit markdown.

What’s missing

Complex taxonomies for a link database, but I don’t think I need that anymore. The Semantic MediaWiki Link wiki approach described in the previous post might have been useful earlier, but feels overblown for me now.

Obsidian search options over the markdown files that make up the public part of my notes are more than enough for me. In the time between my almost-abandonment of the link wiki and discovery of Obsidian, I’ve been happily Ctrl+F-ing through the various master files or grepping locally and that was … good enough.

That area is definitely a work in progress, we’ll see.

My current solution for casual “read later” bookmarking is Wallabag.

Wallabag (Save the web, freely | wallabag: a self hostable application for saving web pages) is a self-hosted solution to bookmark links. It has a really nice Android app.

It has stars, read / not_read, tags (clickable suggestions on mobile!), a “reader mode” for links, and can create RSS feeds for unread/starred/archived articles.

It has Tagging Rules, that based on variables like title / URI / reading time / … add specific tags.

When I see an interesting link on mobile and want to quickly save it, I “share to Wallabag”. Then I can access them from desktop through the web interface.

Next steps?

I want to move the links from my link wiki https://serhii.net/f/ into something else, and deactivate it. Something else will be probably a Hugo website, compatible with Obsidian.

Conclusion

It’s been a while since I wrote something long on my blog, feels awesome. (By the way, I drafted this post, partly, on mobile, through Obsidian).

Initially it was supposed to be a short summary of what I’m using now, but then I went down into a memory hole, realized how much thoughts I put into these topics all my life, and decided to write it all out. Glad I did.

I’m very happy with the Diensttagebuch approach for saving useful links/snippets. Obsidian is wonderful for personal stuff and adding posts to the blog, and I don’t miss the advanced querying options. Maybe I’ve just started to read stuff less, or stopped caring about saving it for the future.


  1. Beware “I found this awesome thing, am using it for two entire weeks now!” blog posts! ↩︎

  2. Would be easily automatable, but I really enjoy the start-of-day ritual of copypasting the previous date block etc. ↩︎

  3. you write files, “compile” the website, a static .html website that’s trivial to host is generated at the end ↩︎

  4. I was also more and more unhappy with some of the design decisions Wordpress took (hate the “new” editor), and realized writing posts there is not fun anymore. But I kept having to update it, because Wordpress is known for being unsafe. ↩︎

  5. Decided to switch, did some interesting templating magic to make it closer to what I want. The CSS keeps giving me issues, especially after I tried to merge the Skeleton-based home page (Skeleton: Responsive CSS Boilerplate) with the Hugo theme, still keeps giving me issues (ordered/unordered lists, code blocks, etc), but that’s on me, not Hugo. ↩︎

  6. The grouping of separate posts under the same Day is done by Hugo through a template I wrote, described in part here (note the name!): 211108-1405 Hugo create shortcode or template for Day - serhii.net.
    The final list.html template result looks like this (note that both are under the same “Day 1065” header):
    A single individual post looks like this:  ↩︎

  7. Even if the link dies ↩︎

02 Dec 2021

My journey in PKM, Part 1: things I tried

3037 words, ~12 min read

Intro

Hi! Welcome to my take on Personal Knowledge Management (PKM).

I’ll describe the things I tried and lessons I learned trying to save stuff such as links, quotes, code snippets, ideas, book notes, meeting minutes and ideas from conversations I had with people, for the last 10 years. I won’t touch the related (but just as interesting to me) topics of productivity, time management, and task management.

I was planning to make this a short post, but it became unexpectedly large, and I split it into two parts.

Part 1 (this post) will be about things I tried in the past and why I stopped using them, along with what they taught me about my requirements for a PKM system.
Part 2 will be a description of the current iteration.

There may be a bias towards learning in public, text-based and self-hosted things, because I like those things and the post is about my experiences :)

TL;DR: Tried a lot of stuff, My criteria for a PKM system. Look at “Part 2” for my post about what worked at the end, spoiler: one long text file for randomness, Obsidian for notes, Hugo to convert part of it to my public blog.

Quick background and basics

Personal knowledge management (PKM)

Personal knowledge management is “a process of collecting information that a person uses to gather, classify, store, search, retrieve and share knowledge in their daily activities”. 1

Different ways to store different data

You’d likely do something different based on what you’re storing and why. Think of different example scenarios:

What kind of information you’re storing

  • Simple info
    • “London is the capital of Great Britain”
    • “To run Tensorflow 1.2.3b on my Nvidia GPU x234 I needed CUDA v.10.3 and driver version 412.3”
  • Info you might need later, but probably won’t need or be able to remember it specifically:
    • DVC is an open-source VCS for ML projects that would be cool to use sometime”
    • This long-long paper I want to want to be interested in and will definitely read later
  • Personal stuff
    • “Doctor’s apt. 12.02.2022 at 10:00, don’t eat anything beforehand, drinking is fine. Dr. Max Mustermann, Whateverstr. 23 +4915255232148”
    • Things I promised to do during the last meeting
    • Lists of ideas of gifts for people, or debts
  • .. Anything
    • A quote or something funny:
      I, on the date: Are you, what do you think about Google Translation?
      Date: I think he is an excellent tool for communicating with strangers! Now, no need to learn a foreign language!
      2

How will you look for it

  • You’ll want that specific fact (“When was my appointment?..”)
  • “You need something for ML version control? I sometimes save cool links about open source stuff, there were definitely some projects for version control, one sec I’ll find it…”
  • You won’t:
    • … because it’s trivial to Google, not worth the effort to write it down (“London is …”)
    • … because you’re only saving it to feel good and “not lose it”, you know you won’t ever read it or even remember it. 3

How will you access it?

  • Is it okay if it exists only as a post-it on the fridge at home?
    • “Honey, you at home today? Could you please take a picture of the paper near my…”
  • You can’t Ctrl+F on a paper notebook
  • You can’t Ctrl+F on a phone that drowned in a river

How often will you need it?

There’s an XXCD for everything4: Is It Worth the Time?

If it’s easily googleable and you’re not anticipating to need it often, it may not be worth the time to save. Generally, the more often you need this information, the fewer clicks and time should be required to access it.

Think of your target audience

“Personal” is not just about information, but also the process itself.

You are the person you care about, you are the only user, adapt it maximally to your own needs and the way your memory works.

There are people who just remember stuff.
There are people who don’t remember stuff but remember where to find it.
There are people who don’t remember stuff, where to find it, but remember what it was called and can search for it.
In my case, I don’t remember anything BUT I can create systems that allow to reconstruct the missing pieces.

There are people who are fine with carrying stuff on a USB stick and copying the latest version of the data to each device they touch, there are people who will spend 5 days automating this instead.

You get the idea.

My opinions here come from my own needs, and it took years for me to figure out my needs, and they keep changing too. It’s very likely you care about completely different stuff.

My journey

Paper, browser bookmarks, then I had a Chrome add-on which opened a small text field to paste notes there.

Then started the era of del.icio.us

1. “Social bookmarking” websites

You add your links there, probably through an addon or bookmarklet, optionally tag them, they are saved somewhere “in the cloud” and optionally public.

Del.icio.us

Delicious was awesome. You could save links, add any tags you like, browse them etc. You could also export your bookmarks in standard formats.

But the magic came from the “social” part of it: you could see which tags were popular for your link if it has been posted already, search other’s links, etc. It worked very well as a search engine, you’d get a much cleaner signal coming from real people, not SEO (especially for things like “Free hosting”).

Then after being sold multiple times and service quality degrading, it finally died. It’s death (and Google Reader’s) were the beginnings of my love for open source and self-hosted stuff, especially for things I depend on.

The current best replacement of it is “Pinboard — Social-bookmarking for introverts”. It’s paid, no-nonsense, has mostly similar features. But the last time I checked it was run completely by one single individual, raising exactly the same doubts for me.

Lessons learned

This story taught me that I want to be in control of my data. It has to be easily exportable to common formats, ideally in an automatizable way (or live locally, or be self-hosted). 5

If I also want stability. Even if I can get my data out, I probably built a workflow based on a specific program/service and converting, re-importing, re-building all of this is painful. Not everything is under our control, but some companies have a better track record than others. Having clear monetization strategy helps here.

This is also relevant for open source stuff: if the project dies, I’m not going to support the codebase myself. I now try to do some basic research about the projects I use, and do monthly donations to projects that add a lot of value to my life.

That was the time when I created my first “real” personal website (shmt.pp.ua), at a certain point with a blog for random interesting stuff.

First I saved links as a long page, then through a Wordpress extension, at the end a separate WordPress installation whose only goal was to keep my links.

The “wordpress extension” phase looked like this:

This gave me much more flexibility. Text/categories/descriptions, links between the posts, or posts containing multiple links about the same things, etc etc etc.

Taxonomy blues

That’s when I learned that taxonomies are hard. I’m not thinking philosophy here, just about what will make sense when looking up stuff later on.

  • What should become a tag, what should become a category?
  • Does this belong in category “Tutorial” or “Tutorials”?
  • Did I tag the other similar links “ML” or “Machine learning”? “Coding” or “Programming”?
  • Does “ML” automatically imply “IT” or it’s better to add “IT” too, for good measure?
  • Do things like “Wikipedia” merit their own category or tag?6
  • Just how much should I add to each link, given that each entity can be described as belonging to basically an infinite number of categories?

How do I keep it dynamic but still consistent, so that I don’t have to look anything up when tagging, don’t end up with duplicate tags, can easily and reliably know which tags to use when looking up stuff, and will never have to manually re-tag a lot of pages?

Information vs data vs knowledge

There was and old metaphor about data being a pile of bricks, information being a house.

Saving/tagging/categorizing links is good, but at a certain point I noticed that I’m not stopping at that anymore. Having a blog meant I could add text to posts - I was adding short descriptions / summaries, conceptualizing it by adding links to other relevant places, creating pages that are actually lists of resources on a specific topic.

This made the info more valuable by itself, but then I realized that it actually helps to remember stuff.

It’s like writing by hand instead of copypasting - once you formulate it in your own words, remove the unneeded parts, distill it to what you care about you already interacted with the source material a bit more and probably memorized part of it already.

Lessons learned

  • Thinking about categories/tags is hard to do but needs to be done, otherwise you’ll end up with an unusable mess with duplicate categories and tags
  • Links alone are good, but to make the most out of it you should have a place for summaries, links to other pages, things not neatly fitting the “one page = one link” concept.

Unmet needs

I was using tags/categories for different things:

  • topics (“Programming”, “Design”)
  • how much I like it (“Good”, “Awesome”)
  • sometimes - where does it come from (wikipedia etc)
  • medium - is it a blog post, is it a website, is it an ebook?

And I had no easy way to use AND/OR in queries, so it was either looking for “IT stuff” OR for “stuff I really liked”.

I wanted a more flexible taxonomy and run advanced queries over it. Something like “search for all the links about ‘Psychology’ except wikipedia articles”.

The next step was a personal wiki, then an overly-complex Semantic Mediawiki.

3. Personal wikis

Personal wikis are a thing, and there are infinite variations here too. I’d assume most aren’t open to the internet, but there are some public ones (for example YourcmcWiki, in Russian).7

There are a lot of engines, from the venerable MediaWiki to smaller/leaner things like dokuwiki [DokuWiki] etc.

Using a wiki also means we can deal with complex information much better - longer pages, inter-links, upload pictures and bigger attachments (.pdf books for example!), etc. You can add descriptions to category pages, you can see stuff like “what links here”, etc.

My own (still existing) wiki

My own personal wiki lives here. It was the main place I organised my links and resources for the last 5 years (though it’s mostly abandoned the least year or so). Of course I wrote a post here about it (in Russian).

Looks/looked like this8:

Home page
Single link page
.

For the “define your own attributes and run complex searches” part I installed Semantic Mediawiki, which allows to define custom attributes and semantic connections between pages.

For example, you can set [London] HAS_POPULATION 400000 or [London] IS_A [City], then query for “Cities with population over 3000”. Just what I wanted.

Now that I could define my own attributes, nothing could stop me.

I used it as a standard PKM wiki with additional bits for the pages representing links.

Standard PKM was simple: I just added the text I want to save in the pages.

Pages representing links were more involved. Each link-page had the following attributes:

  • URI (l)
  • title/name (n)
  • rating (how much I liked it or expect to like it) (r)
  • complexity (how much mental effort does it require) (c)
  • tags (t)

Then since it’s still a normal wiki page, it could belong to categories and it had place for free-form text that I used for summaries (for example, see this page: https://www.serhii.net/f/index.php/Quantifying_Productivity).

Now I finally had built a system exactly the way I wanted it.

Hi link wiki, I’m bored, give me some easy articles about programming I wanted to read.

I go to Special:Ask, then: Query:

[[Category:To read]]
[[Category:IT]]
[[c::<<7]]

Printout (show columns “complexity” and “link”):

?C
?L

Results:

Search results could be returned in various formats (like RSS/JSON/…). The RSS feed of the latest links I liked (rating 8+) was shown on my home page. 9 I once used it to write a simple website where you click on a big red button and it took you to a random link from the wiki.

Good times.

Unmet needs

Then what went wrong?

Friction

A lot of things were stopping me, different ones, but all made the thing not fun to use.

Adding stuff to it took either many steps, or many scripts, I of course chose the second option.

My original post about it goes into painful detail about the process.

Short version: setting the page attributes look like this and is painful to type:

[[Link::http://what.ever]]
[[Name::Link title]]

I wrote a number of scripts that (when run on a page I want to save) open the browser window (through a mediawiki template), pre-fill the URI and title, I add the rest:

https://www.pchr8.net/d/dtb/
Diensttagebuch - A purely technical blog about things I did on particular days, for future reference and search.
5


tag1, tag tag2, tag3

Cat1
Cat2
And a category with space

Then a VIM macro transforms it into this, which becomes the final content of the page:

{{B|https://www.pchr8.net/d/dtb/
|Diensttagebuch - A purely technical blog about things I did on particular days, for future reference and search.
|5
|6
}}
{{#set:
k=tag1, tag tag2, tag3
|+sep=, }}

[[Category: Cat1]]
[[Category: Cat2]]
[[Category: And a category with space]]

B is another mediawiki template I wrote (source here). It sets the SMW parameters (or uses the defaults) + makes the rendered page look nice.

I had keybindings for all this and it was fast, and the rating and complexity were optional and defaulted to 5, but I still had to enter the tags and categories and then wait for it to save to see if it worked.

Slow feedback loops

Tags and category names had to be typed manually and you’d get no feedback until you publish/preview. So:

  • you had to remember them (or look them up)
  • If you made an error, it’d quietly create that tag/category. That’s why I had “Tutorial” and “Tutorials”, for example. 10 My convention of “Categories are plural, tags singular” helped but not too much.
  • Only syntax errors were loud but also only at the very end.

When running, it was slower that I’d have wanted. Of course, it’s a webapp running on a cheap server, but even moving it locally wouldn’t have helped much. This added to the frustration.

Mantaining it

Even when not used, it created problems. Upgrading it, backing it up, moving it was painful and involved SQL databases, read/write permissions in PHP scripts, etc. Migration scripts were often broken, you’d have to re-import and rebuild the database, then find out that some extensions didn’t work etc. Not-upgrading it is a bad idea security-wise11 and if it gets too old your provider stops supporting the PHP/MariaDB versions of everything.

Availability

Corollary of the above, but: If something goes wrong, I can’t easily access that information. If my host goes down, I may have backups locally, but I won’t be able to access the info until I set up an entire LAMP stack and restore it there.

Without noticing or planning to, I moved to a simpler system.

Lessons learned

  • Adding information has to be fast and require few steps
  • The thing has to require very little maintenance to keep it alive
  • The thing has to be future-proof: info should be readable on some level even without the thing that created them being available

My criteria for a PKM system

The tales above point to a nice list of criteria that are important for me:

  • Data storage:
    • The data’s main location shouldn’t be a webservice. Ideally I should control both the data and the tools needed.
    • The data should live in a future-proof format, readable even without the tools
  • It has to require little upkeep/maintenance
  • Should be flexible and the data it gets and support:
    • Not just links, but also pictures/files etc
    • free-form text for manual summaries of the items saved
  • Taxonomy:
    • Ideally as flexible as possible, ability to add own attributes
    • Ability to use complex queries when searching
    • Quick feedback for errors or autocomplete for tags/categories
  • Usability:
    • Adding stuff it should be really fast and friction-free. If it takes time and effort to add new info to it you won’t do it often.
    • Both loading times and number of steps should be very very small

My next post will be about the next step and the system I’m using now, that I’m very happy with. Thanks for reading!


  1. Personal knowledge management - Wikipedia ↩︎

  2. http://allthingslinguistic.com/ ↩︎

  3. this is the story of 70% of my saved links. I don’t want to read it now, I don’t want to lose it by closing the tab, so either it’s in limbo with the other 100+ open tabs, or it goes to a category like “read later” with a single tag “interesting”. ↩︎

  4. xkcd: Is It Worth the Time? ↩︎

  5. Exporting stuff though manual steps is tedious and easily forgettable. And the webservice can randomly stop allowing that, like Goodreads did, or you can lose access to your account. ↩︎

  6. (At the end I decided that yes, because when looking for it I remember it was on Wikipedia and this helps to narrow it down.) ↩︎

  7. I had a lot of them saved in my links, but all except the above are down now. Link rot is another threat and steps can be taken to mitigate it: Archiving URLs · Gwern.net ↩︎

  8. Made some more screenshots just for fun, the link wiki is going down pretty soon, as soon as get to moving it to something static.  ↩︎

  9. Looked like this:  ↩︎

  10.  ↩︎

  11. (this is why I got rid of Wordpress) ↩︎

29 Nov 2021

Attempting to parse Obsidian tags with Templater templates

1504 words, ~6 min read

Obsidian

After more than a month of use, I’m still totally completely absolutely in love with Obsidian.

The standard scenario for any new technology I get excited about is something like

  1. Discover something really cool
  2. Read the entire Internet about it
  3. Try to use it to solve all my problems, to see what sticks
  4. After a week or so, either I stop using it completely, or I keep using it for a narrow use-case. I consider the latter a success.

I think this is the first time the opposite happened: I started to play with Obsidian as a way to quickly sync notes between my computer and phone (better than one-person Telegram groups or Nextcloud or Joplin or…), then started using it to write the Diensttagebuch, then realized I can drag-n-drop pictures/PDFs into it and can use it to keep my vaccination certificate and other stuff I need often on my phone, then oh nice it’s also a markdown editor, and we’re not done yet.

I’d usually avoid closed-source solutions, but it has everything I could ask for except that:

  • a really active community, with blog posts being written, repositories, plugins etc being constantly developed by very different people
  • notes being stored markdown, which then can be version-controlled and edited using any of my existing tools
    • this is much better than being able to “export” them to markdown, one less step to do (or forget, or easily disable). Fits seamlessly into the backup strategies being used.
  • Downloadable program that works even without an Internet connection, even if Obsidian HQ gets hit by a meteorite
  • Obsidian themselves having paid options1, which means a chance, clear plan and incentive to survive, and clear ways to support them. Better than whatever I’d be able to do with an abandoned open source project I rely on. (That said, I’d love them to open source at least the client at some point.)

This mix between personal-and-not-personal stuff, and having both my phone and my laptop as first-class citizens, is something I’ve never had before, and something I like, then if I also try to make it into my published blog I’m bound to find edge cases, one of them being tags. That said until now, and including this bit, everything I tried to do worked seamlessly.

This post describes my attempt to set up tags in a way that both Obsidian’s native autocompletion/search AND Hugo’s tagging work.

Two types of tags

This blog is written in markdown and converted into a static website with Hugo. Both the Diensttagebuch and the journal take files from specific subfolders in a specific Obsidian vault, and get converted into Hugo-friendly markdown using Obyde.

There are two kinds of tags as a result of that:

  • Obsidian’s #tags in the body of the text. They are the main kind supported, they get autocompleted, various #tag/subtag options can happen, etc. They get ignored by obyde/Hugo during conversion.
  • Front matter tags. They look like this in yaml/obsidian:
    Obsidian metadata
    They are parsed by Obsidian, as in searching by them works, but adding them manually is painful and has no autocompletion. One needs to set the ‘metadata’ to be shown in settings for them to be displayed.
    They are the only ones understood by Obyde/Hugo, though.

I decided to write something that takes care of this for me easily.

Obsidian templates and Templater

Logical first step was Templater, which is a plugin for Obsidian I already use for my templating needs, such as generating a YAML frontmatter based only on a filename (see Day 1021).

I wanted:

  • obsidian’s #tags to become part of the yaml frontmatter
  • optionally - adding a line at the end of the file, like “Tags: #one #two #three” with the tags found in the frontmatter but not in the body.

I found a template2 doing pretty much this in the Template Showcase. It uses purely Obsidian’s/Templater’s JS/Templating language and is very close to what I want - but not exactly, and somehow I didn’t want to write more Javascript than needed.

My solution is more of a hack, less portable, and uses Python, because that’s what I know how to write best.

My solution

Python script to parse/add the tags to frontmatter

I wrote a (quick-n-dirty) Python script that:

  • gets the tags from the frontmatter of the input .md file
  • gets the tags found by Obsidian from an environment variable
  • finds tags found by obsidian but not in frontmatter
  • rewrites the .md file with all the tags added to the frontmatter.
from frontmatter import Frontmatter
from pathlib import Path
import os
import argparse
import yaml

ENV_VAR_TAGS = 'tags'
TAGS_LINE = "\nTags: "
IGNORE_TAGS = {"zc"}
TAGS_TO_LOWER = True

def get_args() -> argparse.Namespace:
  parser = argparse.ArgumentParser(description='Remove tags')
  parser.add_argument('--input_file', type=Path, help='Input file')
  parser.add_argument('--print', default=False, action="store_true", help='if set, will print to screen instead of rewriting the input file')
  parser.add_argument('--add_new_tagline', default=False, action="store_true", help='if set, will create/edit a "Tags: " line at the end of the file with tags found in front matter but not text body')
  return parser.parse_args()


def str_tags_to_set(tags: str) -> set:
  """
  Converts tags like "#one,#two,#three" into a set
  of string tags without the "#"s:
    {'one', 'two', 'three'}
  """
  def parse_tag(tag: str):
    ret_tag = tag.lower() if TAGS_TO_LOWER else tag
    return ret_tag[1:]

  return_set = set([parse_tag(x) for x in tags.split(",")])
  return return_set

def set_tags_to_str(tags: set, ignore_tags: set = IGNORE_TAGS) -> str:
  """
  The opposite of str_tags_to_set, returns space-separated "#tag1 #tag, ..".
  Ignores tags that contain even part of any ignore_tags.
  """

  final_tags = ''
  for tag in tags:
    for i in ignore_tags:
      if i in tag:
        continue
    if TAGS_TO_LOWER:
      tag: str = tag.lower()
    final_tags+=f"#{tag} "
  return final_tags

def line_is_tag_line(line: str) -> bool:
  return line[0:len(TAGS_LINE)] == TAGS_LINE

def get_tags_in_tagline(tagline: str) -> set:
  words = tagline.split(" ")
  return {w for w in words if w[0]=="#"}

def main() -> None:
  args = get_args()
  input_file = args.input_file

  # input tags
  tags_frontmatter = set()
  tags_all = set()
  tags_obs = set()

  # output tags
  missing_obs_tags = set()
  missing_yaml_tags = set()

  parsed_yaml_fm = Frontmatter.read_file(input_file)
  frontmatter_dict = parsed_yaml_fm['attributes']
  post_body = parsed_yaml_fm['body']

  has_tags_in_fm = 'tags' in frontmatter_dict

  # all tags (yaml + #obsidian)
  env_tags_by_obsidian = os.getenv(ENV_VAR_TAGS)
  tags_all = str_tags_to_set(env_tags_by_obsidian)

  # tags in yaml frontmatter 
  tags_frontmatter = set()
  if has_tags_in_fm:
    tags_frontmatter = set(frontmatter_dict['tags'])

  # "obsidian" tags (basically #tags in the text)
  tags_obs = tags_all.difference(tags_frontmatter)

  # print(f"{input_file}: \n\
  #     all_tags: {tags_all}\n \
  #     obs_tags: {tags_obs}\n \
  #     fm_tags: {tags_frontmatter}\n"
  #     )

  # tags found in frontmatter but not in #obsidian
  missing_obs_tags = tags_frontmatter.difference(tags_obs)
  # #obsidian tags not found in frontmatter
  missing_fm_tags = tags_obs.difference(tags_frontmatter)

  if missing_fm_tags:
    if not has_tags_in_fm:
      frontmatter_dict['tags'] = list()
    frontmatter_dict['tags'].extend(missing_fm_tags)

  if missing_obs_tags and args.add_new_tagline:
    final_tags = set_tags_to_str(missing_obs_tags)

    # If last line is "Tags: "
    last_line = post_body.splitlines()[-1]
    if line_is_tag_line(last_line):
      # tags_in_tl = get_tags_in_tagline(last_line)
      # Remove last "\n" in post body
      post_body = post_body[:-1]
      # Add the missing tags to the last line
      post_body += " " + final_tags + "\n"
    else:
      # If we have no "Tags: " line, we add one
      final_string = TAGS_LINE + final_tags
      post_body+=final_string

  new_fm_as_str = "---\n" + yaml.dump(frontmatter_dict)  + "\n---"
  final_file_content = new_fm_as_str + "\n" + post_body

  # print(final_file_content)
  if args.print:
    print(final_file_content)
  else:
    input_file.write_text(final_file_content)

if __name__ == "__main__":
  main()

Obsidian templates

To use the python file, I added to Templater a “System command user function” 3 add_tags with this code:

python3 _templates/tags/py_add_tags.py --input_file "<% tp.file.path() %>" 

It calls the python file and passes to it the location of the currently edited file.

Then I create the template that calls it:

<% tp.user.add_tags({"tags": tp.file.tags}) %>

tp.file.tags returns all (all) tags found by Obsidian, so #body tags and frontmatter ones.

They get passed to the python script as an environment variable, canonical way to do this as per Templater docu4.

Initially I tried to pass them as parameter, but tp.file.tags passed in the system command user function always returned an empty list.

Usage

I write the text in Obsidian as usual, adding any #body tags I like, then at the end run that template through the hotkey I bound it to (<C-S-a>), done.

Better ways to do this

Problems with this solution:

  • won’t work on Android
  • too many moving parts

Ways to improve it:

  • It’s possible to do this without Python. The template I found2 uses JS to find the editor window, then the text in it, then the YAML node. Though intuitively I like parsing the YAML as YAML more.
  • I wrote it with further automatization in mind, for example running it in deploy.sh so that it parses and edits all the markdown files in one go. This would mean splitting the thing by words, taking care of correctly grouping #tags-with/subtags and not looking inside code blocks etc. Not sure here. I’d still have Obsidian as ultimate source of truth about what it considers a tag and what not.

What now?

This is the first long-ish blog post I’ve written in a while. Feels awesome. Let’s see if I can get this blog started again.

02 Jan 2021

Підсумки 2020

514 words, ~2 min read

Дуже, дуже цікавий рік був :) Аж вау насправді. Цього року, в останні дні 2020, я перебрав усі документи, завів нову папочку для архіву, передивився білети, записи, чеки, і увійшов в 2021 без відчуття хаосу і пилу.

Пишу ці рядки в своїй квартирі, вечором, другого грудня. На душі відносний спокій.

Now playing: David Bowie - Starman

Досягнення року: Перша full-time робота по спеціальності!
Подія року: Я одружився!
Настрій року: Спочатку невизначеність та неясне хвилювання, потім - спокою, оптимізму, тотальної впевненості в своїх ресурсах та майбутньому.1
Зустріч року: AA
Геморой року: Всі пов’язані з коронавірусом питання: юридичні/логістичні/етичні, Einreisebeschränkungen, планування весілля, “чи закінчиться воно все в серпні”, …
Країна року: Німеччина
Місто року: Лейпциг!!! Цього року з трьома окличними знаками!
Слово року: “Антирекорд”
Подорож року: Карпати, можливо. На безриб’ї?..
Веб-сервіс року: https://hckrnews.com/; Worldometer & MDR Sachsen; Amazon, Netflix
Колір року: Той дивний відтінок червоного, який всі якось історично використовують для зображень і інфографіків пов’язаних з вірусом.2
Запах року: Антисептику
Новина року: Вразила ця серія твітів
Книга року: Starfish (Rifters, #1) by Peter Watts; Difficult Conversations by Douglas Stone
Фільм/серіал року: Bojack Horseman, Star Trek (Корона навчила Netflix-у!). Family guy (мені соромно)
Media N.O.S.: 13 Minutes to the Moon (Podcast)
Пісня року: David Bowie - Starman Lyrics - YouTube Король И Шут Кукла Колдуна - YouTube Red Hot Chili Peppers - Californication - Live in Chorzów - YouTube Вальс в Конго — А всё-таки (Маяковский) | Презентация альбома Алексея Краева «Баю-бай», СПб 24.05.15 - YouTube Murka (in English) - YouTube
Жах року: Коронавірус. Як і минулого року, цікаво спостерігати за думками і поведінкою людей
Заклад року: Star Pizza & Pizza Caesar
Напій року: Протеїнові йогурти та молочні напої
Їжа року: Яйця та омлет, місо-суп
Транспорт року: Nextbike!
Бренд року: Nextbike
Ціль на наступний рік:  (a) Отримати папірець про володіння німецькою на рівні С1. (b) Прочитати цілком хоча б одну нормальну книгу (або офіційну документацію) по Пітону та Джаві. (c) Наскільки це можливо, вийти з екосистеми Гугл. Фактично, основне: перевести основний імейл з gmail. Допустимо залишити Google Photos та пошук.
Побажання собі на 2013 2014 2015 2016 2017 2018 2019 2020 2021 рік:

Продовжити сон, спорт, медитацію – ЦЕ ПРАЦЮЄ. (x3)

Read for enjoyment. Менше дивитися муть, менше відволікати себе муттю.

Планувати тижні відповідно до пріоритетів, а потім слідувати цьому плану без вини й не поспішаючи.

Систематично оцінювати свій стан, джерела вини, планування.

Більше читати цікаві мені технічні речі, навіть якщо вони складні. Більше експериментувати з цікавими мені технологіями.

Вчитися ясно передавати свої думки, більше писати.

Минулого року я писав:

Рік буде цікавим, дуже, але сподіваюсь, що буду відпочивати, свідомо давати собі відпочивати. Я багато робив цього року, наступного теж треба буде робити багато всякого, але тут і зараз планую на 2021 зменшити обороти.

Так от.

ЗМЕНШИТИ ОБОРОТИ

(У)


  1. І це найцікавіше, насправді - як тільки з’явилась впевненість в майбутньому, стабільність, покрилися найнижчі рівні пірамідки, то все інше теж дуже покращилось. Я не знав, наскільки мене їла нестабільність з роботою, візою, і тп. ↩︎

  2. Шукав - знайшов: Coronavirus (COVID-19) Color Scheme » Chocolate » SchemeColor.com: Kenyan Copper (#6E1B09), Amaranth Red (#D22C2C), Chinese Orange (#F07249), Ebony (#5D5F5C) and Onyx (#393A3C). ↩︎

21 Jan 2020

Intermezzo - 2

1131 words, ~4 min read

Три истории про Мерзебург

Вот про Мерзебург надо писать на русском языке, на самом деле, хотя нереально объяснить почему.

Сижу за идеально пустым столом комнатки где провел предыдущие 4 года. Вокруг какие-то непонятные бумаги на полу, какие-то ручки, как будто после урагана.

Now playing: Stravinsky - Le sacre du printemps / The Rite of Spring

Господи, сколько же всякого происходило тут за последние 4 года.

Сижу за знакомым столом, который на идеальной высоте, куда идеально ложатся локти. Хотя все вещи кроме общажной мебели отсюда увезены, чудом осталась свечка и спички. Сейчас она горит и пахнет воском, тоже до боли знакомый запах, с точностью до всех нот - конкретно такие свечки и покупал 4 года подряд. И писал на таких листочках А4, тем же почерком, той же рукой.

Candle

Свеча выглядит как будто она догорит сегодня, и это лучшее и самое правильное совпадение этого мира.

Комнатка прошла полный круг - а изменился ли я?

А еще - город где была сфокусирована моя жизнь довольно долгое время. Сейчас тут пустая комната, за окном - темнота, хорошие люди в городе и самом общежитии в общем-то остались, но само нахождение тут как-то просто странно. Очень хороший повод порефлексировать о том, как можно себя чувствовать совершенно чужим в каком-то городе, особенно по вечерам. Помню летние месяцы тут - за окном лето, ты в напрочь пустом общежитии маленького городка восточной Германии, чувство свободы и пустоты, лето, бесконечное лето, лето как состояние. С работой это все будет стираться, и надо пытаться себя учить замечать маленькие детали в изменениях сезонов, иметь хоть какие-то ритуалы связанные с разными порами года, чтоб это не сливалось и чувствовать, к приеру, лето, про-живать, пере-живать сезоны. Постик об этом, отчасти.

Но это все лирика, лирика которая не должна отвлекать нас от того, что на самом деле важно -

Окна

Слева от меня два огромных окна, традиционно жертвы моей любимой темы писать на окнах и давать хорошим людям писать на моих окнах. Очень много этих надписей связаны с вполне конкретными людьми и воспоминаниями.

Все что следует написано очень многими разными почерками и размерами и цветами, кроме левой половины первого окна.

Window

Окно 1, левая половина

Life is a non-0-sum game.

"Nothing exists except atoms 
and empty space. Everything 
else is opinion" - Democritus 
    ____ - - -
 
SIT,  BE STILL AND LISTEN, 
BECAUSE YOU ARE DRUNK 
AND WE'RE ON THE 
EDGE OF THE ROOF 
                - RUMI
    __________

BE A LIGHT UPON YOURSELF.
    ___________
    ___________

I make my own coincidences, 
synchronicities, Luck, 
    and Destiny.

    ____________

Rule your mind,  or it will rule you.

    ____________

Безумие, безумие, безумие.
              (с) М.

 Рисунок роботов, вид сверху. 

Окно 1, правая половина

L'occhio del lupo Amazon

U: ---/---
P: admin123

       __________

Рисунок круга с точкой внутри

Leave tonight 
or live and 
die this way.


padik is where your
    semki shells lie


 Еще одна схема робота, одного,
вид прямо 

 Рисунок слона, подписан Ellina

Antal
Szerb: Reise
im Mondlicht

Это все
часть пути

Now playing: Händel - Sarabande, просто самая сильная извесная мне композиция. Мурашки по коже.

Продолжаю.

Window

Окно 2, левая половина

-- Что мне терять 
на этоп этапе?
-- Этап.

Ойген

Matthew 6:33
    TachibanaPC2998

Wovor laüfst
du weg?

 Непонятный рисунок с квадратиками, кружочками и штрих-пунктиром. 
    
    We were dringking
       with Ukrainians!

    19:01

 Рисунок короны

 Рисунок трех синусоид, суммирующихся в 1 

 Две неразборчивых надписи

6C | 2-3

   Wo bist du?
 Sergej

 Еще одна неразборчивая надпись

Buch "Krabat"
 (↳ O.Preußler)

 Смайлик 

         Логитип BMW 

 Рисунок земли, над ней шар,
вокруг шара концентрические стрелочки
Под ним: "2001"

I fucking like
  weather

сука

SOKOLY
(I.M.T. SMILE)

Окно 2, правая половина


 Большой рисунок 
каббалисткого Древа Жизни,
с буквами на иврите внутри 

10:45 am

Мыло для бульбашек

 Рисунок лица в очках 
Сережа ня :3

"Я тебя щелкну
как семку!"
    (с) Женя

 Рисунок Дао  

25см 
(i) 1:17

 Странный рисунок лошади (?)
перехоящей в ботинок (?) 

   Der kleine Prinz
   ist bei mir! 
    - Yasmin
  
    P.S. 
    lies das 
    Parfüm!

 Рисунок графика
и минимумов в нем 

    PRIMETIME 
         SPIRIT

Он хотел историй
Он ее получит [sic]

HN

GL DF
   ALeX

Инсмут

Тут еще будет уместен этот линк на пост, написанный когда я только-только приехал сюда: Файне місто Мерзбург | Я сам, соломка, чай.

Сложно написать что-то общее про Мерзебург и мое отношение к нему. Если бы писал, то “блеск и нищета” точно бы звучало. Чем-то очень темный город, маленький, по-своему в некотором роде некоторым образом уютный, без лишних претензий. Но все же, темный, давящий, причем давящий с самого начала. Все хорошее, что я мог про него говорить, было скорее стокгольмским синдромом и рационализацией.

Если город маленький, общение с людьми приобретает чуть больше граней. И общение с городом-вообще, где ты знаешь в лицо всех кассирш ближайшего магазина, единственного филиала банка, где четыре года подряд ходишь в одну аптеку и тебя там узнают, и ты узнаешь всех (двух) людей, которых ты там когда-либо видел за прилавком.

Как будто личности, которые часть этого города, имеют более прочную позицию в нем, имеют чуть большее значение. Ты встречаешь дедушку на лавочке, болтаешь с ним - дедушка важен, лавочка важна, озеро, около которого она, тоже важно. Ты не анонимен и лавочка не анонимна. Все имеет больший масштаб и связь между всем сильнее.

Вне этого - если что-то тебя давит, то город беспощаден, и тебе в нем не затеряться и не отвлечься. Сенека что-то писал про то, что постоянные переезды и путешествия – признак беспокойного духа. Мне кажется надо иметь нереально спокойный дух, чтоб мочь долго жить в маленьком городке.

Не Инсмут

А если иметь спокойный дух - условия в принципе идеальные. Маленький универсистет, университет в 50 метров от общежития. 200 метров дальше - спортивный комплекс. Там можно играть в теннис с людьми, которых туда приглашаешь. По дороге туда встречаешь всех. А в тренажерном зале встречаешь местами преподавательницу немецкого языка, местами - ректора, который стоит и ждет своей очереди на тренажер у тебя над душой, что очень неловко всем.

Мерзе это город где к тебе могут просто зайти и пригласить выйти погулять, и ты идешь и просто гуляешь по территории и по Tiergarten, до которого метров 500. Это город где шикарно гуляется ночью. И шикарно разговаривается ночью.

Это город, в котором нереально хорошо видны звезды, все, и ночью можно ходить на них смотреть в кукурузные поля (до которых метров 700). Где есть крыша, на которую можно залазить и оттуда смотреть на затмение.

Это город где ты идешь в магазин за едой и это интересно, и это развлекаловка, и ты резко понимаешь в чем может быть прелесть шоппинга.

Мерзе меня многому научил. От того, как это, когда вокруг у тебя Мерзебург, где мало что происходит, а ты хочешь чего-то интересного - и ты учишься to make your own fun и организовываешь вещи.

Эти 4 год атут были мне очень необходимыми и уместными, продлились ровно столько, сколько нужно, и закончились в идеальное для этого время.

В эти секунды тушится свечка.

Спасибо тебе, свечка, спасибо тебе, столик.

Спасибо тебе, здание 5B.

Спасибо тебе, Мерзебург, спасибо за все.

06 Jan 2020

Підсумки 2019

725 words, ~2 min read

Трошки підзабив на блог цього року. Цікаво, що було причиною. 90% суєта суєт - я відчуваю менше потреби читати, писати, розвиватися, і навколо стало відбуватися трошки більше хаосу. З іншого боку, я став значно більше обмінюватися інформацією зі світом (і людьми) в реальному житті.

Це, швидше за все, добре.

З іншого боку те, що до підсумків 2019 я дійшов в Святвечір 2020 року, є трошки меншим добром. Я відчуваю тотальну перегруженість інформаційним шумом.

У будь-якому випадку пишу ці рядки за своїм столом, у своїй кімнатці в Києві, де все дуже рідне і знайоме. Життя продовжується, але це єдине місце (не місто, не країна, а 20 квадратних метрів) куди мені приємно повертатися, де затишок і де мене оточують знайомі приємні речі.

Так от.

Now playing: Мертвий півень - Я помру від застуди

o/`
Я помру від застуди, наш лазарет
Перебазують кудись на південь
І фронт котитиметься вперед
І саме почнеться квітень

o/`

Досягнення року: Знайшов першу дорослу не-internship роботу яка настільки по спеціальності наскільки взагалі можливо в абсолютно чудовому місці! А ще Я БАКАЛАААВРР (знову). Ще я переміг Mikroprozessortechnik. Відсканував фоточки частини сім’ї за останні 5 поколінь. Рік був цікавим, дуже.
Подія року: 36c3! Хоча насправді не впевнений. Ще є тема, що переїхав в труъ квартиру, ще є тема, що знайшов всі свої старі файли десятирічної давності. Складно.
Настрій року: Перегруженості, робота-яка-займає-більше-вільного-часу-і-енергії-ніж-хотілось-би, is-this-what-feeling-an-adult-feels-like?-а-що-ж-тоді-буде-коли-40-годин-на-тиждень?
Зустріч року: Ммм. Ммммммммм. Складно. Хай або Штефан Б., або Йенс.
Геморой року: Електротехніка ні, цього року Mikroprozessortechnik-а.
Країна року: Німеччина?
Місто року: Лейпциг!
Слово року: Thesis
Подорож року: Синевир! Подорож в самому істинному значенні слова
Веб-сервіс року: https://hckrnews.com/
Колір року: Гранж-сірий, а також, окремо від нього - лікарняно-білий з помітними слідами цвяхів
Запах року: Гвоздики
Новина року: “We are very happy to welcome you at $companyName very soon!”
Книга року: “Cakes&Ale” by Somerset Maugham; “Gomorra” by Roberto Saviano. Судячи з мого профілю в Goodreads, цього року я дочитав цілих дві (2) книжки.
Фільм року: Міміно! А також The Original Star Wars Trilogy (взагалі якщо всі відсортував би як 4-5-6-2-1-9)
Пісня року: Ітак. ІТАК. Цього року в оберненому хронологічному порядку. Joan Baez - Diamonds and Rust; The Balfa Brothers - Parlez Nous A Boire; Ludo - Lake Pontchartrain; Hugh Laurie - Saint James Infirmary (Let Them Talk, A Celebration of New Orleans Blues); Dr Dre - Still в 100500 лайв-виконаннях, наприклад раз і два; Mimino - Chito Grito; Bajaga i Instruktori - Zivot je nekad siv, nekad zut; Melanie - Look What They’ve Done To My Song, Ma; Король И Шут - Кукла Колдуна; Агата Кристи - Сказочная тайга; Biagio Antonacci - Mio fratello ft. Mario Incudine і окремо ця лайв версія; Roberto Vecchioni e Angelo Branduardi - Samarcanda; Окремо Bomani Armah - Read a Book і ця лайв версія; Koutev Bulgarian National Ensemble - Bre Petrunko; Fabrizio De André - Via del campo

o/`
Then give me another word for it
You were so good with words
And at keeping things vague
o/`

Відео/Media N.O.S: SCP Readings by TheVolgun; Bedtime Stories; “The Pill Mills of Florida” у цьому виконанні; + “I’m a search and rescue officer for the US forest service creepypasta” + Missing411 у всіх варіаціях
Жах року: Дебати між кандидатами у президенти. (…та результати виборів).
Заклад року: Mensa am Park
Напій року: Чорний чай Lady Gray, Айран
Їжа року: Омлети з молоком, Червоні спагеті
Транспорт року: Wizzair/Ryanair; S5X
Бренд року: … (якщо і наступного року тут буде пусто приберу з анкетки)
Антилюдина року: -
МріяЦіль на наступний рік:  Дійти до точки коли у мене є відчуття професіоналізму чи кваліфікації, хоч трошки, в МЛ, Пітоні та Джаві. На рівні “не боятися йти на інтерв’ю”.

Побажання собі на 2013 2014 2015 2016 2017 2018 2019 2020 рік: 

Продовжити сон, спорт, медитацію – ЦЕ ПРАЦЮЄ. (x2)

Більше читати художньої літератури та consume better media; Менше читати HN.

Allow myself to feel bored, when I walk on the street just walk on the street.

Систематично дивитися, що є джерелами відчуття вини, та систематично їх прибирати, раз в Х днів. 90% це “не відповів Х” та “давно не звонив У”.

Do some technological downshifting and limit the amount of web/online/IT/not-really-existing stuff I have.

Рік буде цікавим, дуже, але сподіваюсь, що буду відпочивати, свідомо давати собі відпочивати. Я багато робив цього року, наступного теж треба буде робити багато всякого, але тут і зараз планую на 2021 зменшити обороти.

Relax and take stuff a bit easier.

(У)

23 Sep 2019

Intermezzo

1093 words, ~4 min read

Had a long and wonderful vacation, and as it usually happens – I regret not keeping better records of what happened. In general, I feel like I’m losing some touch with my ability to write and to do at least semi-artistic things – and I believe this to be a great loss (for me, not for humanity).

Now playing: Музыка для никого - Агата Кристи (минус на пианино). Currently in the plane and without a connection, so untypically there will be no links.


During this trip home we organized another “we have a projector, make a ~20min presentation about whatever interests you” thing, and it went even better than the first – it’s not hard to get people to talk about stuff they are interested in. And it’s a wonderful way to get exposed to a lot of awesome stuff you didn’t know existed – topics ranged from vaccinations to roleplaying to how to play a flute.

Then I took part in my first D&D game, and it was interesting. Not going to get into it heavily, but it’s fascinating how everything is organized to be playable, and I think I see the appeal of it all. Also it looks 10/10 like something I would love – I’m not really sure why I don’t.

The month leading to it were probably one of the least pleasant of the last couple of years – thesis, very unpleasant uni stuff, a couple of all-nighters I could not properly recover from. My coscience was about as fragmented and stressed-out and burned-out as it gets, I think. So after 3 days at home the best thing happened:

Then I went to a 2 week camping thing in the Karpathians.

Now playing: Летов - все идет по плану

И взагалі мій куточок в Інтернет, маю право на що завгодно – продовження буде українською.

Так от, похід по Карпатах – це було настільки тотальне очищення дуже фрагментованої свідомості. Він був значно ващим ніж заплановано, і днів шість (а заплановано було три дні) треба було просто йти вперед. Навіть по-людськи не було часу годинку відпочити і понасолоджуватися на привалі. Плюс було трошки складно з маршрутом, один траверс який був набагато гірше маркованим у середині ніж його початок збив з дороги десь на день. І рюкзаки були значно важчі ніж було б правильно. І вилилось це все в просто 6 днів нервів але особливо тупо фізичного навантаження. І насправді це те, що, думаю, було особисто мені потрібно.

Now playing: Давайте делать паузы в словах

А, ще були гори, багато гір. Дивишся назад - бачиш прекрасний вид. Проходить 40 хв, знову дивишся - він став ще прекраснішим. І ти бачиш гори-гори-гори яких не бачив раніше. І розумієш, що це саме ти своїми ногами піднявся на цю висоту.

Але чи не основне те, що дав цей похід - це Н днів майже без телефону і без Інтернет у будь-якому вигляді. І найбільшу очистку дало саме це. (Окрема галочка – місця без телефонного звʼязку. Коли ти десь на горі, не бачив ніяких зустрічних туристів дня два, розумієш, що до найближчого місця де зможеш подзвонити йти годин 6.) І відчуваєш тоальну свободу, словами не передати яку. Свобода-пустота-ямогувсе, розумієш що для щастя тобі - конкретно тобі - треба небагато. Що проблеми - це шукати дрова, щоб не змерзнути. Прості древні проблеми. Розумієш, скільки умовностей і абстракцій ти собі постворював в т.н. “реальному” житті, і наскільки те, що відбувається тут з тобою на декілька порядків реальніше.

Відчуваю, що гублю ці увідомленя – навіть зараз, пару тижнів після кінця походу. І це теж у мене було - це все про свободу і т.п. не просвітлення після якого все інакше (я не впевнений, що взагалі вірю у такі просвітлення). Такі усвідомлення треба поновлювати, і речі/події які дають такого плану речі теж потрібно повторювати. Пригадую, що було у собору в Кьольні, що було коло Синевиру, що було під час минулих поїздок автостопом. Записувати це може трошки нагадати, але не дасть той самий afterglow котрий на шкірі і глибший за свідомість.

Now playing: Команда нашего двора - Визбор

Не останнім фактором, мені здається, там була тема чисто фізичних зусиль. Коли ти робиш 140% від того, на що (думаєш) здатен. Доходиш на вершину гори. Бачиш просто вау вид навколо, навіть не робиш спробу сфоткати - все рівно нічого не передати, і чимось це вже порожні для тебе категорії. Максимально стараєшся відчути, про-жити це. В тілі всі ті характерні ендорфіни від фізичної роботи, яка так очищає душу.

А на дворі 12 ранку, і ти розумієш, що тобі ще 2 таких подвига сьогодні. Звʼязку немає і не буде, телефон вимкнений, десь у тебе тренується якась нейромережа, але це так далеко і чимось не-реально. Згадуєш людей з твого реального життя, обличча ніби як зі сну.

І ще важливим було чітке розуміння того, що тобі навіть в чисто фізичному плані не так багато потрібно - в плані їжі, 39 душів в день, чистої голови. І хоча все рівно буду її мити, розуміння що 6 днів підряд можна цього не робити і все буде ОК теж робило все світлішим і простішим, чи що. Типу постворювали собі абстрактні системи і умовності, живемо в цьому гіперреальному світі, вирішуємо проблеми в рамках цієї системи - а так не завжди було і можна інакше. (Не в плані, що це погано, але швидше, що цікаво це бачити – бо контакт з простим і реальним втрачаєш тим більше, чим більше часу не маєш контакту з простим і реальним).

Now playing: Ostatnia prośba wędrownego grajka (та сама “Переведіть мене через майдан” польською).

Коли дійшли до цивілізації ми були раді бачити цивілізацію, все ж.

І друга частина відпочинку була ідеальною – лежали в кроватці, гарно їли у місцевій колибі, ходили до озера, потім поверталися, ad infinitum. Але телефона все одно не сильно включали. (Пригадую наскільки фізично дивно було друкувати щось на телефонній клавіатурі). В перший вечір зʼїли 10 блюд з колиби на двох.

Баноші, деруни з былими грибами, млинці з ягодами, ось це все.

I весь другий тиждень був тотальний-тотальний відпочинок, і фізичний і когнітивний. І цей формат дуже спрацював - і я його використовуватиму у майбутньому. Можливо, зі значно простішим походом, де на тебе не давить необхідність щось робити щосекунди, а просто релакс без телефона, з гамаками, вогнищем, і т.п.

У будь-якому випадку, Київ був гарним і я був дуже радим його бачити.

Повернувся додому, все було нормально. Галочка 1 - фраза “З дороги завжли треба помити руки і вмитися, щоб змити з себе пил і погляди людей”, і фраза друга-єврея одного street performer про те, що “людей нужно удивлять”.


Позже, вероятно, последует похожий постикак о планах на следующий год.

Over and out. (Y)

25 Aug 2019

Daily todo/check-up/review program concept

1977 words, ~7 min read

EDIT: I use a variation of this now, both more simple and more complex, and better integrated with i3. Not sure I’ll ever do a write-up of that, but for now leaving this here for historical reasons I guess?
EDIT-2: Reimplemented this in Obsidian, now I can access it and fill it from all my devices!

This is an idea that has been floating in my head for over 2 years, and currently lives as a series of random spaghetti-Bash-Python scripts, and I think it would be interesting to formalize this in some way and make The One True Script To Rule Them All ©®™.

The main problem I’m trying to solve is the fact that I was never able to integrate any nice habits in my life without getting constantly reminded of them. The solutions/prescriptions are almost the same as in 2014, and every time I read any old notes I’m shocked by how relevant it is (still), and carry on that momentum for the next couple of days until I forget again.

How nice would it be if every morning I could run a script that generates a todo, checklists, and reminders about relevant habits/ideas?

Stephen Wolfram’s home dashboard (pic, from this article about his personal infrastructure) is probably one of the biggest inspirations for this.

(Read More)

26 Mar 2019

Pchr8board - a mirrored left-hand keyboard layout for Dvorak

1055 words, ~4 min read

Pchr8board

Pchr8board is a keyboard layout for Linux based on Randall Munroe’s Mirrorboard idea and implements it in Linux for the Dvorak keyboard layout.

It looks like this:

(Read More)