<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://hanspinckaers.com</id>
  <title>Hans – Public Notes</title>
  <updated>2024-03-27T20:21:39.580253+00:00</updated>
  <author>
    <name>hanspinckaers</name>
    <email>hidden</email>
  </author>
  <link href="https://hanspinckaers.com/" rel="alternate"/>
  <link href="https://hanspinckaers.com/feed/" rel="self"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="0.9.0">python-feedgen</generator>
  <subtitle>Hi! Welcome to my small website. This is a collection of short public notes to hopefully help others. I'm currently a Machine Learning Scientist working on d...</subtitle>
  <entry>
    <id>https://hanspinckaers.com/my-custom-css-for-vivaldi/</id>
    <title>My custom CSS for Vivaldi</title>
    <updated>2023-07-22T19:35:16.302730+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;p&gt;The theme has to be set to 'Subtle'&lt;/p&gt;
&lt;p&gt;My tweaks are available on Github: &lt;a href="https://github.com/hanspinckaers/vivaldi-theme"&gt;https://github.com/hanspinckaers/vivaldi-theme&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="major-limitation"&gt;Major limitation:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Tabs sidebar needs to be exactly 250px, otherwise you get misalignments of the menubar / tabs&lt;/li&gt;
&lt;li&gt;Dark mode doesn't work&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="before"&gt;Before&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Before" src="https://bear-images.sfo2.cdn.digitaloceanspaces.com/hanspinckaers-1690053584-0.png"/&gt;&lt;/p&gt;
&lt;h2 id="after"&gt;After&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Hans – Public Notes" src="https://bear-images.sfo2.cdn.digitaloceanspaces.com/hanspinckaers-1690053608-0.png"/&gt;&lt;/p&gt;
&lt;h2 id="before"&gt;Before&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Hans – Public Notes" src="https://bear-images.sfo2.cdn.digitaloceanspaces.com/hanspinckaers-1690053621-0.png"/&gt;&lt;/p&gt;
&lt;h2 id="after"&gt;After&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Hans – Public Notes" src="https://bear-images.sfo2.cdn.digitaloceanspaces.com/hanspinckaers-1690053643-0.png"/&gt;&lt;/p&gt;
</content>
    <link href="https://hanspinckaers.com/my-custom-css-for-vivaldi/" rel="alternate"/>
    <published>2023-07-22T19:23:06.433163+00:00</published>
  </entry>
  <entry>
    <id>https://hanspinckaers.com/pandoc-eqnos-on-macos/</id>
    <title>pandoc-eqnos on macOS</title>
    <updated>2023-07-14T12:55:53.001770+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;h3 id="runtimeerror"&gt;RuntimeError&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;RuntimeError: Cannot understand pandocversion=3.1.3
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Relevant issues: &lt;a href="https://github.com/tomduck/pandoc-eqnos/issues/68"&gt;https://github.com/tomduck/pandoc-eqnos/issues/68&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What I did:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;conda install -c conda-forge pandoc==2.19.2
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="error-running-filter"&gt;Error running filter&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Error running filter pandoc_eqnos:
Could not find executable pandoc_eqnos
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Solution for me:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip show pandoc_eqnos # get Location
pandoc --filter &amp;lt;&amp;gt;/python3.9/site-packages/pandoc_eqnos.py ...
&lt;/pre&gt;&lt;/div&gt;

</content>
    <link href="https://hanspinckaers.com/pandoc-eqnos-on-macos/" rel="alternate"/>
    <published>2023-07-14T12:54:43.735921+00:00</published>
  </entry>
  <entry>
    <id>https://hanspinckaers.com/use-grammarly-premium-with-grammarly-lsp-in-neovim/</id>
    <title>Use Grammarly Premium with Grammarly LSP in Neovim</title>
    <updated>2023-07-14T08:32:34.028735+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;p&gt;Basically, I needed to login via VSCode, then I got it working.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download / install VSCode (the horror..)&lt;/li&gt;
&lt;li&gt;Install the extension Grammarly&lt;/li&gt;
&lt;li&gt;Shift-Command-p --&amp;gt; grammarly.login&lt;/li&gt;
&lt;li&gt;Follow the login flow&lt;/li&gt;
&lt;li&gt;Quit VSCode&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;ls ~/.config/grammarly-languageserver&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Copy the folder name, this is your clientID&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Configure the LSP like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="s1"&gt;'lspconfig'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grammarly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;on_attach&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;on_attach&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;init_options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;clientId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;&amp;gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Getting &lt;code&gt;TypeError: Failed to parse URL&lt;/code&gt; ? You may need to run using node v16.40:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install nvm (&lt;a href="https://github.com/nvm-sh/nvm"&gt;https://github.com/nvm-sh/nvm&lt;/a&gt; / &lt;a href="https://github.com/jorgebucaran/nvm.fish"&gt;https://github.com/jorgebucaran/nvm.fish&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nvm install v16.14.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nvm use 16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nvim&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <link href="https://hanspinckaers.com/use-grammarly-premium-with-grammarly-lsp-in-neovim/" rel="alternate"/>
    <published>2023-07-13T14:28:58.716208+00:00</published>
  </entry>
  <entry>
    <id>https://hanspinckaers.com/languagetool-premium-with-ltex-lsp-in-neovim/</id>
    <title>Use LanguageTool Premium with LTeX LSP in Neovim</title>
    <updated>2023-07-13T14:32:22.465290+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;p&gt;Find your API key here: https://languagetool.org/editor/settings/access-tokens&lt;/p&gt;
&lt;p&gt;Install ltex (I'm on a Mac): &lt;code&gt;brew install ltex-ls&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;require'lspconfig'.ltex.setup{
     on_attach = on_attach,
     settings ={
      ltex = {
        languageToolHttpServerUri='https://api.languagetoolplus.com',
        languageToolOrg = {
          username='&amp;lt;email&amp;gt;',
          apiKey = '&amp;lt;API key&amp;gt;',
        }
      }
    }
 }
&lt;/pre&gt;&lt;/div&gt;

</content>
    <link href="https://hanspinckaers.com/languagetool-premium-with-ltex-lsp-in-neovim/" rel="alternate"/>
    <published>2023-07-13T14:13:40.322880+00:00</published>
  </entry>
  <entry>
    <id>https://hanspinckaers.com/matplotlib-backend-for-kitty-over-ssh/</id>
    <title>Matplotlib backend for Kitty over SSH</title>
    <updated>2023-07-11T08:51:03.456484+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;p&gt;I couldn't get &lt;code&gt;kitty +kitten icat&lt;/code&gt; working:
&lt;code&gt;Terminal does not support reporting screen sizes via the TIOCGWINSZ ioctl&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workaround using &lt;a href="https://github.com/jesvedberg/tpix/"&gt;tpix&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;wget&lt;span class="w"&gt; &lt;/span&gt;https://github.com/jesvedberg/tpix/releases/download/v1.0.0/tpix-1.0.0-x86_64-linux.tar.gz
tar&lt;span class="w"&gt; &lt;/span&gt;xzf&lt;span class="w"&gt; &lt;/span&gt;tpix-1.0.0-x86_64-linux.tar.gz
mv&lt;span class="w"&gt; &lt;/span&gt;tpix&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Install my fork of matplotlib-backend-kitty that uses tpix:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pip install git+https://github.com/HansPinckaers/matplotlib-backend-kitty-tpix.git&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recommended:&lt;/strong&gt; put this in your bashrc (and source it):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;export MPLBACKEND='module://matplotlib-backend-kitty'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Or use this in Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;import matplotlib
matplotlib.use('module://matplotlib-backend-kitty')
import matplotlib.pyplot as plt
&lt;/pre&gt;&lt;/div&gt;

</content>
    <link href="https://hanspinckaers.com/matplotlib-backend-for-kitty-over-ssh/" rel="alternate"/>
    <published>2023-07-11T08:42:32.469704+00:00</published>
  </entry>
  <entry>
    <id>https://hanspinckaers.com/async-black-for-python-in-neovim/</id>
    <title>Asynchronous Black for Python in Neovim</title>
    <updated>2023-11-01T19:24:44.237421+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;p&gt;&lt;strong&gt;Update: please use this awesome plug-in instead of this post:
&lt;a href="https://github.com/stevearc/conform.nvim"&gt;GitHub - stevearc/conform.nvim: Lightweight yet powerful formatter plugin for Neovim&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I searched a bit on the internet for a non-blocking formatter using Black in Neovim, while keeping the jumplist intact. Since I couldn't find it, I coded this with help from a LLM. It's not perfect, but it does the job for me.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;async_black&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;bufnr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_get_current_buf&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;stdin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'black'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;'--fast'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-q'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;stdio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;cwd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;detached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;-- print("black process exited with code: " .. code .. ", signal: " .. signal)&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
      &lt;span class="nb"&gt;table.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;else&lt;/span&gt;
      &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;all_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;table.concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;save_view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;winsaveview&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;curpos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getcurpos&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;save_jumplist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getjumplist&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_buf_set_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bufnr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="kr"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="n"&gt;save_jumplist&lt;/span&gt; &lt;span class="kr"&gt;do&lt;/span&gt;
          &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;save_jumplist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;bufnr&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;bufnr&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
            &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'normal! '&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;save_jumplist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;lnum&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;'G'&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;save_jumplist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;'|'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="kr"&gt;end&lt;/span&gt;
        &lt;span class="kr"&gt;end&lt;/span&gt;
        &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'normal! '&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;curpos&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;'G'&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;curpos&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="s1"&gt;'|'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;winrestview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;save_view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;uv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kr"&gt;then&lt;/span&gt;
      &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"stderr data: "&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kr"&gt;end&lt;/span&gt;
  &lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nvim_buf_get_lines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bufnr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;all_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;table.concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;[[&lt;/span&gt;
&lt;span class="s"&gt;  augroup async_black&lt;/span&gt;
&lt;span class="s"&gt;    autocmd!&lt;/span&gt;
&lt;span class="s"&gt;    autocmd FileType python autocmd BufWritePost &amp;lt;buffer&amp;gt; lua async_black()&lt;/span&gt;
&lt;span class="s"&gt;  augroup END&lt;/span&gt;
&lt;span class="s"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

</content>
    <link href="https://hanspinckaers.com/async-black-for-python-in-neovim/" rel="alternate"/>
    <published>2023-07-10T13:26:02.319303+00:00</published>
  </entry>
  <entry>
    <id>https://hanspinckaers.com/papers-on-concept-activation-vectors/</id>
    <title>Papers on Concept Activation Vectors</title>
    <updated>2023-07-10T09:10:11.331206+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;h2 id="theory"&gt;Theory&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;On completeness-aware concept-based explanations in deep neural networks.&lt;/strong&gt; Yeh, C.-K., Kim, B., Arik, S., Li, C.-L., Ravikumar, P., &amp;amp; Pfister, T. (2020). &lt;a href="https://arxiv.org/abs/1910.07969"&gt;https://arxiv.org/abs/1910.07969&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Debugging Tests for Model Explanations.&lt;/strong&gt; Adebayo, J., Muelly, M., Liccardi, I., &amp;amp; Kim, B. (2020). arXiv, 2011.05429v1. &lt;a href="http://arxiv.org/abs/2011.05429v1"&gt;http://arxiv.org/abs/2011.05429v1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Concept Whitening for Interpretable Image Recognition.&lt;/strong&gt; Chen, Z., Bei, Y., &amp;amp; Rudin, C. (2020). Nature Machine Intelligence, Vol 2, Dec 2020, 772-782, 2002.01650v5. &lt;a href="http://arxiv.org/abs/2002.01650v5"&gt;http://arxiv.org/abs/2002.01650v5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Concept Bottleneck Models&lt;/strong&gt;. Koh, P. W., Nguyen, T., Tang, Y. S., Mussmann, S., Pierson, E., Kim, B., &amp;amp; Liang, P. (2020). arXiv, 2007.04612v3. &lt;a href="http://arxiv.org/abs/2007.04612v3"&gt;http://arxiv.org/abs/2007.04612v3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Towards Automatic Concept-based Explanations.&lt;/strong&gt; Ghorbani, A., Wexler, J., Zou, J., &amp;amp; Kim, B. (2019). arXiv, 1902.03129v3. &lt;a href="http://arxiv.org/abs/1902.03129v3"&gt;http://arxiv.org/abs/1902.03129v3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explaining Classifiers with Causal Concept Effect (CaCE).&lt;/strong&gt; Goyal, Y., Feder, A., Shalit, U., &amp;amp; Kim, B. (2019). arXiv, 1907.07165v2. &lt;a href="http://arxiv.org/abs/1907.07165v2"&gt;http://arxiv.org/abs/1907.07165v2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interpretability beyond feature attribution: Quantitative testing with concept activation vectors (TCAV).&lt;/strong&gt; Kim, B., Wattenberg, M., Gilmer, J., Cai, C., Wexler, J., &amp;amp; Viegas, F. (2018). In International conference on machine learning (pp. 2668-2677). PMLR. &lt;a href="http://proceedings.mlr.press/v80/kim18d.html"&gt;http://proceedings.mlr.press/v80/kim18d.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="application-medical-domain"&gt;Application (medical domain)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Robust and Interpretable Convolutional Neural Networks to Detect Glaucoma in Optical Coherence Tomography Images.&lt;/strong&gt; Thakoor, K. A., Koorathota, S. C., Hood, D. C., &amp;amp; Sajda, P. (2020). IEEE Trans Biomed Eng, PP. &lt;a href="https://doi.org/10.1109/TBME.2020.3043215"&gt;https://doi.org/10.1109/TBME.2020.3043215&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On interpretability of deep learning based skin lesion classifiers using concept activation vectors.&lt;/strong&gt; Lucieri, A., Bajwa, M. N., Braun, S. A., Malik, M. I., Dengel, A., &amp;amp; Ahmed, S. (2020). International Joint Conference on Neural Networks (IJCNN) (pp. 1-10). IEEE. &lt;a href="https://ieeexplore.ieee.org/document/9206946"&gt;https://ieeexplore.ieee.org/document/9206946&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Concept-based model explanations for Electronic Health Records.&lt;/strong&gt; Baur, S., Hou, S., Loreaux, E., Mincu, D., Mottram, A., Protsyuk, I., Tomasev, N., Seneviratne, M. G., Karthikesanlingam, A., &amp;amp; Schrouff, J. (2020). arXiv, 2012.02308v1. &lt;a href="http://arxiv.org/abs/2012.02308v1"&gt;http://arxiv.org/abs/2012.02308v1&lt;/a&gt;&lt;/p&gt;
</content>
    <link href="https://hanspinckaers.com/papers-on-concept-activation-vectors/" rel="alternate"/>
    <published>2021-02-16T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://hanspinckaers.com/notes-on-dialing-in-an-espresso/</id>
    <title>Notes on dialing in an espresso</title>
    <updated>2023-07-10T09:09:50.885943+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;ul&gt;
&lt;li&gt;First keep recipe the same (amount of ground coffee in and amount of extracted coffee out) and tweak grind size to get brew time in the right range (25-30 seconds)&lt;/li&gt;
&lt;li&gt;When numbers are in the right range use taste to tweak extraction: sourness is mostly under-extraction, bitterness is over-extraction.&lt;/li&gt;
&lt;li&gt;Lighter roasts: more work to extract the coffee, which means use less dose or coarser grind. If you start with a big dose, impossible amount of work to do. Sour, weak body as a result. Here underextraction can thus be because of too fine grinds as well!&lt;/li&gt;
&lt;li&gt;Darker roast: easy to extract, soluble get out quickly, is OK to use a higher dose. Can benefit from finer grind.&lt;/li&gt;
&lt;li&gt;Instead of changing grind size you can also tweak dose a bit, add more dose: is more work to extract, slower flow, so longer contact time.&lt;/li&gt;
&lt;li&gt;You can increase extraction with lower dose, also maybe combined with finer grind&lt;/li&gt;
&lt;li&gt;Brew time: 25-30 seconds is a good target, but not so important.&lt;/li&gt;
&lt;li&gt;You can also increase brew time for an extra little bit extraction, you trade this for strength (because you dilute), but can add clarity and sweetness&lt;/li&gt;
&lt;li&gt;Grams out is very important to monitor, to keep the ratio the same.&lt;/li&gt;
&lt;li&gt;Espresso ratio: 1.5-2.5, meaning ratio between grams coffee in and grams of liquid out.&lt;/li&gt;
&lt;li&gt;Source: mainly &lt;a href="https://youtu.be/aTFsBqhpLes"&gt;James Hoffman&lt;/a&gt;'s fantastic &lt;a href="https://www.youtube.com/channel/UCMb0O2CdPBNi-QqPk5T3gsQ"&gt;YouTube channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Barista Hustle has some good blogs post as well:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.baristahustle.com/blog/coffee-extraction-and-how-to-taste-it/"&gt;https://www.baristahustle.com/blog/coffee-extraction-and-how-to-taste-it/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baristahustle.com/blog/espresso-recipes-analyzing-dose/"&gt;https://www.baristahustle.com/blog/espresso-recipes-analyzing-dose/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baristahustle.com/blog/espresso-recipes-strength/"&gt;https://www.baristahustle.com/blog/espresso-recipes-strength/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baristahustle.com/blog/espresso-recipes-understanding-yield/"&gt;https://www.baristahustle.com/blog/espresso-recipes-understanding-yield/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.baristahustle.com/blog/espresso-recipes-time/"&gt;https://www.baristahustle.com/blog/espresso-recipes-time/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;One of their tips: only dose more or less coffee to make more or less coffee.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
    <link href="https://hanspinckaers.com/notes-on-dialing-in-an-espresso/" rel="alternate"/>
    <published>2020-10-14T00:00:00+00:00</published>
  </entry>
  <entry>
    <id>https://hanspinckaers.com/using-a-sony-alpha-camera-as-a-webcam-in-ubuntu/</id>
    <title>Using a Sony alpha camera as a webcam in Ubuntu</title>
    <updated>2023-07-10T09:10:53.594892+00:00</updated>
    <author>
      <name>hanspinckaers</name>
      <email>hidden</email>
    </author>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Make sure you have ffmpeg: &lt;code&gt;sudo apt-get install ffmpeg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install latest release gphoto2: &lt;a href="https://github.com/gonzalo/gphoto2-updater"&gt;https://github.com/gonzalo/gphoto2-updater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://github.com/umlaeute/v4l2loopback"&gt;https://github.com/umlaeute/v4l2loopback&lt;/a&gt; from source (see README.md)&lt;/li&gt;
&lt;li&gt;On Sony alpha camera: change &lt;em&gt;USB connection&lt;/em&gt; in settings on camera to &lt;em&gt;PC Remote&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enable kernel extension: &lt;code&gt;sudo modprobe v4l2loopback exclusive_caps=1 max_buffers=2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Launch webcam: &lt;code&gt;gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -threads 8 -f v4l2 /dev/video2&lt;/code&gt;&lt;ul&gt;
&lt;li&gt;Change &lt;code&gt;/dev/video2/&lt;/code&gt; to device mentioned in &lt;code&gt;v4l2-ctl --list-devices&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;It doesn't work anymore&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Did you start the kernel module? &lt;code&gt;sudo modprobe v4l2loopback exclusive_caps=1 max_buffers=2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;When after upgrading the v4l2loopback kernel module will not load: build from source again, but start with a &lt;code&gt;make clean&lt;/code&gt; &lt;code&gt;make&lt;/code&gt; &lt;code&gt;sudo make install&lt;/code&gt; &lt;code&gt;sudo depmod -a&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Main source&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.crackedthecode.co/how-to-use-your-dslr-as-a-webcam-in-linux/"&gt;https://www.crackedthecode.co/how-to-use-your-dslr-as-a-webcam-in-linux/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
    <link href="https://hanspinckaers.com/using-a-sony-alpha-camera-as-a-webcam-in-ubuntu/" rel="alternate"/>
    <published>2020-10-12T00:00:00+00:00</published>
  </entry>
</feed>
