about summary refs log tree commit diff homepage
diff options
context:
space:
mode:
authorNguyễn Gia Phong <mcsinyx@disroot.org>2021-03-07 15:46:35 +0700
committerNguyễn Gia Phong <mcsinyx@disroot.org>2021-03-07 15:46:35 +0700
commit752a020bf54082e8af3c966f4740abf5914ac821 (patch)
tree1e25967db718b62a459e9fe5a6e8022acfb8e7fd
parent6a7f3beea1cd4908a03b38064ee49cdb5b2fe14c (diff)
downloadsite-752a020bf54082e8af3c966f4740abf5914ac821.tar.gz
Migrate work listing page
-rw-r--r--README.md2
-rw-r--r--_assets/add-waiter.png3
-rw-r--r--_assets/axuy.png3
-rw-r--r--_assets/brutalmaze.png3
-rw-r--r--_assets/comp.pngbin0 -> 432312 bytes
-rw-r--r--_assets/favicon.pngbin768 -> 3287 bytes
-rw-r--r--_assets/mathiewd.png3
-rw-r--r--_assets/rndimg.jpgbin18569 -> 0 bytes
-rw-r--r--_css/franklin.css4
-rw-r--r--_layout/header.html12
-rw-r--r--_layout/page_foot.html11
-rw-r--r--config.md8
-rw-r--r--index.md199
-rw-r--r--menu1.md84
-rw-r--r--menu2.md30
-rw-r--r--utils.jl10
-rw-r--r--works.md189
17 files changed, 245 insertions, 316 deletions
diff --git a/README.md b/README.md
index 6da16be..16443a1 100644
--- a/README.md
+++ b/README.md
@@ -26,5 +26,5 @@ plus their own dependencies:
 
 ## Copying
 
-[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)] (https://creativecommons.org/licenses/by-sa/4.0/)
+![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)
 The content of this site is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/).
diff --git a/_assets/add-waiter.png b/_assets/add-waiter.png
new file mode 100644
index 0000000..7371113
--- /dev/null
+++ b/_assets/add-waiter.png
@@ -0,0 +1,3 @@
+--2021-03-07 15:37:07--  https://cdn.pling.com/img//hive/content-pre2/170664-2.png
+Resolving cdn.pling.com (cdn.pling.com)... failed: Temporary failure in name resolution.
+wget: unable to resolve host address ‘cdn.pling.com’
diff --git a/_assets/axuy.png b/_assets/axuy.png
new file mode 100644
index 0000000..bd0a6c5
--- /dev/null
+++ b/_assets/axuy.png
@@ -0,0 +1,3 @@
+--2021-03-07 15:26:12--  https://user-images.githubusercontent.com/13689192/85820832-57455280-b7a1-11ea-84c5-b049abfc2098.png
+Resolving user-images.githubusercontent.com (user-images.githubusercontent.com)... failed: Temporary failure in name resolution.
+wget: unable to resolve host address ‘user-images.githubusercontent.com’
diff --git a/_assets/brutalmaze.png b/_assets/brutalmaze.png
new file mode 100644
index 0000000..9ac1b7d
--- /dev/null
+++ b/_assets/brutalmaze.png
@@ -0,0 +1,3 @@
+--2021-03-07 15:22:38--  https://brutalmaze.rtfd.io/_images/screenshot.png
+Resolving brutalmaze.rtfd.io (brutalmaze.rtfd.io)... failed: Temporary failure in name resolution.
+wget: unable to resolve host address ‘brutalmaze.rtfd.io’
diff --git a/_assets/comp.png b/_assets/comp.png
new file mode 100644
index 0000000..d99db3b
--- /dev/null
+++ b/_assets/comp.png
Binary files differdiff --git a/_assets/favicon.png b/_assets/favicon.png
index 5fcfc95..3415c7d 100644
--- a/_assets/favicon.png
+++ b/_assets/favicon.png
Binary files differdiff --git a/_assets/mathiewd.png b/_assets/mathiewd.png
new file mode 100644
index 0000000..1b1781a
--- /dev/null
+++ b/_assets/mathiewd.png
@@ -0,0 +1,3 @@
+--2021-03-07 15:38:15--  https://cdn.pling.com/img//hive/content-pre2/168712-2.png
+Resolving cdn.pling.com (cdn.pling.com)... failed: Temporary failure in name resolution.
+wget: unable to resolve host address ‘cdn.pling.com’
diff --git a/_assets/rndimg.jpg b/_assets/rndimg.jpg
deleted file mode 100644
index 98be38d..0000000
--- a/_assets/rndimg.jpg
+++ /dev/null
Binary files differdiff --git a/_css/franklin.css b/_css/franklin.css
index 3f5b9db..bb54a1e 100644
--- a/_css/franklin.css
+++ b/_css/franklin.css
@@ -240,9 +240,7 @@ td {
 ================================================================== */
 
 .franklin-content img {
-  width: 70%;
-  text-align: center;
-  padding-left: 10%;
+  width: 100%;
 }
 
 .franklin-content .img-small img {
diff --git a/_layout/header.html b/_layout/header.html
index b3d0f94..31dbaa4 100644
--- a/_layout/header.html
+++ b/_layout/header.html
@@ -1,12 +1,12 @@
 <header>
-<div class="blog-name"><a href="">Basic Template</a></div>
+<div class=blog-name><a href=/>McSinyx</a></div>
 <nav>
   <ul>
-    <li><a href="/">Home</a></li>
-    <li><a href="/menu1/">Code blocks</a></li>
-    <li><a href="/menu2/">More goodies</a></li>
-    <li><a href="/menu3/">Tags</a></li>
+    <li><a href=/>Home</a></li>
+    <li><a href=/works>Works</a></li>
+    <li><a href=/menu2>Life</a></li>
+    <li><a href=/menu3>Tags</a></li>
   </ul>
-  <img src="/assets/hamburger.svg" id="menu-icon">
+  <img src=/assets/hamburger.svg id=menu-icon>
 </nav>
 </header>
diff --git a/_layout/page_foot.html b/_layout/page_foot.html
index 9562d32..d85c41e 100644
--- a/_layout/page_foot.html
+++ b/_layout/page_foot.html
@@ -1,5 +1,10 @@
-<div class="page-foot">
-  <div class="copyright">
-    &copy; {{ fill author }}. {{isnotpage /tag/*}}Last modified: {{ fill fd_mtime }}.{{end}} Website built with <a href="https://github.com/tlienart/Franklin.jl">Franklin.jl</a> and the <a href="https://julialang.org">Julia programming language</a>.
+<div class=page-foot>
+  <div class=copyright>
+    Copyright &copy; 2018-2021 {{fill author}};
+    See <a href=https://creativecommons.org/licenses/by-sa/4.0>license
+    terms</a><br>
+    {{isnotpage /tag/*}}Last modified: {{fill fd_mtime}}<br>{{end}}
+    A website by <a href=https://julialang.org>Julia</a>
+    <a href=https://franklinjl.org>Franklin</a>
   </div>
 </div>
diff --git a/config.md b/config.md
index a2e8e0b..467c139 100644
--- a/config.md
+++ b/config.md
@@ -3,11 +3,11 @@ Add here global page variables to use throughout your
 website.
 The website_* must be defined for the RSS to work
 -->
-@def website_title = "Franklin Template"
-@def website_descr = "Example website using Franklin"
-@def website_url   = "https://tlienart.github.io/FranklinTemplates.jl/"
+@def website_title = "McSinyx"
+@def website_descr = "McSinyx' personal site"
+@def website_url   = "https://cnx.srht.page"
 
-@def author = "Septimia Zenobia"
+@def author = "Nguyễn Gia Phong"
 
 @def mintoclevel = 2
 
diff --git a/index.md b/index.md
index 9ea1970..4275ec1 100644
--- a/index.md
+++ b/index.md
@@ -1,187 +1,22 @@
-@def title = "Franklin Example"
-@def tags = ["syntax", "code"]
+@def title = "McSinyx"
+@def tags = ["whoami", "about"]
 
-# How to use Franklin
+# About Me
 
-\tableofcontents <!-- you can use \toc as well -->
+Hi!  [My name is][] Nguyễn Gia Phong.  I'm a Vietnamese undergrad student
+and a [free software][] enthusiast.  You can find me under my Internet alias
+McSinyx in the [Fediverse][]:
 
-This section is meant as a refresher if you're new to Franklin.
-Have a look at both how the website renders and the corresponding markdown (`index.md`).
-Modify at will to get a feeling for how things work!
+* Matrix: [@McSinyx:matrix.org][]
+* Email: [mcsinyx@disroot.org][]
+* Mastodon: [@mcsinyx@librem.one][]
 
-Ps: if you want to modify the header or footer or the general look of the website, adjust the files in
-* `src/_css/` and
-* `src/_html_parts/`.
+Academically, I am also known as [0000-0003-2336-706X][].
 
-## The base with Markdown
-
-The [standard markdown syntax](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) can be used such as titles using `#`, lists:
-
-* element with **bold**
-* element with _emph_
-
-or code-blocks `inline` or with highlighting (note the `@def hascode = true` in the source to allow [highlight.js](https://highlightjs.org/) to do its job):
-
-```julia
-abstract type Point end
-struct PointR2{T<:Real} <: Point
-    x::T
-    y::T
-end
-struct PointR3{T<:Real} <: Point
-    x::T
-    y::T
-    z::T
-end
-function len(p::T) where T<:Point
-  sqrt(sum(getfield(p, η)^2 for η ∈ fieldnames(T)))
-end
-```
-
-You can also quote stuff
-
-> You must have chaos within you to ...
-
-or have tables:
-
-| English         | Mandarin   |
-| --------------- | ---------- |
-| winnie the pooh | 维尼熊      |
-
-Note that you may have to do a bit of CSS-styling to get these elements to look the way you want them (the same holds for the whole page in fact).
-
-### Symbols and html entities
-
-If you want a dollar sign you have to escape it like so: \$, you can also use html entities like so: &rarr; or &pi; or, if you're using Juno for instance, you can use `\pi[TAB]` to insert the symbol as is: π (it will be converted to a html entity).[^1]
-
-If you want to show a backslash, just use it like so: \ ; if you want to force a line break, use a ` \\ ` like \\ so (this is on a new line).[^blah]
-
-If you want to show a backtick, escape it like so: \` and if you want to show a tick in inline code use double backticks like ``so ` ...``.
-
-Footnotes are nice too:
-
-[^1]: this is the text for the first footnote, you can style all this looking at `.fndef` elements; note that the whole footnote definition is _expected to be on the same line_.
-[^blah]: and this is a longer footnote with some blah from veggie ipsum: turnip greens yarrow ricebean rutabaga endive cauliflower sea lettuce kohlrabi amaranth water spinach avocado daikon napa cabbage asparagus winter purslane kale. Celery potato scallion desert raisin horseradish spinach carrot soko.
-
-## Basic Franklin extensions
-
-### Divs
-
-It is sometimes useful to have a short way to make a part of the page belong to a div so that it can be styled separately.
-You can do this easily with Franklin by using `@@divname ... @@`.
-For instance, you could want a blue background behind some text.
-
-@@colbox-blue
-Here we go! (this is styled in the css sheet with name "colbox-blue").
-@@
-
-Since it's just a `<div>` block, you can put this construction wherever you like and locally style your text.
-
-### LaTeX and Maths
-
-Essentially three things are imitated from LaTeX
-
-1. you can introduce definitions using `\newcommand`
-1. you can use hyper-references with `\eqref`, `\cite`, ...
-1. you can show nice maths (via KaTeX)
-
-The definitions can be introduced in the page or in the `config.md` (in which case they're available everywhere as opposed to just in that page).
-For instance, the commands `\scal` and `\R` are defined in the config file (see `src/config.md`) and can directly be used whereas the command `\E` is defined below (and therefore only available on this page):
-
-\newcommand{\E}[1]{\mathbb E\left[#1\right]}
-
-Now we can write something like
-
-$$  \varphi(\E{X}) \le \E{\varphi(X)}. \label{equation blah} $$
-
-since we've given it the label `\label{equation blah}`, we can refer it like so: \eqref{equation blah} which can be convenient for pages that are math-heavy.
-
-In a similar vein you can cite references that would be at the bottom of the page: \citep{noether15, bezanson17}.
-
-**Note**: the LaTeX commands you define can also incorporate standard markdown (though not in a math environment) so for instance let's define a silly `\bolditalic` command.
-
-\newcommand{\bolditalic}[1]{_**!#1**_} <!--_ ignore this comment, it helps atom to not get confused by the trailing underscore when highlighting the code but is not necessary.-->
-
-and use it \bolditalic{here for example}.
-
-Here's another quick one, a command to change the color:
-
-\newcommand{\col}[2]{~~~<span style="color:#1">#2</span>~~~}
-
-This is \col{blue}{in blue} or \col{#bf37bc}{in #bf37bc}.
-
-### A quick note on whitespaces
-
-For most commands you will use `#k` to refer to the $k$-th argument as in LaTeX.
-In order to reduce headaches, this forcibly introduces a whitespace on the left of whatever is inserted which, usually, changes nothing visible (e.g. in a math settings).
-However there _may be_ situations where you do not want this to happen and you know that the insertion will not clash with anything else.
-In that case, you should simply use `!#k` which will not introduce that whitespace.
-It's probably easier to see this in action:
-
-\newcommand{\pathwith}[1]{`/usr/local/bin/#1`}
-\newcommand{\pathwithout}[1]{`/usr/local/bin/!#1`}
-
-* with: \pathwith{script.jl}, there's a whitespace you don't want 🚫
-* without: \pathwithout{script.jl} here there isn't ✅
-
-### Raw HTML
-
-You can include raw HTML by just surrounding a block with `~~~`.
-Not much more to add.
-This may be useful for local custom layouts like having a photo next to a text in a specific way.
-
-~~~
-<div class="row">
-  <div class="container">
-    <img class="left" src="/assets/rndimg.jpg">
-    <p>
-    Marine iguanas are truly splendid creatures. They're found on the Gálapagos islands, have skin that basically acts as a solar panel, can swim and may have the ability to adapt their body size depending on whether there's food or not.
-    </p>
-    <p>
-    Evolution is cool.
-    </p>
-    <div style="clear: both"></div>      
-  </div>
-</div>
-~~~
-
-**Note 1**: again, entire such blocks can be made into latex-like commands via `\newcommand{\mynewblock}[1]{...}`.
-
-**Note 2**: whatever is in a raw HTML block is *not* further processed (so you can't have LaTeX in there for instance). A partial way around this is to use `@@...` blocks which *will* be recursively parsed. The following code gives the same result as above with the small difference that there is LaTeX being processed in the inner div.
-
-@@row
-@@container
-@@left ![](/assets/rndimg.jpg) @@
-@@
-Marine iguanas are **truly splendid** creatures. They're not found in equations like $\exp(-i\pi)+1$. But they're still quite cool.
-~~~
-<div style="clear: both"></div>
-~~~
-@@
-
-## Pages and structure
-
-Here are a few empty pages connecting to the menu links to show where files can go and the resulting paths. (It's probably best if you look at the source folder for this).
-
-* [menu 1](/menu1/)
-* [menu 2](/menu2/)
-* [menu 3](/menu3/)
-
-## References (not really)
-
-* \biblabel{noether15}{Noether (1915)} **Noether**,  Körper und Systeme rationaler Funktionen, 1915.
-* \biblabel{bezanson17}{Bezanson et al. (2017)} **Bezanson**, **Edelman**, **Karpinski** and **Shah**, [Julia: a fresh approach to numerical computing](https://julialang.org/research/julia-fresh-approach-BEKS.pdf), SIAM review 2017.
-
-## Header and Footer
-
-As you can see here at the bottom of the page, there is a footer which you may want on all pages but for instance you may want the date of last modification to be displayed.
-In a fashion heavily inspired by [Hugo](https://gohugo.io), you can write things like
-
-```html
-Last modified: {{ fill fd_mtime }}.
-```
-
-(cf. `src/_html_parts/page_foot.html`) which will then replace these braces with the content of a dictionary of variables at the key `fd_mtime`.
-This dictionary of variables is accessed locally by pages through `@def varname = value` and globally through the `config.md` page via the same syntax.
-
-There's a few other such functions of the form `{{fname p₁ p₂}}` as well as support for conditional blocks. If you wander through the `src/_html_parts/` folder and its content, you should be able to see those in action.
+[My name is]: https://www.youtube.com/watch?v=LDj8kkVwisY
+[free software]: https://www.gnu.org/philosophy/free-sw.html
+[Fediverse]: https://en.wikipedia.org/wiki/Fediverse
+[@McSinyx:matrix.org]: https://matrix.to/#/@McSinyx:matrix.org
+[mcsinyx@disroot.org]: mailto:mcsinyx@disroot.org
+[@mcsinyx@librem.one]: https://social.librem.one/@mcsinyx
+[0000-0003-2336-706X]: https://orcid.org/0000-0003-2336-706X
diff --git a/menu1.md b/menu1.md
deleted file mode 100644
index e03613b..0000000
--- a/menu1.md
+++ /dev/null
@@ -1,84 +0,0 @@
-+++
-title = "Code blocks"
-hascode = true
-date = Date(2019, 3, 22)
-rss = "A short description of the page which would serve as **blurb** in a `RSS` feed; you can use basic markdown here but the whole description string must be a single line (not a multiline string). Like this one for instance. Keep in mind that styling is minimal in RSS so for instance don't expect maths or fancy styling to work; images should be ok though: ![](https://upload.wikimedia.org/wikipedia/en/3/32/Rick_and_Morty_opening_credits.jpeg)"
-+++
-@def tags = ["syntax", "code"]
-
-# Working with code blocks
-
-\toc
-
-## Live evaluation of code blocks
-
-If you would like to show code as well as what the code outputs, you only need to specify where the script corresponding to the code block will be saved.
-
-Indeed, what happens is that the code block gets saved as a script which then gets executed.
-This also allows for that block to not be re-executed every time you change something _else_ on the page.
-
-Here's a simple example (change values in `a` to see the results being live updated):
-
-```julia:./exdot.jl
-using LinearAlgebra
-a = [1, 2, 3, 3, 4, 5, 2, 2]
-@show dot(a, a)
-println(dot(a, a))
-```
-
-You can now show what this would look like:
-
-\output{./exdot.jl}
-
-**Notes**:
-* you don't have to specify the `.jl` (see below),
-* you do need to explicitly use print statements or `@show` for things to show, so just leaving a variable at the end like you would in the REPL will show nothing,
-* only Julia code blocks are supported at the moment, there may be a support for scripting languages like `R` or `python` in the future,
-* the way you specify the path is important; see [the docs](https://tlienart.github.io/franklindocs/code/index.html#more_on_paths) for more info. If you don't care about how things are structured in your `/assets/` folder, just use `./scriptname.jl`. If you want things to be grouped, use `./group/scriptname.jl`. For more involved uses, see the docs.
-
-Lastly, it's important to realise that if you don't change the content of the code, then that code will only be executed _once_ even if you make multiple changes to the text around it.
-
-Here's another example,
-
-```julia:./code/ex2
-for i ∈ 1:5, j ∈ 1:5
-    print(" ", rpad("*"^i,5), lpad("*"^(6-i),5), j==5 ? "\n" : " "^4)
-end
-```
-
-which gives the (utterly useless):
-
-\output{./code/ex2}
-
-note the absence of `.jl`, it's inferred.
-
-You can also hide lines (that will be executed nonetheless):
-
-```julia:./code/ex3
-using Random
-Random.seed!(1) # hide
-@show randn(2)
-```
-
-\output{./code/ex3}
-
-
-## Including scripts
-
-Another approach is to include the content of a script that has already been executed.
-This can be an alternative to the description above if you'd like to only run the code once because it's particularly slow or because it's not Julia code.
-For this you can use the `\input` command specifying which language it should be tagged as:
-
-
-\input{julia}{/_assets/scripts/script1.jl} <!--_-->
-
-
-these scripts can be run in such a way that their output is also saved to file, see `scripts/generate_results.jl` for instance, and you can then also input the results:
-
-\output{/_assets/scripts/script1.jl} <!--_-->
-
-which is convenient if you're presenting code.
-
-**Note**: paths specification matters, see [the docs](https://tlienart.github.io/franklindocs/code/index.html#more_on_paths) for details.
-
-Using this approach with the `generate_results.jl` file also makes sure that all the code on your website works and that all results match the code which makes maintenance easier.
diff --git a/menu2.md b/menu2.md
index 26e5d65..cbae046 100644
--- a/menu2.md
+++ b/menu2.md
@@ -70,36 +70,6 @@ The former (`hfun_*`) is most likely to be useful.
 
 ### Custom "hfun"
 
-If you define a function `hfun_bar` in the `utils.jl` then you have access to a new template function `{{bar ...}}`. The parameters are passed as a list of strings, for instance variable names but it  could just be strings as well.
-
-For instance:
-
-```julia
-function hfun_bar(vname)
-  val = Meta.parse(vname[1])
-  return round(sqrt(val), digits=2)
-end
-```
-
-~~~
-.hf {background-color:black;color:white;font-weight:bold;}
-~~~
-
-Can be called with `{{bar 4}}`: **{{bar 4}}**.
-
-Usually you will want to pass variable name (either local or global) and collect their value via one of `locvar`, `globvar` or `pagevar` depending on your use case.
-Let's have another toy example:
-
-```julia
-function hfun_m1fill(vname)
-  var = vname[1]
-  return pagevar("menu1", var)
-end
-```
-
-Which you can use like this `{{m1fill title}}`: **{{m1fill title}}**. Of course  in this specific case you could also have used `{{fill title menu1}}`: **{{fill title menu1}}**.
-
-Of course these examples are not very useful, in practice you might want to use it to generate actual HTML in a specific way using Julia code.
 For instance you can use it to customise how [tag pages look like](/menu3/#customising_tag_pages).
 
 A nice example of what you can do is in the [SymbolicUtils.jl manual](https://juliasymbolics.github.io/SymbolicUtils.jl/api/) where they use a `hfun_` to generate HTML encapsulating the content of code docstrings, in a way doing something similar to what Documenter does. See [how they defined it](https://github.com/JuliaSymbolics/SymbolicUtils.jl/blob/website/utils.jl).
diff --git a/utils.jl b/utils.jl
index c3fa6b1..bb8826b 100644
--- a/utils.jl
+++ b/utils.jl
@@ -1,6 +1,10 @@
-function hfun_bar(vname)
-  val = Meta.parse(vname[1])
-  return round(sqrt(val), digits=2)
+using Printf
+
+function hfun_pep(args)
+  postfix = length(args) < 2 ? "" : '#' * args[2]
+  return @sprintf(
+    "<a href=https://www.python.org/dev/peps/pep-%04d%s>PEP %s%s</a>",
+    Meta.parse(args[1]), postfix, args[1], postfix)
 end
 
 function hfun_m1fill(vname)
diff --git a/works.md b/works.md
new file mode 100644
index 0000000..2f1712d
--- /dev/null
+++ b/works.md
@@ -0,0 +1,189 @@
++++
+title = "Free Software Works"
+hascode = true
+rss = "Listing of McSinyx past and current works"
++++
+@def tags = ["software"]
+
+# Free Software Works
+
+\toc
+
+## Applications
+
+### comp
+
+[Curses Omni Media Player][comp] is a [mpv][] front-end using curses.
+
+![comp screenshot](/assets/comp.png)
+
+It has basic media player functions and can to extract playlists
+from multiple sources such as media sites supported by [youtube-dl][],
+local and direct URL to video/audio and its own JSON playlist format.
+
+[comp]: https://pypi.org/project/comp
+[mpv]:  https://mpv.io
+[youtube-dl]: https://youtube-dl.org
+
+### pip
+
+[pip][] is a package installer for Python.  [Summer 2020][],
+I worked as an intern trying improve its new resolver's networking performance.
+The final result was not quite satisfying, but I got to meet some really
+nice and talented people (-;
+
+[pip]: https://pip.pypa.io
+[Summer 2020]: /gsoc2020
+
+## Libraries
+
+### Palace
+
+[Pythonic Audio Library and Codecs Environment][palace] provides
+common higher-level API for audio rendering using OpenAL:
+
+* 3D positional rendering, with [HRTF][] support for stereo systems
+* Environmental effects: reverb, atmospheric air absorption,
+  sound occlusion and obstruction
+* Out-of-the-box codec support: FLAC, MP3, Ogg Vorbis, Opus, WAV, AIFF, etc.
+
+Palace wraps around the C++ interface [alure][] using [Cython][] for a safe and
+convenient interface with type hinting, data descriptors and context managers,
+following {{pep 8 naming-conventions}} (`PascalCase.snake_case`).
+
+[palace]: https://mcsinyx.gitlab.io/palace
+[HRTF]: https://en.wikipedia.org/wiki/Head-related_transfer_function
+[alure]: https://github.com/kcat/alure
+[Cython]: https://cython.org
+
+### Lazip
+
+[Lazip][] is a Python library providing a read-only file-like object
+lazily mapped to a ZIP file over HTTP via range requests.
+
+[Lazip]: https://sr.ht/~cnx/lazip
+
+## Video Games
+
+### Brutal Maze
+
+[Brutal Maze][] is a thrilling shoot ‘em up game with minimalist art style.
+
+![Brutal Maze screenshot](/assets/brutalmaze.png)
+
+The game features a trigon trapped in an infinite maze.  As our hero tries
+to escape, the maze's border turns into aggressive squares trying to stop per.
+Your job is to help the trigon fight against those evil squares and find
+a way out (if there is any).  Be aware that the more get killed,
+the more will show up and our hero will get weaker when wounded.
+
+[Brutal Maze]: https://brutalmaze.rtfd.io
+
+### Axuy
+
+[Axuy][] is a mininalist peer-to-peer first-person shooter.
+
+![Axuy screenshot](/assets/axuy.png)
+
+It is a WIP game for me to experiment with various concepts
+in P2P networking as well as 3D game development.
+
+[Axuy]: https://www.youtube.com/playlist?list=PLAA9fHINq3sayfxEyZSF2D_rMgDZGyL3N
+
+### Slacker
+
+[Slacker][] is a clone/parody of the popular arcade game [Stacker][].
+
+[Slacker]: https://pypi.org/project/slacker-game
+[Stacker]: https://en.wikipedia.org/wiki/Stacker_(arcade_game)
+
+## Plugins
+
+### Vicious
+
+[Vicious][] is a modular widget library for window managers, but mostly catering
+to users of the [awesome window manager][].  It was derived from the old
+*wicked* widget library, and has some of the old *wicked* widget types,
+a few of them rewritten, and a good number of new ones.
+
+Vicious widget types are a framework for creating your own widgets.
+Vicious contains modules that gather data about your system,
+and a few *awesome* helper functions that make it easier to register timers,
+suspend widgets and so on.  Vicious doesn't depend on any third party [Lua][]
+library, but may depend on additional system utilities.
+
+[Vicious]: https://vicious.rtfd.io
+[awesome window manager]: https://awesomewm.org
+[Lua]: https://www.lua.org
+
+### Alful
+
+[Alful][] is a six-line extension making Firefox Quantum open all windows
+in fullscreen to hide the toolbars in windowed mode
+(`full-screen-api.ignore-widgets = true`).  All credits go to tazeat,
+who wrote the original version and suggested the change
+[to achieve the current behavior][alful patch].
+
+[Alful]: https://addons.mozilla.org/en-US/firefox/addon/alful
+[alful patch]: https://github.com/tazeat/AutoFullscreen/issues/4#issuecomment-509723353
+
+### vim-octave
+
+I am maintaining [Octave syntax and indentation support for Vim][vim-octave].
+
+[vim-octave]: https://github.com/McSinyx/vim-octave
+
+## Localizations
+
+### Simplified Vietnamese Keymaps
+
+I am the author of the [simplified Telex and VNI keymaps][tevnex]
+for [Vim][vim-tevnex] and [ibus-table][].
+
+[tevnex]: https://github.com/McSinyx/ibus-table-vietnamese#phương-thức-gõ
+[vim-tevnex]: https://github.com/vim/vim/commit/a02a551
+[ibus-table]: https://github.com/moebiuscurve/ibus-table-others/commit/b6fafd0
+
+### Vietnamese Translation of Flare
+
+I have translated the [Free/Libre Action Roleplaying Engine][flare] \(yep,
+just the engine) to Vietnamese.  The translation of the [Empyrean Campaign][]
+is work in progress---admittedly it does not get enough priority lately.
+
+[flare]: https://flarerpg.org
+[Empyrean Campaign]: https://flarerpg.org/index.php/mods/flare-empyrean
+
+## Themes
+
+### Add-Waiter
+
+Add-Waiter is a [GTK+ 2][add-waiter-gtk2] and [xfwm4][add-waiter-xfwm4] clone
+of the dark variant of the default GTK+ 3 theme [Adwaita][].  It was created
+using screenshots of the original theme on GTK+ 3.16.
+
+![Add-Waiter screenshot](/assets/add-waiter.png)
+
+The theme was released under GPLv2+, although after the redesign
+of openDesktop.org, such information is no longer available on the website.
+
+[add-waiter-gtk2]: https://www.opendesktop.org/p/1078597
+[add-waiter-xfwm4]: https://www.opendesktop.org/p/1016170
+[Adwaita]: https://blogs.gnome.org/mclasen/2014/06/13/a-new-default-theme-for-gtk/
+
+### MathieWD
+
+[MathieWD][] is a flat and clean xfwm4 theme that uses colors from
+the active GTK+ theme.  It is inspired by elementary mathematical symbols.
+
+![MathieWD screenshot](/assets/mathiewd.png)
+
+The theme was released under GPLv2+, although after the redesign of
+openDesktop.org, such information is no longer available on the website.
+
+[MathieWD]: https://www.opendesktop.org/p/1016294
+
+### Miscellaneous
+
+Other themes and configurations are cooperated into my personal [dotfiles][].
+
+[dotfiles]: https://git.sr.ht/~cnx/dotfiles