<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Kisaragi Hiu</title><link>https://kisaragi-hiu.com/</link><description>Recent content on https://kisaragi-hiu.com/</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sat, 02 May 2026 19:21:37 +0900</lastBuildDate><atom:link href="https://kisaragi-hiu.com/index.xml" rel="self" type="application/rss+xml"/><item><title>How to turn an already cloned Git repository into a bare repo with worktrees</title><link>https://kisaragi-hiu.com/git-repo-for-worktree/</link><pubDate>Sat, 02 May 2026 19:21:37 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/git-repo-for-worktree/</guid><description>&lt;p>
Worktrees are &lt;del>useful&lt;/del> essential if you want to multitask on one project. This is becoming common with the use of AI agents, but even when not using agents it is just nicer to be able to essentially checkout many branches at once.&lt;/p>
&lt;p>
The default way of working with &lt;a href="https://git-scm.com/docs/git-worktree">worktrees&lt;/a> is not great though.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>In &lt;code class="verbatim">~/Projects/foo&lt;/code>&lt;/p>
&lt;pre class="example">
git worktree add ../feature1 # create a new checkout at ../feature1 for branch feature1
&lt;/pre>
&lt;/li>
&lt;li>In &lt;code class="verbatim">~/Projects/feature1&lt;/code>
This is the branch &lt;code class="verbatim">feature1&lt;/code> of foo.&lt;/li>
&lt;/ul>
&lt;p>You cannot put worktrees in the project&amp;#39;s own directory because the directory is taken up by the main worktree.&lt;/p></description></item><item><title>Review for December 2025</title><link>https://kisaragi-hiu.com/review-2025-12/</link><pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2025-12/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;ul>
&lt;li>&lt;a href="https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/3381">invent:plasma/plasma-desktop#3381&lt;/a>: In application launchers, put “Add to favorites” next to “Add to desktop”&lt;/li>
&lt;li>(Ongoing) &lt;a href="https://github.com/marzocchi/zsh-notify/pull/103">marzocchi/zsh-notify#103&lt;/a>: Support sending notifications on Linux even if xdotool and wmctrl aren&amp;#39;t present; support focus checking and activating windows on Plasma Wayland&lt;/li>
&lt;li>(Ongoing) &lt;a href="https://github.com/microsoft/TypeScript-Website/pull/3482">microsoft/TypeScript-Website#3482&lt;/a>: Document the JSDoc @overload tag, which I use in&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
My own projects
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;ul>
&lt;li>&lt;a href="https://github.com/kemdict/gettext">@kemdict/gettext&lt;/a>: A node-gettext fork with the goal of allowing me to use gettext-style translations for Kemdict&lt;/li>
&lt;li>I&amp;#39;m in the process of updating Kemdict&amp;#39;s data for the MOE Taiwanese dictionary to the latest released version…&lt;/li>
&lt;li>&lt;a href="https://github.com/kisaragi-hiu/k-gnome-l10n">kisaragi-hiu/k-gnome-l10n&lt;/a>: Like k-kdesvn but for GNOME translations&lt;/li>
&lt;li>&lt;a href="https://github.com/kisaragi-hiu/mastodon">kisaragi-hiu/mastodon&lt;/a>: A GitHub repository for making it easier to preview Taiwanese translations for Mastodon&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-3" class="outline-2">
&lt;h2 id="headline-3">
Translations
&lt;/h2>
&lt;div id="outline-text-headline-3" class="outline-text-2">
&lt;ul>
&lt;li>At least 5 hours for KDE translations: revisions &lt;a href="https://websvn.kde.org/?revision=1724965&amp;amp;view=revision">1724965&lt;/a>, &lt;a href="https://websvn.kde.org/?revision=1725509&amp;amp;view=revision">1725509&lt;/a>, &lt;a href="https://websvn.kde.org/?revision=1725627&amp;amp;view=revision">1725627&lt;/a>, &lt;a href="https://websvn.kde.org/?revision=1725635&amp;amp;view=revision">1725635&lt;/a>&lt;/li>
&lt;li>Translate UserAgent-Switcher to zh_TW (&lt;a href="https://github.com/ray-lothian/UserAgent-Switcher/pull/262">ray-lothian/UserAgent-Switcher#262&lt;/a>)&lt;/li>
&lt;li>Update zh_TW translations for xdg-desktop-portal-gtk (&lt;a href="https://github.com/flatpak/xdg-desktop-portal-gtk/pull/534">flatpak/xdg-desktop-portal-gtk#534&lt;/a>)&lt;/li>
&lt;li>Submitted translations for 3 other GNOME applications for review&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div></description></item><item><title>2026 Resolution</title><link>https://kisaragi-hiu.com/2026-resolution/</link><pubDate>Sun, 28 Dec 2025 23:43:00 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2026-resolution/</guid><description>&lt;p>
I think instead of getting out a half-assed full year review before New Year I&amp;#39;ll just edit and post the resolution I wrote a few days ago.&lt;/p>
&lt;p>
2026 resolution&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Personal
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
Fucking actually graduate NKUST successfully.&lt;/p>
&lt;p>
Stay alive to see the next year.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;p>
Please actually push forward the Firefox Android URL thing again. It&amp;#39;s probably 20 hours of work. &lt;em>Someone&lt;/em> has to do it.&lt;/p></description></item><item><title>A translation discourse response</title><link>https://kisaragi-hiu.com/2025-12-14-a-translation-discourse-response/</link><pubDate>Sun, 14 Dec 2025 21:08:32 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2025-12-14-a-translation-discourse-response/</guid><description>&lt;p>
Here&amp;#39;s a ranty response to &lt;a href="https://breezymove.blogspot.com/2024/10/translation-style-guide-taiwan.html">Tseng-Tsia&amp;#39;s post about zh_TW translation principles&lt;/a>. Sorry. TL;DR user preferred wording ie. realities of Taiwanese Mandarin are more important than principles that we make up. The principles serve our goals of minimizing confusion, consistency, etc., not the other way around. Our principles should not invalidate words that users actually find acceptable, and we should at least care about finding out.&lt;/p>
&lt;hr>
&lt;blockquote>
&lt;p>譯者要注意的是，既有的常見翻譯很有可能是不良翻譯。請先理解原文與概念，再試著用自己的語言說，只有在想不到詞彙能比擬後，才去找已有的中文資料，並將微軟系統譯詞、蘋果系統譯詞、各軟體公司譯詞、樂詞網搜集之譯詞作為最後一道參考。當參考這些資料後，都覺得無法表達出原作的意義，就進入自己發想階段。&lt;/p></description></item><item><title>Review for November 2025</title><link>https://kisaragi-hiu.com/review-2025-11/</link><pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2025-11/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;ul>
&lt;li>&lt;a href="https://github.com/Wilfred/suggest.el/pull/52">Wilfred/suggest.el#52&lt;/a>: Fix extra quote argument to cl-case&lt;/li>
&lt;li>&lt;a href="https://github.com/Wilfred/suggest.el/pull/53">Wilfred/suggest.el#53&lt;/a>: Add suggestion candidates from various issues
There are a few more changes I might want to upstream (-zip-lists or cl-mapcar with list), but I haven&amp;#39;t cleaned them up yet.&lt;/li>
&lt;li>&lt;a href="https://github.com/doomemacs/doomemacs/pull/8581">doomemacs/doomemacs#8581&lt;/a>: Improve first startup speed when using the unicode module&lt;/li>
&lt;li>&lt;a href="https://github.com/doomemacs/doomemacs/pull/8575">doomemacs/doomemacs#8575&lt;/a>: Fix tab-width within Helpful buffers, which should always be 8 for Emacs C code and Emacs Lisp code that use Tab indentation.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
My own projects
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;p>
&lt;a href="https://github.com/kisaragi-hiu/emacs-japanese-kana-input">kisaragi-hiu/emacs-japanese-kana-input&lt;/a>: An attempt to implement かな入力 in Emacs. It works, but it probably doesn&amp;#39;t yet work on JIS keyboards; I bought a new (cheap) Japanese keyboard for the layout and I&amp;#39;m waiting for it to arrive before I can make sure it works on JIS keyboards.&lt;/p></description></item><item><title>Review for October 2025</title><link>https://kisaragi-hiu.com/review-2025-10/</link><pubDate>Mon, 17 Nov 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2025-10/</guid><description>&lt;p>
I&amp;#39;ve skipped many months, but I want to try to get back to this.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;ul>
&lt;li>Deno 2.5.5: Fix Deno&amp;#39;s implementation of os.cpus() erroring on Android or when CPU info isn&amp;#39;t available (&lt;a href="https://github.com/denoland/deno/pull/31097">denoland/deno#31097&lt;/a>). This is, however, unintentionally almost identical to &lt;a href="https://github.com/termux/termux-packages/pull/26981">Termux&amp;#39;s downstream patch&lt;/a>, which I didn&amp;#39;t know existed when I &lt;a href="https://github.com/denoland/deno/issues/25929#issuecomment-3448734941">investigated the issue for myself&lt;/a>. The difference is that I concluded this change should apply to all platforms, since os.cpus() is specified in Node docs and implemented in Node to just return an empty array if it can&amp;#39;t read CPU info.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
My own projects
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;ul>
&lt;li>Moved my command for moving Org headings to files into its own package, &lt;a href="https://github.com/kisaragi-hiu/org-heading-to-file">org-heading-to-file&lt;/a>.&lt;/li>
&lt;li>&lt;a href="https://github.com/kisaragi-hiu/read-timestamp">read-timestamp&lt;/a>, a function that I&amp;#39;ve wanted for a while that allows input of ISO 8601 timestamps with up/down commands, instead of having to type them out manually.&lt;/li>
&lt;li>&lt;a href="https://github.com/kisaragi-hiu/k-kdesvn">k-kdesvn&lt;/a>: implement a &lt;code class="verbatim">clone&lt;/code> subcommand which will set up a new checkout in &lt;a href="2025-07-07-kde-translation-workflow-en.html">my style&lt;/a> (partial SVN checkout from root plus a local Git repository)&lt;/li>
&lt;li>&lt;a href="https://github.com/kisaragi-hiu/cached-fetch">@kisaragi-hiu/cached-fetch&lt;/a>: allow fetcher to return a string or a &lt;code class="verbatim">Promise&amp;lt;string&amp;gt;&lt;/code>, which makes it useful for wrapping &lt;code class="verbatim">spawnSync&lt;/code> calls (&lt;a href="https://github.com/kisaragi-hiu/cached-fetch/commit/736c560f9757546c19e49d65f70ae764a3e2447c">kisaragi-hiu/cached-fetch:736c560f&lt;/a>)&lt;/li>
&lt;li>&lt;a href="https://github.com/kisaragi-hiu/evil-cutlass">evil-cutlass&lt;/a>: Rewrite&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-3" class="outline-2">
&lt;h2 id="headline-3">
Translations
&lt;/h2>
&lt;div id="outline-text-headline-3" class="outline-text-2">
&lt;ul>
&lt;li>Submitted &lt;code class="verbatim">zh_TW&lt;/code> translation to Gpick (&lt;a href="https://github.com/thezbyg/gpick/pull/231">thezbyg/gpick#231&lt;/a>)&lt;/li>
&lt;li>Submitted a bit of translation to KDE (revisions r1719444 and r1720668)&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div></description></item><item><title>Is it faster to (read) Elisp or parse JSON from Emacs?</title><link>https://kisaragi-hiu.com/2025-11-10-read-or-json/</link><pubDate>Mon, 10 Nov 2025 13:28:37 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2025-11-10-read-or-json/</guid><description>&lt;p>
I got curious while working on a project and did a quick test, this is the result.&lt;/p>
&lt;p>
My main point is effectively RPC, so I have control over the production of the data. As such I&amp;#39;m only going to be comparing the parsing speed for a very basic structure.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
How
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
First prepare the basic test file:&lt;/p>
&lt;div class="src src-elisp">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-elisp" data-lang="elisp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">;; /tmp/bench.el&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nb">defun&lt;/span> &lt;span class="nv">generate&lt;/span> &lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nb">require&lt;/span> &lt;span class="ss">&amp;#39;json&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nb">let&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="nf">list&lt;/span> &lt;span class="no">nil&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nb">dotimes&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">i&lt;/span> &lt;span class="mi">10000000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nb">push&lt;/span> &lt;span class="nv">i&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nb">with-temp-file&lt;/span> &lt;span class="s">&amp;#34;10million.el&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nf">insert&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">prin1-to-string&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nb">with-temp-file&lt;/span> &lt;span class="s">&amp;#34;10million.json&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">;; json-serialize wants a vector, so I&amp;#39;ll just use json-encode instead&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">;; …I mean, I could&amp;#39;ve also just done (vconcat nil [])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nf">insert&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">json-encode&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">)))))&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
I was running this in shell instead of running it in my main Emacs instance. So I ran it like this:&lt;/p></description></item><item><title>fusion-mode</title><link>https://kisaragi-hiu.com/projects/fusion-mode/</link><pubDate>Wed, 05 Nov 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/fusion-mode/</guid><description>&lt;p>
A very basic major mode for the Fusion programming language.&lt;/p></description></item><item><title>read-timestamp</title><link>https://kisaragi-hiu.com/projects/read-timestamp/</link><pubDate>Fri, 31 Oct 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/read-timestamp/</guid><description>&lt;p>
Like &lt;a href="https://github.com/haversnail/inquirer-date-prompt">inquirer-date-prompt&lt;/a> but in Emacs and for ISO 8601 timestamps.&lt;/p>
&lt;p>
Use arrows (or hjkl in Evil) to move around components of the timestamp and increase/decrease it.&lt;/p></description></item><item><title>org-heading-to-file</title><link>https://kisaragi-hiu.com/projects/org-heading-to-file/</link><pubDate>Thu, 16 Oct 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/org-heading-to-file/</guid><description>&lt;p>
A command for exporting the current heading to a file in my preference. It&amp;#39;s a core part of my workflow reviewing notes from Simplenote and importing them into my notes archive.&lt;/p></description></item><item><title>astro-org-loader</title><link>https://kisaragi-hiu.com/projects/astro-org-loader/</link><pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/astro-org-loader/</guid><description>&lt;p>
An attempt to make an Astro content loader for Org files.&lt;/p></description></item><item><title>Is Google Font Taigi yet?</title><link>https://kisaragi-hiu.com/google-font-taigi/</link><pubDate>Sun, 28 Sep 2025 22:11:40 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/google-font-taigi/</guid><description>&lt;p>No.&lt;/p>
&lt;p>
Che-sī chi̍t-kóa Tâi-gí ê bûn. Google Fonts ê chi̍t-ē chin tōa ê būn-tê sī, i ē
kā peh-siaⁿ ê jī-goân the̍h-tiāu. (This is some text in Taiwanese. Google Fonts
has a major problem where they remove the character for the 8th tone.)
&lt;/p>
&lt;p>
Chi̍t-ê blog iōng ê jī-thé (Equity) mā bô-hoat-tō͘ piáu-sī peh-siaⁿ,
chhin-chhiūⁿ: (The font used by this blug, Equity, also isn't able to display
the 8th tone, like this:)
&lt;/p></description></item><item><title>Some tips about using Lokalize</title><link>https://kisaragi-hiu.com/blog/2025-09-25-lokalize-tips/</link><pubDate>Thu, 25 Sep 2025 01:01:24 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2025-09-25-lokalize-tips/</guid><description>&lt;p>
There are some useful features in Lokalize that are not quite obvious. Ideally they&amp;#39;d be more obvious, but here&amp;#39;s an attempt to just document them a bit.&lt;/p>
&lt;p>
I think I&amp;#39;ll update this list in the future as I find more of these.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Focusing the translated text field
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
There isn&amp;#39;t currently a command to focus the text edit field. But the functionality is there. Use the &lt;code class="verbatim">Ctrl+l&lt;/code> shortcut (“Focus the search line of Translation Units view”) to focus the filter field; while in the field, &lt;code class="verbatim">Esc&lt;/code> is set up to move the focus back to the edit field for the translated text.&lt;/p></description></item><item><title>How I currently (2025) set up Emacs for C++ and CMake</title><link>https://kisaragi-hiu.com/2025-09-25-emacs-cmake/</link><pubDate>Thu, 25 Sep 2025 00:33:56 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2025-09-25-emacs-cmake/</guid><description>&lt;p>
This is how I currently set up Emacs for C++, as an update to &lt;a href="emacs-cpp-notes.html">Trying to set up Emacs for C++ (2022)&lt;/a>.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Goals
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I&amp;#39;m using Emacs to code for KDE projects, mostly written in C++/Qt.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
Dependencies
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;p>
Clangd as the language server, and lsp-mode as the LSP implementation in Emacs. I don&amp;#39;t use Eglot because last time I used it it didn&amp;#39;t support multiple language servers in one buffer, which is a thing I need.&lt;/p></description></item><item><title>Trying Ghostty (as of 1.1.3; updated for 1.2.3)</title><link>https://kisaragi-hiu.com/blog/2025-08-20-trying-ghostty/</link><pubDate>Wed, 20 Aug 2025 01:37:22 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2025-08-20-trying-ghostty/</guid><description>&lt;p>
My main terminal is usually Alacritty or Konsole, they work fine, but sometimes I feel like exploring other terminals.&lt;/p>
&lt;p>
My main gripe with Alacritty is that it doesn&amp;#39;t have tabs, and having the ability to use one or two tabs is nice. Otherwise it&amp;#39;s a perfectly good terminal.&lt;/p>
&lt;p>
My main issue with Konsole… it&amp;#39;s fine and featureful, but&lt;/p>
&lt;ul>
&lt;li>Perhaps Breeze Dark should&amp;#39;ve been the default window color scheme when the default terminal color scheme is also dark?&lt;/li>
&lt;li>Too many settings are thrown into Profiles. Why exactly should scrollback not have a global setting? Or the option to turn on links?&lt;/li>
&lt;li>The default profile is read-only so you have to clone a new profile and give it a name just to be able to change the above things that arguably shouldn&amp;#39;t have been profile specific in the first place. But it&amp;#39;s been done, and it&amp;#39;s no longer worth it to change it, so the configuration just ends up feeling a little janky.&lt;/li>
&lt;li>Terminal links are off by default. Fine. But they also don&amp;#39;t have hover hints, and you can only see the target of a link after clicking it and getting a prompt. Not so fine. Even Alacritty has this.&lt;/li>
&lt;li>Why is Ctrl-Tab &amp;#34;switch to previously used tab&amp;#34; by default? No one does that by default. I know it&amp;#39;s like Alt-Tab but this is not how other apps with tabs define Ctrl-Tab as by default.&lt;/li>
&lt;/ul>
&lt;p>It&amp;#39;s still alright. But might as well try something else. So this post is to document the last hour or two of configuring and trying out Ghostty.&lt;/p></description></item><item><title>My KDE translation workflow</title><link>https://kisaragi-hiu.com/2025-07-07-kde-translation-workflow-en/</link><pubDate>Mon, 07 Jul 2025 23:46:18 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2025-07-07-kde-translation-workflow-en/</guid><description>&lt;p>
&lt;a href="./2024-01-20-kde-translation-workflow.html">Mandarin version&lt;/a>&lt;/p>
&lt;p>
Thought I might write down my current workflow for contributing to KDE and publish it.&lt;/p>
&lt;p>
&lt;em>Disclaimer: everything written here is &lt;strong>my&lt;/strong> understanding. If anything deviates from how things actually are, blame me for getting the facts wrong.&lt;/em>&lt;/p>
&lt;p>
I&amp;#39;m currently a member of the Traditional Chinese (&lt;code class="verbatim">zh_TW&lt;/code>) translation team for KDE, having gotten commit permissions after the invitation of pan93412. My workflow is therefore built on the assumption that I can directly commit changes to the KDE Subversion repository (after careful checks).&lt;/p></description></item><item><title>k-kdesvn</title><link>https://kisaragi-hiu.com/projects/k-kdesvn/</link><pubDate>Thu, 27 Mar 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/k-kdesvn/</guid><description>&lt;p>
My own automation to manage my checkout of the KDE subversion repository, using Git to track local changes.&lt;/p></description></item><item><title>elpas.kisaragi-hiu.com</title><link>https://kisaragi-hiu.com/projects/elpas/</link><pubDate>Tue, 18 Mar 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/elpas/</guid><description>&lt;p>
Searching across MELPA, GNU ELPA, and NonGNU ELPA at the same time in a browser is basically impossible, and you have to do it within Emacs instead. This aims to change that.&lt;/p></description></item><item><title>Plasma: Avoiding having to type the login password again when first using Git / GPG</title><link>https://kisaragi-hiu.com/blog/2025-03-07-pinentry-kde-wallet/</link><pubDate>Sat, 08 Mar 2025 00:18:16 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2025-03-07-pinentry-kde-wallet/</guid><description>&lt;p>
GnuPG uses Pinentry, which can read from the dbus secret service provider (which KDE Wallet is one). But KDE Wallet has an option to encrypt wallets using GPG, which in this cause would cause a deadlock:&lt;/p>
&lt;ul>
&lt;li>gpg refers to pinentry&lt;/li>
&lt;li>pinentry refers to kwallet&lt;/li>
&lt;li>kwallet refers to gpg&lt;/li>
&lt;/ul>
&lt;p>ArchWiki says this:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Note:&lt;/strong> When using &lt;a href="https://wiki.archlinux.org/title/KDE">KDE&lt;/a>, the Secret Service API integration is disabled to &lt;a href="https://dev.gnupg.org/rPefb6de7fb2c15c1e31349b80fa7c8c1d4694c6cf">prevent a deadlock&lt;/a> in case &lt;a href="https://wiki.archlinux.org/title/KDE_Wallet">KDE Wallet&lt;/a> uses GnuPG encryption. If you use KDE Wallet with the classic, blowfish encrypted file instead, re-enable the Secret Service API integration by setting the &lt;a href="https://wiki.archlinux.org/title/Environment_variable">environment variable&lt;/a> &lt;code class="verbatim">PINENTRY_KDE_USE_WALLET&lt;/code> to a non-empty value.
— &lt;a href="https://wiki.archlinux.org/title/GnuPG#gpg-agent">https://wiki.archlinux.org/title/GnuPG#gpg-agent&lt;/a>&lt;/p></description></item><item><title>我目前偏好使用的 ffmpeg 編碼設定</title><link>https://kisaragi-hiu.com/blog/2025-03-04-current-favorite-ffmpeg-options/</link><pubDate>Tue, 04 Mar 2025 18:37:57 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2025-03-04-current-favorite-ffmpeg-options/</guid><description>&lt;p>
取夠好的品質並且不要浪費空間。假設只有一個音訊跟一個視訊軌。假設音訊是雙聲道。&lt;/p>
&lt;div class="src src-sh">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">ffmpeg -i &lt;span class="s2">&amp;#34;whatever.mov&amp;#34;&lt;/span> -c:a libopus -c:v libx265 -crf &lt;span class="m">23&lt;/span> -r &lt;span class="m">60&lt;/span> &lt;span class="s2">&amp;#34;out.mkv&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>用 opus 音訊編碼然後用預設設定，它是夠好的&lt;/li>
&lt;li>包裝用 mkv，印象中它比較不挑編碼&lt;/li>
&lt;li>影片用 hevc / h265，然後用 crf 23，也是我偏好的平衡&lt;/li>
&lt;li>需要改影格率的話放在輸出前面。我讀說明文件的印象是只有極少數情況才會需要指定輸入影格率。&lt;/li>
&lt;/ul>
&lt;p>也可以用硬體加速，不過因為 crf 是 libx265 的功能所以沒辦法指定 crf，要用其他指定品質的方式。&lt;/p></description></item><item><title>wei18n-po-conv</title><link>https://kisaragi-hiu.com/projects/wei18n-po-conv/</link><pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/wei18n-po-conv/</guid><description>&lt;p>
Convert WebExtensions API messages.json format to/from Gettext PO files in order to be able to translate them in Lokalize.&lt;/p>
&lt;p>
i18next-gettext-converter also works, but it doesn&amp;#39;t handle the message descriptions.&lt;/p></description></item><item><title>RIME 停用它自己的英數輸入模式</title><link>https://kisaragi-hiu.com/rime-ascii-mode/</link><pubDate>Thu, 16 Jan 2025 23:55:32 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/rime-ascii-mode/</guid><description>&lt;p>
我電腦上習慣用 &lt;a href="https://rime.im/">RIME&lt;/a> 輸入法引擎提供的注音輸入法，但它預設（就像其他注音輸入法一樣）有自己的英數模式。因為系統的輸入法引擎（我是用 fcitx5）也有英文輸入模式，這造成有的時候會在切換回 RIME 之後還是英數模式，打字時有幾秒鐘被卡到的感覺。&lt;/p></description></item><item><title>Review for September 2024</title><link>https://kisaragi-hiu.com/review-2024-09/</link><pubDate>Sat, 04 Jan 2025 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2024-09/</guid><description>&lt;p>
2025-01-04: So it&amp;#39;s been a while since I wrote a “monthly” review. This is partially because I&amp;#39;m again trying to finish my college studies. Nevertheless, I would like to at least publish what I wrote in September.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;ul>
&lt;li>Make @pkgjs/parseargs work on &lt;a href="https://gitlab.gnome.org/GNOME/gjs">gjs&lt;/a> and other runtimes that don&amp;#39;t have &lt;code class="verbatim">global&lt;/code> (understandably, since &lt;code class="verbatim">global&lt;/code> is a Node-specific name) (&lt;a href="https://github.com/pkgjs/parseargs/pull/158">@pkgjs/parseargs#158&lt;/a>). This is the same &lt;code class="verbatim">parseArgs&lt;/code> that went into node:util which strikes an amazing balance between being powerful (named and positional arguments, full types) and being simple (no subcommands, not a whole framework for defining commands).
I wanted this to be able to write a command in gjs, in order to &lt;a href="https://github.com/kisaragi-hiu/glib-date-playground">build an interactive interface for GLib (GTK) date formats&lt;/a> so that I can preview the formats in the strings of elementary OS.&lt;/li>
&lt;li>KDE: Removed an extra separator from System Settings → Font Management (&lt;a href="https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/4701">plasma-workspace!4701&lt;/a>). This page is in need of some overhaul (hopefully without losing features as well), and while poking around to see what I can do I noticed it&amp;#39;s just adding this extra separator.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
My own projects
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;ul>
&lt;li>The previously mentioned &lt;a href="https://github.com/kisaragi-hiu/glib-date-playground">glib-date-playground&lt;/a>. This took about 4 hours.&lt;/li>
&lt;li>I&amp;#39;m building &lt;a href="https://github.com/kisaragi-hiu/nanostores-search-params">nanostores-search-params&lt;/a>, which aims to be sveltekit-search-params or nuqs but usable for Astro.
&lt;em>2025-01-04: I&amp;#39;ve ended up having practically abandoning it.&lt;/em>&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://github.com/kisaragi-hiu/use-license">kisaragi-hiu/use-license&lt;/a>, which is yet another take on a tool to quickly choose a license. My unique take here is that I&amp;#39;m directly reading my license list and text from &lt;a href="https://github.com/spdx/license-list-data/">SPDX&amp;#39;s list&lt;/a>, instead of through another package that needs to be (and isn&amp;#39;t) regularly updated.&lt;/p></description></item><item><title>Review for October 2024 ~ December 2024</title><link>https://kisaragi-hiu.com/review-2024-10-2024-12/</link><pubDate>Sat, 04 Jan 2025 07:02:59 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2024-10-2024-12/</guid><description>&lt;p>
2025-01-04: &lt;a href="review-2024-09.html">Again&lt;/a>, it&amp;#39;s been a while since I updated these.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
There&amp;#39;s like none other than a stalled effort to make a change to the Font Management page in KDE&amp;#39;s System Settings.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
My own projects
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;ul>
&lt;li>(Node) &lt;a href="https://github.com/kisaragi-hiu/vtt-to-text-paragraphs">kisaragi-hiu/vtt-to-text-paragraphs&lt;/a>, a small script utilizing &lt;code class="verbatim">@plussub/srt-vtt-parser&lt;/code> to read a subtitle file and output the subtitles into a text file, split into paragraphs based on the length of pauses&lt;/li>
&lt;li>(Bun) &lt;a href="https://github.com/kisaragi-hiu/thai-numbers-deck">kisaragi-hiu/thai-numbers-deck&lt;/a> An Anki deck for Thai numerals and a script for creating it (utilizing &lt;a href="https://www.npmjs.com/package/anki-apkg-export">npm:anki-apkg-export&lt;/a>)&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-3" class="outline-2">
&lt;h2 id="headline-3">
Translations
&lt;/h2>
&lt;div id="outline-text-headline-3" class="outline-text-2">
&lt;p>
Between September 2024 and December 2024, I successfully provided the rest of elementary OS&amp;#39;s Traditional Chinese translations, although there&amp;#39;s still a fair bit of it that&amp;#39;s waiting for the next release of many elementary apps. This is without any use of generative AI or machine translation — I feel like I kind of need to clarify that. It&amp;#39;s simply about 30 hours of work through &lt;a href="https://apps.kde.org/lokalize/">Lokalize&lt;/a> and some custom tooling to push and pull translations between Weblate and my local checkout.&lt;/p></description></item><item><title>Emacs: turning parsed XML/HTML nodes back into text (encoding/printing/writing it out)</title><link>https://kisaragi-hiu.com/emacs-xml-encode/</link><pubDate>Mon, 23 Dec 2024 16:47:15 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/emacs-xml-encode/</guid><description>&lt;p>
TL;DR you might want &lt;code class="verbatim">shr-dom-print&lt;/code>.&lt;/p>
&lt;hr>
&lt;p>
I wanted to write this down because it&amp;#39;s kind of non-obvious.&lt;/p>
&lt;p>
To parse XML / HTML text into nodes, there are &lt;code class="verbatim">libxml-parse-xml-region&lt;/code> and &lt;code class="verbatim">libxml-parse-html-region&lt;/code> functions which return nodes that can be manipulated with, say, functions from &lt;code class="verbatim">dom.el&lt;/code>. But after you got the right parse tree and want to write it out back into a text with XML tags, neither xml.c nor xml.el offer an option for that.&lt;/p>
&lt;p>
xml.el has an &lt;code class="verbatim">xml-print&lt;/code> function, but it seems to expect a parse tree that strictly follows XML (and fails on text nodes, for instance). This may be no fault of xml.el (my need is more with processing loose XML-ish text; so, basically, SGML).&lt;/p></description></item><item><title>VTT subtitle paragraph splitter</title><link>https://kisaragi-hiu.com/projects/vtt-to-text-paragraphs/</link><pubDate>Tue, 17 Dec 2024 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/vtt-to-text-paragraphs/</guid><description>&lt;p>
Extract text from subtitle files for further analysis.&lt;/p>
&lt;p>
If current start time - previous end time is more than epsilon (default 100ms), an extra newline is added when copying lines over.&lt;/p>
&lt;p>
A simple script built on top of &lt;code class="verbatim">@plussub/srt-vtt-parser&lt;/code>.&lt;/p></description></item><item><title>不會倉頡也能利用倉頡找打不出來的漢字</title><link>https://kisaragi-hiu.com/find-han-character-with-cangjie/</link><pubDate>Wed, 11 Dec 2024 15:35:14 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/find-han-character-with-cangjie/</guid><description>&lt;p>
我之後可能會再修這篇，總之先寫一下。&lt;/p>
&lt;p>
在進行人力文字辨識的時候，有的時候可能會有漢字是不知道讀音或不知道其他打法的。我的做法是這樣的：&lt;/p>
&lt;p>
假設我要打這個字：「苜」，但我不知道怎麽打。我知道倉頡的組字法，但我不記得漢字各種元素對應的倉頡碼。&lt;/p></description></item><item><title>use-license</title><link>https://kisaragi-hiu.com/projects/use-license/</link><pubDate>Sun, 22 Sep 2024 18:02:06 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/use-license/</guid><description>&lt;p>
Yet another license selector. This can be used like this:&lt;/p>
&lt;div class="src src-sh">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">npx use-license MIT &lt;span class="c1"># an SPDX identifier&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
or without an argument to select a license from SPDX. This will then write the selected or specifies license to &lt;code class="verbatim">./LICENSE&lt;/code>.&lt;/p>
&lt;p>
I wrote this because I thought the prior art is too complicated and also need more upkeep than really is necessary. This package fetches directly from &lt;a href="https://github.com/spdx/license-list-data">SPDX&amp;#39;s license list data&lt;/a>, instead of using the &lt;a href="https://github.com/sindresorhus/spdx-license-list">sindresorhus/spdx-license-list package&lt;/a>. My guess is that that package exists perhaps to make SPDX&amp;#39;s license list easier to access.&lt;/p></description></item><item><title>Monthly review for August 2024</title><link>https://kisaragi-hiu.com/review-2024-08/</link><pubDate>Mon, 16 Sep 2024 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2024-08/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;ul>
&lt;li>Add language support for Dune (dune-project) to GitHub Linguist (&lt;a href="https://github.com/github-linguist/linguist/pull/6814">github-linguist/linguist#6814&lt;/a>). I opened it in June but with too many filenames that do not meet GitHub&amp;#39;s usage requirements, which is why it took until now to be approved.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
My own projects
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;ul>
&lt;li>I&amp;#39;m trying to make a dashboard for KDE translations that&amp;#39;s able to show a bit more stats than Websvn or l10n.kde.org. I spent 13 hours on it this week.&lt;/li>
&lt;li>I spent another 10 hours transcribing List Of Plants Of Formosa.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-3" class="outline-2">
&lt;h2 id="headline-3">
Translations
&lt;/h2>
&lt;div id="outline-text-headline-3" class="outline-text-2">
&lt;ul>
&lt;li>I spent 21 hours on translation, 10 of which are for KDE.&lt;/li>
&lt;li>I tried to submit translations for GnuPG. The previous language coordinator for &lt;code class="verbatim">zh_TW&lt;/code> handed it over to me, and I submitted directly to upstream, but I&amp;#39;m still waiting for a reply or merge. I&amp;#39;ll have to try again / follow up on this.&lt;/li>
&lt;li>Got the Taiwanese Mandarin translations for &lt;a href="https://gitlab.freedesktop.org/xdg/shared-mime-info">shared-mime-info&lt;/a> back up to fully translated (891 strings), up from 78% (700/891 strings).
And for some reason also get into an argument about the translation for “source code” in the l10n-tw Telegram channel. 源碼 and 原始碼 are both fine, even if I prefer the latter since it seems more familiar to me; 源始碼 is trying to impose a language revision in a top-down manner (literally no one writes that and it only ever gets interpreted as a typo; it has the wrong register and is in fact not more “pure”, thank you very much), and 來源碼 only makes sense in the context of the source code ←→ object code contrast.&lt;/li>
&lt;li>Update the Taiwanese Mandarin translation for powertop (&lt;a href="https://github.com/fenrus75/powertop/pull/155">fenrus75/powertop#155&lt;/a>); still pending review.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div></description></item><item><title>When is something executed? (mental model)</title><link>https://kisaragi-hiu.com/runtime-context/</link><pubDate>Fri, 13 Sep 2024 06:39:20 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/runtime-context/</guid><description>&lt;p>
From code being written to code working in an app, there are a wide variety of places where code is run. This distinction needs to be kept in mind, especially for something like web metaframeworks, where you have code running on different contexts using the same language (so it&amp;#39;s no longer as obvious). So I think it&amp;#39;s a good idea to write it down.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
My mental model
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;div id="outline-container-headline-2" class="outline-3">
&lt;h3 id="headline-2">
When making the thing:
&lt;/h3>
&lt;div id="outline-text-headline-2" class="outline-text-3">
&lt;ul>
&lt;li>
&lt;p>While editing I can use my editing commands, as well as on save, on commit…&lt;/p></description></item><item><title>glib-date-playground</title><link>https://kisaragi-hiu.com/projects/glib-date-playground/</link><pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/glib-date-playground/</guid><description>&lt;p>
A way to play with GLib DateTime format strings.&lt;/p>
&lt;p>
Since &lt;code class="verbatim">gjs&lt;/code> is JS and has access to GLib stuff, building a simple shell in gjs seemed to be the easiest option.&lt;/p></description></item><item><title>Redirecting from under a load balancing NGINX</title><link>https://kisaragi-hiu.com/redirecting-from-under-a-load-balancing-nginx/</link><pubDate>Thu, 05 Sep 2024 02:54:44 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/redirecting-from-under-a-load-balancing-nginx/</guid><description>&lt;p>
Let&amp;#39;s say I have a server program running locally on 127.0.0.1:8080; and I&amp;#39;ve already set up DNS such that &lt;em>example.com&lt;/em> points to the IP of the server this program is running on. I can then set up Nginx like this as a reverse proxy, mapping the domain name to a program so that I can host multiple programs for multiple domains on the same machine.&lt;/p>
&lt;div class="src src-conf">
&lt;pre tabindex="0">&lt;code class="language-conf" data-lang="conf">server {
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}&lt;/code>&lt;/pre>
&lt;/div>
&lt;p>
This works fine, but whenever I restart the program the site goes down, understandably.&lt;/p></description></item><item><title>Monthly review for July 2024</title><link>https://kisaragi-hiu.com/review-2024-07/</link><pubDate>Sat, 10 Aug 2024 11:53:04 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2024-07/</guid><description>&lt;p>
I&amp;#39;m continuing in a bit of a limbo state right now, switching between procrastination and hyperfocused work while being really unsure about stuff. This, well, isn&amp;#39;t healthy.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
[Emacs] &lt;a href="https://github.com/xenodium/ready-player/pull/3">xenodium/ready-player#3&lt;/a>: Fix &amp;#34;read only&amp;#34; error when playing a song after another finishes&lt;/p>
&lt;p>
[Emacs] &lt;a href="https://github.com/doomemacs/themes/pull/834#issuecomment-2253464840">doom-themes#834&lt;/a>: Fix visibility of gray text in emacs-vterm. The grayed out text of zsh-autosuggestions or Node etc. should now actually be visible in all Doom themes, whereas previously they were always barely or completely invisible.&lt;/p></description></item><item><title>Monthly review for June 2024</title><link>https://kisaragi-hiu.com/review-2024-06/</link><pubDate>Wed, 10 Jul 2024 11:43:25 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2024-06/</guid><description>&lt;p>
This month I spent 49 hours on translation, 15 of which are for KDE, and 17 hours on development.&lt;/p>
&lt;p>
I left college, though not as a graduation due to personal failures. I guess I can just put it like that…&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Work
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I was contracted by MODA&amp;#39;s &lt;a href="https://ocf.tw/p/oss_localization/">zh_TW open source localization project&lt;/a> to produce one set of translations for GIMP.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;ul>
&lt;li>[JS] Opened an issue for &lt;a href="https://github.com/tc39/proposal-async-context">tc39/proposal-async-context&lt;/a> pointing out there&amp;#39;s a 404 link to an old Node blog post that had disappeared. This is otherwise unremarkable, I was just amazed by how fast the link was &lt;a href="https://github.com/nodejs/nodejs.org/pull/6825">repaired by reinstating that post&lt;/a>.&lt;/li>
&lt;li>[CSS] &lt;a href="https://github.com/remix-run/react-router-website/pull/111">remix-run/react-router-website#111&lt;/a>: fix pre/code links not changing color when &lt;code class="verbatim">:active&lt;/code> in dark mode. This was a follow up to &lt;a href="https://github.com/remix-run/remix-website/pull/262">remix-run/remix-website#262&lt;/a>, fixing the same underlying issue where Tailwind &lt;code class="verbatim">text-inherit&lt;/code> has lower specificity than the dark mode fallback, meaning you need to use &lt;code class="verbatim">text-inherit dark:text-inherit&lt;/code>.&lt;/li>
&lt;li>[Emacs] &lt;a href="https://github.com/seagle0128/doom-modeline/pull/725">doom-modeline#725&lt;/a>: calculate anzu count faster and with less memory. The code was collecting a list only to calculate its length and throw the list away, so the PR makes it simply count up an integer. This makes &lt;code class="verbatim">evil-search&lt;/code> less painful.&lt;/li>
&lt;/ul>
&lt;p>This month I spent most of my effort on the GIMP translation project, and I&amp;#39;m happy with what I submitted back to OCF.&lt;/p></description></item><item><title>reStructuredText 中文：如何讓連結不要有多餘的空格</title><link>https://kisaragi-hiu.com/restructuredtext-spaces/</link><pubDate>Sun, 09 Jun 2024 01:57:45 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/restructuredtext-spaces/</guid><description>&lt;p>
&lt;a href="https://zh.wikipedia.org/zh-tw/ReStructuredText">reStructuredText&lt;/a> 的文內語法周圍需要有空格，但這樣的話中文連結不就必須要有多餘的空格了嗎？（像是 &lt;span style="text-decoration: underline;">這個&lt;/span> 樣子）&lt;/p>
&lt;p>
我解釋一下為什麼會這樣覺得：&lt;a href="https://orgmode.org/">Org Mode&lt;/a> 的文內語法就是這樣，光是*加上星號*不夠加上粗體，因為 Org Mode 的設計者在不使用空格斷詞的語言的考量與 “/a/random/path” 好寫程度的取捨上選擇了後者。（因為這篇文章是用 Org 寫的，你會發現下一段的 inline code 也是多一堆空格。）另外查 reST 的中文介紹（像是 &lt;a href="https://learn-rst.readthedocs.io/zh-cn/latest/reST-入门.html">https://learn-rst.readthedocs.io/zh-cn/latest/reST-入门.html&lt;/a>）的時候也會看到中文連結的確有多的空格。&lt;/p></description></item><item><title>Monthly review for May 2024</title><link>https://kisaragi-hiu.com/review-2024-05/</link><pubDate>Sat, 01 Jun 2024 19:36:26 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2024-05/</guid><description>&lt;p>
This month I spent 32 hours on translation (22 of which are for KDE), and 30 hours on development.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Open source contributions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;ul>
&lt;li>Shiki: add support for Vala, Genie, QML, QSS, qmldir, Haxe, HXML, Wikitext, Soy (&lt;a href="https://github.com/shikijs/textmate-grammars-themes/pull/54">shikijs/textmate-grammar-themes#54&lt;/a>)&lt;/li>
&lt;li>Shiki: add support for Emacs Lisp via &lt;a href="https://github.com/Alhadis/language-emacs-lisp">Alhadis/language-emacs-lisp&lt;/a> (&lt;a href="https://github.com/shikijs/textmate-grammars-themes/pull/56">shikijs/textmate-grammar-themes#56&lt;/a>)&lt;/li>
&lt;li>Fix code links being indistinguishable from non-link inline code in Remix docs (&lt;a href="https://github.com/remix-run/remix-website/pull/262">remix-run/remix-website#262&lt;/a>). This was a case of CSS specificity being a little unintuitive. I plan to file a PR for reactrouter.com which has a similar issue, though it&amp;#39;s not as severe — I thought it didn&amp;#39;t have the same problem at first.&lt;/li>
&lt;li>&lt;a href="https://github.com/emacs-typescript/typescript.el/pull/189">emacs-typescript/typescript.el#189&lt;/a>: Make &lt;code class="verbatim">typescript-mode&lt;/code> recognize the &lt;code class="verbatim">satisfies&lt;/code> keyword added in TypeScript 4.9. &lt;code class="verbatim">typescript-mode&lt;/code> is more or less left behind in favor of the tree-sitter-based TypeScript mode that&amp;#39;s now built into Emacs 29+, but I&amp;#39;m still using &lt;code class="verbatim">typescript-mode&lt;/code> since I haven&amp;#39;t yet bothered to set up tree-sitter.&lt;/li>
&lt;li>&lt;a href="https://github.com/highlightjs/highlight.js/pull/4058">highlightjs/highlight.js#4058&lt;/a>: Same for highlight.js, adding support for &lt;code class="verbatim">satisfies&lt;/code> in TS. highlight.js is used by, for instance, &lt;a href="https://www.solidjs.com/blog/solid-start-the-shape-frameworks-to-come#:~:text=satisfies">SolidJS&amp;#39;s website&lt;/a> (even though IMO Shiki is a much better choice since Shiki 1.0), so once this is released and trickles down into websites the days of seeing &lt;code class="verbatim">satisfies&lt;/code> unrecognized in a popular component framework&amp;#39;s announcement post should finally be over. highlight.js has already accumulated 7 months of unreleased changes, though.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
In-progress contributions
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;ul>
&lt;li>Pending: Make KDE e.V.&amp;#39;s voting system actually usable on mobile without excessive zoom (&lt;a href="https://invent.kde.org/websites/ballot-kde-org/-/merge_requests/2">https://invent.kde.org/websites/ballot-kde-org/-/merge_requests/2&lt;/a>)&lt;/li>
&lt;li>Pending: make GitHub recognize &amp;amp; highlight Dune, the OCaml build system (&lt;a href="https://github.com/github-linguist/linguist/pull/6814">https://github.com/github-linguist/linguist/pull/6814&lt;/a>)&lt;/li>
&lt;li>Work in progress: Make Plasma&amp;#39;s pager open overview when clicking on the current desktop. This still needs me to find / implement a way to check whether the “effect” is currently enabled. (&lt;a href="https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/2256">https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/2256&lt;/a>)&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-3" class="outline-2">
&lt;h2 id="headline-3">
Translations
&lt;/h2>
&lt;div id="outline-text-headline-3" class="outline-text-2">
&lt;p>
I started providing Taiwanese Mandarin translations to HandBrake. The next Linux HandBrake release should already be a lot less painful to use in &lt;code class="verbatim">zh_TW&lt;/code>, with simple interface strings.&lt;/p></description></item><item><title>k-po-mode</title><link>https://kisaragi-hiu.com/projects/k-po/</link><pubDate>Fri, 31 May 2024 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/k-po/</guid><description>&lt;p>
A personal po-mode fork for translating stuff in Emacs, sometimes reimplementing ideas from Lokalize.&lt;/p></description></item><item><title>Monthly review for April 2024</title><link>https://kisaragi-hiu.com/review-2024-04/</link><pubDate>Wed, 01 May 2024 13:10:57 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2024-04/</guid><description>&lt;p>
This month I think I did quite a few things, which I&amp;#39;m now more able to quantify thanks to my progress on Canrylog.&lt;/p>
&lt;p>
I logged about 45 hours developing stuff, and 17 hours translating KDE.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
AUR packages
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I adopted the AUR packages &lt;code>&lt;a href="https://aur.archlinux.org/packages/rime-pinyin-zhwiktionary"> rime-pinyin-zhwiktionary &lt;/a>&lt;/code>
and &lt;code>&lt;a href="https://aur.archlinux.org/packages/fcitx5-pinyin-zhwiktionary"> fcitx5-pinyin-zhwiktionary &lt;/a>&lt;/code>
(they share a PKGBUILD) in order to fix 404 during build. They were relying on a specific Wiktionary dump from 2022 being provided, instead of using the latest versions.&lt;/p></description></item><item><title>Expo: How to do a local build without the dev server and without logging in</title><link>https://kisaragi-hiu.com/expo-local-build-no-login/</link><pubDate>Wed, 10 Apr 2024 13:48:51 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/expo-local-build-no-login/</guid><description>&lt;p>
I&amp;#39;m trying to test out the startup process of an open source React Native app built with Expo, so I really need the dev server to get out of the way in this case.&lt;/p>
&lt;p>
&lt;a href="https://docs.expo.dev/guides/local-app-development/">Expo docs&lt;/a> describes two ways to build locally, which are (a) use &lt;code class="verbatim">expo run&lt;/code> and (b) use &lt;code class="verbatim">eas --local&lt;/code>. This is not the whole picture.&lt;/p>
&lt;p>
In Expo, your actual build options, as far as I can tell, are:&lt;/p>
&lt;ul>
&lt;li>Use &lt;code class="verbatim">expo run:&amp;lt;platform&amp;gt;&lt;/code>, which builds a magical hot-reloading app, coupled with the dev server, has incredible development experience, but in this exact case we want to avoid&lt;/li>
&lt;li>
&lt;p>Use &lt;code class="verbatim">eas build --platform &amp;lt;platform&amp;gt; --local&lt;/code>&lt;/p></description></item><item><title>Monthly review for March 2024</title><link>https://kisaragi-hiu.com/review-2024-03/</link><pubDate>Tue, 09 Apr 2024 01:14:36 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/review-2024-03/</guid><description>&lt;p>
I felt like I should write reports on what I&amp;#39;ve been doing, to more accurately guage how much work I&amp;#39;ve actually done, so here it is.&lt;/p>
&lt;p>
I became &lt;a href="https://ev.kde.org/members/#:~:text=Kisaragi%20Hiu">a KDE e.V. member&lt;/a> at the end of February for my translation work for KDE, following an invitation from Jeff Huang, another zh-TW translator for KDE and other Free Software.&lt;/p>
&lt;p>
In March, I started making &lt;a href="https://kde-project.kisaragi-hiu.com">kde-project.kisaragi-hiu.com&lt;/a>, a redirector from KDE project IDs and also a fast-loading KDE project list, utilizing KDE&amp;#39;s own metadata for projects. It&amp;#39;s basically done by the end of March. This took about 10 hours.&lt;/p></description></item><item><title>Notes on JavaScript Macros</title><link>https://kisaragi-hiu.com/js-macros/</link><pubDate>Wed, 27 Mar 2024 22:21:06 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/js-macros/</guid><description>&lt;p>
Just some notes on macros in the JavaScript ecosystem.&lt;/p>
&lt;dl>
&lt;dt>
Babel
&lt;/dt>
&lt;dd>Babel plugins basically function as macros, as compile-time transformations. They are also capable of doing literally anything: JSX, TypeScript, and new JS syntaxes all have implementations as Babel plugins. Creating and maintaining a plugin for each macro is cumbersome, though: it&amp;#39;s not at all as simple as a &lt;code class="verbatim">defmacro&lt;/code>.&lt;/dd>
&lt;dt>
&lt;a href="https://github.com/kentcdodds/babel-plugin-macros">babel-plugin-macros&lt;/a>
&lt;/dt>
&lt;dd>Appears to be adopted widely. Macros are modules exporting a main compile-time function - this function receives some compilation state and writes into that state.&lt;/dd>
&lt;dt>
&lt;a href="https://www.sweetjs.org">Sweet.js&lt;/a>
&lt;/dt>
&lt;dd>Compile-time functions returning syntax objects. Can implement new constructs like cond-case. Can define new operators. Has a cli for transpilation as well as a Babel backend.&lt;/dd>
&lt;dt>
&lt;a href="https://bun.sh/docs/bundler/macros">Bun macros&lt;/a>
&lt;/dt>
&lt;dd>Compile-time (bundle-time) functions. Written as normal functions marked as macros at import. Cannot alter syntax or do metaprogramming - return value must be serializable and cannot be functions.&lt;/dd>
&lt;dt>
&lt;a href="https://github.com/jarred-sumner/decky">decky&lt;/a>
&lt;/dt>
&lt;dd>Bun also supports esbuild plugins that only use the onLoad and onResolve hooks. This means it probably also supports decky, which uses decorator syntax for compile-time functions. They receive a custom AST and return a string.&lt;/dd>
&lt;dt>
&lt;a href="https://parceljs.org/features/macros/">Parcel macros&lt;/a>
&lt;/dt>
&lt;dd>Almost exactly like Bun macros, except (a) macros can generate assets and tell Parcel about them and (b) they can return functions, albeit only those created with the Function constructor; and a few other minor differences.&lt;/dd>
&lt;/dl>
&lt;p>&lt;em>2025-03-09T21:12:36+0900: Gotta love it when I find an old blog post sitting uncommitted in an old checkout that I&amp;#39;m only coming back to now. This is a reason why I cannot use LLMs: I can&amp;#39;t know what I wrote and what I didn&amp;#39;t write otherwise.&lt;/em>&lt;/p></description></item><item><title>Quick redirector for KDE Projects</title><link>https://kisaragi-hiu.com/projects/kde-project-redirector/</link><pubDate>Fri, 22 Mar 2024 08:25:32 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/kde-project-redirector/</guid><description>&lt;p>
A &lt;a href="https://workers.cloudflare.com/">Cloudflare Workers&lt;/a> project to redirect KDE project IDs to their KDE Invent repositories. Useful for checking context while translating for KDE, as translation files are named after project IDs but Invent doesn&amp;#39;t have an easy way to go from ID to repo.&lt;/p>
&lt;p>
Includes an index page listing all projects.&lt;/p>
&lt;ul>
&lt;li>Package manager: Bun&lt;/li>
&lt;li>Runtime: Cloudflare Workers (workerd)&lt;/li>
&lt;li>Bundler: Esbuild (through Wrangler)&lt;/li>
&lt;li>Dev server: Bun (because &lt;code class="verbatim">wrangler dev&lt;/code> doesn&amp;#39;t work for me and Bun.serve has the same interface as Workers)&lt;/li>
&lt;li>Linter: Biome&lt;/li>
&lt;/ul></description></item><item><title>Glossary</title><link>https://kisaragi-hiu.com/glossary/</link><pubDate>Fri, 01 Mar 2024 03:25:21 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/glossary/</guid><description>&lt;p>
&lt;del>This is my current KDE localization glossary plus some comments.&lt;/del>&lt;/p>
&lt;p>
This is my translation glossary. It&amp;#39;s mainly for translating KDE apps, but I want to kind of document things.&lt;/p>
&lt;p>
I use the glossary kind of as a reference. While there are some items that are strongly binding (stuff like always using 剪貼簿 for “Clipboard” and never 剪貼板), I haven&amp;#39;t found a way to annotate that yet beyond just knowing it myself.&lt;/p></description></item><item><title>我的 KDE 翻譯流程</title><link>https://kisaragi-hiu.com/2024-01-20-kde-translation-workflow/</link><pubDate>Sat, 20 Jan 2024 20:50:31 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2024-01-20-kde-translation-workflow/</guid><description>&lt;p>
我想把我目前的 KDE 翻譯流程寫下來、公開出來。&lt;/p>
&lt;p>
我目前是 KDE 正體中文翻譯團隊的一員，在 pan93412 的邀請下有直接提交翻譯的權限。因此我的流程在沒有直接提交的權限時可能會比較不方便。&lt;/p></description></item><item><title>2023 review</title><link>https://kisaragi-hiu.com/2023-review/</link><pubDate>Sun, 31 Dec 2023 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2023-review/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Projects
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I think I made some projects that I&amp;#39;m reasonably proud of.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="projects/kemdict.html">Kemdict&lt;/a> updates.&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://nowww.kisaragi-hiu.com/">nowww.tw&lt;/a>, an attempt at an advocate site for Taiwanese websites to &lt;em>please&lt;/em> redirect their apex domains to their www subdomains.&lt;/p>
&lt;figure>
&lt;img src="https://kisaragi-hiu.com/20230424T000503+0900.png" alt="/20230424T000503+0900.png" title="/20230424T000503+0900.png" />&lt;figcaption>
The first URL is 404 but the second isn&amp;#39;t.
&lt;/figcaption>
&lt;/figure>
&lt;p>
&lt;em>2025-10-30T21:59:14+0900: in 2024 I let the domain lapse because I wanted to save the domain cost. .tw domains are a little expensive. I now host it at &lt;a href="https://nowww.kisaragi-hiu.com">https://nowww.kisaragi-hiu.com&lt;/a>.&lt;/em>&lt;/p></description></item><item><title>Emacs: silencing messages</title><link>https://kisaragi-hiu.com/inhibit-message/</link><pubDate>Sun, 22 Oct 2023 18:50:08 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/inhibit-message/</guid><description>&lt;p>
Ignoring &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Batch-Mode.html">batch mode&lt;/a>, the &lt;code class="verbatim">message&lt;/code> function displays a message to the user in the echo area and logs it in the message log buffer (default &lt;code class="verbatim">*Messages*&lt;/code>).&lt;/p>
&lt;p>
If we&amp;#39;re calling some code that we don&amp;#39;t control (or sometimes even if we do), we might want to suppress either behavior. To do that:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>To make &lt;code class="verbatim">message&lt;/code> not show something in the echo area temporarily, let-bind &lt;code class="verbatim">inhibit-message&lt;/code> to non-nil.&lt;/p>
&lt;div class="src src-emacs-lisp">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-emacs-lisp" data-lang="emacs-lisp">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nb">let&lt;/span> &lt;span class="p">((&lt;/span>&lt;span class="nv">inhibit-message&lt;/span> &lt;span class="no">t&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">;; Logs but does not show in echo area&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nf">message&lt;/span> &lt;span class="s">&amp;#34;%s&amp;#34;&lt;/span> &lt;span class="s">&amp;#34;abc&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">some-code-that-calls-message&lt;/span>&lt;span class="p">))&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/li>
&lt;li>
&lt;p>To make &lt;code class="verbatim">message&lt;/code> not log messages to the log buffer, let bind &lt;code class="verbatim">message-log-max&lt;/code> to nil.&lt;/p></description></item><item><title>Emacs 29 pgtk woes</title><link>https://kisaragi-hiu.com/emacs-29-pgtk-woes/</link><pubDate>Thu, 31 Aug 2023 00:34:10 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/emacs-29-pgtk-woes/</guid><description>&lt;p>
Emacs on my systems has had an issue where IME inputs would pass through to Emacs instead of going to the IME. For instance, 「新鮮」 is typed as vupvu0 RET; some characters would slip through into Emacs. I&amp;#39;m not sure if it&amp;#39;s just my configuration or not.&lt;/p>
&lt;p>
In Emacs 29, when not using pgtk, the issue persists, no change here. But if I use &lt;code class="verbatim">x-gtk-use-native-input&lt;/code>, the problem goes away — mostly. Now Shift no longer registers for the IME. For example, I use Kana input in Mozc to type Japanese on my US-layout keyboard, and there を is typed as Shift-0, while 0 on its own types わ. With this issue, that&amp;#39;s no longer possible.&lt;/p></description></item><item><title>ordered-set.el</title><link>https://kisaragi-hiu.com/projects/ordered-set.el/</link><pubDate>Fri, 30 Jun 2023 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/ordered-set.el/</guid><description>&lt;p>
&lt;a href="https://melpa.org/#/ordered-set">&lt;img src="https://melpa.org/packages/ordered-set-badge.svg" alt="https://melpa.org/packages/ordered-set-badge.svg" />&lt;/a>&lt;/p>
&lt;p>
In Emacs Lisp:&lt;/p>
&lt;ul>
&lt;li>If you want fast (constant) lookup time, you use a hash table&lt;/li>
&lt;li>If you want to preserve order, you use a list&lt;/li>
&lt;/ul>
&lt;p>But sometimes you want a collection that has both constant lookup time and the ability to preserve element order. This library implements that.&lt;/p>
&lt;p>
(This basically ports JavaScript Sets into Emacs Lisp.)&lt;/p></description></item><item><title>Setting up the back button in Framework7 Svelte on Capacitor on Android</title><link>https://kisaragi-hiu.com/framework7-svelte-capacitor-android-back-button/</link><pubDate>Sat, 10 Jun 2023 05:17:40 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/framework7-svelte-capacitor-android-back-button/</guid><description>&lt;p>
The back button is not hooked up by default in &lt;a href="https://framework7.io/">Framework7&lt;/a>, even if you choose the Capacitor template.&lt;/p>
&lt;p>
(This is for framework7-svelte. Your mileage may vary, as I haven&amp;#39;t checked.)&lt;/p>
&lt;p>
To hook it up, we need to (a) go back in history (b) when the back button is pressed.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
(a) Dynamically go back in history
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
framework7-svelte exports an &lt;code class="verbatim">f7ready&lt;/code> function, which calls its callback after the Framework7 app instance is ready — the app instance is passed in as the only argument.&lt;/p></description></item><item><title>Setting up an internal helper library for a TypeScript monorepo</title><link>https://kisaragi-hiu.com/typescript-monorepo-internal-library/</link><pubDate>Sat, 06 May 2023 09:59:25 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/typescript-monorepo-internal-library/</guid><description>&lt;p>
&lt;em>2023-06-10T05:16:30+0900: This article needs a full rewrite. What I wrote doesn&amp;#39;t work.&lt;/em>&lt;/p>
&lt;p>
You have a TypeScript project, organized in a monorepo because there is some common code you want to share between, say, your backend and frontend. Let&amp;#39;s say it looks like this:&lt;/p>
&lt;div class="src src-text">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">- backend/index.ts
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- backend/utils.ts &amp;lt;- you want to share this with frontend
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- frontend/index.ts&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
Unfortunately it&amp;#39;s not as easy as throwing the common TypeScript code into a folder.&lt;/p></description></item><item><title>ChangelogDB</title><link>https://kisaragi-hiu.com/projects/changelog-db/</link><pubDate>Tue, 02 May 2023 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/changelog-db/</guid><description>&lt;p>
The missing changelog field in package.json.&lt;/p>
&lt;p>
PyPI has it, and it&amp;#39;s great! The JavaScript ecosystem should have it as well.&lt;/p>
&lt;p>
For now, this is a manually collected npm package changelog index.&lt;/p></description></item><item><title>A hack to fetch a URL synchronously in Svelte (Astro)</title><link>https://kisaragi-hiu.com/astro-svelte-fetch-sync-hack/</link><pubDate>Mon, 01 May 2023 14:10:48 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/astro-svelte-fetch-sync-hack/</guid><description>&lt;p>
&lt;a href="https://github.com/sveltejs/svelte/issues/5501">Svelte doesn&amp;#39;t currently have top level await&lt;/a>, meaning that in a server-side rendering context, it is impossible to, say, wait a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/fetch">fetch&lt;/a> to finish before sending it to the client. There is the &lt;code class="verbatim">#await&lt;/code> block, but I want the wait to happen on the server. (I don&amp;#39;t care about the full page load taking a little longer as my use case is easily cacheable and already cached on Cloudflare.)&lt;/p>
&lt;div class="src src-svelte">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-svelte" data-lang="svelte">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">export&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">tl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;Guá ū tsi̍t-ē mī-kiānn bē hōo lí khuànn&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">toPOJ&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">text&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">await&lt;/span> &lt;span class="nx">fetch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://pojtl.kemdict.com/toPOJ&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">method&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;POST&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">body&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">text&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">response&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">text&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// const result = await toPOJ(tl);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// -&amp;gt; error as Svelte doesn&amp;#39;t have top level await
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="k">#await&lt;/span> &lt;span class="nx">toPOJ&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">tl&lt;/span>&lt;span class="p">)}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">span&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>...&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">span&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="k">:then&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c">&amp;lt;!-- Waited on the client side --&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">span&lt;/span>&lt;span class="p">&amp;gt;{&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">}&amp;lt;/&lt;/span>&lt;span class="nt">span&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>&lt;span class="k">/await&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
There are a few options for me here:&lt;/p></description></item><item><title>What is Vite?</title><link>https://kisaragi-hiu.com/vite-intro/</link><pubDate>Wed, 26 Apr 2023 01:56:57 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/vite-intro/</guid><description>&lt;p>
When I first learned &lt;a href="https://vitejs.dev/">Vite&lt;/a>, I found its official slogan, &amp;#34;frontend tooling&amp;#34; and &amp;#34;development environment&amp;#34;, to be extremely vague.&lt;/p>
&lt;p>
Granted, I also find it hard to describe satisfactorily — “Super-fast dev server + sensible defaults for Rollup” might be a little more descriptive, but might not reflect the project&amp;#39;s vision.&lt;/p>
&lt;p>
So, what is Vite? The &lt;a href="https://vitejs.dev/guide/">&lt;em>Getting Started&lt;/em> page&lt;/a> says it best:&lt;/p>
&lt;blockquote>
&lt;p>Vite […] is a build tool that aims to provide a faster and leaner development experience for modern web projects. It consists of two major parts:&lt;/p></description></item><item><title>emacs-jieba</title><link>https://kisaragi-hiu.com/projects/emacs-jieba/</link><pubDate>Mon, 10 Apr 2023 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/emacs-jieba/</guid><description>&lt;p>
Emacs Lisp bindings for &lt;a href="https://github.com/messense/jieba-rs">jieba-rs&lt;/a>.&lt;/p>
&lt;p>
Used in Kemdict&amp;#39;s build process because I made the (obviously questionable) decision to aggregate data with Emacs Lisp in that project, and if I wanted to use Jieba keyword extraction in that process I need it to be accessible from Emacs Lisp.&lt;/p></description></item><item><title>Why I switched to Vercel for this site</title><link>https://kisaragi-hiu.com/switching-to-vercel/</link><pubDate>Thu, 06 Apr 2023 01:57:49 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/switching-to-vercel/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>TL;DR&lt;/strong>: Vercel allows me to host subprojects like&lt;/p>
&lt;ul>
&lt;li>subproject A: kisaragi-hiu.com/subproject-a → example-1aLyX9xX8.vercel.app&lt;/li>
&lt;li>subproject B: kisaragi-hiu.com/subproject-b → example-T7nmDoVGB.vercel.app&lt;/li>
&lt;li>parent: kisaragi-hiu.com&lt;/li>
&lt;/ul>
&lt;p>without adding an ugly client side redirect snippet to every single subproject.&lt;/p>
&lt;/blockquote>
&lt;p>
I have some projects that I want to host as subdirectories, instead of their own domains or subdomains. So, like &lt;a href="https://kisaragi-hiu.com/list-of-plants-of-formosa">https://kisaragi-hiu.com/list-of-plants-of-formosa&lt;/a> and not like &lt;code class="verbatim">barren-moon.kisaragi-hiu.com&lt;/code>.&lt;/p>
&lt;p>
There are some ways to do this: pull the code for these “subprojects” during build of the parent site and build them together, which is slow, and subproject changes only show up after a parent rebuild; build the subprojects beforehand, and pull the built artifacts during parent build, which isn&amp;#39;t as slow but changes still only show up after a parent rebuild; or build and host the subprojects and the parent separately, and rely on the &lt;a href="https://docs.netlify.com/routing/redirects/rewrites-proxies/">URL rewrites feature&lt;/a>, also called &lt;em>URL proxies&lt;/em>.&lt;/p></description></item><item><title>Astro: How to render a loading state for an element</title><link>https://kisaragi-hiu.com/astro-loading/</link><pubDate>Tue, 07 Mar 2023 01:26:29 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/astro-loading/</guid><description>&lt;p>
Sometimes you just have a component that takes a while to hydrate, and you want to show a loading indicator instead of pretending that it is interactive.&lt;/p>
&lt;p>
In SvelteKit you can do this:&lt;/p>
&lt;div class="src src-svelte">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-svelte" data-lang="svelte">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">browser&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s2">&amp;#34;$app/environment&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">import&lt;/span> &lt;span class="nx">Spinner&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s2">&amp;#34;$lib/Spinner.svelte&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">import&lt;/span> &lt;span class="nx">Component&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s2">&amp;#34;./Component.svelte&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">import&lt;/span> &lt;span class="nx">TreeThatTakes&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s2">&amp;#34;./TreeThatTakes.svelte&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">import&lt;/span> &lt;span class="nx">SomeTime&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s2">&amp;#34;./SomeTime.svelte&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">import&lt;/span> &lt;span class="nx">ToHydrate&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s2">&amp;#34;./ToHydrate.svelte&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>&lt;span class="k">#if&lt;/span> &lt;span class="nx">browser&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">Component&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">TreeThatTakes&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">SomeTime&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">ToHydrate&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">Component&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="k">else&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">Spinner&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>&lt;span class="k">/if&lt;/span>&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
Now the server side renders the spinner, and after it&amp;#39;s hydrated the main component tree will be rendered on the client.&lt;/p></description></item><item><title>List of Plants of Formosa (another digitization)</title><link>https://kisaragi-hiu.com/projects/lopof-digitize/</link><pubDate>Sat, 11 Feb 2023 18:31:35 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/lopof-digitize/</guid><description>&lt;p>
An attempt to turn List of Plants of Formosa into machine-readable data plus selectable text.&lt;/p>
&lt;p>
There are 420 pages for the main content in total, of which I&amp;#39;ve completed 253 so far.&lt;/p></description></item><item><title>2022 review</title><link>https://kisaragi-hiu.com/2022-review/</link><pubDate>Tue, 27 Dec 2022 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2022-review/</guid><description>&lt;p>
Some things are falling apart while others are falling together.&lt;/p>
&lt;p>
I&amp;#39;ve been enjoying my time in the NKUST (first campus) wind band club &lt;em>immensely&lt;/em>, with several performances, noticeable improvements in my trumpet ability, as well as the national competition which resumed after two years of hiatus due to COVID. (The competition took place before &lt;a href="https://www.theguardian.com/world/2022/may/09/once-a-zero-covid-poster-child-taiwan-learns-to-live-with-the-virus">infections took off again around March&lt;/a>.)&lt;/p>
&lt;p>
There have been days where I&amp;#39;m questioning the will to live and such. This has prompted me to actually seek help — again. I&amp;#39;ll have to see how well I&amp;#39;m able to lift myself out of this with mental help.&lt;/p></description></item><item><title>Making a serverless SvelteKit site that reads data from a local SQLite database</title><link>https://kisaragi-hiu.com/kemdict-sveltekit-sqlite/</link><pubDate>Thu, 17 Nov 2022 20:46:18 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/kemdict-sveltekit-sqlite/</guid><description>&lt;p>
Version history:&lt;/p>
&lt;ul>
&lt;li>2024-07-10: Mark todos as just “Unfinished” instead, and try to apply some of the comments that I wrote. I don&amp;#39;t plan to update this further.&lt;/li>
&lt;li>2022-11-30: rewrite to make it not about Kemdict&lt;/li>
&lt;li>2022-11-19: clarify that this is about SvelteKit on serverless platforms&lt;/li>
&lt;li>2022-11-17: first draft&lt;/li>
&lt;/ul>
&lt;p>Still a rough draft even though the whole thing has been rewritten.&lt;/p>
&lt;p>
Reference repository: &lt;a href="https://github.com/kisaragi-hiu/demo-sveltekit-sqlite">https://github.com/kisaragi-hiu/demo-sveltekit-sqlite&lt;/a>&lt;/p>
&lt;p>
We&amp;#39;re not reading and writing runtime data. A dedicated database (like Supabase) is better in that case. Here, I just want to read from an already created SQLite database.&lt;/p></description></item><item><title>Kemdict</title><link>https://kisaragi-hiu.com/projects/kemdict/</link><pubDate>Fri, 04 Nov 2022 05:55:59 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/kemdict/</guid><description>&lt;p>
教育部有很多本辭典，但要一次搜尋它們很不方便。Kemdict 提供一個介面同時搜尋《重編國語辭典修訂本》、《國語辭典簡編本》、《成語典》、《臺灣閩南語常用詞辭典》，並且像 &lt;a href="https://www.weblio.jp">Weblio&lt;/a> 一樣把定義列在同一個頁面上。&lt;/p></description></item><item><title>Migrating away from .pam_environment</title><link>https://kisaragi-hiu.com/migrating-away-from-pam-environment/</link><pubDate>Mon, 31 Oct 2022 02:56:43 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/migrating-away-from-pam-environment/</guid><description>&lt;p>
So apparently &lt;code class="verbatim">~/.pam_environment&lt;/code> has been deprecated &lt;a href="https://bugs.archlinux.org/task/68945">for several years now&lt;/a>; on Arch Linux, &lt;code class="verbatim">~/.pam_environment&lt;/code> stopped being read since 2022-10-20. I guess I have to migrate to environment.d then.&lt;/p>
&lt;p>
&lt;a href="https://wiki.archlinux.org/title/Environment_variables">ArchWiki is really helpful&lt;/a>, but it took searching for Fcitx on Twitter — because, with my environment variables now unset, the input method isn&amp;#39;t working anymore — and stumbling onto &lt;a href="https://twitter.com/boronology/status/1584159897377128448">this tweet&lt;/a> before I learned that this is a thing.&lt;/p>
&lt;p>
I don&amp;#39;t know what the standard for a change to make it onto the &lt;a href="https://archlinux.org/news/">Arch Linux news page&lt;/a>, but apparently &amp;#34;if you set your environment variables via this method that works on both Wayland and X, your environment variables will cease to take effect&amp;#34; is not breaking enough. I don&amp;#39;t know, maybe it really isn&amp;#39;t: configuration incompatibilities don&amp;#39;t usually make it onto the news page, and &lt;a href="https://archlinux.org/news/grub-bootloader-upgrade-and-configuration-incompatibilities/">the grub one&lt;/a> is an exception because it&amp;#39;s the bootloader.&lt;/p></description></item><item><title>What is UTAU?</title><link>https://kisaragi-hiu.com/what-is-utau/</link><pubDate>Tue, 25 Oct 2022 22:24:03 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/what-is-utau/</guid><description>&lt;p>
I wanted a small primer on &lt;a href="http://utau2008.web.fc2.com/index.html">UTAU&lt;/a> for the covers page but it grew too large, so here it is.&lt;/p>
&lt;hr>
&lt;p>
UTAU, made by &lt;a href="http://utau2008.blog47.fc2.com/">飴屋／菖蒲 (あめや・あやめ)&lt;/a>, consists of:&lt;/p>
&lt;ul>
&lt;li>An editor for notes to be sung, including extra data for each note denoting lyrics, singing styles, etc.&lt;/li>
&lt;li>The format for those notes — general virtual instruments have MIDI, while UTAU has UST (which stands for &lt;em>UTAU Sequence Text&lt;/em>)&lt;/li>
&lt;li>&lt;em>Voicebanks&lt;/em>, which are collections (folders) of samples sung by (for example) their creators&lt;/li>
&lt;li>A &lt;em>wavtool&lt;/em> (tool1) and a &lt;em>resampler&lt;/em> (tool2), which together process the voicebank according to the notes in the UST and produce an audio file in the end.&lt;/li>
&lt;/ul>
&lt;p>UTAU&amp;#39;s official editor has not been updated since 2013; between then and now (2022-10-25) there has already been 3 (!) versions of VOCALOID released. But, because the ecosystem is made of relatively decipherable formats (UST is &lt;a href="https://en.wikipedia.org/wiki/Shift_JIS">Shift-JIS&lt;/a> plaintext), almost every piece of actual software can be replaced — there is essentially an unwritten standard. As a result, the ecosystem is still alive despite the lack of official updates.&lt;/p></description></item><item><title>Trying to set up Emacs for C++</title><link>https://kisaragi-hiu.com/emacs-cpp-notes/</link><pubDate>Mon, 10 Oct 2022 22:14:34 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/emacs-cpp-notes/</guid><description>&lt;p>
This is how I have set up Emacs for C++.&lt;/p>
&lt;p>
First, install the necessary packages.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://clangd.llvm.org/">Clangd&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/rizsotto/Bear">Bear&lt;/a>&lt;/li>
&lt;li>
&lt;p>&lt;a href="https://emacs-lsp.github.io/lsp-mode/">LSP Mode&lt;/a>&lt;/p>
&lt;div class="src src-elisp">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-elisp" data-lang="elisp">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">straight-use-package&lt;/span> &lt;span class="ss">&amp;#39;lsp-mode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nb">when&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">executable-find&lt;/span> &lt;span class="s">&amp;#34;clangd&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">add-hook&lt;/span> &lt;span class="ss">&amp;#39;c++-mode-hook&lt;/span> &lt;span class="nf">#&amp;#39;&lt;/span>&lt;span class="nv">lsp&lt;/span>&lt;span class="p">))&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/li>
&lt;/ul>
&lt;p>Then we need to run a build through Bear once.&lt;/p>
&lt;p>
As far as I can tell, the C++ ecosystem generally manages the dependency tree as part of the build system, rather than the compiler. This information has to be passed to Clangd so that it knows where to find the header files.&lt;/p></description></item><item><title>一些日文學習資源</title><link>https://kisaragi-hiu.com/some-japanese-resources/</link><pubDate>Tue, 13 Sep 2022 18:57:37 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/some-japanese-resources/</guid><description>&lt;ul>
&lt;li>
&lt;p>&lt;a href="https://www.jlpt.jp/samples/sampleindex.html?mode=pc">JLPT 官方模擬試題&lt;/a>&lt;/p>
&lt;p>JLPT 網站上有一些例題很多人有看過，但是模擬試題的部分好像比較少。這裡有兩份官方的模擬試題（一份 2018 年，一份 2012 年），可以用來做完整的模擬試驗，來在報名之前判斷自己實際的能力在哪裡。&lt;/p></description></item><item><title>Task Runners</title><link>https://kisaragi-hiu.com/task-runners/</link><pubDate>Fri, 09 Sep 2022 00:13:55 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/task-runners/</guid><description>&lt;p>
A task runner runs … tasks.&lt;/p>
&lt;p>
In the JS world, some module bundlers also act as a task runner, but it&amp;#39;s more useful to think of the task runner as a separate thing.&lt;/p>
&lt;p>
Some task runners that I know of and would consider using:&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Make
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>Make can be seen as a task runner that happens to come with file-based dependency management.&lt;/p>
&lt;ul>
&lt;li>Pro: Installed everywhere&lt;/li>
&lt;li>Con: You better hope your file names never contain spaces&lt;/li>
&lt;/ul>
&lt;p>Usage:&lt;/p></description></item><item><title>GitHub Actions / GitLab CI: deploy to branch</title><link>https://kisaragi-hiu.com/deploy-to-branch-in-github-actions-or-gitlab-ci/</link><pubDate>Fri, 29 Jul 2022 00:26:23 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/deploy-to-branch-in-github-actions-or-gitlab-ci/</guid><description>&lt;p>
Why? Now your latest release is one &lt;code class="verbatim">git clone &amp;lt;url&amp;gt; -b release &amp;lt;local-path&amp;gt;&lt;/code> away. That&amp;#39;s what I want.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
GitLab CI
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;div class="src src-yaml">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">archlinux:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">variables&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">SSH_PRIVATE_KEY&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">$SSH_PRIVATE_KEY&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">before_script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">pacman -Syu --noconfirm make git openssh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="s2">&amp;#34;default&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">stage&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;build&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">make public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">after_script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">mkdir ~/.ssh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">echo &amp;#34;$SSH_PRIVATE_KEY&amp;#34; &amp;gt; ~/.ssh/id_rsa&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">chmod 600 ~/.ssh/id_rsa&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">touch ~/.ssh/known_hosts&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">ssh-keyscan gitlab.com &amp;gt;&amp;gt; ~/.ssh/known_hosts&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">cd public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">git init --initial-branch=release&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">git config user.name &amp;#34;Built on CI&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">git config user.email &amp;#34;your-email@example.com&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">git add .&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">git commit -m &amp;#34;Deploy to Git&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">git push --force &amp;#34;git@gitlab.com:$CI_PROJECT_PATH&amp;#34; release&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">$CI_PIPELINE_SOURCE == &amp;#34;push&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-3">
&lt;h3 id="headline-2">
Things of note
&lt;/h3>
&lt;div id="outline-text-headline-2" class="outline-text-3">
&lt;ul>
&lt;li>Substitude “make” with your build script, of course.&lt;/li>
&lt;li>This assumes your output directory is called “public”.&lt;/li>
&lt;li>
&lt;p>Push access with the deploy token is still not a thing (&lt;a href="https://gitlab.com/gitlab-org/gitlab/-/issues/14101">gitlab-org/gitlab#14101&lt;/a>), so we emulate it with SSH.&lt;/p></description></item><item><title>My Plasma Wayland experience in July 2022</title><link>https://kisaragi-hiu.com/2022-07-17-wayland/</link><pubDate>Sun, 17 Jul 2022 23:14:02 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2022-07-17-wayland/</guid><description>&lt;p>
Last time I tried (many years ago), trying to log into the Plasma Wayland session just popped me straight back to the display manager. As it has been several years, I want to try it out again.&lt;/p>
&lt;p>
The computer I did this on is a conventional desktop PC with a mouse and keyboard, along with a Wacom drawing tablet. The GPU is a Radeon 460.&lt;/p>
&lt;p>
Overall it&amp;#39;s the same at best and somewhat broken at worst. Although it&amp;#39;s &lt;em>much&lt;/em> better than the last time I tried (2015 if I remember right, back when GNOME 3.16 was recent) and likely a better experience for some users, for example with multiple monitors or with touch devices, it is still not ready for me.&lt;/p></description></item><item><title>閾</title><link>https://kisaragi-hiu.com/illust/2022-07-14/</link><pubDate>Thu, 14 Jul 2022 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2022-07-14/</guid><description/></item><item><title>How to preserve cursor location when pausing in REAPER?</title><link>https://kisaragi-hiu.com/reaper-preserver-playback-location/</link><pubDate>Sat, 02 Jul 2022 01:47:28 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/reaper-preserver-playback-location/</guid><description>&lt;p>
This is what happens when you pause in Reaper:&lt;/p>
&lt;figure>
&lt;video controls autoplay muted loop src="https://kisaragi-hiu.com/20220702/reaper-default.mp4">&lt;/video>
&lt;figcaption>
The snapping is me seeking with my mouse (I forgot to include the mouse cursor while recording).
&lt;/figcaption>
&lt;/figure>
&lt;p>
When starting playback again, it always starts from the same point.&lt;/p>
&lt;p>
This is a reasonable default, but sometimes I might want it to not snap back to where I started playback, like the “After stopping keep position” mode in LMMS:&lt;/p></description></item><item><title>git-zip-commit</title><link>https://kisaragi-hiu.com/projects/git-zip-commit/</link><pubDate>Fri, 24 Jun 2022 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/git-zip-commit/</guid><description>&lt;p>
Pack a commit&amp;#39;s changed files into a zip file.&lt;/p>
&lt;p>
Just a command to make it easier for me to submit KDE &lt;code class="verbatim">zh_TW&lt;/code> translations.&lt;/p></description></item><item><title>info-variable-pitch.el</title><link>https://kisaragi-hiu.com/projects/info-variable-pitch/</link><pubDate>Fri, 17 Jun 2022 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/info-variable-pitch/</guid><description>&lt;p>
Like &lt;a href="https://github.com/cadadr/elisp/blob/stable/org-variable-pitch.el">org-variable-pitch&lt;/a> but for Info.&lt;/p></description></item><item><title>Download packages without fetching repositories when using Straight*</title><link>https://kisaragi-hiu.com/2022-06-14-straight-dont-download-repo/</link><pubDate>Tue, 14 Jun 2022 01:48:20 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2022-06-14-straight-dont-download-repo/</guid><description>&lt;p>
&lt;em>2022-07-02T02:53:13+0900: Caveat: dependency packages will be installed twice; which one gets loaded will be up to whether Straight or Package added it to &lt;code class="verbatim">load-path&lt;/code> first. This is why no one really recommends this, and I didn&amp;#39;t keep this in mind when I wrote this.)&lt;/em>&lt;/p>
&lt;p>
&lt;a href="https://github.com/raxod502/straight.el">straight.el&lt;/a> is awesome as it clones the source repositories of each package being installed. This makes it easy to install packages not submitted to a package archive, make changes and perhaps contribute to packages, etc.&lt;/p></description></item><item><title>NodeJS: How to await an asynchronous child process</title><link>https://kisaragi-hiu.com/nodejs-cmd/</link><pubDate>Tue, 07 Jun 2022 01:04:42 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/nodejs-cmd/</guid><description>TL;DR: &lt;a href="#tldr">the solution&lt;/a>.
&lt;p>
If you need a command to happen after another, you can use &lt;a href="https://nodejs.org/docs/latest-v18.x/api/child_process.html#child_processspawnsynccommand-args-options">spawnSync&lt;/a> and other *Sync functions in the &lt;a href="https://nodejs.org/docs/latest-v18.x/api/child_process.html">child_process&lt;/a> module. However, the command&amp;#39;s output will not be printed to the terminal as it runs: you might decide to read the return value and send the command&amp;#39;s output to your program&amp;#39;s output yourself, but all output will be bunched up and printed at once.&lt;/p>
&lt;div class="src src-js">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">execSync&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;child_process&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">process&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;process&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">stdout&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">write&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">execSync&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;echo one; sleep 1; echo two; sleep 1&amp;#34;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;This must happen last.&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
&lt;video controls autoplay muted loop src="https://kisaragi-hiu.com/nodejs-cmd-node-sync.mp4">&lt;/video>
&lt;/p></description></item><item><title>Performance comparison between cl-lib, dash, and seq</title><link>https://kisaragi-hiu.com/performance-cl-lib-dash-seq/</link><pubDate>Sun, 05 Jun 2022 00:45:51 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/performance-cl-lib-dash-seq/</guid><description>&lt;p>
Caveats: Not compiled&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Conclusions
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;ul>
&lt;li>In general seq.el is the slowest while dash.el and cl-lib.el can be really similar&lt;/li>
&lt;li>dash.el anaphoric forms are really slow unless your code is compiled&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-2" class="outline-2">
&lt;h2 id="headline-2">
Hardware
&lt;/h2>
&lt;div id="outline-text-headline-2" class="outline-text-2">
&lt;div class="src src-shell">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">uname -a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">emacs -Q --batch --eval &lt;span class="s2">&amp;#34;(princ (format \&amp;#34;Emacs: %s\\n\&amp;#34; emacs-version))&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">neofetch cpu gpu memory&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;pre class="example">
Linux MF-PC 5.15.45-1-lts #1 SMP Mon, 06 Jun 2022 09:19:52 +0000 x86_64 GNU/Linux
Emacs: 28.1
cpu: AMD Ryzen 5 2600 (12) @ 3.400GHz
gpu: AMD ATI Radeon RX 460/560D / Pro 450/455/460/555/555X/560/560X
memory: 4027MiB / 7958MiB
&lt;/pre>
&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-3" class="outline-2">
&lt;h2 id="headline-3">
Comparisons
&lt;/h2>
&lt;div id="outline-text-headline-3" class="outline-text-2">
&lt;ul>
&lt;li>
&lt;p>&lt;code class="verbatim">cl-find-if&lt;/code>, &lt;code class="verbatim">-first&lt;/code>, &lt;code class="verbatim">--first&lt;/code>, &lt;code class="verbatim">seq-find&lt;/code>&lt;/p></description></item><item><title>ntoml.el</title><link>https://kisaragi-hiu.com/projects/ntoml/</link><pubDate>Sat, 04 Jun 2022 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/ntoml/</guid><description>&lt;p>
An attempt at creating a &lt;a href="https://toml.io/en/v1.0.0">TOML 1.0&lt;/a> decoder / encoder for Emacs Lisp.&lt;/p></description></item><item><title>Switching to Corfu</title><link>https://kisaragi-hiu.com/switching-to-corfu/</link><pubDate>Fri, 03 Jun 2022 21:45:43 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/switching-to-corfu/</guid><description>&lt;p>
I switched to using &lt;a href="https://github.com/minad/corfu">Corfu&lt;/a> as my in-buffer completion framework this afternoon.&lt;/p>
&lt;p>
I&amp;#39;ve never been happy about my Company configuration, so when I read Corfu&amp;#39;s README it just sounded like it is for me.&lt;/p>
&lt;p>
Corfu uses child frames by default — I haven&amp;#39;t had good results with child frames, but so far with Corfu it seems to work just fine. I also have a need to use Emacs in a terminal (in &lt;a href="https://termux.com/">Termux&lt;/a>), which &lt;a href="https://codeberg.org/akib/emacs-corfu-terminal">corfu-terminal&lt;/a> solves pretty easily.&lt;/p></description></item><item><title>tftt</title><link>https://kisaragi-hiu.com/projects/tftt/</link><pubDate>Sun, 29 May 2022 09:26:30 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/tftt/</guid><description>&lt;p>
&lt;img src="https://kisaragi-hiu.com/tftt.png" alt="/tftt.png" title="/tftt.png" />&lt;/p></description></item><item><title>yabridgectl-emacs</title><link>https://kisaragi-hiu.com/projects/yabridgectl-emacs/</link><pubDate>Wed, 25 May 2022 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/yabridgectl-emacs/</guid><description>&lt;p>
An Emacs GUI for &lt;a href="https://github.com/robbert-vdh/yabridge">yabridge&lt;/a>.&lt;/p>
&lt;p>
&lt;img src="https://kisaragi-hiu.com/yabridgectl-emacs.png" alt="/yabridgectl-emacs.png" title="/yabridgectl-emacs.png" />&lt;/p></description></item><item><title>Fixing leaf-keywords "unrecognized keyword" error in Flycheck</title><link>https://kisaragi-hiu.com/fix-leaf-keywords-flycheck-error/</link><pubDate>Tue, 17 May 2022 15:31:05 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/fix-leaf-keywords-flycheck-error/</guid><description>&lt;p>
After setting up &lt;a href="https://github.com/conao3/leaf-keywords.el">leaf-keywords&lt;/a> and Flycheck properly:&lt;/p>
&lt;div class="src src-emacs-lisp">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-emacs-lisp" data-lang="emacs-lisp">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">straight-use-package&lt;/span> &lt;span class="ss">&amp;#39;leaf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">straight-use-package&lt;/span> &lt;span class="ss">&amp;#39;leaf-keywords&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nb">require&lt;/span> &lt;span class="ss">&amp;#39;leaf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nb">require&lt;/span> &lt;span class="ss">&amp;#39;leaf-keywords&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">leaf-keywords-init&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">leaf&lt;/span> &lt;span class="nv">flycheck&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">:straight&lt;/span> &lt;span class="no">t&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">:hook&lt;/span> &lt;span class="nv">prog-mode-hook&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
Despite &lt;code class="verbatim">leaf-keywords&lt;/code> being loaded, Flycheck will now return an error from leaf.el complaining that &lt;code class="verbatim">:straight&lt;/code> is an unrecognized keyword.&lt;/p>
&lt;p>
I tried putting &lt;code class="verbatim">leaf-keywords-init&lt;/code> in a &lt;code class="verbatim">eval-when-compile&lt;/code> or a &lt;code class="verbatim">(cl-eval-when (compile load eval))&lt;/code> block, to no avail.&lt;/p>
&lt;p>
For the longest time I just turned Flycheck off in my init file (the only place where leaf.el is used), but yesterday I decided to take another look at it.&lt;/p></description></item><item><title>A Reaper action to open UST files</title><link>https://kisaragi-hiu.com/a-reaper-action-to-open-ust-files/</link><pubDate>Mon, 04 Apr 2022 03:08:37 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/a-reaper-action-to-open-ust-files/</guid><description>&lt;p>
&lt;div class="mx-0 mb-4 mt-4 overflow-auto" id="toc">
&lt;header>
&lt;h1 class="font-serif font-bold mt-0 mb-0">
Table of Contents
&lt;/h1>
&lt;/header>
&lt;div class="k-prose">
&lt;nav id="TableOfContents">
&lt;ul>
&lt;li>&lt;a href="#headline-1">Grabbing the path&lt;/a>
&lt;/li>
&lt;li>&lt;a href="#headline-2">Create a list of possible UST locations and return the first one that exists&lt;/a>
&lt;/li>
&lt;li>&lt;a href="#headline-3">Actually opening the file after finding it&lt;/a>
&lt;/li>
&lt;li>&lt;a href="#headline-4">The end result&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/nav>
&lt;/div>
&lt;/div>
&lt;/p>
&lt;p>
So I bought &lt;a href="https://www.reaper.fm/">Reaper&lt;/a> for its folder tracks and easy to use piano roll, but also because of reviews talking about how they sink tons of time into customizing it exactly to their likings. It sounded to me like it&amp;#39;s the Emacs of DAWs. As I tried using it for a new UTAU cover, I wanted to try out this capability.&lt;/p></description></item><item><title>Why switch to fcitx5</title><link>https://kisaragi-hiu.com/why-fcitx5/</link><pubDate>Sun, 20 Mar 2022 15:29:28 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/why-fcitx5/</guid><description>&lt;p>
&lt;a href="https://github.com/fcitx/fcitx5">The README&lt;/a> does not explain at all, only that it&amp;#39;s the &lt;em>next generation&lt;/em>. I had no issue with fcitx4, and I don&amp;#39;t care that fcitx4 in maintenance mode. Why should I switch?&lt;/p>
&lt;p>
After trying for a little bit, this is why:&lt;/p>
&lt;ul>
&lt;li>Better integration with Plasma. The KCM is shipped as part of fcitx5, instead of as a separate package (&lt;code class="verbatim">kcm-fcitx&lt;/code>). It&amp;#39;s not integrated as well as ibus does to GNOME though — keyboard layouts and input methods are still configured in different pages. GNOME just merges the two.&lt;/li>
&lt;li>You can bind any key to switch to the next input method now. Fcitx 4 only offered four options, none of which use the Super key to avoid conflict with other apps&lt;/li>
&lt;li>There is this new concept of input method groups. I find it pointless in my use case, but maybe some people rely on this. Windows offered something similar: you switch languages with &lt;code class="verbatim">&amp;lt;S-space&amp;gt;&lt;/code> and switch input method within a language with &lt;code class="verbatim">C-space&lt;/code>.&lt;/li>
&lt;li>It seems like there are more themes available on the AUR, but I haven&amp;#39;t wanted to try because &lt;code class="verbatim">kimpanel&lt;/code> looks the best.&lt;/li>
&lt;/ul>
&lt;p>Unless something breaks spectacularly, I&amp;#39;m probably not switching again for some time.&lt;/p></description></item><item><title>Linux: Finding devices on the same network</title><link>https://kisaragi-hiu.com/finding-devices-on-the-same-network/</link><pubDate>Tue, 15 Mar 2022 01:48:23 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/finding-devices-on-the-same-network/</guid><description>&lt;p>
I know when I share my phone&amp;#39;s mobile internet to my laptop through WiFi tethering, the two devices are in the same network and can see each other. But how do I find out the local IP address of the other device?&lt;/p>
&lt;p>
After a little bit of Googling, like this:&lt;/p>
&lt;div class="src src-shell">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">nmap -sn 192.168.2.87/24&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;ul>
&lt;li>&lt;code class="verbatim">-sn&lt;/code> disables “port scan”, which I assume means nmap will scan for devices and not scan for open ports.&lt;/li>
&lt;li>The IP comes from the &lt;code class="verbatim">inet&lt;/code> field in my WiFi device that I got from a call to &lt;code class="verbatim">ip address&lt;/code>&lt;sup class="footnote-reference">&lt;a id="footnote-reference-1" href="#footnote-1">1&lt;/a>&lt;/sup>.&lt;/li>
&lt;/ul>
&lt;p>This is the result:&lt;/p></description></item><item><title>org-import-simplenote</title><link>https://kisaragi-hiu.com/projects/org-import-simplenote/</link><pubDate>Thu, 03 Mar 2022 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/org-import-simplenote/</guid><description>&lt;p>
Import a &lt;a href="https://simplenote.com">Simplenote&lt;/a> archive as Org headings.&lt;/p>
&lt;ol>
&lt;li>Go to Simplenote → Settings → Tools → Export Notes&lt;/li>
&lt;li>A &lt;code class="verbatim">notes.zip&lt;/code> should now be downloaded&lt;/li>
&lt;li>In an Org buffer, run &lt;code class="verbatim">org-import-simplenote&lt;/code> and select the zip file&lt;/li>
&lt;li>Each Simplenote item will be imported as an Org heading&lt;/li>
&lt;/ol></description></item><item><title>Blender: how to display lyrics based on a .lrc file (for lyrics videos)</title><link>https://kisaragi-hiu.com/blender-lrc/</link><pubDate>Sat, 19 Feb 2022 01:19:46 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blender-lrc/</guid><description>&lt;p>
You want to create a lyrics video with Blender. You&amp;#39;ve synchronized the lyrics with the music by creating an &lt;a href="https://en.wikipedia.org/wiki/LRC_(file_format)">.lrc file&lt;/a>, perhaps with &lt;em>&lt;a href="https://lrc-maker.github.io">LRC Maker&lt;/a>&lt;/em>. How do you then synchronize it to a text object?&lt;/p>
&lt;figure>
&lt;video controls autoplay muted loop src="https://kisaragi-hiu.com/blender-lrc.mp4">&lt;/video>
&lt;figcaption>
The video is for a cover of &lt;a href="https://www.youtube.com/watch?v=hL75gQUcu0A">カラカラカラのカラ&lt;/a>
&lt;/figcaption>
&lt;/figure>
&lt;p>
Like this:&lt;/p>
&lt;div class="src src-python">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">re&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">bpy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">timecode_to_frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">timecode&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Return the corresponding frame number for timecodes like &amp;#34;01:23.456&amp;#34;.&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">timecode_to_miliseconds&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">timecode&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">m&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">re&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="k">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">r&lt;/span>&lt;span class="s2">&amp;#34;(.*?):(.*?)\.(.*)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">timecode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">minutes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">group&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">seconds&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">group&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">miliseconds&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">m&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">group&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">minutes&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">1000&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">seconds&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">1000&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">miliseconds&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># one frame is this many miliseconds&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">frametime&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">bpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">scene&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">render&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fps&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">timecode_to_miliseconds&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">timecode&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">frametime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Use a list of lists so that we can iterate over it directly without having to call .items() first&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># (This probably matters because .items() would be run on every frame?)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">parse_lyrics&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text_name&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lyrics&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">line&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">bpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">texts&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">text_name&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lines&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">match&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">re&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="k">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">r&lt;/span>&lt;span class="s2">&amp;#34;\[(.*?)\] ?(.*)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">line&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">body&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">timecode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">match&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">group&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">match&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">group&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">frame&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">timecode_to_frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">timecode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Skip special fields and empty lines&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">except&lt;/span> &lt;span class="ne">ValueError&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">continue&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lyrics&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="n">frame&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">lyrics&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">LYRICS&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">parse_lyrics&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;lyrics.lrc&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">set_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">scene&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">current&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">scene&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">frame_current&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LYRICS&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">index&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pair&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">enumerate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LYRICS&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pair&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prev_keyframe&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">LYRICS&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">max&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">index&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">next_keyframe&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">LYRICS&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">min&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">index&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">length&lt;/span>&lt;span class="p">)][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">prev_keyframe&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">current&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="n">next_keyframe&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">curves&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;Lyrics&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">body&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">text&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">bpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">handlers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">frame_change_pre&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">clear&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">bpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">handlers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">frame_change_pre&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">set_text&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
In Blender, create a new Text datablock (perhaps in the Scripting workplace), call it &lt;em>read_lyrics.py&lt;/em> (or whatever, as well as it ends in .py), and paste the above into it. Run it through (toolbar) Text &amp;gt; Run Script. (Maybe also register it through (toolbar) Text &amp;gt; Register so that this code will run every time the Blender file is opened.)&lt;/p></description></item><item><title>Emacs Lisp: how to check if we haven't yet created any windows in daemon mode</title><link>https://kisaragi-hiu.com/emacs-detect-daemon-before-frame/</link><pubDate>Tue, 18 Jan 2022 05:06:40 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/emacs-detect-daemon-before-frame/</guid><description>&lt;p>
On my system, Emacs segfaults if this is run in a daemon before a window is created:&lt;/p>
&lt;div class="src src-emacs-lisp">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-emacs-lisp" data-lang="emacs-lisp">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nf">set-fontset-font&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">face-attribute&lt;/span> &lt;span class="ss">&amp;#39;default&lt;/span> &lt;span class="nb">:fontset&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="ss">&amp;#39;han&lt;/span> &lt;span class="s">&amp;#34;Noto Sans Mono CJK JP&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
I don&amp;#39;t really know how this works, but I just need to prevent it from running during that time. So how do we check if Emacs is running as a daemon but a window hasn&amp;#39;t been created?&lt;/p>
&lt;p>
(I&amp;#39;ll go back to calling them “&lt;a href="https://www.emacswiki.org/emacs/Frame">frames&lt;/a>” in the rest of this article.)&lt;/p></description></item><item><title>2021 review</title><link>https://kisaragi-hiu.com/2021-review/</link><pubDate>Fri, 31 Dec 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2021-review/</guid><description>&lt;p>
I&amp;#39;m still not sure what I&amp;#39;m doing, and I continue to gain immense interest for stuff before losing interest in like a week or so. No meaningful progress have been made on drawing and music composition, two things that I occasionally feel that I &lt;em>really&lt;/em> want to learn before backing down.&lt;/p>
&lt;p>
I did play on stage as part of the NKUST first campus wind band club though.&lt;/p>
&lt;p>
For something a little bit more personal: I started hormone replacement therapy this April. That&amp;#39;s a major concern off my chest, I guess.&lt;/p></description></item><item><title>Making the Multimedia category in my Linux app menu usable again</title><link>https://kisaragi-hiu.com/declutter-app-list/</link><pubDate>Tue, 07 Dec 2021 19:32:23 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/declutter-app-list/</guid><description>&lt;p>
&lt;code class="verbatim">lsp-plugins&lt;/code> and &lt;code class="verbatim">x42-plugins&lt;/code> both install a launcher shortcut for &lt;em>every single plugin they provide&lt;/em>, rendering the Multimedia category in the desktop menu completely useless. In desktops where apps aren&amp;#39;t split into categories (GNOME), the entire app list is rendered useless by pages upon pages of LSP plugins with the same exact icon.&lt;/p>
&lt;p>
Nobody launches LV2 plugins from the app list — those who do likely knows how to use the command line. I understand that some probably do like being able to use them without a DAW, and it would indeed be nice to be able to launch them from the app list, but that&amp;#39;s only &lt;strong>if the app list actually allows them to be hidden when I don&amp;#39;t need them&lt;/strong>. Right now, as app menus either don&amp;#39;t support application-provided folders or even categories, packages really shouldn&amp;#39;t be providing over 100 launcher shortcuts out of the box.&lt;/p></description></item><item><title>What to do when Piapro Studio no longer uses tempo from the DAW after loading a VSQx</title><link>https://kisaragi-hiu.com/piapro-studio-sync/</link><pubDate>Sat, 27 Nov 2021 21:01:39 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/piapro-studio-sync/</guid><description>&lt;p>
When you load a VSQx into Piapro Studio (perhaps for tuning reference), it will follow the tempo from the VSQx instead of the tempo of the current DAW project.&lt;/p>
&lt;p>
This is a feature called tempo automation. To return to the DAW&amp;#39;s tempo and meter settings, open the meter and tempo automation panel and turn them off.&lt;/p>
&lt;figure>
&lt;img src="https://kisaragi-hiu.com/piapro-studio-tempo-automation-panel.jpg" alt="/piapro-studio-tempo-automation-panel.jpg" title="/piapro-studio-tempo-automation-panel.jpg" />&lt;figcaption>
This button
&lt;/figcaption>
&lt;/figure></description></item><item><title>PipeWire should probably use WirePlumber by default</title><link>https://kisaragi-hiu.com/why-wireplumber-as-a-user/</link><pubDate>Sun, 21 Nov 2021 02:35:44 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/why-wireplumber-as-a-user/</guid><description>&lt;p>
Note: PipeWire still changes. This seems to be true as of PipeWire 0.3.40 and WirePlumber 0.4.5. Commands are most likely not going to be relevant after a while.&lt;/p>
&lt;p>
There are two “session managers” that can be used with PipeWire, &lt;code class="verbatim">pipewire-media-session&lt;/code> and WirePlumber. The two are not supposed to have noticeable differences, but WirePlumber seems to work better for me.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Context
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I use PipeWire 0.3.40 exclusively on my Arch Linux system, replacing both PulseAudio and JACK. These packages are installed:&lt;/p></description></item><item><title>風鈴</title><link>https://kisaragi-hiu.com/illust/2021-11-20/</link><pubDate>Sat, 20 Nov 2021 10:21:07 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2021-11-20/</guid><description/></item><item><title>Windows 11 is fine</title><link>https://kisaragi-hiu.com/windows-11-fine/</link><pubDate>Sun, 31 Oct 2021 04:33:56 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/windows-11-fine/</guid><description>&lt;p>
I upgraded my main PC&amp;#39;s Windows install to Windows 11. It&amp;#39;s honestly fine, I just don&amp;#39;t like the fact that Microsoft broke the promise to make Windows 10 the “last release of Windows” (ie. future updates are always versions of Windows 10) and nobody seems to care. So here&amp;#39;s a brain dump of what I think of Windows 11 so far, roughly sorted from positive to negative.&lt;/p></description></item><item><title>As a Taiwanese, why do I prefer to use a Japanese name?</title><link>https://kisaragi-hiu.com/why-japanese-name/</link><pubDate>Sun, 10 Oct 2021 16:44:40 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/why-japanese-name/</guid><description>&lt;p>
I use a Japanese name despite being Taiwanese. When I introduce myself as Kisaragi, sometimes people mistaken me as being Japanese. I think I need to at least attempt to explain this.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Why foreign names are fine
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
Foreign names are common in Taiwan. Most people have an English name, even if their native language is Mandarin or something else. These names often bear zero semblance to our native names. When learning a new language, people also often adopt names in that language.&lt;/p></description></item><item><title>Functions passed to completing-read do more than just returning a list to select</title><link>https://kisaragi-hiu.com/emacs-completion-metadata/</link><pubDate>Fri, 08 Oct 2021 05:36:31 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/emacs-completion-metadata/</guid><description>&lt;p>
&lt;code class="verbatim">completing-read&lt;/code> accepts a function as the collection of candidates, not just lists. I&amp;#39;ve always thought of this as a small niche that&amp;#39;s only useful for dynamic collections.&lt;/p>
&lt;blockquote>
&lt;p>&lt;code class="verbatim">(completing-read PROMPT COLLECTION &amp;amp;optional PREDICATE REQUIRE-MATCH INITIAL-INPUT HIST DEF INHERIT-INPUT-METHOD)&lt;/code>&lt;/p>
&lt;p>
Read a string in the minibuffer, with completion.&lt;/p>
&lt;ul>
&lt;li>&lt;code class="verbatim">PROMPT&lt;/code> is a string to prompt with; normally it ends in a colon and a space.&lt;/li>
&lt;li>&lt;code class="verbatim">COLLECTION&lt;/code> can be a list of strings, an alist, an obarray or a hash table.&lt;/li>
&lt;li>&lt;code class="verbatim">COLLECTION&lt;/code> can also be a function to do the completion itself.&lt;/li>
&lt;li>&lt;code class="verbatim">PREDICATE&lt;/code> limits completion to a subset of &lt;code class="verbatim">COLLECTION&lt;/code>.&lt;/li>
&lt;li>See &lt;code>try-completion&lt;/code>, &lt;code>all-completions&lt;/code>, &lt;code>test-completion&lt;/code>, and &lt;code>completion-boundaries&lt;/code>, for more details on completion, &lt;code class="verbatim">COLLECTION&lt;/code>, and &lt;code class="verbatim">PREDICATE&lt;/code>. See also Info node &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Basic-Completion.html">(elisp)Basic Completion&lt;/a> for the details about completion, and Info node &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Programmed-Completion.html">(elisp)Programmed Completion&lt;/a> for expectations from &lt;code class="verbatim">COLLECTION&lt;/code> when it&amp;#39;s a function.&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>
Last night I was trying out &lt;a href="https://github.com/minad/embark">Embark&lt;/a> and &lt;a href="https://github.com/minad/marginalia">Marginalia&lt;/a> after reading &lt;a href="https://karthinks.com/software/fifteen-ways-to-use-embark/">Fifteen ways to use Embark&lt;/a>, and I learned that the built in completion system actually supports specifying &lt;em>categories&lt;/em>. The built in completion system knows that &lt;code class="verbatim">find-file&lt;/code> is looking for files, and &lt;code class="verbatim">describe-minor-mode&lt;/code> is looking for a list of minor modes; Marginalia makes use of this to decide what annotations to show, while Embark makes use of it to decide which context menu to show.&lt;/p></description></item><item><title>Installing a Progressive Web App on Linux with Firefox</title><link>https://kisaragi-hiu.com/firefox-install-pwa/</link><pubDate>Sat, 11 Sep 2021 19:26:26 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/firefox-install-pwa/</guid><description>&lt;p>
Progressive Web Apps (&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps">PWA&lt;/a>) is just a fancy name for websites that utilize a set of APIs that allow them to replace native apps. “Installing a PWA” really just means adding a shortcut to the website while taking its &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Manifest">manifest&lt;/a> into account.&lt;/p>
&lt;p>
On Windows, installing a PWA using Firefox is pretty simple. For websites that provide a manifest, an install button will appear next to window controls, which adds a shortcut to the start menu when clicked. Opening the shortcut will open the website in its own window without browser controls, as if it&amp;#39;s a native app.&lt;/p></description></item><item><title>One way to set up org-protocol on Linux</title><link>https://kisaragi-hiu.com/org-protocol-linux/</link><pubDate>Thu, 09 Sep 2021 03:03:34 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/org-protocol-linux/</guid><description>&lt;p>
&lt;a href="https://orgmode.org/manual/Protocols.html">Org-protocol&lt;/a> allows you to write links in the browser and open Emacs when you click the link. After the Emacs side is set up, running &lt;code class="verbatim">emacsclient org-protocol://handler?key=value&lt;/code> will pass &lt;code class="verbatim">(:key &amp;#34;value&amp;#34;)&lt;/code> to the function that is registered for &lt;code class="verbatim">handler&lt;/code>. But the browser still does not recognize the link.&lt;/p>
&lt;p>
&lt;a href="https://github.com/org-roam/org-roam/blob/1795039ab93ef19611dbb3fca21c4211c4e655a9/doc/org-roam.org#linux">Org-roam&amp;#39;s documentation explains a set up that is more in depth&lt;/a> (and also covers macOS and Windows). But I didn&amp;#39;t want to create a new &lt;code class="verbatim">.desktop&lt;/code> file, so this is how I did it.&lt;/p></description></item><item><title>timer</title><link>https://kisaragi-hiu.com/projects/timer/</link><pubDate>Mon, 30 Aug 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/timer/</guid><description>&lt;p>
A &lt;em>vanilla JS&lt;/em> timer with frame counts.&lt;/p>
&lt;p>
&lt;img src="https://kisaragi-hiu.com/kisaragi-timer.png" alt="/kisaragi-timer.png" title="/kisaragi-timer.png" />&lt;/p></description></item><item><title>壊れたセカイ</title><link>https://kisaragi-hiu.com/illust/2021-08-29/</link><pubDate>Sun, 29 Aug 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2021-08-29/</guid><description/></item><item><title>list-albums</title><link>https://kisaragi-hiu.com/projects/list-albums/</link><pubDate>Thu, 05 Aug 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/list-albums/</guid><description>&lt;p>
Documented in &lt;a href="https://kisaragi-hiu.com/sort-albums-by-duration">https://kisaragi-hiu.com/sort-albums-by-duration&lt;/a>&lt;/p>
&lt;p>
A command to list albums by album duration.&lt;/p>
&lt;p>
Since no music player that I&amp;#39;ve tried supports this, I had to implement this myself. It&amp;#39;s been useful from time to time, so I&amp;#39;ve made it a package.&lt;/p></description></item><item><title>Creating a list sorted by duration in Emacs</title><link>https://kisaragi-hiu.com/sort-albums-by-duration/</link><pubDate>Thu, 05 Aug 2021 00:59:00 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/sort-albums-by-duration/</guid><description>&lt;p>
Sometimes I listen to albums in my music collection as a sort of timer. It’s pretty neat: I know about one hour has passed when the album &lt;a href="https://w.atwiki.jp/hmiku/pages/29068.html">Youthfull (koyori)&lt;/a> is over (54 minutes), and I don’t have to have a clock on screen to be able to know that.&lt;/p>
&lt;p>
To do this, I want to sort the albums by duration so I can pick one that’s at the right length. However, (at least on Linux) seemingly no music player supports it. Some just don’t have a table view for sorting anything (GNOME Music), some don’t have a list view for albums (Lollypop, &lt;a href="https://github.com/elementary/music">elementary Music&lt;/a>), some allow sorting albums but not by duration (Elisa)…&lt;/p></description></item><item><title>How to avoid accidentally quitting an app or a game: app pinning</title><link>https://kisaragi-hiu.com/pin-app-to-avoid-accidental-quit/</link><pubDate>Sun, 25 Jul 2021 21:30:02 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/pin-app-to-avoid-accidental-quit/</guid><description>&lt;p>
One thing that used to stop me from ever considering using gesture-based navigation on my phone is how easy it is to accidentally trigger a gesture in a game, particularly in a rhythm game. I’d be on a full combo attempt only to accidentally quit out to home, ruining a good play — I would rather not have to worry about that. However, a few days ago I learned that you can actually prevent this from happening simply by pinning the app.&lt;/p></description></item><item><title>@kisaragi-hiu/cached-fetch</title><link>https://kisaragi-hiu.com/projects/cached-fetch/</link><pubDate>Sun, 25 Jul 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/cached-fetch/</guid><description>&lt;p>
A caching function designed for caching fetch GET responses on disk in a command line program.&lt;/p>
&lt;p>
I keep rewriting this logic in multiple projects, so I&amp;#39;m making it a package.&lt;/p>
&lt;div class="src src-typescript">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">cached&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;@kisaragi-hiu/cached-fetch&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">cached&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;myCacheKey&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">()&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="nx">fetch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://example.com&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">cached&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;myCacheKey2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">()&lt;/span> &lt;span class="o">=&amp;gt;&lt;/span> &lt;span class="nx">$&lt;/span>&lt;span class="sb">`echo hello`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div></description></item><item><title>evil-cutlass</title><link>https://kisaragi-hiu.com/projects/evil-cutlass/</link><pubDate>Sun, 25 Jul 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/evil-cutlass/</guid><description>&lt;p>
Override delete operations to not affect the clipboard / kill ring. Evil port of &lt;a href="https://github.com/svermeulen/vim-cutlass">vim-cutlass&lt;/a>.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Setup
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;div class="src src-elisp">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-elisp" data-lang="elisp">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">straight-use-package&lt;/span> &lt;span class="o">&amp;#39;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">evil-cutlass&lt;/span> &lt;span class="nb">:host&lt;/span> &lt;span class="nv">github&lt;/span> &lt;span class="nb">:repo&lt;/span> &lt;span class="s">&amp;#34;kisaragi-hiu/evil-cutlass&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">;; Turn on the mode globally:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">evil-cutlass-mode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">;; Or bind a key to toggle the minor mode:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">general-define-key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">:prefix&lt;/span> &lt;span class="s">&amp;#34;SPC&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">:states&lt;/span> &lt;span class="o">&amp;#39;&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nv">normal&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;tc&amp;#34;&lt;/span> &lt;span class="nf">#&amp;#39;&lt;/span>&lt;span class="nv">evil-cutlass-mode&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">;; Maybe bind keys for cutting:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">evil-define-key*&lt;/span> &lt;span class="ss">&amp;#39;normal&lt;/span> &lt;span class="nv">evil-cutlass-mode-map&lt;/span> &lt;span class="s">&amp;#34;x&amp;#34;&lt;/span> &lt;span class="nf">#&amp;#39;&lt;/span>&lt;span class="nv">evil-cutlass-cut&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">evil-define-key*&lt;/span> &lt;span class="ss">&amp;#39;normal&lt;/span> &lt;span class="nv">evil-cutlass-mode-map&lt;/span> &lt;span class="s">&amp;#34;X&amp;#34;&lt;/span> &lt;span class="nf">#&amp;#39;&lt;/span>&lt;span class="nv">evil-cutlass-cut-line&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Blender pseudo vertical text</title><link>https://kisaragi-hiu.com/projects/blender-pseudo-vertical-text/</link><pubDate>Thu, 08 Jul 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/blender-pseudo-vertical-text/</guid><description>&lt;p>
The addon I said I wanted to make in &lt;a href="https://kisaragi-hiu.com/blender-vertical-writing.html">在Blender裡用直書&lt;/a>.&lt;/p>
&lt;p>
It&amp;#39;s now published &lt;a href="https://blendermarket.com/products/cjk-pseudo-vertical-writing">on Blender Market&lt;/a> for $5.&lt;/p>
&lt;p>
&lt;video controls autoplay muted loop src="https://kisaragi-hiu.com/blender-pseudo-vertical-text-0.2.0.mp4">&lt;/video>
&lt;/p></description></item><item><title>Vertical writing in Blender</title><link>https://kisaragi-hiu.com/blender-vertical-writing/</link><pubDate>Sun, 04 Jul 2021 09:37:15 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blender-vertical-writing/</guid><description>&lt;p>
Blender doesn&amp;#39;t support vertical writing. So what should I do when I still want to use it?&lt;/p>
&lt;p>
&lt;em>2021-07-08:&lt;/em> I&amp;#39;ve now published &lt;a href="#0238c6f6-6ed5-41b6-8b23-737ef4eabca9">option 3, emulating vertical writing with newlines&lt;/a>, as an addon &lt;a href="https://blendermarket.com/products/cjk-pseudo-vertical-writing">on Blender Market&lt;/a>. &lt;a href="https://kisaragi-hiu.com/projects/blender-pseudo-vertical-text.html">Here&amp;#39;s its page on this site&lt;/a>.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Option 1: Convert Text to Mesh or Curve then rotate it myself
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
You can do anything to the polygons and vertices after converting to a Mesh or a Curve.&lt;/p>
&lt;p>
This is not a solution: you have to do it for &lt;em>every single character&lt;/em>, and if you&amp;#39;re doing it for eg. lyrics, you&amp;#39;re going to spend all your time simply to turn the text to vertical.&lt;/p></description></item><item><title>在 Blender 裡用直書</title><link>https://kisaragi-hiu.com/zh-blender-vertical-writing/</link><pubDate>Sun, 04 Jul 2021 09:37:15 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/zh-blender-vertical-writing/</guid><description>&lt;p>
Blender 不支援直書。但如果我還是想要用直書的話怎麼辦？&lt;/p>
&lt;p>
&lt;em>2021-07-08:&lt;/em> 我把&lt;a href="#d41e9dcd-f02f-4eae-88ee-b03e04340d6b">下面提到用換行模擬的方式&lt;/a>做成插件了。&lt;a href="https://kisaragi-hiu.com/projects/blender-pseudo-vertical-text.html">插件的頁面在這裡。&lt;/a>&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
打字之後轉換成Mesh或Curve然後自己轉90°
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
反正轉換成Mesh或Curve物件之後頂點和多邊形要怎麼改都可以。&lt;/p></description></item><item><title>ハルノ寂寞 雨月ver.</title><link>https://kisaragi-hiu.com/illust/2021-06-22/</link><pubDate>Tue, 22 Jun 2021 08:03:16 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2021-06-22/</guid><description>&lt;p>
&lt;a href="https://nico.ms/sm38728089">稲葉曇さんのハルノ寂寞&lt;/a>のカバーに使う予定の背景です。&lt;/p>
&lt;p>
絵はあんまりかけないのにこの背景の雨月バージョンがほしいので、トレスものになってしまいました。&lt;/p>
&lt;p>
トレスした本家:&lt;/p>
&lt;ul>
&lt;li>本家の背景 (ぬくぬくにぎりめしさん)：ポーズとデザインなど&lt;/li>
&lt;li>&lt;a href="https://ja.wikipedia.org/wiki/安達としまむら#テレビアニメ">安達としまむら&lt;/a> 第二話 17:47ぐらい (安達としまむら製作委員会)：顔と目と眉の位置&lt;/li>
&lt;/ul>
&lt;p>参考図:&lt;/p></description></item><item><title>expt, log, and root: the power triangle</title><link>https://kisaragi-hiu.com/power-triangle/</link><pubDate>Sun, 20 Jun 2021 23:35:02 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/power-triangle/</guid><description>&lt;p>
&lt;img src="expt-log-root-triangle.jpg" alt="expt-log-root-triangle.jpg" title="expt-log-root-triangle.jpg" />&lt;/p>
&lt;p>
I learned this view from 3blue1brown’s video, &lt;a href="https://www.youtube.com/watch?v=sULa9Lc4pck">Triangle of Power&lt;/a>, which sources from &lt;a href="https://math.stackexchange.com/questions/30046/alternative-notation-for-exponents-logs-and-roots">this Math StackExchange answer that invented this notation&lt;/a>.&lt;/p>
&lt;p>
While those sources explain this as an alternative notation, even without using it as a notation it is still a pretty useful conceptual tool.&lt;/p></description></item><item><title>使用 Crowdin 管理翻譯專案</title><link>https://kisaragi-hiu.com/crowdin-setup-intro/</link><pubDate>Sat, 19 Jun 2021 00:52:03 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/crowdin-setup-intro/</guid><description>&lt;p>
Crowdin 是一個翻譯平台。需要翻譯的專案可以上傳到 Crowdin 上再交給翻譯師翻譯，也可以做成公開專案讓使用者們貢獻翻譯。大宗的使用者有例如 Mojang — &lt;a href="https://crowdin.com/project/minecraft">Minecraft 的翻譯都是在 Crowdin 上做的&lt;/a>。&lt;/p></description></item><item><title>Tagging tags in Hugo</title><link>https://kisaragi-hiu.com/hugo-tagging-tags/</link><pubDate>Sun, 13 Jun 2021 20:19:55 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/hugo-tagging-tags/</guid><description>&lt;p>
Hugo has extensive support for Taxonomies. These allow any page to be tagged with anything, with appropriate list pages generated automatically.&lt;/p>
&lt;p>
However, this support does not extend to those list pages themselves.&lt;/p>
&lt;p>
In a normal page template, I can use &lt;code class="verbatim">{{.GetTerms &amp;#34;tags&amp;#34;}}&lt;/code> to get the current page’s tags, including the link to the listing for those tags.&lt;/p>
&lt;p>
&lt;code class="verbatim">{{.GetTerms &amp;#34;tags&amp;#34;}}&lt;/code> in a Taxonomy Term template returns nothing.&lt;/p>
&lt;p>
Fortunately Hugo is flexible enough to allow us to work around this limitation.&lt;/p></description></item><item><title>Making links work in both Hugo and Org</title><link>https://kisaragi-hiu.com/links-in-both-hugo-and-org/</link><pubDate>Sat, 12 Jun 2021 23:06:34 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/links-in-both-hugo-and-org/</guid><description>&lt;p>
In a Hugo site using Org like this one, paths to the same files are different in the source code and when they’re exported. For example, to reference an image in this repository,&lt;/p>
&lt;ul>
&lt;li>its source path would be something like /static/illust/2021-06-11.jpg,&lt;/li>
&lt;li>while the exported path would be &lt;a href="https://kisaragi-hiu.com/illust/2021-06-11.jpg">/illust/2021-06-11.jpg&lt;/a>.&lt;/li>
&lt;/ul>
&lt;p>This causes links to either work in Emacs (which uses source paths) or the browser (using exported paths), but not both.&lt;/p>
&lt;p>
go-org, the Org parsing library that Hugo uses, &lt;a href="https://github.com/niklasfasching/go-org/releases/tag/v1.4.0">alleviated this somewhat in version 1.4.0&lt;/a>. A link to &lt;code class="verbatim">[[about.org]]&lt;/code> is now exported as a link to &lt;code class="verbatim">[[about.html]]&lt;/code>, allowing links in the same directory to work both in Emacs and in the browser.&lt;/p></description></item><item><title>Finally finished reading Steins;Gate</title><link>https://kisaragi-hiu.com/blog/2021-06-11-sg-done/</link><pubDate>Sat, 12 Jun 2021 00:48:28 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2021-06-11-sg-done/</guid><description>&lt;p>
After putting it off for so long, I finally finished reading Steins;Gate (for a second time).&lt;/p>
&lt;p>
Before its Steam release I did play through it once, reaching the Mayuri end as I didn&amp;#39;t have a guide. That was the first time I attempted to read something in Japanese only.&lt;/p>
&lt;p>
After the Steam release on 2016-09-09, I set about playing through it with a guide this time. But for various reasons the 43 hours in total that I spent on this play through has spanned over 4 years, from 2016-09-11 all the way to 2021-05-31.&lt;/p></description></item><item><title>Spiral</title><link>https://kisaragi-hiu.com/illust/2021-06-11/</link><pubDate>Fri, 11 Jun 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2021-06-11/</guid><description>&lt;p>
&lt;em>Heavily&lt;/em> inspired by the spiral in Girls&amp;#39; Last Tour episode 8.&lt;/p></description></item><item><title>ISO 8601</title><link>https://kisaragi-hiu.com/iso8601/</link><pubDate>Mon, 07 Jun 2021 20:15:39 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/iso8601/</guid><description>&lt;p>
A standard for timestamps.&lt;/p>
&lt;p>
It is roughly &lt;code class="verbatim">yyyy-mm-ddTHH:MM:SSZ&lt;/code>, where&lt;/p>
&lt;ul>
&lt;li>yyyy is the 4-digit year&lt;/li>
&lt;li>mm is the 2-digit month&lt;/li>
&lt;li>dd is the 2-digit day&lt;/li>
&lt;li>HH is the hour&lt;/li>
&lt;li>MM is the minute&lt;/li>
&lt;li>SS is the second&lt;/li>
&lt;li>and Z is the offset from UTC.&lt;/li>
&lt;/ul>
&lt;p>The offset from UTC is roughly written in this format:&lt;/p>
&lt;ul>
&lt;li>&lt;code class="verbatim">Z&lt;/code> stands for UTC. It&amp;#39;s also referred to as Zulu time.&lt;/li>
&lt;li>Otherwise, it&amp;#39;s either &lt;code class="verbatim">+HH:MM&lt;/code> or &lt;code class="verbatim">-HH:MM&lt;/code>.&lt;/li>
&lt;/ul>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Omitting the colon in the UTC offset
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I tend to omit the colon in the UTC offset, but I&amp;#39;m not sure if this actually conforms to the standard.&lt;/p></description></item><item><title>Why I shouldn't have put the publish date in my URLs</title><link>https://kisaragi-hiu.com/why-not-date-in-url/</link><pubDate>Mon, 07 Jun 2021 19:41:30 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/why-not-date-in-url/</guid><description>&lt;p>
Two philosophies:&lt;/p>
&lt;ul>
&lt;li>Date in URL: each page is like a snapshot in time, pages are more like public diary entries / blog posts&lt;/li>
&lt;li>Just the title or an ID: each page is like an encyclopedia entry. The site is more like a personal wiki.&lt;/li>
&lt;/ul>
&lt;p>The former is good for logs, but not that good for concept notes. What if you want to update your understanding of the concept?&lt;/p>
&lt;p>
Concept entries should use the latter.&lt;/p></description></item><item><title>Inserting a link after typing “[[” in Org</title><link>https://kisaragi-hiu.com/2021-06-02-insert-key-double-key/</link><pubDate>Wed, 02 Jun 2021 23:00:06 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2021-06-02-insert-key-double-key/</guid><description>&lt;p>
&lt;video controls autoplay muted loop src="https://kisaragi-hiu.com/emacs-org-double-square-insert.mp4">&lt;/video>
&lt;/p>
&lt;p>
Many personal wiki systems use “[[” to insert internal links. Often times when a user types “[[”, an autocomplete prompt will be shown.&lt;/p>
&lt;p>
Org-roam also implements this with a completion-at-point backend, but personally I prefer autocompletion with Ivy over Company. I find Ivy easier to navigate when there is a large number of candidates.&lt;/p>
&lt;p>
I have a custom &lt;code class="verbatim">k/insert-link&lt;/code> command, which functionally serves the same purpose as &lt;code class="verbatim">org-roam-insert&lt;/code>. I will use that command to insert links, but the latter can also be used.&lt;/p></description></item><item><title>So I made a trumpet score for ID Smile</title><link>https://kisaragi-hiu.com/2021-05-01-idsmile-trumpet-sheet/</link><pubDate>Sat, 01 May 2021 23:19:58 +0700</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2021-05-01-idsmile-trumpet-sheet/</guid><description>&lt;p>
I’ve been obsessed over &lt;a href="https://pjsekai.sega.jp/">Project Sekai&lt;/a> in the last few months. &lt;a href="https://www.youtube.com/watch?v=X_6EPkvIAGg">ID Smile&lt;/a> is a song that was recently added to the game, and it’s my favorite song in the last month.&lt;/p>
&lt;p>
I wanted to try to play it when practicing the trumpet, so I tried making a sheet for it. When I started a few hours before writing this post the full version wasn’t uploaded yet, so I focused on transcribing the &lt;a href="https://www.youtube.com/watch?v=QdYji4SVH3A">short version&lt;/a> onto the sheet.&lt;/p></description></item><item><title>aqi.tw</title><link>https://kisaragi-hiu.com/projects/aqi-tw/</link><pubDate>Tue, 13 Apr 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/aqi-tw/</guid><description>&lt;p>
&lt;img src="https://kisaragi-hiu.com/aqi-tw-20210708.png" alt="/aqi-tw-20210708.png" title="/aqi-tw-20210708.png" />&lt;/p>
&lt;p>
A simple visualization of Taiwan’s AQI data.&lt;/p>
&lt;p>
I’ve wanted to write this as a sort of practice since 2017.&lt;/p>
&lt;p>
I was actually a little surprised that the domain wasn’t already taken between then and now (2021).&lt;/p></description></item><item><title>Switching to Hugo</title><link>https://kisaragi-hiu.com/2021-03-20-switching-to-hugo/</link><pubDate>Sat, 20 Mar 2021 00:53:55 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2021-03-20-switching-to-hugo/</guid><description>&lt;p>
So I finally switched to &lt;a href="https://gohugo.io/">Hugo&lt;/a> because trying to iterate design elements in Pollen is just too slow. Pollen is good for defining flexible markup, but that’s not what I want for a blog.&lt;/p>
&lt;p>
This is long overdue. I’ve been trying to revamp the site on and off since 2018, most recently starting to move all articles to Org mode (utilizing &lt;a href="projects/ox-pollen.html">ox-pollen&lt;/a>) so that I can index them in org-roam, but switching fully to a fast static site generator is still pretty nice.&lt;/p></description></item><item><title>Setting up testing and coverage for Emacs Lisp on Gitlab CI</title><link>https://kisaragi-hiu.com/emacs-lisp-testing-gitlab-ci/</link><pubDate>Sun, 14 Feb 2021 17:34:14 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/emacs-lisp-testing-gitlab-ci/</guid><description>&lt;p>
As many projects use &lt;a href="https://docs.github.com/en/actions">GitHub Actions&lt;/a> for CI, there seems to be more resources for setting GitHub Actions up for Emacs Lisp, including &lt;a href="https://github.com/purcell/setup-emacs">purcell/setup-emacs&lt;/a> and &lt;a href="https://github.com/leotaku/elisp-check">leotaku/elisp-check&lt;/a>. There are also many examples to copy from.&lt;/p>
&lt;p>
On the other hand, I was only able to find one Emacs Lisp project using Gitlab CI: &lt;a href="https://gitlab.com/joewreschnig/gitlab-ci-mode/">joewreschnig/gitlab-ci-mode&lt;/a>.&lt;/p>
&lt;p>
To learn how to do this, I added automatic testing to &lt;a href="https://gitlab.com/kisaragi-hiu/tst.el">tst.el&lt;/a>, a tiny library hosted on Gitlab. This is the result.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
.gitlab-ci.yml
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;div class="src src-yaml">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">default&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">before_script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">cask install&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">test-26.3&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">silex/emacs:26.3-ci-cask&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">cask exec ert-runner&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">test-27.1&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">silex/emacs:27.1-ci-cask&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">cask exec ert-runner&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
This tells Gitlab CI to automatically run tests (with ert-runner) under Emacs 26.3 and Emacs 27.1.&lt;/p></description></item><item><title>tst.el</title><link>https://kisaragi-hiu.com/projects/tst.el/</link><pubDate>Mon, 11 Jan 2021 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/tst.el/</guid><description>&lt;p>
An Emacs Lisp library implementing a syntax for specifying tags inspired by TagSpaces.&lt;/p>
&lt;p>
I also use this as a reference for &lt;a href="https://kisaragi-hiu.com/emacs-lisp-testing-gitlab-ci.html">setting up GitLab CI for Emacs Lisp&lt;/a> whenever I don’t quite remember.&lt;/p></description></item><item><title>2020 review</title><link>https://kisaragi-hiu.com/2020-review/</link><pubDate>Thu, 17 Dec 2020 03:32:42 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2020-review/</guid><description>&lt;p>
Last year I saw &lt;a href="https://www.taniarascia.com/2019-into-2020/">Tania Rascia’s 2019 into 2020&lt;/a> article and thought I should do the same, but I procrastinated so much that now I’m writing a review for 2020 instead of 2019.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Articles
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I wrote way too few articles this year. I’ve been keeping more private notes, some of which are more suited to this blog, so I’ll probably publish more next year.&lt;/p></description></item><item><title>Language Learning Roadmap</title><link>https://kisaragi-hiu.com/language-learning-roadmap/</link><pubDate>Tue, 10 Nov 2020 03:53:02 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/language-learning-roadmap/</guid><description>&lt;p>
An attempt at making a universal roadmap for learning another language.&lt;/p>
&lt;p>
&lt;del>This is not published yet: that only happens when we add this file to &lt;code class="verbatim">index.ptree&lt;/code>.&lt;/del> &lt;em>2021-03-29T01:40:19+0900: Oops? This is actually already published. Best revise this later, I guess.&lt;/em>&lt;/p>
&lt;p>
Learning a language = memorize enough of the vocabulary + be familiar enough with grammatical rules (+ understanding pronunciation, though I consider this to be part of vocabulary)&lt;/p>
&lt;p>
Motivation: is there anything you want to read in the target language? If not, Wikipedia is a good starting point.&lt;/p></description></item><item><title>background-job.el</title><link>https://kisaragi-hiu.com/projects/background-job.el/</link><pubDate>Sun, 01 Nov 2020 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/background-job.el/</guid><description>&lt;p>
An Emacs Lisp library to start jobs in the background that try not to block the user too much.&lt;/p></description></item><item><title>Infrastructure of this site as of October 2020</title><link>https://kisaragi-hiu.com/2020-10-31-infrastructure/</link><pubDate>Sat, 31 Oct 2020 04:19:31 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2020-10-31-infrastructure/</guid><description>&lt;p>
&lt;em>2021-06-13T03:03:01+0900: This is now outdated. &lt;a href="2021-03-20-switching-to-hugo.html">I don’t use Pollen on this site any more&lt;/a>.&lt;/em>&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
History
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>This blog went through many iterations.&lt;/p>
&lt;ul>
&lt;li>It &lt;a href="2017-03-19-new-website.html">started as a Jekyll site hosted on Github Pages&lt;/a> (replacing an old blog hosted on Blogger, which was just a list of UTAU cover announcements),&lt;/li>
&lt;li>then I &lt;a href="2017-11-14-this-blog-with-pollen-and-frog.html">moved it to Frog, then to just Pollen, then back to Frog but using Pollen as a preprocessor&lt;/a>,&lt;/li>
&lt;li>then completely back to Pollen in 2018.&lt;/li>
&lt;/ul>
&lt;p>Now I’ve added another layer: content is now written in Org mode and converted to Pollen Markup with &lt;a href="projects/ox-pollen">ox-pollen&lt;/a>.&lt;/p></description></item><item><title>inbetween</title><link>https://kisaragi-hiu.com/illust/2020-10-27/</link><pubDate>Tue, 27 Oct 2020 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2020-10-27/</guid><description/></item><item><title>ox-pollen: a way to integrate Org files into a Pollen project</title><link>https://kisaragi-hiu.com/2020-10-25-ox-pollen/</link><pubDate>Sun, 25 Oct 2020 02:30:33 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2020-10-25-ox-pollen/</guid><description>&lt;p>
After reading &lt;a href="https://www.swyx.io/learn-in-public/">swyx - Learn in public&lt;/a>, I realized I really have to write more on this blog to make use of some of my collection of 2000+ diary and note entries.&lt;/p>
&lt;p>
I haven’t been writing that much (at all) on this blog, mainly because this year I’ve been going through lots of changes in the way I take notes. I now use &lt;a href="https://www.orgroam.com">Org-roam&lt;/a> to manage all notes (after briefly experimenting with my own implementation of backlinks in Emacs). But this has left this blog stuck in an old workflow that I’ve now abandoned, making it even harder for me to start wanting to write in public again.&lt;/p></description></item><item><title>ox-pollen</title><link>https://kisaragi-hiu.com/projects/ox-pollen/</link><pubDate>Fri, 16 Oct 2020 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/ox-pollen/</guid><description>&lt;p>
ox-pollen allows exporting Org mode to Pollen markup.&lt;/p>
&lt;p>
The Pollen markup it generates is somewhat opinionated, simply because of how flexible Pollen markup is.&lt;/p>
&lt;p>
It supports converting Org mode keywords (&lt;code class="verbatim">#+title:&lt;/code> and the like) to &lt;code class="verbatim">define-meta&lt;/code> statements.&lt;/p>
&lt;p>
Combined with Make, it makes for a pretty nice workflow for writing pages in Org in a Pollen project.&lt;/p></description></item><item><title>kisaragi-log</title><link>https://kisaragi-hiu.com/projects/kisaragi-log/</link><pubDate>Tue, 28 Jul 2020 00:05:44 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/kisaragi-log/</guid><description>&lt;p>
https://gitlab.com/kisaragi-hiu/kisaragi-hydration&lt;/p>
&lt;p>
Tracking amounts of stuff in Emacs.&lt;/p>
&lt;p>
Started as my own hydration tracker, but I wanted to track more than just water intake.&lt;/p></description></item><item><title>dired-show-readme</title><link>https://kisaragi-hiu.com/projects/dsr/</link><pubDate>Fri, 03 Apr 2020 22:08:51 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/dsr/</guid><description>&lt;p>
A Dired extension to show README of a directory like code foundries.&lt;/p>
&lt;p>
I saw Nextcloud doing it in April 2020 and wanted it in Dired.&lt;/p>
&lt;figure>
&lt;img src="https://kisaragi-hiu.com/dired-show-readme-0.2.1.png" alt="/dired-show-readme-0.2.1.png" title="/dired-show-readme-0.2.1.png" />&lt;figcaption>
dired-show-readme in my dotfiles
&lt;/figcaption>
&lt;/figure></description></item><item><title>Exporting my Slack data to an Org mode file</title><link>https://kisaragi-hiu.com/2020-02-16-slack-export-to-org/</link><pubDate>Sun, 16 Feb 2020 03:19:38 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2020-02-16-slack-export-to-org/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Story
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
In 2017, I tried to use Slack as some sort of todo list, with channels serving as categories, messages being stuff to process, and myself being the only member. It did not work out, partly because I didn&amp;#39;t have internet on my phone; I abandoned the personal Slack workspace shortly after.&lt;/p>
&lt;p>
My personal notes system has evolved a lot, and is now a central Git repository with a bunch of Org files in it. However, I never actually exported the data on the Slack workspace — some notes were still only available there.&lt;/p></description></item><item><title>Publishing my poems as a web-based book</title><link>https://kisaragi-hiu.com/blog/2019-12-16-barren-moon/</link><pubDate>Mon, 16 Dec 2019 19:48:23 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2019-12-16-barren-moon/</guid><description>&lt;figure>
&lt;img src="https://kisaragi-hiu.com/barren-moon-1.0.png" alt="/barren-moon-1.0.png" title="/barren-moon-1.0.png" />&lt;figcaption>
1.0 Screenshot.
&lt;/figcaption>
&lt;/figure>
&lt;p>
I started writing poems (mostly in Mandarin) intermittently in 2013. Initially I put them on Blogger; I then moved them into this site in 2017. However, since they were quite different from everything else on this site (not to mention in a different language), and since I don&amp;#39;t really have a category / tag system that works well, I effectively removed all mentions to them on this site. They were still hosted here, but there were no links in any of the main pages.&lt;/p></description></item><item><title>如同月球般的荒涼</title><link>https://kisaragi-hiu.com/projects/%E5%A6%82%E5%90%8C%E6%9C%88%E7%90%83%E8%88%AC%E7%9A%84%E8%8D%92%E6%B6%BC/</link><pubDate>Mon, 16 Dec 2019 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/%E5%A6%82%E5%90%8C%E6%9C%88%E7%90%83%E8%88%AC%E7%9A%84%E8%8D%92%E6%B6%BC/</guid><description>&lt;p>
&lt;img src="https://kisaragi-hiu.com/barren-moon-1.0.png" alt="/barren-moon-1.0.png" title="/barren-moon-1.0.png" />&lt;/p>
&lt;p>
A web-based book. Collection of poems I wrote in junior and senior high school.&lt;/p>
&lt;p>
Announcement post: &lt;a href="https://kisaragi-hiu.com/blog/2019-12-16-barren-moon.html">Publishing my poems as a web-based book&lt;/a>&lt;/p></description></item><item><title>pangu.rkt</title><link>https://kisaragi-hiu.com/projects/pangu.rkt/</link><pubDate>Thu, 12 Dec 2019 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/pangu.rkt/</guid><description>&lt;p>
Racket port of &lt;a href="https://github.com/vinta/pangu.js">pangu.js&lt;/a> (adding space automatically around CJK text).&lt;/p></description></item><item><title>Classroom Practice</title><link>https://kisaragi-hiu.com/illust/2019-11-21/</link><pubDate>Thu, 21 Nov 2019 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2019-11-21/</guid><description/></item><item><title>ust-mode</title><link>https://kisaragi-hiu.com/projects/ust-mode/</link><pubDate>Sun, 27 Oct 2019 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/ust-mode/</guid><description>&lt;p>
An Emacs major mode for editing UTAU projects (UST files) as text.&lt;/p>
&lt;p>
Only provides syntax highlighting (based on &lt;code class="verbatim">conf-mode&lt;/code>) and a command to normalize paths like OutFile and CacheDir. Useful for searching for a particular flag and replacing all occurances of it, for example.&lt;/p>
&lt;figure>
&lt;img src="https://kisaragi-hiu.com/emacs-ust-mode.png" alt="/emacs-ust-mode.png" title="/emacs-ust-mode.png" />&lt;figcaption>
Editing a UST
&lt;/figcaption>
&lt;/figure></description></item><item><title>Locales, Org timestamps, and format-time-string</title><link>https://kisaragi-hiu.com/blog/2019-10-09-format-time-string-today/</link><pubDate>Wed, 09 Oct 2019 22:39:21 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2019-10-09-format-time-string-today/</guid><description>&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
The problem
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
Org mode&amp;#39;s timestamps include a day-of-week part (like this: &lt;code class="verbatim">&amp;lt;2019-10-09 Wed&amp;gt;&lt;/code>). That day-of-week is localized.&lt;/p>
&lt;p>
When &lt;code class="verbatim">org-todo&lt;/code> is rescheduling a repeating task and encounters a timestamp with a day-of-week in a different locale (eg. &lt;code class="verbatim">&amp;lt;2019-10-09 水 .+1d&amp;gt;&lt;/code>), it updates the format but does not update the time described by the timestamp. When this happens, I have to run &lt;code class="verbatim">org-todo&lt;/code> again, potentially creating a duplicate entry in the heading&amp;#39;s logbook. This is normally not an issue, unless you edit the same Org file from two machines in different locales — exactly why I&amp;#39;m bitten by this quirk.&lt;/p></description></item><item><title>QR Codes from Emacs</title><link>https://kisaragi-hiu.com/blog/2019-09-24-qr-codes-from-emacs/</link><pubDate>Tue, 24 Sep 2019 22:45:48 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2019-09-24-qr-codes-from-emacs/</guid><description>&lt;p>
This article was inspired by &lt;a href="https://blog.jpalardy.com/posts/qr-codes-on-the-command-line/">QR Codes on the Command-Line&lt;/a>.&lt;/p>
&lt;p>
QR codes are nice: if you want to send e.g. a URL or a short string to your phone, just turn it into a QR code and scan it on the phone, no internet required.&lt;/p>
&lt;p>
Install &lt;a href="https://fukuchi.org/works/qrencode/index.html.en">&lt;code class="verbatim">qrencode&lt;/code>&lt;/a> on your system:&lt;/p>
&lt;div class="src src-bash">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pacman -S qrencode&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
Now a QR code can be generated in Emacs by directly calling the shell command, then dumping it to an ASCII art in the &lt;code class="verbatim">*Messages*&lt;/code> buffer:&lt;/p></description></item><item><title>didyoumean.el</title><link>https://kisaragi-hiu.com/projects/didyoumean-el/</link><pubDate>Tue, 20 Aug 2019 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/didyoumean-el/</guid><description>&lt;p>
&lt;a href="https://melpa.org/#/didyoumean" class="badge">&lt;img alt="MELPA badge to package didyoumean" src="https://melpa.org/packages/didyoumean-badge.svg">&lt;/a>
&lt;/p>
&lt;p>
Ask for the right file to open.&lt;/p>
&lt;p>
If there&amp;#39;s a &lt;code class="verbatim">foo.txt&lt;/code> and a &lt;code class="verbatim">foo.md&lt;/code> in the same directory and you request to visit &lt;code class="verbatim">foo&lt;/code>, this will ask if you meant to open one of those files.&lt;/p>
&lt;p>
Emacs port of the &lt;a href="https://github.com/EinfachToll/DidYouMean">DidYouMean&lt;/a> Vim plugin.&lt;/p></description></item><item><title>Setting the width of Emacs profiler reports</title><link>https://kisaragi-hiu.com/blog/2019-05-16-emacs-profiler-width/</link><pubDate>Thu, 16 May 2019 21:39:41 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2019-05-16-emacs-profiler-width/</guid><description>&lt;p>
&lt;strong>TL;DR&lt;/strong>: &lt;a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Setting-Generalized-Variables.html">&lt;code class="verbatim">setf&lt;/code>&lt;/a> the caar of &lt;code class="verbatim">profiler-report-cpu-line-format&lt;/code> and &lt;code class="verbatim">profiler-report-memory-line-format&lt;/code> to a larger width (default 50 and 55).&lt;/p>
&lt;p>
&lt;strong>Update 2021-03-10&lt;/strong>: As of &lt;a href="http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=9920929e7b538f8bf8fb1dd7a9ae7cd1fe5d2b31">this commit on 2020-12-22&lt;/a> the profiler layout has been changed for Emacs 28, putting function names at the rightmost column, preventing them from being truncated. So this article only applies to Emacs up to 27.&lt;/p>
&lt;div class="src src-elisp">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-elisp" data-lang="elisp">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nb">setf&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">caar&lt;/span> &lt;span class="nv">profiler-report-cpu-line-format&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="mi">80&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">caar&lt;/span> &lt;span class="nv">profiler-report-memory-line-format&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
Emacs&amp;#39;s profiler reports have a fixed width, which makes debugging deeply nested function calls &lt;a href="https://emacs.stackexchange.com/questions/7344/make-profiler-report-columns-wider">difficult&lt;/a>.&lt;/p>
&lt;p>
&lt;img src="https://kisaragi-hiu.com/emacs-26.2-profiler.png" alt="/emacs-26.2-profiler.png" title="/emacs-26.2-profiler.png" />&lt;/p>
&lt;p>
Ideally the columns would be resized along with the window, or perhaps &lt;a href="https://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/profiler.el?h=emacs-26">profiler.el&lt;/a> should define its formatting variables with &lt;code class="verbatim">defcustom&lt;/code>. Either way, it is still relatively easy to change the format.&lt;/p></description></item><item><title>My attempt at explaining closures</title><link>https://kisaragi-hiu.com/closures/</link><pubDate>Wed, 15 May 2019 18:16:51 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/closures/</guid><description>&lt;p>
A closure is a function associated with a local, persistent, environment. It is a language feature — some languages attach local environments to functions, some languages don’t.&lt;/p>
&lt;p>
This lets functions keep a persistent state without using global variables.&lt;/p>
&lt;p>
To define a function that has persistent local variables in a language that supports this, create it in a local environment where you’d define these local variables. In Lisp family languages, this means a &lt;code class="verbatim">lambda&lt;/code> wrapped inside a &lt;code class="verbatim">let&lt;/code>: the local binding of that let will become part of the lambda’s environment.&lt;/p></description></item><item><title>org-msr</title><link>https://kisaragi-hiu.com/projects/org-msr/</link><pubDate>Fri, 03 May 2019 17:57:22 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/org-msr/</guid><description>&lt;p>
My personal spaced repetition system, implemented with Org-mode repeaters.&lt;/p>
&lt;p>
Org-msr is a minimal spaced repetition setup for Org mode.&lt;/p>
&lt;p>
After years of usage, I don’t actually think this has been a good idea. Nevertheless, as my vocabulary collection uses it, I’m still not moving away.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Usage
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
Run &lt;code class="verbatim">org-msr-setup&lt;/code> in a Org mode file to&lt;/p>
&lt;ul>
&lt;li>add file TODO keywords according to &lt;code class="verbatim">org-msr-keyword-frequency-alist&lt;/code>&lt;/li>
&lt;li>start &lt;code class="verbatim">org-msr-mode&lt;/code> automatically when visiting this file.&lt;/li>
&lt;/ul>
&lt;p>Now for each heading you want to remember, run &lt;code class="verbatim">org-todo&lt;/code> and select how frequently you want to see it. A repeater will automatically be added and updated, and you can see all items in your org-agenda.&lt;/p></description></item><item><title>A Makefile for UTAU Projects</title><link>https://kisaragi-hiu.com/utau-make-file/</link><pubDate>Wed, 17 Apr 2019 19:50:52 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/utau-make-file/</guid><description>&lt;p>
&lt;em>Update 2019-05-24: Updated Makefile to generate file list automatically (line 2).&lt;/em>&lt;/p>
&lt;p>
I&amp;#39;m currently making a new cover using UTAU, after having broken the last streak of covers. This time, I thought I&amp;#39;d try using &lt;code class="verbatim">make&lt;/code> to help with rendering.&lt;/p>
&lt;p>
My biggest obstacle is automating the rendering itself: I don&amp;#39;t know if UTAU has a command line interface, and using &lt;code class="verbatim">xdotool&lt;/code> proved to be too unreliable when I tried. (It was frustrating.)&lt;/p>
&lt;blockquote>
&lt;p>How do I render a UST from the command line…&lt;/p></description></item><item><title>A systemd unit to kill a daemon on loop</title><link>https://kisaragi-hiu.com/blog/2019-04-13-systemd-timer-tracker-store/</link><pubDate>Sat, 13 Apr 2019 13:30:20 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2019-04-13-systemd-timer-tracker-store/</guid><description>&lt;p>
&lt;code class="verbatim">tracker-store&lt;/code> leaks memory on my system, and after approximately 1 day of uptime, it&amp;#39;ll leak everything and send my system into a lockup. The kernel out-of-memory (OOM) killer isn&amp;#39;t going to do anything, and I&amp;#39;m not sure if &lt;code class="verbatim">earlyoom&lt;/code> is going to help either. This means the simplest solution is just going to be:&lt;/p>
&lt;div class="src src-sh">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span> true&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pkill tracker-store
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> sleep 3h
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;p>
If I had to do this with Firefox or Chrome, this would be a bit too extreme, but since &lt;code class="verbatim">tracker-store&lt;/code> is only supposed to run in the background anyway, I don&amp;#39;t mind (or care) if it&amp;#39;s getting killed.&lt;/p></description></item><item><title>明日を忘れ(minimalistic)</title><link>https://kisaragi-hiu.com/illust/2019-02-10/</link><pubDate>Sun, 10 Feb 2019 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2019-02-10/</guid><description>&lt;p>
The flat version of &lt;a href="2018-09-23.html">明日を忘れ&lt;/a>. I made this for use on my phone cover.&lt;/p></description></item><item><title>Lookup Cangjie encoding in Emacs with =cangjie.el=</title><link>https://kisaragi-hiu.com/blog/2019-01-21-cangjie.el/</link><pubDate>Mon, 21 Jan 2019 19:43:47 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2019-01-21-cangjie.el/</guid><description>&lt;p>
In August 2018, I wanted to start learning &lt;a href="https://en.wikipedia.org/wiki/Cangjie_input_method">Cangjie input method&lt;/a>, but I didn&amp;#39;t know of an easy way to look up the encoding for particular characters. Up to this point I had been using Chinese Wiktionary, which contains the encoding in the pages about individual characters.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
&lt;code class="verbatim">curl Wiktionary | grep &amp;#34;仓颉&amp;#34;&lt;/code>
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
Getting that data from Wiktionary is simple:&lt;/p></description></item><item><title>Canrylog</title><link>https://kisaragi-hiu.com/projects/canrylog/</link><pubDate>Sat, 05 Jan 2019 21:47:20 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/canrylog/</guid><description>&lt;p>
My own time tracker.&lt;/p>
&lt;p>
The core idea is that we simply track a list of events stating that from a moment onward, some task is currently active.&lt;/p>
&lt;p>
I want it to be available in many platforms, but so far there is only an Emacs version.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Tracking file
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>The core tracking file looks like this:&lt;/p>
&lt;div class="src src-canrylog-file">
&lt;pre tabindex="0">&lt;code class="language-canrylog-file" data-lang="canrylog-file">2019-01-15T22:40:18+0900 Entertainment:Gaming:osu!
2019-01-15T23:04:56+0900 Development:Canrylog:Emacs
2019-01-15T23:13:41+0800 Notes:Scheduling
2019-01-15T23:28:19+0800 SocialMedia:Youtube
2019-01-16T00:24:53+0800 Sleep&lt;/code>&lt;/pre>
&lt;/div>
&lt;p>
Each line represents a “task switching event”. Each line starts with a timestamp, a separator (two spaces), and a task name.&lt;/p></description></item><item><title>A Pollen PDF template based on HTML, instead of LaTeX</title><link>https://kisaragi-hiu.com/blog/2019-01-03-pollen-pdf-template/</link><pubDate>Thu, 03 Jan 2019 03:50:00 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2019-01-03-pollen-pdf-template/</guid><description>&lt;p>
&lt;strong>Update 2019-03-24&lt;/strong>: I forgot to mention that Chrom/ium adds a header and footer when printing to PDF from the command line. To work around this, set the top/bottom margin to 0, eg.:&lt;/p>
&lt;div class="src src-css">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="line">&lt;span class="cl">&lt;span class="p">@&lt;/span>&lt;span class="k">media&lt;/span> &lt;span class="nt">print&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">body&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">margin&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="kt">rem&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;hr>
&lt;p>
Pollen&amp;#39;s manual has a &lt;a href="http://docs.racket-lang.org/pollen/fourth-tutorial.html#(part._.Adding_support_for_.P.D.F_output)">tutorial&lt;/a> on how to make &lt;a href="http://docs.racket-lang.org/pollen/second-tutorial.html#%28part._tutorial-2._.Templates%29">templates&lt;/a> for PDF. It first builds a LaTeX source file, then renders that with &lt;code class="verbatim">pdflatex&lt;/code>, then returns the bytes from the PDF, deleting the temporary files. The problem with this in my use case is that I don&amp;#39;t use LaTeX, and would like a way to turn the HTML version of my pages into PDF. So far I had always manually rendered my pages in Firefox (my primary browser) or Chrome (offers a print preview), which I&amp;#39;d like to automate.&lt;/p></description></item><item><title>チャンスという</title><link>https://kisaragi-hiu.com/illust/2018-12-31/</link><pubDate>Mon, 31 Dec 2018 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2018-12-31/</guid><description/></item><item><title>yasearch</title><link>https://kisaragi-hiu.com/projects/yasearch/</link><pubDate>Sun, 09 Dec 2018 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/yasearch/</guid><description>&lt;p>
Yet Another web Search plugin for Emacs.&lt;/p>
&lt;p>
Search the word under point or region on the web.&lt;/p>
&lt;p>
&lt;em>〜Because everybody needs their own web-search Emacs function〜&lt;/em>&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Sample configuration
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;div class="src src-emacs-lisp">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-emacs-lisp" data-lang="emacs-lisp">&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="nv">leaf&lt;/span> &lt;span class="nv">yasearch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">:straight&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nv">yasearch&lt;/span> &lt;span class="nb">:type&lt;/span> &lt;span class="nv">git&lt;/span> &lt;span class="nb">:repo&lt;/span> &lt;span class="s">&amp;#34;https://git.sr.ht/~kisaragi_hiu/yasearch&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">:after&lt;/span> &lt;span class="nv">evil&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">:init&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">evil-define-key&lt;/span> &lt;span class="ss">&amp;#39;motion&lt;/span> &lt;span class="ss">&amp;#39;global&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;gb&amp;#34;&lt;/span> &lt;span class="nf">#&amp;#39;&lt;/span>&lt;span class="nv">yasearch-operator&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">:config&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nb">setq&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">yasearch-engine-alist&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;#39;&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nv">dictgoo&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://dictionary.goo.ne.jp/srch/all/%s/m0u/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">wikipedia-en&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://en.wikipedia.org/w/index.php?search=%s&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">wikipedia-zh&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://zh.wikipedia.org/w/index.php?search=%s&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">wikipedia-ja&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://ja.wikipedia.org/w/index.php?search=%s&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">kotobank&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://kotobank.jp/word/%s&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">google&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://google.com/search?q=%s&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">duckduckgo&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://duckduckgo.com/?q=%s&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">wiktionary-zh&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://zh.wiktionary.org/w/index.php?search=%s&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">wiktionary-en&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://en.wiktionary.org/w/index.php?search=%s&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="nv">wiktionary-ja&lt;/span> &lt;span class="o">.&lt;/span> &lt;span class="s">&amp;#34;https://ja.wiktionary.org/w/index.php?search=%s&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">yasearch-browser-function&lt;/span> &lt;span class="nf">#&amp;#39;&lt;/span>&lt;span class="nv">eww-browse-url&lt;/span>&lt;span class="p">))&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div></description></item><item><title>Three versions of random-string</title><link>https://kisaragi-hiu.com/blog/2018-10-08-random-string-picolisp/</link><pubDate>Mon, 08 Oct 2018 20:52:35 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2018-10-08-random-string-picolisp/</guid><description>&lt;p>
After I started using a password manager to generate my passwords, sometimes I want to do the same in the shell — not necessarily for passwords, but just a random alphanumeric string of a specified length can be useful sometimes.&lt;/p>
&lt;p>
The command would take just one argument as the length for the output string.&lt;/p>
&lt;p>
I wrote the &lt;a href="https://gitlab.com/kisaragi-hiu/dotfiles/commit/c5946b85625d0f10d93b0350f9a34a355293ea6d">first version&lt;/a> in Racket, then rewrote it in Common Lisp because Racket&amp;#39;s startup speed makes it quite unsuitable for shell commands. I eventually rewrote it in Picolisp because it&amp;#39;s available in Termux; it&amp;#39;s quite a fascinating language.&lt;/p></description></item><item><title>明日を忘れ</title><link>https://kisaragi-hiu.com/illust/2018-09-23/</link><pubDate>Sun, 23 Sep 2018 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2018-09-23/</guid><description>&lt;p>
The background for the video I made for &lt;a href="https://kisaragi-hiu.com/covers/20180926-mnemonic-やなぎなぎ.html">the mnemonic cover&lt;/a>.&lt;/p>
&lt;p>
The title came from a phrase in the refrain of the song.&lt;/p></description></item><item><title>Getting started with Magit</title><link>https://kisaragi-hiu.com/blog/2018-09-20-magit-introduction/</link><pubDate>Thu, 20 Sep 2018 23:57:41 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2018-09-20-magit-introduction/</guid><description>&lt;p>
This is a quick guide for using &lt;a href="https://magit.vc/">Magit&lt;/a>, a wonderful Git interface based in Emacs. Its base features are fairly simple, but it can be confusing if you&amp;#39;re not already using Emacs, as I was a few months ago.&lt;/p>
&lt;figure>
&lt;video controls autoplay muted loop src="https://kisaragi-hiu.com/emacs-magit-typical-workflow.mp4">&lt;/video>
&lt;figcaption>
Workflow as I edit Cangjie.el
&lt;/figcaption>
&lt;/figure>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
The &lt;code class="verbatim">magit&lt;/code> command
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I&amp;#39;ll explain Emacs basics in the last paragraph.&lt;/p>
&lt;p>
The stage / committing workflow with Magit is centered around an interactive version of &lt;code class="verbatim">git status&lt;/code>.&lt;/p></description></item><item><title>Cangjie.el</title><link>https://kisaragi-hiu.com/projects/cangjie-el/</link><pubDate>Thu, 23 Aug 2018 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/cangjie-el/</guid><description>&lt;p>
My first Emacs package.&lt;/p>
&lt;p>
Retrieve Cangjie code for a Han character in Emacs.&lt;/p>
&lt;p>
https://github.com/kisaragi-hiu/cangjie.el&lt;/p></description></item><item><title>UTAU tip: labels</title><link>https://kisaragi-hiu.com/utau-labels/</link><pubDate>Fri, 27 Jul 2018 00:23:19 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/utau-labels/</guid><description>&lt;p>
In UTAU, labels are a simple way to mark sections of the UST to easily jump around. I&amp;#39;ve been using them to make notes in the UST since &lt;a href="https://www.youtube.com/watch?v=PNLT7WUuXHM">my メリュー cover&lt;/a>, and for marking sections since &lt;a href="https://www.youtube.com/watch?v=3hnI8DqMVfc">my 濫觴生命 cover&lt;/a>.&lt;/p>
&lt;figure>
&lt;img src="https://kisaragi-hiu.com/utau/screenshot-labels.png" alt="/utau/screenshot-labels.png" title="/utau/screenshot-labels.png" />&lt;figcaption>
Labels marking sections.
&lt;/figcaption>
&lt;/figure>
&lt;p>
For some reason, I&amp;#39;ve never seen a UST with section marks, even though I think they&amp;#39;re quite helpful.&lt;/p>
&lt;p>
Label is a note property, this makes it useful for marking specific notes as well.&lt;/p></description></item><item><title>UTAU Covering Experiment</title><link>https://kisaragi-hiu.com/blog/2018-05-11-utau-tuning-experiment/</link><pubDate>Fri, 11 May 2018 22:00:10 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2018-05-11-utau-tuning-experiment/</guid><description>&lt;p>
Back in March, I started getting back into doing UTAU covers, and have tried to finish one cover within two weeks. I&amp;#39;m so far happy with the results, although it is taking up too much of my attention.&lt;/p>
&lt;p>
I&amp;#39;ve done this sort of experimental “metaprojects” in the past, where I try to put more effort into a specific subject. Last March I tried to get better at osu! which has so far turned out ok (I&amp;#39;m at least actually improving), and I tried to practice singing last year, releasing several covers with my own voice.&lt;/p></description></item><item><title>bk</title><link>https://kisaragi-hiu.com/projects/bk/</link><pubDate>Thu, 26 Apr 2018 00:44:45 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/bk/</guid><description>&lt;p>
Key-value pair storage based on JSON, intended for command line bookmarks.&lt;/p>
&lt;p>
The file can be specified with the environment variable &lt;code class="verbatim">$BK_FILE&lt;/code>, otherwise it is &lt;code class="verbatim">${XDG_DATA_HOME}/bk/bk.json&lt;/code> or &lt;code class="verbatim">~/.local/share/bk/bk.json&lt;/code> by default.&lt;/p>
&lt;dl>
&lt;dt>
&lt;code class="verbatim">bk --init&lt;/code>
&lt;/dt>
&lt;dd>Initialize the key-value store. There is no need to do this manually.&lt;/dd>
&lt;dt>
&lt;code class="verbatim">bk &amp;lt;key&amp;gt;&lt;/code>
&lt;/dt>
&lt;dd>Retrieve the value associated with &lt;code class="verbatim">key&lt;/code>.&lt;/dd>
&lt;dt>
&lt;code class="verbatim">bk &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;&lt;/code>
&lt;/dt>
&lt;dd>Set the value associated with &lt;code class="verbatim">key&lt;/code> to &lt;code class="verbatim">value&lt;/code>.&lt;/dd>
&lt;dt>
&lt;code class="verbatim">bk -l&lt;/code> or &lt;code class="verbatim">bk --list&lt;/code>
&lt;/dt>
&lt;dd>List all existing keys&lt;/dd>
&lt;dt>
&lt;code class="verbatim">bk -d &amp;lt;key&amp;gt;&lt;/code> or &lt;code class="verbatim">bk --delete &amp;lt;key&amp;gt;&lt;/code>
&lt;/dt>
&lt;dd>Delete &lt;code class="verbatim">key&lt;/code> from the key-value store&lt;/dd>
&lt;dt>
&lt;code class="verbatim">bk -h&lt;/code> or &lt;code class="verbatim">bk --help&lt;/code>
&lt;/dt>
&lt;dd>Show a help message.&lt;/dd>
&lt;/dl></description></item><item><title>Introduction to Two Factor Authorization</title><link>https://kisaragi-hiu.com/blog/2018-04-08-2fa-introduction/</link><pubDate>Sun, 08 Apr 2018 19:38:06 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2018-04-08-2fa-introduction/</guid><description>&lt;p>
Two factor authorization (2FA) in online accounts is a strong way to limit account access. It involves a website (a point of access control) and a client (like Google Authenticator, FreeOTP, and others).&lt;/p>
&lt;p>
When setting up 2FA, you store a randomly generated text (I&amp;#39;ll call it the token) in the 2FA client.&lt;/p>
&lt;p>
Both the website and the 2FA client will derive a 6-digit code from the token and the current time. When they share the same token and agree with the current time, the code will be the same. This is done so you can type in a 6-digit code while keeping the difficulty in guessing a long string of random text.&lt;/p></description></item><item><title>Hanezeve Caradhina Language Construction</title><link>https://kisaragi-hiu.com/illust/2018-03-26/</link><pubDate>Mon, 26 Mar 2018 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2018-03-26/</guid><description>&lt;p>
The end result of the &lt;a href="../series/hanezeve-caradhina-language-construction.html">Hanezeve Caradhina Language Construction&lt;/a> project.&lt;/p></description></item><item><title>Making up a language from Hanezeve Caradhina, "Day 5"</title><link>https://kisaragi-hiu.com/blog/2018-03-11-hanezeve-final/</link><pubDate>Sun, 11 Mar 2018 21:24:47 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2018-03-11-hanezeve-final/</guid><description>&lt;p>
After putting this aside for three months, I finally spent another few minutes thinking what the last line can mean.&lt;/p>
&lt;p>
The B section:&lt;/p>
&lt;div class="src src-text">
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Holo-ohlo holo forðe holo &amp;lt;?&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Helelele lelele &amp;lt;?&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">colwelela kalalila let the journey begin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hanezeve yulumai-ni to the bottom of the Abyss&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Come, come
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
Starting off from the part that&amp;#39;s harder to break apart, I&amp;#39;m seeing &amp;#34;Helelele lelele&amp;#34; as one word or just one gesture (maybe similar to dokidoki in Japanese). Its repetitiveness to me sounds like some kind of invitation, which leads to &amp;#34;let the journey begin&amp;#34;. Let&amp;#39;s just say it does mean that, then I can translate it into something like &amp;#34;come, come&amp;#34; in English.&lt;/p></description></item><item><title>Switching to .pam_environment for environment variables</title><link>https://kisaragi-hiu.com/blog/2018-02-25-pam_env/</link><pubDate>Sun, 25 Feb 2018 21:34:45 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2018-02-25-pam_env/</guid><description>&lt;p>
My system environment has been quite a mess this past month.&lt;/p>
&lt;p>
I used to put my environment variables in &lt;code class="verbatim">~/.profile&lt;/code>. However, the variables suddenly stopped being applied one day. I tried to switch my display manager from sddm, to gdm, then to lightdm, to no avail. I know &lt;code class="verbatim">~/.profile&lt;/code>, being essentially a bash script, is somewhat insecure; &lt;code class="verbatim">~/.pam_environment&lt;/code> is also probably the right way going forward, so I started moving variables into it.&lt;/p></description></item><item><title>Language startup benchmark</title><link>https://kisaragi-hiu.com/projects/language-startup-benchmark/</link><pubDate>Sat, 20 Jan 2018 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/language-startup-benchmark/</guid><description>&lt;p>
Time hello world in various languages to benchmark their startup times.&lt;/p></description></item><item><title>Working around Steins;Gate's input problem on Linux</title><link>https://kisaragi-hiu.com/blog/2018-01-15-sg-input-workaround/</link><pubDate>Mon, 15 Jan 2018 13:51:00 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2018-01-15-sg-input-workaround/</guid><description>&lt;p>
Steins;Gate was released on Steam on September 9, 2016, for Windows only. A few months later, as far as I can remember, Wine started being able to run it.&lt;/p>
&lt;p>
However, for the entirety of 2017, I haven&amp;#39;t been able to play it: mouse selection doesn&amp;#39;t work at all, menu entries are selected then deselected immediately without my input, the menu is completely unusable. It&amp;#39;s almost as if some input is being spammed…?&lt;/p></description></item><item><title>Disabling Pollen cache temporarily</title><link>https://kisaragi-hiu.com/blog/2018-01-07-pollen-skip-cache/</link><pubDate>Sun, 07 Jan 2018 23:20:35 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2018-01-07-pollen-skip-cache/</guid><description>&lt;p>
Recently Pollen got support for caching, substantially improving build time. However, I realized it doesn&amp;#39;t detect changes in files imported with &lt;code class="verbatim">file-&amp;gt;string&lt;/code> (as to be expected), which I&amp;#39;m using to remove duplicated code implementing special tags in &lt;code class="verbatim">index-template&lt;/code> and &lt;code class="verbatim">post-template&lt;/code>. Putting how hacky that implementation is aside, I need to temporarily force pollen to not use the cache when I&amp;#39;m editing that template.&lt;/p>
&lt;p>
Reading through &lt;a href="http://docs.racket-lang.org/pollen/Cache.html">the Pollen documentation for caching&lt;/a>, it states:&lt;/p>
&lt;blockquote>
&lt;p>The compile cache tracks the modification date of the source file, the current setting of the POLLEN environment variable, and the modification dates of the template and &amp;#34;pollen.rkt&amp;#34; (if they exist).&lt;/p></description></item><item><title>My list of notable anime series in 2017</title><link>https://kisaragi-hiu.com/blog/2017-12-31-notable-anime-in-2017/</link><pubDate>Sun, 31 Dec 2017 23:59:57 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2017-12-31-notable-anime-in-2017/</guid><description>&lt;p>
2017 is the second year since I started following seasonal anime. (I started with Re:0 last summer.)&lt;/p>
&lt;p>
There have been a few series that I liked this year, and this is the list.&lt;/p>
&lt;p>
&lt;strong>Saga of Tanya the Evil (Youjo Senki)&lt;/strong>&lt;/p>
&lt;p>
This is actually a story about an alternative version of World War I in a world with semi-magical powers.&lt;/p>
&lt;p>
When this series aired, I thought this is just another loli series that kind of just screws around. Then a few months after the broadcast, I decided to pick up this series after watching a review of it (and being spoiled) on Youtube. It was actually quite nice.&lt;/p></description></item><item><title>An attempt to explain function values (lambdas)</title><link>https://kisaragi-hiu.com/lambda/</link><pubDate>Fri, 22 Dec 2017 15:44:25 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/lambda/</guid><description>&lt;p>
A lambda is simply a function.&lt;/p>
&lt;p>
&lt;strong>Functions do not have to be named&lt;/strong>. Consider the fact that in English, “function” is also a noun. It is an ordinary value, just like numbers, lists, and characters.&lt;/p>
&lt;p>
Just like how a list can be created with &lt;code class="verbatim">(list &amp;#39;item &amp;#39;item &amp;#39;item)&lt;/code>, a function can be created with &lt;code class="verbatim">(lambda (input) body-expr)&lt;/code>.&lt;/p>
&lt;p>
&lt;code class="verbatim">(lambda (x y) (+ x y))&lt;/code> produces a function that takes two arguments and sends them to the + function. In a typical environment:&lt;/p></description></item><item><title>Colwelelo Kalalila: Let's continue our journey (Day 3, 4)</title><link>https://kisaragi-hiu.com/blog/2017-12-08-hanezeve-day-3-4/</link><pubDate>Fri, 08 Dec 2017 19:03:56 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2017-12-08-hanezeve-day-3-4/</guid><description>&lt;p>
The last two days I listened to the song a few more times to check the lyrics, and then made up another line in section B.&lt;/p>
&lt;p>
Listen to Hanezeve Caradhina &lt;a href="https://open.spotify.com/track/0KzOeB44GAj2rHmoXML0eb">on Spotify&lt;/a>.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Lyrics changes
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I found two parts that should be changed:&lt;/p>
&lt;ol>
&lt;li>The word for &amp;#34;journey&amp;#34;, &amp;#34;lalelila&amp;#34;, sounds more like &amp;#34;walelila&amp;#34;.&lt;/li>
&lt;li>The first sentence of B and &amp;#39;B should be the same.&lt;/li>
&lt;/ol>
&lt;hr/>
&lt;p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Halalaha zela halalelu
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sivivile shi-dhina
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl">houwelela, walelila
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hanezeve cara-dhina
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B.
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl">Holo loholo forðe holo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">helelele lelele
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#39;B.
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl">Holo loholo forðe holo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/p></description></item><item><title>Dreaming about the grammar (Day 2)</title><link>https://kisaragi-hiu.com/blog/2017-12-06-grammar-zela-halalelu-day2/</link><pubDate>Wed, 06 Dec 2017 23:23:00 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2017-12-06-grammar-zela-halalelu-day2/</guid><description>&lt;p>
Today I watched the episodes where Hanezeve Caradhina was played (1, 8, 9), and further confirmed myself that it indeed feels like describing Riko&amp;#39;s journey.&lt;/p>
&lt;p>
With that, I got a rough idea for the first line that&amp;#39;s along the lines with &lt;code class="verbatim">I&amp;#39;m dreaming a dream&lt;/code>.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Dreaming the grammar
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
I started with how &amp;#34;halalaha&amp;#34; and &amp;#34;halalelu&amp;#34; both have the common prefix &amp;#34;hala-&amp;#34;. Since I was already thinking about using &amp;#34;dream&amp;#34; as the idea of the line, I defined &amp;#34;hala-&amp;#34; to be a prefix related to thoughts, and &amp;#34;-laha&amp;#34; to be &amp;#34;fiction&amp;#34;, &amp;#34;illusion&amp;#34;.&lt;/p></description></item><item><title>Making up a language from Hanezeve Caradhina, Day 1</title><link>https://kisaragi-hiu.com/blog/2017-12-05-hanezeve-caradhina-day1/</link><pubDate>Tue, 05 Dec 2017 23:32:00 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2017-12-05-hanezeve-caradhina-day1/</guid><description>&lt;p>
After listening to Hanezeve Caradhina for a few days, I decided it would be interesting to try to create a language based on the lyrics.&lt;/p>
&lt;p>
Listen to Hanezeve Caradhina (and the rest of the Made in Abyss OST) &lt;a href="https://open.spotify.com/album/5oEzjkSYSfC0ITRiqK6m8l">on Spotify.&lt;/a>&lt;/p>
&lt;p>
The song doesn&amp;#39;t actually have too much lyrics, as I will show in the next few paragraphs, which means this language isn&amp;#39;t really going to be &amp;#34;deciphered&amp;#34;; I&amp;#39;m simply going to create a new (very incomplete) language that might slightly makes sense. This is my progress in the first day.&lt;/p></description></item><item><title>Should East Asian names be flipped when being translated to English?</title><link>https://kisaragi-hiu.com/east-asian-name-reverse/</link><pubDate>Sun, 26 Nov 2017 17:55:59 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/east-asian-name-reverse/</guid><description>&lt;p>
In East Asian names, the first part of a person’s name is their family name. This is unlike many other languages, which put family name last (to the point where “last name” is sometimes synonymous with “family name”).&lt;/p>
&lt;p>
When these names are translated, often they would be flipped over to match English conventions.&lt;/p>
&lt;p>
One has to consider the fact that they’re messing with someone’s name when doing this. It’s not a big problem, but I prefer not to do this.&lt;/p></description></item><item><title>Setting up this site with Pollen and Frog</title><link>https://kisaragi-hiu.com/blog/2017-11-14-this-blog-with-pollen-and-frog/</link><pubDate>Tue, 14 Nov 2017 10:56:43 +0900</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/blog/2017-11-14-this-blog-with-pollen-and-frog/</guid><description>&lt;p>
&lt;em>Update 2020-10-31T03:06:28+0900: this is now outdated. See &lt;a href="2020-10-31-infrastructure.html">2020-10-31 Current infrastructure&lt;/a> for further changes, including the move away from Frog and the introduction of ox-pollen.&lt;/em>&lt;/p>
&lt;p>
I have wanted to keep a personal site since 2015. I started on Jimdo, then moved to WordPress.com, then Blogger, then just let the site rot. I wasn&amp;#39;t writing much, and the only posts I had were copies of my UTAU cover announcements.&lt;/p>
&lt;div id="outline-container-headline-1" class="outline-2">
&lt;h2 id="headline-1">
Github Pages
&lt;/h2>
&lt;div id="outline-text-headline-1" class="outline-text-2">
&lt;p>
In March this year, I discovered Github Pages, and wanted to revive my personal site. I started with the official tutorial, not understanding static site generators or Jekyll, even. I only wrote one post during this time, basically &lt;a href="zh-new-website.html">the hello world post&lt;/a>.&lt;/p></description></item><item><title>Iterations of Learning</title><link>https://kisaragi-hiu.com/iterations/</link><pubDate>Tue, 10 Oct 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/iterations/</guid><description>&lt;p>
Learning is based on iterations.&lt;/p>
&lt;p>
You do something, then repeat until you&amp;#39;re familiar with it. This is what “practice” means.&lt;/p>
&lt;p>
Different subjects have different sorts of steps to repeat, for instance:&lt;/p>
&lt;dl>
&lt;dt>
Language learning
&lt;/dt>
&lt;dd>
&lt;ol>
&lt;li>Find a unit of text (eg. a sentence).&lt;/li>
&lt;li>Figure out what it means.&lt;/li>
&lt;li>Repeat.&lt;/li>
&lt;/ol>
&lt;/dd>
&lt;dt>
Piano
&lt;/dt>
&lt;dd>
&lt;ol>
&lt;li>Find an unfamiliar sheet.&lt;/li>
&lt;li>Divide it into smaller chunks.&lt;/li>
&lt;li>Play each chunk until some level of familiarity.&lt;/li>
&lt;li>Combine them together.&lt;/li>
&lt;li>Repeat.&lt;/li>
&lt;/ol>
&lt;/dd>
&lt;/dl>
&lt;p>Learning is essentially finding the steps of an iteration, and then doing it again and again.&lt;/p></description></item><item><title>Moving the blog, again</title><link>https://kisaragi-hiu.com/2017-09-24-pollen/</link><pubDate>Sun, 24 Sep 2017 18:20:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2017-09-24-pollen/</guid><description>&lt;p>
So, I restructured this blog again, this time using &lt;a href="https://web.archive.org/web/20170708201545/https://mstill.io/">mstill.io&lt;/a> as a template, because I don&amp;#39;t know how to use bootstrap. And I want to use Pollen markup.&lt;/p>
&lt;p>
&lt;em>2025-10-30T21:56:06+0900: The site is now down. The author&amp;#39;s new site is &lt;a href="https://mstill.dev/">https://mstill.dev/&lt;/a>. The old repository is &lt;a href="https://github.com/malcolmstill/mstill.io">still available on GitHub&lt;/a>, though.&lt;/em>&lt;/p>
&lt;p>
The process is actually suprisingly smooth, except:&lt;/p>
&lt;ul>
&lt;li>Post date isn&amp;#39;t updating. I have to fix it.&lt;/li>
&lt;li>There&amp;#39;s no Atom / RSS feed ready to use, I&amp;#39;ll have to maybe do it myself.&lt;/li>
&lt;/ul>
&lt;p>Overall I like this setup a bit more.&lt;/p></description></item><item><title>kisaragi-hiu.com</title><link>https://kisaragi-hiu.com/projects/kisaragi-hiu.com/</link><pubDate>Thu, 21 Sep 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/kisaragi-hiu.com/</guid><description>&lt;p>
This site. See &lt;a href="https://kisaragi-hiu.com/tags/meta.html">#meta&lt;/a> for some history behind it.&lt;/p>
&lt;p>
It’s currently (and for a foreseeable future) built on Hugo.&lt;/p></description></item><item><title>Discovering Racket through making a osu! skin</title><link>https://kisaragi-hiu.com/2017-09-13-discovering-racket/</link><pubDate>Wed, 13 Sep 2017 17:58:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2017-09-13-discovering-racket/</guid><description>&lt;p>
In around March this year, I started trying to make my own osu! skin, or at least mix a skin for my own use.
I started with the &lt;a href="https://osu.ppy.sh/forum/t/454986">Emilia (Re:0) skin by Beatstatic&lt;/a>, with a git repo to track my changes, and copied the hitcircles from &lt;a href="https://osu.ppy.sh/forum/t/300001">Clear Skin Ultra 2.4&lt;/a> (I like its hitcircle design a lot).&lt;/p>
&lt;p>
Then I stumbled across &lt;a href="https://www.youtube.com/watch?v=Yih6pz09Z1A">a font made for the I script in Re:0&lt;/a> in April, and started wanting to learn the script for the sake of it. As part of the practice, I decided why not make osu!&amp;#39;s elements in the Re:0 writing system? So I made a new folder in my mix skin, then opened Blender to make the elements, because that&amp;#39;s the only tool I was comfortable with using. (I&amp;#39;ve since learned to use Inkscape more.)&lt;/p></description></item><item><title>Using Frog on Android</title><link>https://kisaragi-hiu.com/termux-and-linux-deploy/</link><pubDate>Tue, 12 Sep 2017 16:46:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/termux-and-linux-deploy/</guid><description>&lt;p>
(Translated from &lt;a href="zh-termux-and-linux-deploy.html">the original&lt;/a>.)&lt;/p>
&lt;p>
Linux Deploy is a pretty nice app on Android.&lt;/p>
&lt;p>
I finished porting this site to Frog a few days ago. There isn&amp;#39;t a package for Racket in Termux — Termux provides packages for Jekyll and Hugo, but I still don&amp;#39;t really understand them, and I&amp;#39;m using Frog right now — but with Linux Deploy, I could create an environment (sort of like a container?) and install Debian Sid into it, enable SSH, bind &lt;code class="verbatim">/sdcard&lt;/code> into it, install Racket and Frog inside, and now I can build this site on my phone.&lt;/p></description></item><item><title>在 Android 上用Frog</title><link>https://kisaragi-hiu.com/zh-termux-and-linux-deploy/</link><pubDate>Tue, 12 Sep 2017 16:46:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/zh-termux-and-linux-deploy/</guid><description>&lt;p>
Linux Deploy是個很不錯的Android app。這個網站前幾天改成了用Frog建置，但是Termux裡沒有racket的套件(如果我是用Jekyll還是Hugo之類的Termux裡面有需要的套件，但那些我還弄不懂)。用Linux Deploy我可以建構一個Debian Sid的(類似Container)的環境出來，啟用ssh，然後把/sdcard bind到那裡面，再裝好Racket和Frog，就可以在手機上建構這個網站了。&lt;/p></description></item><item><title>バラバラ</title><link>https://kisaragi-hiu.com/illust/2017-08-24/</link><pubDate>Thu, 24 Aug 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2017-08-24/</guid><description>&lt;p>
Another rough draft.&lt;/p></description></item><item><title>いつか海の見える街で Cover + PV</title><link>https://kisaragi-hiu.com/zh-itsukauminomierubashode/</link><pubDate>Mon, 10 Jul 2017 15:01:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/zh-itsukauminomierubashode/</guid><description>&lt;p>
試著唱了いつか海の見える街で，然後弄了個簡單的歌詞PV。背景是畢旅時坐電車在車廂尾端錄的，剛好我們班在最後一車。&lt;/p>
&lt;p>
歌詞是ほのか明朝，在 blender compositor Alpha Over 在 Glow 然後用 ColorRamp 染色之後的背景的上面。Kdenlive 做打包專案時沒注意到.blend不會打包，結果歌詞圖片的.blend就被我刪掉了。&lt;/p></description></item><item><title>いつか海の見える街で Cover and PV</title><link>https://kisaragi-hiu.com/itsukauminomierubashode/</link><pubDate>Mon, 10 Jul 2017 15:01:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/itsukauminomierubashode/</guid><description>&lt;p>
I tried to cover いつか海の見える街で, and also made a simple lyrics video. The background was recorded during my graduation trip at the end of our train, as my class just happened to get assigned to the last train car.&lt;/p>
&lt;p>
The lyrics are set in Honoka Mincho, composited onto a glow + color ramp with the Alpha Over node in Blender. I accidentally deleted the .blend file for the lyrics images as I didn&amp;#39;t realize Kdenlive wouldn&amp;#39;t archive it.&lt;/p></description></item><item><title>レディーレ Cover</title><link>https://kisaragi-hiu.com/redire-cover/</link><pubDate>Wed, 28 Jun 2017 22:50:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/redire-cover/</guid><description>&lt;p>
Tried to sing バルーン&amp;#39;s レディーレ.&lt;/p>
&lt;p>
I wanted to try to sing it the moment I saw the original, but it took me two weeks just to finish it…&lt;/p>
&lt;p>
This time I came back to using Ardour for mixing.&lt;/p>
&lt;p>
It felt like more hassle than Audacity at first as I don&amp;#39;t see a way to directly do normalization, but it&amp;#39;s way more convenient as it&amp;#39;s possible to rerecord a section after effects have been applied, instead of having to redo all the effects.&lt;/p></description></item><item><title>レディーレ Cover</title><link>https://kisaragi-hiu.com/zh-redire-cover/</link><pubDate>Wed, 28 Jun 2017 22:50:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/zh-redire-cover/</guid><description>&lt;p>
試唱了バルーン的レディーレ。&lt;/p>
&lt;p>
看到本家就想要唱唱看了，但拖了兩個禮拜才全部弄好就是ww&lt;/p>
&lt;p>
這次回到用 Ardour 來混音了。&lt;/p>
&lt;p>
剛開始感覺比 Audacity 麻煩一點，沒辦法直接做正規化等等，但當效果都加好之後，有段要重錄的話錄好就完成了，不用所有 sample 重新來過。&lt;/p></description></item><item><title>Factory Roadway</title><link>https://kisaragi-hiu.com/illust/2017-06-15/</link><pubDate>Thu, 15 Jun 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2017-06-15/</guid><description/></item><item><title>res.</title><link>https://kisaragi-hiu.com/illust/2017-06-04/</link><pubDate>Sun, 04 Jun 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2017-06-04/</guid><description/></item><item><title>Retome</title><link>https://kisaragi-hiu.com/projects/retome/</link><pubDate>Sat, 27 May 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/retome/</guid><description>&lt;p>
My personal osu! skin, focused on glow and shadow effects.&lt;/p></description></item><item><title>Rozerofo</title><link>https://kisaragi-hiu.com/projects/rozerofo/</link><pubDate>Sun, 30 Apr 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/rozerofo/</guid><description>&lt;p>
A font for the &lt;em>Romoji&lt;/em> script from &lt;a href="https://en.wikipedia.org/wiki/Re:Zero_−_Starting_Life_in_Another_World">Re:Zero&lt;/a>.&lt;/p></description></item><item><title>礦坑</title><link>https://kisaragi-hiu.com/illust/2017-04-18/</link><pubDate>Tue, 18 Apr 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2017-04-18/</guid><description>&lt;p>
I removed this on Pixiv. Maybe I should remove this here as well.&lt;/p>
&lt;p>
It&amp;#39;s just a &lt;em>very&lt;/em> rough draft.&lt;/p></description></item><item><title>教室</title><link>https://kisaragi-hiu.com/illust/2017-04-17/</link><pubDate>Mon, 17 Apr 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2017-04-17/</guid><description>&lt;blockquote>
&lt;p>もう消えてしまった、記憶の場所&lt;/p>
&lt;/blockquote></description></item><item><title>New website</title><link>https://kisaragi-hiu.com/new-website/</link><pubDate>Sun, 19 Mar 2017 05:00:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/new-website/</guid><description>&lt;p>
(Translated from &lt;a href="./zh-new-website.html">the original&lt;/a>.)&lt;/p>
&lt;p>
I wanted a simple file to keep links to my profile&lt;/p>
&lt;ul>
&lt;li>→ Let&amp;#39;s put it on Github Pages&lt;/li>
&lt;li>→ Let&amp;#39;s try out Jekyll&lt;/li>
&lt;li>→ Might as well turn it into a full website&lt;/li>
&lt;/ul>
&lt;p>Something like that.&lt;/p>
&lt;p>
So by Blogger is now officially replaced.&lt;/p>
&lt;p>
Yeah, new website.&lt;/p></description></item><item><title>新網站</title><link>https://kisaragi-hiu.com/zh-new-website/</link><pubDate>Sun, 19 Mar 2017 05:00:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/zh-new-website/</guid><description>&lt;p>
想要有個簡單的檔案記錄所有連結&lt;/p>
&lt;ul>
&lt;li>→放在Github Pages好了&lt;/li>
&lt;li>→試試看Jekyll好了&lt;/li>
&lt;li>→還是直接弄成完整的網站吧&lt;/li>
&lt;/ul>
&lt;p>什麼的。&lt;/p>
&lt;p>
結果就這樣的，Blogger那裡正式的被取代掉了呢。&lt;/p></description></item><item><title>MetroSigns</title><link>https://kisaragi-hiu.com/illust/2017-01-08/</link><pubDate>Sun, 08 Jan 2017 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2017-01-08/</guid><description/></item><item><title>Watamote running scene</title><link>https://kisaragi-hiu.com/illust/2016-12-27/</link><pubDate>Tue, 27 Dec 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-12-27/</guid><description/></item><item><title>閉幕</title><link>https://kisaragi-hiu.com/illust/2016-11-29/</link><pubDate>Tue, 29 Nov 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-11-29/</guid><description/></item><item><title>Underpass</title><link>https://kisaragi-hiu.com/illust/2016-10-23/</link><pubDate>Sun, 23 Oct 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-10-23/</guid><description/></item><item><title>出口</title><link>https://kisaragi-hiu.com/illust/2016-10-09/</link><pubDate>Sun, 09 Oct 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-10-09/</guid><description/></item><item><title>アニメ風メールボックス　テスト</title><link>https://kisaragi-hiu.com/illust/2016-09-23/</link><pubDate>Fri, 23 Sep 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-09-23/</guid><description/></item><item><title>とても素敵な六月でした Title Remake</title><link>https://kisaragi-hiu.com/illust/2016-09-14/</link><pubDate>Wed, 14 Sep 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-09-14/</guid><description/></item><item><title>randomwallpaper</title><link>https://kisaragi-hiu.com/projects/randomwallpaper/</link><pubDate>Tue, 13 Sep 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/projects/randomwallpaper/</guid><description>&lt;p>
A script to set a random wallpaper from a directory every so often.&lt;/p></description></item><item><title>夕中</title><link>https://kisaragi-hiu.com/illust/2016-08-17/</link><pubDate>Wed, 17 Aug 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-08-17/</guid><description/></item><item><title>直岸車站</title><link>https://kisaragi-hiu.com/illust/2016-07-09/</link><pubDate>Sat, 09 Jul 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-07-09/</guid><description/></item><item><title>Han Characters</title><link>https://kisaragi-hiu.com/2016-06-30-han-characters/</link><pubDate>Thu, 30 Jun 2016 00:00:00 +0800</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/2016-06-30-han-characters/</guid><description>&lt;p>
If you&amp;#39;re learning a language using Han characters, and you haven&amp;#39;t known Han characters already, start with just the phonetic alphabets first. If you know them already… maybe starting with just phonetic alphabets would also be a good idea, but the difference won&amp;#39;t be that significent.&lt;/p>
&lt;p>
So, say if you&amp;#39;re starting to learn Mandarin. You first learn the phonetic alphabet of choice (I&amp;#39;d advice Bopomofo since it&amp;#39;s, I think, more optimized for Mandarin, but pinyin may feel more familiar), then just start learning it without thinking about Han characters.
After a while, when you have a basic set of vocabulary, start learning the Han characters - assigning these characters to the words. For example, after you&amp;#39;ve learned &amp;#34;zhuo zi5&amp;#34;(table), &amp;#34;yi3 zi5&amp;#34; (chair), and maybe when you can say something like &amp;#34;wo3 zhuo4 zai4 yi3 zi5 shang4, kang4 zhe5 yi4 zhang zhuo zi5&amp;#34; (I sit on a chair looking at a table), you start learning the Han character for wo3 (I): 我, zhuo (table): 桌, kang4 (look): 看, etc., eventually learning the whole sentence&amp;#39;s Han characters. (我坐在椅子上看著一張桌子)&lt;/p></description></item><item><title>幻夢森林</title><link>https://kisaragi-hiu.com/illust/2016-06-06/</link><pubDate>Mon, 06 Jun 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-06-06/</guid><description/></item><item><title>The Ocarina (大海原與大海原)</title><link>https://kisaragi-hiu.com/illust/2016-03-12/</link><pubDate>Sat, 12 Mar 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-03-12/</guid><description>&lt;p>
A recreation of an opening scene in &lt;a href="https://en.wikipedia.org/wiki/Wadanohara_and_the_Great_Blue_Sea">Wadanohara and the Great Blue Sea&lt;/a>.&lt;/p></description></item><item><title>夜下窗明</title><link>https://kisaragi-hiu.com/illust/2016-02-06/</link><pubDate>Sat, 06 Feb 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-02-06/</guid><description/></item><item><title>窗外</title><link>https://kisaragi-hiu.com/illust/2016-01-04/</link><pubDate>Mon, 04 Jan 2016 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2016-01-04/</guid><description/></item><item><title>林中 Mayu</title><link>https://kisaragi-hiu.com/illust/2015-12-05/</link><pubDate>Sat, 05 Dec 2015 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2015-12-05/</guid><description/></item><item><title>樹中之月</title><link>https://kisaragi-hiu.com/illust/2015-09-17/</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2015-09-17/</guid><description/></item><item><title>暗夜中、夢中之人</title><link>https://kisaragi-hiu.com/illust/2015-09-03/</link><pubDate>Thu, 03 Sep 2015 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/illust/2015-09-03/</guid><description/></item><item><title>Sites</title><link>https://kisaragi-hiu.com/sites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>Kisaragi Hiu</author><guid>https://kisaragi-hiu.com/sites/</guid><description>&lt;figure>
&lt;a href="https://kisaragi-hiu.com/barren-moon">&lt;img src="barren-moon-1.0.png" alt="barren-moon-1.0.png" />&lt;/a>&lt;figcaption>
如同月球般的荒涼
&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;a href="https://kisaragi-hiu.com/timer">&lt;img src="kisaragi-timer.png" alt="kisaragi-timer.png" />&lt;/a>&lt;figcaption>
&lt;a href="https://kisaragi-hiu.com/timer">timer&lt;/a>
&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;a href="https://kisaragi-hiu.com/tftt">&lt;img src="tftt.png" alt="tftt.png" />&lt;/a>&lt;figcaption>
experimental trumpet fingerings training tool
&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;p>&lt;a href="https://kisaragi-hiu.com/list-of-plants-of-formosa">list-of-plants-of-formosa&lt;/a>&lt;/p>
&lt;figcaption>
list of plants of formosa digitization
&lt;/figcaption>
&lt;/figure></description></item></channel></rss>