Sekai ๐ŸŒ ๐Ÿ—บ

Sekai (ไธ–็•Œ) is the kanji for “the world”. That’s a great word because of the scale that it designates.

Combat Procrastination

My notes for a YouTube video about procrastination on one hearing only.

Why?

  1. Boring tasks.

    It’s necessary?

    • Yes: Make it fun.
      • Get a study partner.
      • Find a more energetic time.
    • No: Get rid of it.
  2. Surrounding environment.

    • Identify someone who procrastinates in your circle of influence.
    • Distance yourself from them, or
    • Be aware of what their behavior.
  3. Perfectionism

    • Know about yourself.
    • Reality: nothing can be perfect.

Five strategies against procrastination:

  1. Decompose a huge task into smaller parts.

    [Read More]

GIMP w'ont Start after Ubuntu Distro Upgrade

Problem

After upgrading to Ubuntu 20.04 form 18.04, I wasn’t able to start GIMP 2.10. The message was in the same format as that in a related Ask Ubuntu question, except that the version numbers were greater.

I attempted installing the package gegl, which was irrelavant to the problem.

Analysis

I found the answers mentioning the package libgegl helpful.

$ dpkg -l | grep gegl
ii  gegl                                       0.4.22-3                         
     amd64        Generic Graphics Library Test Program
ii  libgegl-0.4-0:amd64                        1:0.4.18+om-0ubu18.04.18~ppa     
     amd64        Generic Graphics Library
ii  libgegl-common                             1:0.4.18+om-0ubu18.04.18~ppa     
     all          Generic Graphics Library - common files

Despite deletion of ppa:otto-kesselgulasch/gimp by ppa-purge, that leaves a trace in /etc/apt/sources.list.d.

[Read More]
Ubuntu  GIMP 

Recover Mysql Root Password

Just a little linklog to a relevant page on How to Forge. Root privileges are needed.

  1. Stop service: service mysql stop

  2. Start MySQL server w/o password: mysqld_safe --skip-grant-tables &

  3. Connect to CLI client as root: mysql -u root

  4. Reset root password. Here’s the syntax for โ‰ฅv.5.7.6.

    mysql> use mysql;
    mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD("newpass");
    mysql> flush privileges;
    mysql> quit
    
  5. Repeat step 1, or killall mysqld if it doesn’t work. Output can be different on different Linux distro.

    [Read More]
MySQL 

Pandoc LaTeX Mermaid on GitLab CI

Goal

To provide an open-source alternative to the Docker image escalope/pandoc-mermaid-plantuml, whose Dockerfile isn’t available.

The rationale behind these difficult setup is simple: construct informative Mermaid diagram with intuitive Markdown syntax in an open-source and economic way.

This newly constructed Docker image is entirely on GitLab. No Docker Hub account is needed. For sample usage, consult .gitlab-ci.yml in my test project.

Difficulties

  1. issues raghur/mermaid-filter#51 and #52
  2. issue gitlab-org/gitlab-runner#4566

Useful code/articles

  1. time-machine-project/requests-for-comments@470b0c5 Dockerfile
  2. Reduce Docker Image Sizes Using Alpine
  3. Best practices for building docker images with GitLab CI with the accompanying gist
  4. The code block in the highlighted comment in item 2 of the above section
  5. pandoc installation for Docker
  6. Sample Dockerfile for Alpine Linux in the troubleshooting of Puppeteer
  7. sc250024/docker-mermaid-cli@3c9ddb5 src/puppeteerConfigFile.json
  8. raghur/mermaid-filter project README’s section about Puppeteer config file

Site Maintenance for Hugo v0.60

Background

I lacked motivation to keep this tweaked theme up with Hugo’s development after last summer. When I came back yesterday, I saw that some pages using Font Awesome icons were broken. Apart from that, the ToC list level problem resurfaced.

Fixed ToC

The solution that I had adopted no longer worked. Luckily, some users provided a shorter code in the later discussions. The one from user501254 caught me. I first tried to copy his code into the partial layout for ToC. However, nothing changed.

[Read More]
Hugo 

Set up GitHub Actions for Beautiful Jekyll

GitHub Actions provide CI/CD support, which might interest many GitHub users. I’ve applied for this feature a week ago. Luckily, my application for the trial was approved by GitHub. Tonight, I’ve found the motivation for making my first step in my forked repo VincentTam/beautiful-jekyll.

My setup:

  1. Clicked on the “Action” tab of the repo.
  2. Chose the workflow file template for Jekyll.
  3. Added a slash / in front of srv in chmod 777 srv/jekyll, so as to fix the “no such file or directory” error.
  4. Added the parameter repository: {your repo name} in the site config file _config.yml.

The action should be successfully configured.

[Read More]

Customized Archetype for This Site

Background

I prefer including the date into the Permalink of a post. Everytime I create a new post, I type

hugo new post/$(date -I)-post-title.md

to ensure that the date is correct.

Problem

The title field in the post’s front matter contained the date, which wasn’t something that I wanted because it’s already shown next to the icon.

Observations

Neither \d nor [\d] works for the PCRE character class \d.

[Read More]
Hugo 

Icon in Hugo Navbar

Motivation

The original navbar in words took up half of the horizontal spaces of the viewport. I couldn’t add new items like “Tags” to display the tag list.

Work

Thanks to the pre field in Hugo Menus, one can easily add the icon as an HTML element by some editing on the template file.

{{ range .Site.Menus.main.ByWeight }}
  {{ if .HasChildren }}
    <li class="navlinks-container">
      {{ if .Pre }}
        <a class="navlinks-parent" title="{{ .Name }}">{{ .Pre }}</a>
      {{ else }}
        <a class="navlinks-parent">{{ .Name }}</a>
      {{ end }}
      <div class="navlinks-children">
        {{ range .Children }}
          {{ if .Pre }}
            <a title="{{ .Name }}" href="{{ .URL | relLangURL }}">{{ .Pre }}</a>
          {{ else }}
            <a href="{{ .URL  | relLangURL }}">{{ .Name }}</a>
          {{ end }}
        {{ end }}
      </div>
    </li>
  {{ else }}
    <li>
      {{ if .Pre }}
        <a title="{{ .Name }}" href="{{ .URL | relLangURL }}">{{ .Pre }}</a>
      {{ else }}
        <a href="{{ .URL | relLangURL }}">{{ .Name }}</a>
      {{ end }}
    </li>
  {{ end }}
{{ end }}
Hugo  icons  navbar 

Network Interface Name Detection in Conky

Once-off Conky config for network graphs

When one changes connection type (say, from ethernet to Wi-Fi), the interface name changes (e.g. eth0 โ†’ wlan1). To avoid changing Conky config file all the time, here’s a little Lua function for finding the network interface name.

function findInterface()
    local handle = io.popen('ip a | grep "state UP" | cut -d: -f2 | tr -d " "')
    local result = handle:read('*a'):gsub('\n$','')
    handle:close()
    return result
end
  1. ip a gives everything about connection info. Each entry looks like

     3: wlp3s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    
  2. Grep the “state UP” and extract the second field, using : as a delimiter. Trim off the spaces around.

    [Read More]
Conky  Lua 

Staticman Script in Pure JS

Staticman without jQuery

The official Staticman script sample depends on jQuery. I have been using jQuery in my Staticman script for nested comments for more than six months.

Recently, in the new release of Hugo Swift Theme, in which I’m a collaborator, one has removed all jQuery methods at commit f137efa4. Here’s the structure of the script:

  1. auxiliary functions like elem, elems, pushClass, deleteClass, etc.
  2. A self-executing function comments()
    • some necessary local variables
    • handleForm() consisting merely of an event listener handling form submission.
      • formToJSON(form) for converting the comment form to a JSON string.
      • fetch(url, {...}).then(...).catch(...) for submitting a sever request and handling its response. It calls showModal(...) and it contains resetForm().
    • a conditional form ? handleForm(form) : false; to execute the above method provided the existence of the comment form.
    • closeModal() and showModal() for closing and showing the modal respectively.
    • a conditional containsClass(body, show) ? closeModal() : false;.
    • a self-executing toogleForm() function. Nesting a self-executing function inside another one limits the namespace of variables. Even though there’s no new variable defined inside this function, there’s a need to wrap it with parenthesis () because toggleForm() is not called elsewhere, unlike toggleMenu(). If the if(button){...} statement comes out directly, we will not know that it’s doing.