Thicket data repository for the EEG
1{ 2 "id": "https://mort.io/blog/stop-start/", 3 "title": "Stop, Start", 4 "link": "https://mort.io/blog/stop-start/", 5 "updated": "2024-08-30T00:00:00", 6 "published": "2024-08-30T00:00:00", 7 "summary": "<p>Well, here we go again, again. Having stalled out back in 2013 to restart in\n2015, I stalled out again in 2017, so am finally restarting seven years later.\nAgain. I do have a dozen or more half-written posts from that period that may\nleak out slowly, in <a href=\"https://mort.io/tags/old\">backdated form</a>.</p>\n<p>The stack for the blog has been updated again, naturally \u2013 the tools got better\nafter all. So now this is using <a href=\"https://www.getzola.org\">Zola</a> with, initially,\nthe <a href=\"https://github.com/jieiku/abridge/\">abridge theme</a>. I think it\u2019s shinier,\nand hopefully also involves (almost) no JavaScript, is finally accessible, and\nnot too heavyweight. In removing the excessive JavaScript, I also updated my\n<a href=\"https://mort.io/blog/stop-start/./research#publications\">publication list</a> <a href=\"https://github.com/mor1/bib2html\">generation\nprocess</a>: no more CoffeeScript and JavaScript,\njust some plain ol\u2019 <a href=\"https://www.python.org/\">Python</a> using the slick new\n<a href=\"https://github.com/astral-sh/uv\">uv</a> tooling. The\n<a href=\"https://github.com/casey/just\">Justfile</a> incantation is something like:</p>\n<pre><code><span><span>papers</span> <span>:=</span></span> <span><span><span>&quot;../templates/shortcodes/publications.html&quot;</span></span>\n</span><span><span>bibinputs</span> <span>:=</span></span> <span><span><span>&quot;../papers/bibinputs.json&quot;</span></span>\n</span><span>\n</span><span><span><span>#</span> build papers data for site\n</span></span><span><span><span>@papers</span></span><span>:</span>\n<span></span><span></span></span><span><span></span><span> <span><span><span>cd</span></span><span> bib2html</span> <span>&amp;&amp;</span> <span><span>uv</span></span><span> sync</span> <span>&amp;&amp;</span> <span><span>uv</span></span><span> run<span> --</span></span><span> ./src/bib2html <span><span>{</span><span><span>{</span>bibinputs<span>}</span></span><span>}</span></span> <span>&gt;</span></span><span>|</span> <span><span>{{papers</span></span><span></span>}<span></span>}</span>\n</span></span></code></pre>\n<p>I\u2019ve also added a <a href=\"https://mort.io/blog/stop-start/./register/\">register of interests</a> so I stop having to\nscrabble around remembering what I\u2019m officially doing when I\u2019m occasionally\nasked.</p>\n<p>The stack underneath has also changed. I finally kicked the Mac OS habit after\nover 10 years \u2013 decided I\u2019d had enough of Apple hiding things and generally\ngetting in my way \u2013 at the same time I switched from Android to iPhone. Never\ndo things the easy way, that\u2019s my motto. So now I\u2019m back on a PC \u2026 but it\nturns out that 2024 (well, 2023 in fact) is the year of Linux on the Laptop for\nme. Not something I thought would actually happen when we joked about it in the\nlate 90s. Truly, times change. And not just any old wannabe-Windows distribution\nbut the resolutely idiosyncratic and copiously yet poorly documented\n<a href=\"\">NixOS</a> using Flakes and Home-Manager of course, with\n<a href=\"https://wayland.freedesktop.org/\">Wayland</a> and <a href=\"https://swaywm.org/\">Sway</a>.\nI\u2019ve even finally made the leap to <a href=\"https://vscodium.com/\">Codium</a>, the\nde-Microsofted version of VSCode, from\n<a href=\"https://www.gnu.org/software/emacs/\">Emacs</a> (mostly \u2013\n<a href=\"https://orgmode.org/\">org-mode</a> has not yet been replaced). I blame\n<a href=\"https://www.jeffas.net/\">Andrew</a> and <a href=\"https://www.jentek.dev/\">Chris</a>.</p>\n<p>For the terminally curious, this meant a fairly heavy reworking of my 30 years\nold <a href=\"https://github.com/mor1/rc-files/\">dotfiles</a> \u2013 still work in progress but\nadequately organised for now I think. See the <a href=\"https://github.com/mor1/rc-files/tree/main/nixos\">NixOS specific\nbits</a> if curious.</p>\n<p>And, because I\u2019m going to try to include at least one vaguely technical bit (or\nat least, one bit which isn\u2019t just me bemoaning that I haven\u2019t written anything\nin years), I confess to being particularly pleased with the following fragment\nto enable <a href=\"https://github.com/mor1/rc-files/blob/main/nixos/modules/home-manager/sway.nix#L64-L122\">my Sway startup\nscript</a>\nto start several apps on particular workspaces, by switching to the workspace,\nstarting the app, and then waiting for a suitable window to appear. The latter\nstep entails</p>\n<ul>\n<li>subscribing <code>swaymsg</code> to <code>window</code> messages with\n<a href=\"https://jqlang.github.io/jq/\">jq</a> to extract the messages of interest\nindicating a new window in the background,</li>\n<li>executing the command to start the app,</li>\n<li>using <code>grep</code>/<code>pkill</code> in tandem to kill the subscription when the new window is\ndetected, and finally</li>\n<li>waiting for the subscription to have been killed.</li>\n</ul>\n<p>It seems fairly (indeed, surprisingly) reliable.</p>\n<pre><code><span><span><span>wait_for</span> <span>(</span><span>)</span> <span>{</span>\n</span></span><span><span> <span>{</span> <span><span>swaymsg</span></span><span><span><span> -</span>r</span><span><span> -</span>m</span><span><span> -</span>t</span> subscribe <span><span>'</span>[&quot;window&quot;]<span>'</span></span></span> <span>|</span>\n</span></span><span><span> <span><span>jq</span></span><span><span><span> -</span>c</span><span><span> --</span>unbuffered</span> <span><span>'</span>. | select(.change == &quot;new&quot;)<span>'</span></span></span> <span>|</span>\n</span></span><span><span> <span>{</span> <span><span>grep</span></span><span><span><span> -</span>m1</span> . <span>&gt;</span>/dev/null</span> <span>;</span> <span><span>pkill</span></span><span> swaymsg</span> <span>;</span><span>}</span> <span>&amp;</span>\n</span></span><span><span> <span>}</span><span> <span>2</span><span>&gt;</span>/dev/null</span>\n</span></span><span><span> <span>pid</span><span>=</span><span><span><span>$</span><span>!</span></span></span>\n</span></span><span><span> <span><span>swaymsg</span></span><span><span> --</span></span><span> <span><span>&quot;</span>exec <span><span>$</span><span>*</span></span><span>&quot;</span></span> </span><span>&amp;&amp;</span> <span><span>sleep</span></span><span> 0.5</span>\n</span></span><span><span> <span><span>wait</span></span><span> <span><span>$</span><span>pid</span></span> <span>2</span><span>&gt;</span>/dev/null</span>\n</span></span><span><span><span>}</span></span>\n</span></code></pre>\n<p>Use via something like:</p>\n<pre><code><span><span>wayland</span><span>.</span><span>windowManager</span><span>.</span><span>sway</span><span>.</span><span>config</span><span>.</span><span>startup</span> <span>=</span>\n</span><span> <span>let</span>\n</span><span> <span>msg</span> <span>=</span> <span>cmds</span><span>:</span> <span><span>&quot;</span>swaymsg '<span><span>${</span><span>builtins</span><span>.</span><span>concatStringsSep</span> <span><span>&quot;</span>, <span>&quot;</span></span> <span>cmds</span><span>}</span></span>'<span>&quot;</span></span><span>;</span>\n</span><span> <span>workspace</span> <span>=</span> <span>ws</span><span>:</span> <span>msg</span> <span>[</span> <span><span>&quot;</span>workspace --no-auto-back-and-forth <span><span>${</span><span>ws</span><span>}</span></span><span>&quot;</span></span> <span>]</span><span>;</span>\n</span><span> <span>after</span> <span>=</span> <span>delay</span><span>:</span> <span>cmds</span><span>:</span> <span><span>&quot;</span>sleep <span><span>${</span><span>toString</span> <span>delay</span><span>}</span></span> &amp;&amp; <span><span>${</span><span>msg</span> <span>cmds</span><span>}</span></span><span>&quot;</span></span><span>;</span>\n</span><span> <span>startup</span> <span>=</span> <span>pkgs</span><span>.</span><span>writeShellScriptBin</span> <span><span>&quot;</span>startup.sh<span>&quot;</span></span> <span><span>''</span>\n</span></span><span><span> wait_for () {\n</span></span><span><span> { swaymsg -r -m -t subscribe '[&quot;window&quot;]' |\n</span></span><span><span> jq -c --unbuffered '. | select(.change == &quot;new&quot;)' |\n</span></span><span><span> { grep -m1 . &gt;/dev/null ; pkill swaymsg ;} &amp;\n</span></span><span><span> } 2&gt;/dev/null\n</span></span><span><span> pid=$!\n</span></span><span><span> swaymsg -- &quot;exec $*&quot; &amp;&amp; sleep 0.5\n</span></span><span><span> wait $pid 2&gt;/dev/null\n</span></span><span><span> }\n</span></span><span><span>\n</span></span><span><span> <span><span>${</span><span>workspace</span> <span><span>&quot;</span><span><span>${</span><span>mediaws</span><span>}</span></span><span>&quot;</span></span><span>}</span></span>\n</span></span><span><span> wait_for &quot;rhythmbox&quot;\n</span></span><span><span>...\n</span></span><span><span> <span>''</span></span><span>;</span>\n</span><span> <span>in</span>\n</span><span> <span>[</span> <span>{</span> <span>command</span> <span>=</span> <span><span>&quot;</span><span><span>${</span><span>startup</span><span>}</span></span>/bin/startup.sh<span>&quot;</span></span><span>;</span> <span>}</span> <span>]</span><span>;</span>\n</span></code></pre>", 8 "content": "<p>Well, here we go again, again. Having stalled out back in 2013 to restart in\n2015, I stalled out again in 2017, so am finally restarting seven years later.\nAgain. I do have a dozen or more half-written posts from that period that may\nleak out slowly, in <a href=\"https://mort.io/tags/old\">backdated form</a>.</p>\n<p>The stack for the blog has been updated again, naturally \u2013 the tools got better\nafter all. So now this is using <a href=\"https://www.getzola.org\">Zola</a> with, initially,\nthe <a href=\"https://github.com/jieiku/abridge/\">abridge theme</a>. I think it\u2019s shinier,\nand hopefully also involves (almost) no JavaScript, is finally accessible, and\nnot too heavyweight. In removing the excessive JavaScript, I also updated my\n<a href=\"https://mort.io/blog/stop-start/./research#publications\">publication list</a> <a href=\"https://github.com/mor1/bib2html\">generation\nprocess</a>: no more CoffeeScript and JavaScript,\njust some plain ol\u2019 <a href=\"https://www.python.org/\">Python</a> using the slick new\n<a href=\"https://github.com/astral-sh/uv\">uv</a> tooling. The\n<a href=\"https://github.com/casey/just\">Justfile</a> incantation is something like:</p>\n<pre><code><span><span>papers</span> <span>:=</span></span> <span><span><span>&quot;../templates/shortcodes/publications.html&quot;</span></span>\n</span><span><span>bibinputs</span> <span>:=</span></span> <span><span><span>&quot;../papers/bibinputs.json&quot;</span></span>\n</span><span>\n</span><span><span><span>#</span> build papers data for site\n</span></span><span><span><span>@papers</span></span><span>:</span>\n<span></span><span></span></span><span><span></span><span> <span><span><span>cd</span></span><span> bib2html</span> <span>&amp;&amp;</span> <span><span>uv</span></span><span> sync</span> <span>&amp;&amp;</span> <span><span>uv</span></span><span> run<span> --</span></span><span> ./src/bib2html <span><span>{</span><span><span>{</span>bibinputs<span>}</span></span><span>}</span></span> <span>&gt;</span></span><span>|</span> <span><span>{{papers</span></span><span></span>}<span></span>}</span>\n</span></span></code></pre>\n<p>I\u2019ve also added a <a href=\"https://mort.io/blog/stop-start/./register/\">register of interests</a> so I stop having to\nscrabble around remembering what I\u2019m officially doing when I\u2019m occasionally\nasked.</p>\n<p>The stack underneath has also changed. I finally kicked the Mac OS habit after\nover 10 years \u2013 decided I\u2019d had enough of Apple hiding things and generally\ngetting in my way \u2013 at the same time I switched from Android to iPhone. Never\ndo things the easy way, that\u2019s my motto. So now I\u2019m back on a PC \u2026 but it\nturns out that 2024 (well, 2023 in fact) is the year of Linux on the Laptop for\nme. Not something I thought would actually happen when we joked about it in the\nlate 90s. Truly, times change. And not just any old wannabe-Windows distribution\nbut the resolutely idiosyncratic and copiously yet poorly documented\n<a href=\"\">NixOS</a> using Flakes and Home-Manager of course, with\n<a href=\"https://wayland.freedesktop.org/\">Wayland</a> and <a href=\"https://swaywm.org/\">Sway</a>.\nI\u2019ve even finally made the leap to <a href=\"https://vscodium.com/\">Codium</a>, the\nde-Microsofted version of VSCode, from\n<a href=\"https://www.gnu.org/software/emacs/\">Emacs</a> (mostly \u2013\n<a href=\"https://orgmode.org/\">org-mode</a> has not yet been replaced). I blame\n<a href=\"https://www.jeffas.net/\">Andrew</a> and <a href=\"https://www.jentek.dev/\">Chris</a>.</p>\n<p>For the terminally curious, this meant a fairly heavy reworking of my 30 years\nold <a href=\"https://github.com/mor1/rc-files/\">dotfiles</a> \u2013 still work in progress but\nadequately organised for now I think. See the <a href=\"https://github.com/mor1/rc-files/tree/main/nixos\">NixOS specific\nbits</a> if curious.</p>\n<p>And, because I\u2019m going to try to include at least one vaguely technical bit (or\nat least, one bit which isn\u2019t just me bemoaning that I haven\u2019t written anything\nin years), I confess to being particularly pleased with the following fragment\nto enable <a href=\"https://github.com/mor1/rc-files/blob/main/nixos/modules/home-manager/sway.nix#L64-L122\">my Sway startup\nscript</a>\nto start several apps on particular workspaces, by switching to the workspace,\nstarting the app, and then waiting for a suitable window to appear. The latter\nstep entails</p>\n<ul>\n<li>subscribing <code>swaymsg</code> to <code>window</code> messages with\n<a href=\"https://jqlang.github.io/jq/\">jq</a> to extract the messages of interest\nindicating a new window in the background,</li>\n<li>executing the command to start the app,</li>\n<li>using <code>grep</code>/<code>pkill</code> in tandem to kill the subscription when the new window is\ndetected, and finally</li>\n<li>waiting for the subscription to have been killed.</li>\n</ul>\n<p>It seems fairly (indeed, surprisingly) reliable.</p>\n<pre><code><span><span><span>wait_for</span> <span>(</span><span>)</span> <span>{</span>\n</span></span><span><span> <span>{</span> <span><span>swaymsg</span></span><span><span><span> -</span>r</span><span><span> -</span>m</span><span><span> -</span>t</span> subscribe <span><span>'</span>[&quot;window&quot;]<span>'</span></span></span> <span>|</span>\n</span></span><span><span> <span><span>jq</span></span><span><span><span> -</span>c</span><span><span> --</span>unbuffered</span> <span><span>'</span>. | select(.change == &quot;new&quot;)<span>'</span></span></span> <span>|</span>\n</span></span><span><span> <span>{</span> <span><span>grep</span></span><span><span><span> -</span>m1</span> . <span>&gt;</span>/dev/null</span> <span>;</span> <span><span>pkill</span></span><span> swaymsg</span> <span>;</span><span>}</span> <span>&amp;</span>\n</span></span><span><span> <span>}</span><span> <span>2</span><span>&gt;</span>/dev/null</span>\n</span></span><span><span> <span>pid</span><span>=</span><span><span><span>$</span><span>!</span></span></span>\n</span></span><span><span> <span><span>swaymsg</span></span><span><span> --</span></span><span> <span><span>&quot;</span>exec <span><span>$</span><span>*</span></span><span>&quot;</span></span> </span><span>&amp;&amp;</span> <span><span>sleep</span></span><span> 0.5</span>\n</span></span><span><span> <span><span>wait</span></span><span> <span><span>$</span><span>pid</span></span> <span>2</span><span>&gt;</span>/dev/null</span>\n</span></span><span><span><span>}</span></span>\n</span></code></pre>\n<p>Use via something like:</p>\n<pre><code><span><span>wayland</span><span>.</span><span>windowManager</span><span>.</span><span>sway</span><span>.</span><span>config</span><span>.</span><span>startup</span> <span>=</span>\n</span><span> <span>let</span>\n</span><span> <span>msg</span> <span>=</span> <span>cmds</span><span>:</span> <span><span>&quot;</span>swaymsg '<span><span>${</span><span>builtins</span><span>.</span><span>concatStringsSep</span> <span><span>&quot;</span>, <span>&quot;</span></span> <span>cmds</span><span>}</span></span>'<span>&quot;</span></span><span>;</span>\n</span><span> <span>workspace</span> <span>=</span> <span>ws</span><span>:</span> <span>msg</span> <span>[</span> <span><span>&quot;</span>workspace --no-auto-back-and-forth <span><span>${</span><span>ws</span><span>}</span></span><span>&quot;</span></span> <span>]</span><span>;</span>\n</span><span> <span>after</span> <span>=</span> <span>delay</span><span>:</span> <span>cmds</span><span>:</span> <span><span>&quot;</span>sleep <span><span>${</span><span>toString</span> <span>delay</span><span>}</span></span> &amp;&amp; <span><span>${</span><span>msg</span> <span>cmds</span><span>}</span></span><span>&quot;</span></span><span>;</span>\n</span><span> <span>startup</span> <span>=</span> <span>pkgs</span><span>.</span><span>writeShellScriptBin</span> <span><span>&quot;</span>startup.sh<span>&quot;</span></span> <span><span>''</span>\n</span></span><span><span> wait_for () {\n</span></span><span><span> { swaymsg -r -m -t subscribe '[&quot;window&quot;]' |\n</span></span><span><span> jq -c --unbuffered '. | select(.change == &quot;new&quot;)' |\n</span></span><span><span> { grep -m1 . &gt;/dev/null ; pkill swaymsg ;} &amp;\n</span></span><span><span> } 2&gt;/dev/null\n</span></span><span><span> pid=$!\n</span></span><span><span> swaymsg -- &quot;exec $*&quot; &amp;&amp; sleep 0.5\n</span></span><span><span> wait $pid 2&gt;/dev/null\n</span></span><span><span> }\n</span></span><span><span>\n</span></span><span><span> <span><span>${</span><span>workspace</span> <span><span>&quot;</span><span><span>${</span><span>mediaws</span><span>}</span></span><span>&quot;</span></span><span>}</span></span>\n</span></span><span><span> wait_for &quot;rhythmbox&quot;\n</span></span><span><span>...\n</span></span><span><span> <span>''</span></span><span>;</span>\n</span><span> <span>in</span>\n</span><span> <span>[</span> <span>{</span> <span>command</span> <span>=</span> <span><span>&quot;</span><span><span>${</span><span>startup</span><span>}</span></span>/bin/startup.sh<span>&quot;</span></span><span>;</span> <span>}</span> <span>]</span><span>;</span>\n</span></code></pre>", 9 "content_type": "html", 10 "author": { 11 "name": "Unknown", 12 "email": null, 13 "uri": null 14 }, 15 "categories": [], 16 "rights": null, 17 "source": "https://mort.io/atom.xml" 18}