<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ix5 tech</title>
    <link>https://ix5.org/tech/</link>
    <description>Recent content on ix5 tech</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 27 Apr 2023 07:15:06 +0200</lastBuildDate><atom:link href="https://ix5.org/tech/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Pandas: Apply function per row with context</title>
      <link>https://ix5.org/tech/2023/pandas-row-ops/</link>
      <pubDate>Wed, 12 Apr 2023 17:44:36 +0200</pubDate>
      
      <guid>https://ix5.org/tech/2023/pandas-row-ops/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_affected_days&lt;/span&gt;(start, finish):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pairs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; df&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;apply(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; row: get_affected_days(row[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;started_at&amp;#39;&lt;/span&gt;], row[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;finished_at&amp;#39;&lt;/span&gt;]),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    axis&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Plotly</title>
      <link>https://ix5.org/tech/2023/plotly/</link>
      <pubDate>Fri, 31 Mar 2023 22:06:28 +0200</pubDate>
      
      <guid>https://ix5.org/tech/2023/plotly/</guid>
      <description>&lt;h3 id=&#34;sane-plotly-defaults-margins-with-legends-inside-chart&#34;&gt;Sane plotly defaults, margins, with legends inside chart&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pandas &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; pd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; numpy &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; plotly.express &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; px
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; plotly.graph_objects &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; go
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plotly_config &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dict(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    autosize&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    margin&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;dict(l&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, r&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, b&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, t&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, pad&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;update_layout(&lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;plotly_config)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;update_layout(legend&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;dict(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    yanchor&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    y&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.99&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    xanchor&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;center&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    x&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0.1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_filename &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;filename&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write_image(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;_filename&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.svg&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;show()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;setting-plotly-labels&#34;&gt;Setting plotly labels&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; px&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;bar(df[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;url&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;resample(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1w&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count(), labels&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;value&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Disruptions&amp;#39;&lt;/span&gt;})&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;update_layout(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    autosize&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    margin&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;dict(l&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, r&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, b&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, t&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, pad&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;update_layout(showlegend&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write_image(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;image.svg&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;show()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;pivot-operations-and-multiindex-to-flat-columns&#34;&gt;Pivot operations and MultiIndex to flat columns&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;important &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; russia_bans
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;important&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;loc[&lt;span style=&#34;color:#f92672&#34;&gt;~&lt;/span&gt;russia_bans[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;str&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;startswith(_cols), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Other&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sanctions_with_other &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (important
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;groupby(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        by&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[important[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;date.implemented&amp;#39;&lt;/span&gt;], important[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product&amp;#39;&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;str[:&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        group_keys&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rename(columns&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product.count&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;reset_index(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;loc[:, [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product.count&amp;#39;&lt;/span&gt;]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sanctions_with_other &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;DataFrame(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sanctions_with_other&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;pivot(columns&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;product&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sanctions_with_other&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;columns &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sanctions_with_other&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;columns&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_level_values(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Only for including &amp;#34;Other&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sanctions_with_other &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sanctions_with_other&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;loc[:, (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Ot&amp;#39;&lt;/span&gt;,) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; _cols]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rename(columns&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Ot&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Other&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sanctions_with_other&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;index &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_datetime(sanctions_with_other&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;index)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;helper-embedding-plotly-charts-as-static-images-for-pdf-export&#34;&gt;Helper: Embedding plotly charts as static images for (PDF) export&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EXPORT_TO_PDF &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; IPython.display &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Image
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;plotly_img_save_and_inline&lt;/span&gt;(fig, filename):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write_image(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;filename&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.svg&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;write_image(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;filename&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.png&amp;#39;&lt;/span&gt;, width&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; EXPORT_TO_PDF:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;To pdf, saving&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        img &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Image(data&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;filename&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.png&amp;#39;&lt;/span&gt;, width&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1000&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# Declutter by removing the png file from disk again,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# we only need vector graphics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;remove(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;filename&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;.png&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; img
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Inline&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fig&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;show()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fig &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; px&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;line(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    strikes&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;resample(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;d&amp;#39;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_filename &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;image&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;plotly_img_save_and_inline(fig, _filename)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Changed Zoho IMAP Access for Custom Domain</title>
      <link>https://ix5.org/tech/2023/zoho-imap-access/</link>
      <pubDate>Fri, 24 Mar 2023 23:38:10 +0100</pubDate>
      
      <guid>https://ix5.org/tech/2023/zoho-imap-access/</guid>
      <description>&lt;p&gt;Zoho, a suite of business applications allowing, among others, having an email
account using your own domain name, silently changed their access procedure,
leading to &lt;code&gt;Login failed&lt;/code&gt; messages in e.g. Thunderbird.&lt;/p&gt;
&lt;p&gt;The gist of it is that you need to use &lt;code&gt;imappro.zoho.eu&lt;/code&gt; for your IMAP server
and &lt;code&gt;smtppro.zoho.eu&lt;/code&gt; for outgoing SMTP server to continue using your own domain
name.&lt;/p&gt;
&lt;p&gt;The updated guide is at the
&lt;a href=&#34;https://www.zoho.com/mail/help/thunderbird-imap-access.html&#34;&gt;Help pages for Zoho mail&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;Incoming server hostname:&lt;br&gt;
If you are an organization user with a domain-based account, provide
&lt;code&gt;imappro.zoho.eu&lt;/code&gt;, select &lt;code&gt;993&lt;/code&gt; for Port from the drop-down, and &lt;code&gt;Normal Password&lt;/code&gt; for authentication.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ol start=&#34;10&#34;&gt;
&lt;li&gt;For Outgoing server hostname:&lt;br&gt;
If you are an organization user with a domain-based account, provide
&lt;code&gt;smtppro.zoho.eu&lt;/code&gt;, select &lt;code&gt;465&lt;/code&gt; for Port from the drop-down, and &lt;code&gt;Normal Password&lt;/code&gt; for authentication.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>GNOME: Clear lock timer</title>
      <link>https://ix5.org/tech/2023/gnome-unlock/</link>
      <pubDate>Tue, 21 Feb 2023 22:27:40 +0100</pubDate>
      
      <guid>https://ix5.org/tech/2023/gnome-unlock/</guid>
      <description>&lt;p&gt;Run &lt;code&gt;faillock --user &amp;lt;username&amp;gt; --reset&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sources:
&lt;a href=&#34;https://www.reddit.com/r/gnome/comments/ikobgg/user_locked_for_10_minutes_after_first_failed/&#34;&gt;reddit&lt;/a&gt;,
&lt;a href=&#34;https://www.reddit.com/r/linuxquestions/comments/il170u/how_does_pam_faillock_handle_deny0/&#34;&gt;reddit&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Zotero: Eliminate imported duplicates</title>
      <link>https://ix5.org/tech/2023/zotero-duplicates/</link>
      <pubDate>Tue, 14 Feb 2023 07:43:36 +0100</pubDate>
      
      <guid>https://ix5.org/tech/2023/zotero-duplicates/</guid>
      <description>&lt;p&gt;After exporting a &amp;ldquo;collection&amp;rdquo; in &lt;a href=&#34;https://www.zotero.org/&#34;&gt;Zotero&lt;/a&gt; to send to
an acquaintance, I imported the exported file to check that the archive file was
valid, choosing to &amp;ldquo;link&amp;rdquo; the imported files rather than importing them (i.e.,
storing them inside the Zotero data folder).&lt;/p&gt;
&lt;p&gt;The import had gone smoothly and I deleted the collection again, but foolishly
did not chose to delete the collection contents. This left me with a large
number of duplicate items scattered around, as &amp;ldquo;orphan&amp;rdquo; items with no parents.&lt;/p&gt;
&lt;p&gt;At this point, I should have used the &lt;code&gt;Unfiled Items&lt;/code&gt; pane to find those
duplicates and chosen to permanently delete them. But, as I had not noticed the
duplicate items, I forgot to do this and over time, more unfiled items filled up
with unrelated items (e.g. through saving snapshots from the web extension
without selecting a collection).&lt;/p&gt;
&lt;p&gt;I then noticed the duplicated items and first tried the &amp;ldquo;merge&amp;rdquo; function via the
&lt;code&gt;Duplicate Items&lt;/code&gt; pane. This left me with no duplicate items any more, but meant
that inside the items previously affected by duplication, the notes, PDF
attachments and website snapshots were duplicated, with duplicates pointing to
the data export folder.&lt;/p&gt;
&lt;p&gt;After a little digging, it turns out Zotero marks imported &amp;ldquo;linked&amp;rdquo; attachments
and especially internally with a &amp;ldquo;&lt;a href=&#34;https://github.com/zotero/zotero/blob/d8f7626dd47678ece3977fc23ce102a4a0b88761/chrome/content/zotero/xpcom/attachments.js#L28&#34;&gt;link mode&lt;/a&gt;&amp;rdquo; of 2:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LINK_MODE_IMPORTED_FILE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LINK_MODE_IMPORTED_URL&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LINK_MODE_LINKED_FILE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LINK_MODE_LINKED_URL&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;LINK_MODE_EMBEDDED_IMAGE&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using the &lt;a href=&#34;https://www.zotero.org/support/dev/client_coding/javascript_api&#34;&gt;Zotero Javascript API&lt;/a&gt;, I cleaned up the duplicates.&lt;/p&gt;
&lt;p&gt;Go to &lt;code&gt;Tools&lt;/code&gt; -&amp;gt; &lt;code&gt;Developer&lt;/code&gt; -&amp;gt; &lt;code&gt;Run JavaScript&lt;/code&gt; and enter this code, uncheck
&lt;code&gt;Run as async function&lt;/code&gt;, click &lt;code&gt;Run&lt;/code&gt;. Adjust &lt;code&gt;FS_LOC&lt;/code&gt; to the start of the full
path of the linked imported Zotero collection, e.g. &lt;code&gt;C:/&lt;/code&gt; or &lt;code&gt;C:\&lt;/code&gt; for Windows.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ZoteroPane&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zotero&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getActiveZoteroPane&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;selectedItems&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;ZoteroPane&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getSelectedItems&lt;/span&gt;()[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;attachmentsToDelete&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;itemsWithDuplicateNotes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;itemsWithDuplicateLinks&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Change this to &amp;#39;C:/&amp;#39; for Windows or &amp;#39;/User&amp;#39; for Mac
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FS_LOC&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/home&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;selectedItems&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;isRegularItem&lt;/span&gt;()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;attachmentIDs&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getAttachments&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;links&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;attachmentIDs&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zotero&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getField&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;url&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;// Remove &amp;#34;linked&amp;#34; attachments
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;attachmentLinkMode&amp;#39;&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;attachmentPath&amp;#39;&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;startsWith&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;FS_LOC&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Could also check if attachment with same name already exists
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;attachmentsToDelete&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;erase&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;saveTx&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Zotero&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fulltext&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;indexItems&lt;/span&gt;([&lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;// Remove duplicate linked url attachments
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getAttachmentLinkMode&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;links&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;includes&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;itemsWithDuplicateLinks&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;erase&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;saveTx&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Zotero&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fulltext&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;indexItems&lt;/span&gt;([&lt;span style=&#34;color:#a6e22e&#34;&gt;attachment&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;links&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;url&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;notes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getNotes&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;noteContents&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;of&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;notes&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;note&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Zotero&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Items&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;noteHTML&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;note&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getNote&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#75715e&#34;&gt;// Remove duplicates notes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;noteContents&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;includes&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;noteHTML&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;itemsWithDuplicateNotes&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;text&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;noteHTML&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getID&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;item&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getDisplayTitle&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;note&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;erase&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;note&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;saveTx&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;Zotero&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Fulltext&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;indexItems&lt;/span&gt;([&lt;span style=&#34;color:#a6e22e&#34;&gt;note&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;id&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;noteContents&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;push&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;noteHTML&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//attachmentsToDelete;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//itemsWithDuplicateNotes;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;//itemsWithDuplicateLinks;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For all methods of the &lt;code&gt;Zotero.Item&lt;/code&gt; object, see Zotero&amp;rsquo;s source code for
&lt;a href=&#34;https://github.com/zotero/zotero/blob/d8f7626dd47678ece3977fc23ce102a4a0b88761/chrome/content/zotero/xpcom/data/item.js&#34;&gt;item.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See also: &lt;a href=&#34;https://darencard.net/blog/2019-09-19-zotero-file-relink/&#34;&gt;Zotero file relink&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>spaCy Terms Cheat Sheet</title>
      <link>https://ix5.org/tech/2022/spacy-terms-cheat-sheet/</link>
      <pubDate>Thu, 22 Dec 2022 01:35:24 +0100</pubDate>
      
      <guid>https://ix5.org/tech/2022/spacy-terms-cheat-sheet/</guid>
      <description>&lt;p&gt;I am currently learning to deal with Natural Language Processing (NLP) using
&lt;a href=&#34;https://spacy.io/&#34;&gt;spaCy&lt;/a&gt;. These are the terms that I often end up having to
look up.&lt;/p&gt;
&lt;p&gt;I wrote a small &lt;strong&gt;bash helper function&lt;/strong&gt; for myself:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# spaCy explain term&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; explain&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    _query&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;$1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# activate virtualenv here, if necessary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    python -c &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;from spacy import explain; print(explain(&amp;#39;&amp;#34;&lt;/span&gt;$_query&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#39;))&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;glossary&#34;&gt;Glossary&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Extracted from &lt;strong&gt;spaCy:&lt;/strong&gt; &lt;a href=&#34;https://github.com/explosion/spaCy/blob/master/spacy/glossary.py&#34;&gt;glossary.py&lt;/a&gt;
and polished up a bit. spaCy license: MIT.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;pos-tags-universal-pos-tags&#34;&gt;POS tags: Universal POS Tags&lt;/h3&gt;
&lt;p&gt;See &lt;a href=&#34;http://universaldependencies.org/u/pos/&#34;&gt;universaldependencies.org/u/pos/&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ADJ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjective&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ADP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adposition&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ADV&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;AUX&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;auxiliary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CONJ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CCONJ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;coordinating conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DET&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;determiner&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;INTJ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;interjection&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NOUN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NUM&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;numeral&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PART&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PRON&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PROPN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;proper noun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PUNCT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;punctuation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SCONJ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;subordinating conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SYM&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;symbol&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VERB&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;X&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;other&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;EOL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;end of line&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SPACE&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;space&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;pos-tags-english&#34;&gt;POS tags (English)&lt;/h3&gt;
&lt;p&gt;From OntoNotes 5 / Penn Treebank,
see &lt;a href=&#34;https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html&#34;&gt;ling.upenn.edu&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;punctuation mark, sentence closer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;,&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;punctuation mark, comma&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-LRB-&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;left round bracket&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;-RRB-&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;right round bracket&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;\&lt;/code&gt;``&lt;/td&gt;
          &lt;td&gt;opening quotation mark&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;&amp;quot;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;: closing quotation mark&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;&#39;&#39;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;closing quotation mark&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;:&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;punctuation mark, colon or ellipsis&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;$&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;symbol, currency&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;#&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;symbol, number sign&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;AFX&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;affix&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;conjunction, coordinating&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;cardinal number&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;determiner&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;EX&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;existential there&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;FW&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;foreign word&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;HYPH&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;punctuation mark, hyphen&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;IN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;conjunction, subordinating or preposition&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;JJ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjective (English), other noun-modifier (Chinese)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;JJR&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjective, comparative&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;JJS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjective, superlative&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;LS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;list item marker&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;MD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb, modal auxiliary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NIL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;missing tag&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun, singular or mass&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NNP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun, proper singular&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NNPS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun, proper plural&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NNS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun, plural&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PDT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;predeterminer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;POS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;possessive ending&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PRP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;pronoun, personal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PRP$&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;pronoun, possessive&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;RB&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;RBR&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverb, comparative&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;RBS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverb, superlative&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;RP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverb, particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TO&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lsquo;infinitival to&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;UH&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;interjection&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VB&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb, base form&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VBD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb, past tense&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VBG&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb, gerund or present participle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VBN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb, past participle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VBP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb, non-3rd person singular present&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VBZ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb, 3rd person singular present&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WDT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;wh-determiner&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;wh-pronoun, personal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WP$&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;wh-pronoun, possessive&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WRB&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;wh-adverb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;space (English), sentence-final particle (Chinese)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ADD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;email&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NFP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;superfluous punctuation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GW&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;additional word in multi-word expression&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;XX&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;unknown&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;BES&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;auxiliary &amp;lsquo;be&amp;rsquo;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;HVS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;forms of &amp;lsquo;have&amp;rsquo;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;_SP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;whitespace&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;pos-tags-german&#34;&gt;POS Tags (German)&lt;/h3&gt;
&lt;p&gt;From TIGER Treebank,
see &lt;a href=&#34;http://www.ims.uni-stuttgart.de/forschung/ressourcen/korpora/TIGERCorpus/annotation/tiger_introduction.pdf&#34;&gt;ims.uni-stuttgart.de&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;$(&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;other sentence-internal punctuation mark&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;$,&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;comma&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;$.&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;sentence-final punctuation mark&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ADJA&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjective, attributive&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ADJD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjective, adverbial or predicative&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;APPO&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;postposition&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;APPR&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;preposition; circumposition left&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;APPRART&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;preposition with article&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;APZR&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;circumposition right&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ART&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;definite or indefinite article&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CARD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;cardinal number&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;FM&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;foreign language material&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ITJ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;interjection&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;KOKOM&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;comparative conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;KON&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;coordinate conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;KOUI&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lsquo;subordinate conjunction with zu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;KOUS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;subordinate conjunction with sentence&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NE&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;proper noun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NNE&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;proper noun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PAV&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;pronominal adverb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PROAV&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;pronominal adverb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PDAT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;attributive demonstrative pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PDS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;substituting demonstrative pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PIAT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;attributive indefinite pronoun without determiner&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PIDAT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;attributive indefinite pronoun with determiner&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PIS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;substituting indefinite pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PPER&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;non-reflexive personal pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PPOSAT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;attributive possessive pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PPOSS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;substituting possessive pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PRELAT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;attributive relative pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PRELS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;substituting relative pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PRF&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;reflexive personal pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PTKA&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;particle with adjective or adverb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PTKANT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;answer particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PTKNEG&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;negative particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PTKVZ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;separable verbal particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PTKZU&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lsquo;zu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PWAT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;attributive interrogative pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PWAV&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverbial interrogative or relative pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PWS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;substituting interrogative pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TRUNC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;word remnant&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VAFIN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;finite verb, auxiliary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VAIMP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;imperative, auxiliary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VAINF&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;infinitive, auxiliary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VAPP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;perfect participle, auxiliary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VMFIN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;finite verb, modal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VMINF&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;infinitive, modal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VMPP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;perfect participle, modal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VVFIN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;finite verb, full&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VVIMP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;imperative, full&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VVINF&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;infinitive, full&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VVIZU&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lsquo;infinitive with zu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VVPP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;perfect participle, full&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;XY&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;non-word containing non-letter&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;pos-tags-chinese&#34;&gt;POS Tags (Chinese)&lt;/h3&gt;
&lt;p&gt;From OntoNotes / Chinese Penn Treebank,
see &lt;a href=&#34;https://repository.upenn.edu/cgi/viewcontent.cgi?article=1039&amp;amp;context=ircs_reports&#34;&gt;repository.upenn.edu&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;AD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;AS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;aspect marker&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;BA&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;把 in ba-construction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CS&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;subordinating conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DEC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;的 in a relative clause&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DEG&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;associative 的&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DER&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;得 in V-de const. and V-de-R&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DEV&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;地 before VP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ETC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;for words 等, 等等&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;IJ&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;interjection&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;LB&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;被 in long bei-const&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;LC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;localizer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;M&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;measure word&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;MSP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;other particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NR&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;proper noun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;temporal noun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;OD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;ordinal number&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ON&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;onomatopoeia&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;P&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;preposition excluding 把 and 被&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PN&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;pronoun&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PU&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;punctuation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SB&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;被 in short bei-const&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VA&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;predicative adjective&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;是 (copula)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VE&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;有 as the main verb&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VV&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;other verb&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;noun-chunks&#34;&gt;Noun chunks&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun phrase&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;prepositional phrase&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;VP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;verb phrase&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ADVP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverb phrase&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ADJP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjective phrase&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SBAR&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;subordinating conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PRT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PNP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;prepositional noun phrase&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;dependency-labels-english&#34;&gt;Dependency Labels (English)&lt;/h3&gt;
&lt;p&gt;From ClearNLP / Universal Dependencies,
see &lt;a href=&#34;https://github.com/clir/clearnlp-guidelines/blob/master/md/specifications/dependency_labels.md&#34;&gt;github.com/clir/clearnlp-guidelines&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;acl&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;clausal modifier of noun (adjectival clause)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;acomp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjectival complement&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;advcl&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverbial clause modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;advmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverbial modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;agent&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;amod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjectival modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;appos&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;appositional modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;attr&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;attribute&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;aux&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;auxiliary&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;auxpass&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;auxiliary (passive)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;case&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;case marking&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;coordinating conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ccomp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;clausal complement&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;clf&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;classifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;complm&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;complementizer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;compound&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;compound&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;conj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;conjunct&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cop&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;copula&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;csubj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;clausal subject&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;csubjpass&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;clausal subject (passive)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dative&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;dative&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dep&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;unclassified dependent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;det&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;determiner&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;discourse&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;discourse element&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dislocated&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;dislocated elements&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dobj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;direct object&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;expl&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;expletive&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;fixed&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;fixed multiword expression&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;flat&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;flat multiword expression&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;goeswith&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;goes with&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;hmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;modifier in hyphenation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;hyph&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;hyphen&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;infmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;infinitival modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;intj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;interjection&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;iobj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;indirect object&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;list&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;list&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;mark&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;marker&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;meta&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;meta modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;neg&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;negation modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;modifier of nominal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nn&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun compound modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;npadvmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun phrase as adverbial modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nsubj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;nominal subject&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nsubjpass&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;nominal subject (passive)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nounmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;modifier of nominal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;npmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun phrase as adverbial modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;num&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;number modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;number compound modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nummod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;numeric modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;oprd&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;object predicate&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;obj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;object&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;obl&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;oblique nominal&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;orphan&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;orphan&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;parataxis&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;parataxis&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;partmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;participal modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pcomp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;complement of preposition&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pobj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;object of preposition&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;poss&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;possession modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;possessive&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;possessive modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;preconj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;pre-correlative conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;prep&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;prepositional modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;prt&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;punct&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;punctuation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;quantmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;modifier of quantifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;rcmod&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;relative clause modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;relcl&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;relative clause modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;reparandum&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;overridden disfluency&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;root&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;root&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ROOT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;root&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;vocative&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;vocative&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;xcomp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;open clausal complement&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;dependency-labels-german&#34;&gt;Dependency labels (German)&lt;/h3&gt;
&lt;p&gt;From TIGER Treebank,
see &lt;a href=&#34;http://www.ims.uni-stuttgart.de/forschung/ressourcen/korpora/TIGERCorpus/annotation/tiger_introduction.pdf&#34;&gt;ims.uni-stuttgart.de&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;currently missing: &amp;lsquo;cc&amp;rsquo; (comparative complement) because of conflict with English labels&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ac&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adpositional case marker&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;adc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adjective component&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ag&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;genitive attribute&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ams&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;measure argument of adjective&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;app&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;apposition&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;avc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;adverbial phrase component&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cd&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;coordinating conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cj&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;conjunct&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cm&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;comparative conjunction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;complementizer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;cvc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;collocational verb construction&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;da&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;dative&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dh&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;discourse-level head&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dm&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;discourse marker&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ep&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;expletive es&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;hd&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;head&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ju&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;junctor&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;mnr&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;postnominal modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;mo&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;modifier&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ng&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;negation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nk&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;noun kernel element&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;nmc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;numerical component&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;oa&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;accusative object&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;oc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;clausal object&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;og&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;genitive object&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;op&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;prepositional object&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;par&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;parenthetical element&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pd&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;predicate&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pg&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;phrasal genitive&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ph&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;placeholder&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pm&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;morphological particle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;pnc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;proper noun component&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;rc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;relative clause&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;re&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;repeated element&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;rs&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;reported speech&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sb&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;subject&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sbp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;passivized subject (PP)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;subject or predicate&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;svp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;separable verb prefix&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;uc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;unit component&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;vo&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;vocative&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;named-entity-recognition&#34;&gt;Named Entity Recognition&lt;/h3&gt;
&lt;p&gt;From OntoNotes 5,
see &lt;a href=&#34;https://catalog.ldc.upenn.edu/docs/LDC2013T19/OntoNotes-Release-5.0.pdf&#34;&gt;catalog.ldc.upenn.edu&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PERSON&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;People, including fictional&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;NORP&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Nationalities or religious or political groups&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;FACILITY&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Buildings, airports, highways, bridges, etc.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;FAC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Buildings, airports, highways, bridges, etc.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ORG&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Companies, agencies, institutions, etc.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPE&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Countries, cities, states&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;LOC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Non-GPE locations, mountain ranges, bodies of water&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PRODUCT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Objects, vehicles, foods, etc. (not services)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;EVENT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Named hurricanes, battles, wars, sports events, etc.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WORK_OF_ART&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Titles of books, songs, etc.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;LAW&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Named documents made into laws.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;LANGUAGE&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Any named language&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DATE&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Absolute or relative dates or periods&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TIME&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Times smaller than a day&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PERCENT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lsquo;Percentage, including %&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;MONEY&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Monetary values, including unit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;QUANTITY&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Measurements, as of weight or distance&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ORDINAL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&amp;lsquo;first&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CARDINAL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Numerals that do not fall under another type&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;named-entity-recognition-wikipedia&#34;&gt;Named Entity Recognition (Wikipedia)&lt;/h3&gt;
&lt;p&gt;See &lt;a href=&#34;http://www.sciencedirect.com/science/article/pii/S0004370212000276&#34;&gt;Article 1&lt;/a&gt;
and &lt;a href=&#34;https://pdfs.semanticscholar.org/5744/578cc243d92287f47448870bb426c66cc941.pdf&#34;&gt;Article 2&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PER&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Named person or family.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;MISC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Miscellaneous entities, e.g. events, nationalities, products or works of art&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;ner-miscellaneous&#34;&gt;NER Miscellaneous&lt;/h3&gt;
&lt;p&gt;From &lt;a href=&#34;https://github.com/ltgoslo/norne&#34;&gt;github.com/ltgoslo/norne&lt;/a&gt;:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Term&lt;/th&gt;
          &lt;th&gt;Explanation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;EVT&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Festivals, cultural events, sports events, weather phenomena, wars, etc.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PROD&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Product, i.e. artificially produced entities including speeches, radio shows, programming languages, contracts, laws and ideas&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;DRV&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Words (and phrases?) that are dervied from a name, but not a name in themselves, e.g. &amp;lsquo;Oslo-mannen&amp;rsquo; (&amp;rsquo;the man from Oslo&amp;rsquo;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPE_LOC&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Geo-political entity, with a locative sense, e.g. &amp;lsquo;John lives in Spain&amp;rsquo;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPE_ORG&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Geo-political entity, with an organisation sense, e.g. &amp;lsquo;Spain declined to meet with Belgium&amp;rsquo;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
    </item>
    
    <item>
      <title>Launching scripts from GNOME shortcuts</title>
      <link>https://ix5.org/tech/2022/gsd-media-keys-scripts/</link>
      <pubDate>Sat, 24 Sep 2022 11:01:24 +0200</pubDate>
      
      <guid>https://ix5.org/tech/2022/gsd-media-keys-scripts/</guid>
      <description>&lt;p&gt;As of at least 2022-09-24, launching small scripts that spawn a
&lt;a href=&#34;https://github.com/davatorium/rofi&#34;&gt;rofi&lt;/a&gt; interface via the GNOME shell
shortcuts interface would fail for me with the following message:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;app-gnome-\x7e\x2fcontrol.sh-3565.scope: No PIDs left to attach to the scope&amp;#39;s control group, refusing.
app-gnome-\x7e\x2fcontrol.sh-3565.scope: Failed with result &amp;#39;resources&amp;#39;.
Failed to start Application launched by gsd-media-keys.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;My control script would be executable and located at &lt;code&gt;~/control.sh&lt;/code&gt; and launch
something like &lt;code&gt;rofi -dmenu -i &amp;lt;choices&amp;gt;&lt;/code&gt;. I had the association (e.g. for
&lt;code&gt;&amp;lt;Super&amp;gt;-i&lt;/code&gt;) entered through the GNOME settings keyboard shortcuts as command
&lt;code&gt;~/control.sh&lt;/code&gt; and this used to work just fine for years.&lt;/p&gt;
&lt;p&gt;Researching the error message, it now seems you are supposed to set your own
&amp;ldquo;scope&amp;rdquo; (purportedly somehow related to &lt;code&gt;cgroups&lt;/code&gt;) and use &lt;code&gt;systemd-run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The fix was to change the command &lt;code&gt;~/control.sh&lt;/code&gt; to an absolute path, prefixed by
&lt;code&gt;systemd-run&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;systemd-run --scope --user /home/&amp;lt;user&amp;gt;/control.sh
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>Anki Webview Issues</title>
      <link>https://ix5.org/tech/2022/anki-webview-issues/</link>
      <pubDate>Fri, 15 Apr 2022 15:27:10 +0200</pubDate>
      
      <guid>https://ix5.org/tech/2022/anki-webview-issues/</guid>
      <description>&lt;p&gt;As of 2022-04-15, Anki will open on my up-to-date Arch Linux install, but show
a blank page instead of my decks.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ pacman -Q anki qt5-base qt6-base
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;anki-official-binary-bundle 2.1.49-1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;qt5-base 5.15.3+kde+r137-1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;qt6-base 6.3.0-1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I suspected an issue with the webview implementation, since menus, preferences
and the like still work.&lt;/p&gt;
&lt;p&gt;A topic on the [Ankiweb Forums][forums] surfaces the suggestion to disable the
Qt webengine seccomp filter:
&lt;code&gt;QTWEBENGINE_CHROMIUM_FLAGS=&amp;quot;--disable-seccomp-filter-sandbox&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Add the environment variable to your &lt;code&gt;.bashrc&lt;/code&gt; or wherever or just prepend it
to any launches of Anki:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;QTWEBENGINE_CHROMIUM_FLAGS=&amp;quot;--disable-seccomp-filter-sandbox&amp;quot; anki&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Now simply using &lt;code&gt;anki-bin&lt;/code&gt; AUR package instead of
&lt;code&gt;anki-official-binary-bundle&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;[forums]: &lt;a href=&#34;https://forums.ankiweb.net/t/webviews-blank-on-linux/1433/6&#34;&gt;https://forums.ankiweb.net/t/webviews-blank-on-linux/1433/6&lt;/a&gt;)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Netgear R6120 OpenWRT</title>
      <link>https://ix5.org/tech/2021/netgear-r6120-openwrt/</link>
      <pubDate>Tue, 16 Feb 2021 12:29:02 +0100</pubDate>
      
      <guid>https://ix5.org/tech/2021/netgear-r6120-openwrt/</guid>
      <description>&lt;h2 id=&#34;links&#34;&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://openwrt.org/toh/netgear/netgear_r6120&#34;&gt;Netgear R6120 OpenWRT page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://downloads.openwrt.org/snapshots/targets/ramips/mt76x8/&#34;&gt;Firmware download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/jclehner/nmrpflash&#34;&gt;nmrpflash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;get-nmrpflash&#34;&gt;Get nmrpflash&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ git clone https://github.com/jclehner/nmrpflash.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd nmrpflash/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;check-interfaces&#34;&gt;Check interfaces&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./nmrpflash -L
enp0s31f6        192.168.1.8      8c:16:45:22:f5:71
wlp2s0           192.168.1.6      74:e5:f9:e7:79:26
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For me, &lt;code&gt;enp0s31f6&lt;/code&gt; showed 0.0.0.0 as IP:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;enp0s31f6        0.0.0.0.0        8c:16:45:22:f5:71
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;flash&#34;&gt;Flash&lt;/h2&gt;
&lt;p&gt;Plug LAN cable from computer into LAN port 1 of the router.
&lt;strong&gt;NOT&lt;/strong&gt; into the WAN port.&lt;/p&gt;
&lt;p&gt;Turn off router.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo ./nmrpflash -i enp0s31f6 -f ~/downloads/netgear-openwrt/factory/openwrt-ramips-mt76x8-netgear_r6120-squashfs-factory.img
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Waiting &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; physical connection.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Turn on router&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Advertising NMRP server on enp0s31f6 ...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wait for flash to finish, restart router, you should be able to ssh into it like
the guide says.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;caveats-and-bugs&#34;&gt;Caveats and bugs&lt;/h2&gt;
&lt;p&gt;There are some things that &lt;em&gt;somehow&lt;/em&gt; fail for me from time to time.&lt;/p&gt;
&lt;p&gt;It seems that updating to a newer OpenWRT version by flashing a new sysupgrade
file completely breaks any access, both via web and via ssh.&lt;/p&gt;
&lt;p&gt;While using &lt;code&gt;nmrpflash&lt;/code&gt;, this might happen:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Advertising NMRP server on enp0s31f6 ...
Received configuration request from 00:00:00:00:00:00.
Sending configuration: 10.164.183.252/24.
Received upload request without filename.
Uploading openwrt-ramips-mt76x8-netgear_r6120-squashfs-factory.img ... errno=99
bind: Cannot assign requested address
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Also, make sure to really plug into LAN port 1, not any other!&lt;/p&gt;
&lt;p&gt;N.b.: The following is wrong imo, better to let the tool use automatic IP:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo ./nmrpflash -i enp0s31f6 -f ~/downloads/netgear-openwrt/factory/openwrt-ramips-mt76x8-netgear_r6120-squashfs-factory.img -a 192.168.1.200
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Languages</title>
      <link>https://ix5.org/tech/2021/languages/</link>
      <pubDate>Sun, 07 Feb 2021 20:57:42 +0100</pubDate>
      
      <guid>https://ix5.org/tech/2021/languages/</guid>
      <description>&lt;p&gt;For reasons that (I swear!) have nothing to do with my nationality, I have
always avoided acquiring any modicum of French language skills. I took Latin in
high school and while at university, Spanish sounded like the clearly superior
investment, especially for my social life. Hearing people speak French, I was
having trouble holding it together, because, &lt;em&gt;obviously&lt;/em&gt; this was a fake
language designed to make you emit as many silly noncoherent noises as possible.&lt;/p&gt;
&lt;p&gt;Similarly, I had put off learning Javascript until very recently. The language
of &amp;ldquo;sprinkle some ads on it&amp;rdquo;, the language of ADHD-riddled kids who import a
package to left-align a number, the language that makes the web an increasingly
unpleasant experience. Javascript did not appeal to me.&lt;/p&gt;
&lt;!--
As mentioned in the proof-read yesterday, don&#39;t forget to add a snippet from and link to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#return_value
Because the block returns nothing, .then yiels a fulfilled promise with undefined result value
The return that&#39;s being added here does not &#34;just&#34; give back the return value
The crux is that ensureDir also returns a promise
That is then reused to resolve the rest of the chain, so that checkFile only runs when the recursive chain instantiated by ensureDir -&gt; copyFile finishes
--&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;l&amp;rsquo;ordinateur&lt;/em&gt; - the computer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;$ &#39;wtf&#39; instanceof String&lt;/code&gt;&lt;br&gt;
&lt;code&gt;&amp;gt; false&lt;/code&gt;&lt;br&gt;
&lt;code&gt;$ typeof &#39;wtf&#39;&lt;/code&gt;&lt;br&gt;
&lt;code&gt;&amp;gt; &#39;string&#39;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;As happens from time to time, it is not by choice but rather by necessity that
you have to pick up a skill. So while I am now forced to learn French for future
foreign assignments, I also had to delve into the murky waters that are the
Javascript &amp;ldquo;ecosystem&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;ubuntu-touch--just-a-small-bug&#34;&gt;Ubuntu Touch &amp;amp; just a small bug&lt;/h3&gt;
&lt;p&gt;Flashing custom firmware on mobile phones has historically been a manual and
painful process. All the more was I happy to hear that my buddy &lt;a href=&#34;https://github.com/konradybcio&#34;&gt;Konrad&lt;/a&gt; had
worked hard to submit my favourite device, the Sony &lt;a href=&#34;https://en.wikipedia.org/wiki/Sony_Xperia_XZ&#34;&gt;Xperia XZ&lt;/a&gt;, for
inclusion in &lt;a href=&#34;https://ubuntu-touch.io/&#34;&gt;Ubuntu Touch&lt;/a&gt;&amp;rsquo;s fabulous &lt;a href=&#34;https://ubuntu-touch.io/get-ubuntu-touch&#34;&gt;interactive GUI installer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There was just a &lt;a href=&#34;https://github.com/ubports/ubports-installer/issues/1754&#34;&gt;small issue&lt;/a&gt; with the (Electron/Javascript-based)
installer failing to verify a specific file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;error: Error: core:manual_download: Error: checksum mismatch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I know about Android, Linux administration and hardware debugging. I know where
to look and I can solve issues rather quickly. From investing quite a bit of
time, I&amp;rsquo;ve seen a lot of errors and know how to look for the part in the whole
source tree that might be responsible.&lt;/p&gt;
&lt;p&gt;With Javascript however - or any new and unfamiliar environment - hunting down
bugs takes me ages. It&amp;rsquo;s incredibly frustrating, like you&amp;rsquo;re a preschooler being
made to navigate complex algebra.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;le magazine&lt;/em&gt; - the magazine; &lt;em&gt;le magasin&lt;/em&gt; - the store&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;There are so many convenitions, syntax oddities and build/ecosystem tooling to
learn, none of which I could give a rat&amp;rsquo;s ass about. I am not interested in any
of the individual tools involved, I just want to solve a problem that has been
caused by them.&lt;/p&gt;
&lt;p&gt;Not to be deterred though, &lt;em&gt;I dug in.&lt;/em&gt; This, treasured reader, is the story of
that problem.&lt;/p&gt;
&lt;h3 id=&#34;promises-and-lies&#34;&gt;Promises and Lies&lt;/h3&gt;
&lt;p&gt;The code I am about to reference makes heavy use of
asynchronous &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise&#34;&gt;&lt;code&gt;Promise&lt;/code&gt;&lt;/a&gt; functionality.&lt;/p&gt;
&lt;p&gt;A basic usage pattern would look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;prom&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Promise( (&lt;span style=&#34;color:#a6e22e&#34;&gt;resolutionFunc&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;rejectionFunc&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Look, ma!&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this block, a new &lt;code&gt;Promise&lt;/code&gt; object would be created (and immediately
executed). It executes the log statement and calls back to one of the two
callback functions, one for success &lt;em&gt;(fulfilled)&lt;/em&gt; and one for failure
&lt;em&gt;(rejected).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;More commonly, developers use &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then&#34;&gt;&lt;code&gt;.then&lt;/code&gt;&lt;/a&gt; to handle promise resolution:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;myPromise&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Promise(&lt;span style=&#34;color:#a6e22e&#34;&gt;resolutionFunc&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(() =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// handle first fulfilled, return second fulfilled
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;dostuff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(() =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// handle second fulfilled, return something
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;domorestuff&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;resolved&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// handle domorestuff success
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  }, &lt;span style=&#34;color:#a6e22e&#34;&gt;rejected&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// handle domorestuff failure
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is called a &amp;ldquo;chained promise&amp;rdquo; and is basically a &lt;code&gt;try/catch&lt;/code&gt;, but for
Javascript and &lt;em&gt;asynchrooonouuuuus.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;in, an, en, eau, eux&lt;/em&gt; - all pronounced pretty much the same&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Having learned the semantics of promises, this block of code looked perfectly
innocent to me:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Promise(&lt;span style=&#34;color:#a6e22e&#34;&gt;resolve&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// get user input for path - simplified here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/user/path/file.zip&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;downloadedFilePath&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ensureDir&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;join&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cachePath&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;props&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;codename&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;group&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(() =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;copyFile&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;downloadedFilePath&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;join&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cachePath&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;props&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;codename&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;group&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(() =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;checkFile&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;checksum&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;checksum&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;path&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;join&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;cachePath&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;props&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;config&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;codename&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;group&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Error(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;checksum mismatch&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simple, right? The first promise passes the &lt;code&gt;downloadedFilePath&lt;/code&gt; to the
&lt;code&gt;ensureDir&lt;/code&gt; func, which then triggers &lt;code&gt;copyFile&lt;/code&gt;. Once the block is resolved,
&lt;code&gt;checkFile&lt;/code&gt; is run on the copied file. All functions politely wait for the
previous func to resolve via the &lt;code&gt;.then()&lt;/code&gt; statement.&lt;/p&gt;
&lt;p&gt;Or do they? Has this all been a lie?&lt;/p&gt;
&lt;h3 id=&#34;les-nombres&#34;&gt;Les Nombres&lt;/h3&gt;
&lt;p&gt;Similarly, lulled into a false sense of security, I thought I might approach
learning French numbers above the single-digit range. &lt;em&gt;Une, deux, trois&amp;hellip;&lt;/em&gt;
that&amp;rsquo;s practically Spanish, right? So how hard can those until 100 be?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;4, 5, 6, 7, 8, 9, 10 - &lt;em&gt;quatre, cinq, six, sept, huit, neuf, dix&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So far, so good.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;11, 12, 13, 14, 15, 16 - &lt;em&gt;onze, douze, treize, quatorze, quinze, seize&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Great!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;17, 18, 19, 20, 21 - &lt;em&gt;dix-sept, dix-huit, dix-neuf, vingt, vingt-et-un&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Okay, small inconsistency, but I can get used to that&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;30, 40, 50 - &lt;em&gt;trente, quarante, cinquante&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So from 20 onwards, there&amp;rsquo;s a nice pattern again. Sweet.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Continuing on with Javascript.&lt;/p&gt;
&lt;p&gt;The intended flow of the specific part of the program I was looking at was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If file already present, checksum and compare with predefined checksum, on success
skip all the next steps&lt;/li&gt;
&lt;li&gt;If checksum mismatch or file not present:&lt;/li&gt;
&lt;li&gt;Let user pick file with system file picker&lt;/li&gt;
&lt;li&gt;Return path of picked file as promise&lt;/li&gt;
&lt;li&gt;Ensure target dir inside cache is present&lt;/li&gt;
&lt;li&gt;Copy user-picked file to cache location (&lt;code&gt;~/.cache/ubports/&amp;lt;device&amp;gt;/firmware/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Checksum newly copied file&lt;/li&gt;
&lt;li&gt;Unpack newly copied file (extract &lt;code&gt;.img&lt;/code&gt; from zip file)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To reiterate, the bug which I was encountering looked like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;error: Error: core:manual_download: Error: checksum mismatch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I quickly narrowed down the issue to a call of &lt;code&gt;checkFile()&lt;/code&gt; in
&lt;a href=&#34;https://github.com/ubports/ubports-installer/blob/95745e519351adc3189e7e285a553bc6c1e5100a/src/core/plugins/core/plugin.js#L221&#34;&gt;src/core/plugins/core/plugin.js&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At first, I thought maybe the crypto library was failing to call the right hash
functions, but when a file was already in the right place, the hashes were
verified as correct.&lt;/p&gt;
&lt;p&gt;I then quickly disabled the checksum verification &lt;em&gt;after&lt;/em&gt; the file had been
copied and was met with a failure of the &lt;code&gt;unpack&lt;/code&gt; step, which complained about a
missing input file. The file was being copied alright, but it seems the checksum
and unpack steps were winning a race against the &lt;code&gt;copyFile()&lt;/code&gt; operation even
though I thought they were running in sequence.&lt;/p&gt;
&lt;p&gt;After some further digging, maybe what I needed was the synchronous variant of
&lt;code&gt;copyFile&lt;/code&gt;? Swapped it for &lt;code&gt;copyFileSync&lt;/code&gt;, but no change in results.&lt;/p&gt;
&lt;p&gt;I added an artificial delay of 100ms &lt;em&gt;after&lt;/em&gt; the whole ensuredir/copy block and
&lt;em&gt;before&lt;/em&gt; the checksum, and everything went smoothly. So, why was the copy
operation not being finished in time?&lt;/p&gt;
&lt;p&gt;Having spent way too much time on this issue already, there must&amp;rsquo;ve been
something wrong with all this asynchronous promising going on&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;shadows-looming&#34;&gt;Shadows looming&lt;/h3&gt;
&lt;p&gt;Helpfully, Mozilla&amp;rsquo;s excellent MDN includes an &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise&#34;&gt;admonition&lt;/a&gt; about
the subtle ways you can shoot yourself in the foot:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An action can be assigned to an already &amp;ldquo;settled&amp;rdquo; promise. In that case, the
action (if appropriate) will be performed at the first asynchronous
opportunity. Note that promises are guaranteed to be asynchronous. Therefore,
an action for an already &amp;ldquo;settled&amp;rdquo; promise will occur only after the stack has
cleared and a clock-tick has passed. The effect is much like that of
&lt;code&gt;setTimeout(action,10)&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and this little snippet:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;promiseA&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Promise( (&lt;span style=&#34;color:#a6e22e&#34;&gt;resolutionFunc&lt;/span&gt;,&lt;span style=&#34;color:#a6e22e&#34;&gt;rejectionFunc&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;resolutionFunc&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;777&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// At this point, &amp;#34;promiseA&amp;#34; is already settled.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;promiseA&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;( (&lt;span style=&#34;color:#a6e22e&#34;&gt;val&lt;/span&gt;) =&amp;gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;asynchronous logging has val:&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a6e22e&#34;&gt;val&lt;/span&gt;) );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;console&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;log&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;immediate logging&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// produces output in this order:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// immediate logging
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// asynchronous logging has val: 777
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not quite the problem I was facing, but a harbinger of things to come.&lt;/p&gt;
&lt;p&gt;Now for the final nail in the coffin: Implied return statements.&lt;/p&gt;
&lt;p&gt;This:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;() =&amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;// returns 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;is the same as this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;() =&amp;gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; } &lt;span style=&#34;color:#75715e&#34;&gt;// returns 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;but not the same as this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;() =&amp;gt; { &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;; } &lt;span style=&#34;color:#75715e&#34;&gt;// returns nothing
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With all the pieces of the puzzle collected, we are ready to solve this riddle.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;But not before going back again to the French numbers. We left off at 50 and I&amp;rsquo;m
excited for what lies ahead:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;60&lt;/strong&gt; - soixante&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Excellent. This is beginning to make a lot of sense to me.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;70&lt;/strong&gt; - &lt;em&gt;soixante-dix&lt;/em&gt; (60 + 10)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What. The. Fuck.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;71&lt;/strong&gt; - &lt;em&gt;soixante et onze&lt;/em&gt; (60 + 11)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So from 70 on, they just use 60 as a base? Alright, &lt;em&gt;very&lt;/em&gt; confusing,
but I&amp;rsquo;m in it for the long haul, I can deal with that. How do the numbers
continue after 70?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;80&lt;/strong&gt; - &lt;em&gt;quatre-vingts&lt;/em&gt; (4 x 20)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At this point I&amp;rsquo;m scrambling to cross-reference, because clear as day my study
material has been written by a prankster. That can&amp;rsquo;t possibly be right, no?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;90&lt;/strong&gt; - &lt;em&gt;quatre-vingt-dix&lt;/em&gt; ((4 x 20) + 10)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By now I have consulted several sources and confirmed this is indeed how the
French count. We might have been premature in mocking the Anglos for their
imperial units. This is worse.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;ll leave &lt;em&gt;les nombres&lt;/em&gt; be for now.&lt;/p&gt;
&lt;h3 id=&#34;deadly-void&#34;&gt;Deadly void&lt;/h3&gt;
&lt;p&gt;Aaaand back into the joyous world of machines!
Let&amp;rsquo;s look at the mutinous code block again.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Promise(&lt;span style=&#34;color:#a6e22e&#34;&gt;resolve&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// Return downloadedFilePath
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/user/path/file.zip&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// block start
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;downloadedFilePath&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ensureDir&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/user/path&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(() =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;copyFile&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;downloadedFilePath&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/user/.cache/path/file.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}) &lt;span style=&#34;color:#75715e&#34;&gt;// block end
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(() =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;checkFile&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;ok&lt;/span&gt;) { &lt;span style=&#34;color:#75715e&#34;&gt;// handle stuff
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve simplified it for better readibility. Astute readers will have spotted the
error by now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The whole &amp;ldquo;block&amp;rdquo; was never going to resolve its promise with an actual return
value (inside curly braces but no &lt;code&gt;return&lt;/code&gt; statement)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;checkFile()&lt;/code&gt; was being called before any of the promise functions inside the
previous block had the chance to resolve&lt;/li&gt;
&lt;li&gt;The copied file was not yet available&lt;/li&gt;
&lt;li&gt;&lt;code&gt;checkFile&lt;/code&gt; tried to verify a non-existent path&lt;/li&gt;
&lt;li&gt;Checksum mismatch error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the sort of bug that makes you want to strangle a kitten. To shout
obscenities à la Captain Haddock. To permanently disable the power grid and
return to farming sheep.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;parle, parles, parle&lt;/em&gt; - I speak, you speak, he speaks -  all pronounced the same&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;solution--reflections&#34;&gt;Solution &amp;amp; Reflections&lt;/h3&gt;
&lt;p&gt;The first solution I landed on was to make the whole block explicitly return
something, in this case the value of the last chained promise:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;downloadedFilePath&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// Added return statement below
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ensureDir&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/user/path&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(() =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;copyFile&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;downloadedFilePath&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/user/.cache/path/file.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I finally settled (after consultation with &lt;a href=&#34;https://github.com/MarijnS95&#34;&gt;Marijn&lt;/a&gt;) on removing the
curly braces to convert the block into an implied return, as that would fit
better with the syntax of the surrounding code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// Removed curly braces:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;downloadedFilePath&lt;/span&gt; =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ensureDir&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/user/path&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .&lt;span style=&#34;color:#a6e22e&#34;&gt;then&lt;/span&gt;(() =&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;fs&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;copyFile&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;downloadedFilePath&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home/user/.cache/path/file.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I &lt;a href=&#34;https://github.com/ubports/ubports-installer/pull/1786&#34;&gt;submitted a Pull Request&lt;/a&gt;, as you do nowadays, and waited for the fix to
propagate to the users.&lt;/p&gt;
&lt;p&gt;The saddest part about all this is that none of these functions &lt;em&gt;need&lt;/em&gt; to be
asynchronous. They are executed in sequence and the UI blocks until they return
anyway.&lt;/p&gt;
&lt;p&gt;The developer who wrote all this, &lt;a href=&#34;https://github.com/NeoTheThird/&#34;&gt;Jan Sprinz&lt;/a&gt;, is a perfectly nice
guy, and if it wasn&amp;rsquo;t for him, people would probably still have to fumble around
with arcane command line tools to install Ubuntu Touch. I can&amp;rsquo;t fault him for
seeing common patterns in Javascript development and, thinking they&amp;rsquo;re good
practices, writing the whole function using promises.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In conclusion, programming is terrible, hug your loved ones, go outside and
enjoy the sun.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;ps&#34;&gt;P.S.&lt;/h2&gt;
&lt;p&gt;Huge thanks to my buddy &lt;a href=&#34;https://github.com/MarijnS95&#34;&gt;Marijn&lt;/a&gt; for proofreading and giving
corrections!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Customizing Isso for my needs</title>
      <link>https://ix5.org/tech/2021/isso-customization/</link>
      <pubDate>Tue, 19 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2021/isso-customization/</guid>
      <description>&lt;p&gt;Some functionality that is not (yet) available with upstream &lt;a href=&#34;https://posativ.com/isso/&#34;&gt;Isso&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All features mentioned in this post are available on
&lt;a href=&#34;https://git.ix5.org/felix/isso/commits/branch/FREEZE-blogpost-2021-01-20&#34;&gt;this frozen branch&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I run a local development server using the following command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ISSO_SETTINGS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;share/isso-dev.conf &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    venv-isso/bin/gunicorn &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    -b 0.0.0.0:8080 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    -w &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --preload isso.run &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --worker-tmp-dir /dev/shm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/0f59b1b48533805faa94518e0a4bfba87e811e89&#34;&gt;Thanks button&lt;/a&gt;&lt;/strong&gt; - A small button with a counter to simply say &amp;ldquo;Thanks&amp;rdquo;
instead of posting a comment. Has been &lt;a href=&#34;https://github.com/posativ/isso/issues/286#issuecomment-763507943&#34;&gt;suggested upstream&lt;/a&gt; but so far no
one attempted the work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/940df38858df492fee7764c8edcdf77dd899ec8b&#34;&gt;Telegram integration&lt;/a&gt;&lt;/strong&gt; - Notify me via Telegram when a new comment is
posted. Gotta find a way to lose the &lt;code&gt;requests&lt;/code&gt; dependency and &lt;code&gt;POST&lt;/code&gt; directly.
Also integrated with the custom Thanks button functionality via
&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/8edf5f1b788499e12eb0d009f8c910b08ba2c548&#34;&gt;signals&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use with these settings in your &lt;code&gt;isso.cfg&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cfg&#34; data-lang=&#34;cfg&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[telegram]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;token&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;your-token&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;chat_id&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;chat-id&amp;gt; # Can be obtained from @getidsbot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/3e89147ffa06af3eeaed30756a706019a43c7dd5&#34;&gt;Absolute URIs for threads&lt;/a&gt;&lt;/strong&gt; helps with hosting multiple sites
on the same commenting instance.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/86e0cb02b31273699bfe246d02d9d53bf78454ff&#34;&gt;&lt;strong&gt;Use pre for comments in admin area&lt;/strong&gt;&lt;/a&gt;
&lt;em&gt;(&lt;a href=&#34;https://github.com/posativ/isso/pull/604&#34;&gt;PR opened&lt;/a&gt;)&lt;/em&gt;
means that comments will be rendered as source in admin and be properly
&lt;code&gt;contenteditable&lt;/code&gt;. Used with &lt;a href=&#34;https://git.ix5.org/felix/isso/commit/2c16304c26a14046e9e0a0a5c044099b6728c301&#34;&gt;this fix&lt;/a&gt; for &lt;a href=&#34;https://github.com/posativ/isso/pull/470&#34;&gt;PR #470&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/50c59b63482e8bdcc571f8abb8dbbb733cd5793c&#34;&gt;Restore comment after cancelling edit&lt;/a&gt;&lt;/strong&gt; in admin, from
&lt;a href=&#34;https://github.com/posativ/isso/pull/470&#34;&gt;PR #470&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/e0c3c95b02a38ac54c174acf26179d86c0ab4e77&#34;&gt;js: Remove unused languages&lt;/a&gt;&lt;/strong&gt; results in a reduction of &lt;code&gt;embed.min.js&lt;/code&gt;
from ~65kB to ~43kB.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/0caff99fb8ad196fafc3b0ccc9b00d92c9bfb8b0&#34;&gt;Improve cookie SameSite/Secure handling&lt;/a&gt;&lt;/strong&gt; means no more warnings in
Firefox&amp;rsquo; console and future-proofing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/ab18a974d97e16bd4631ff672eeb5d649ae03de2&#34;&gt;Tooltip saying email will not be public&lt;/a&gt;&lt;/strong&gt; - small tooltip in
frontend, makes users less squeamish about entering E-mail&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/e1a708d075aff437138a5d2ef0af66fbb290bd6b&#34;&gt;Require an edit cookie to be able to view a comment before editing&lt;/a&gt;&lt;/strong&gt; -
not really necessary since I do not have private posts, but nice to have
nonetheless, helps a bit against db scraping directly. From &lt;a href=&#34;https://github.com/posativ/isso/pull/683&#34;&gt;this PR&lt;/a&gt;,
with &lt;a href=&#34;https://github.com/posativ/isso/issues/679&#34;&gt;more background here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/70066cfb3fe1f0bbd35d1731a02753d321da78d6&#34;&gt;Larger type on mobile, &amp;ldquo;Markdown supported&amp;rdquo;&lt;/a&gt;&lt;/strong&gt; -
Just a small adjustment to the comment area&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://git.ix5.org/felix/isso/commit/2ec137fded50e6d147a8ea4eb511e5ca455dea8a&#34;&gt;Makefile: Use sassc&lt;/a&gt;&lt;/strong&gt; - Does what it says. &lt;code&gt;nodejs&lt;/code&gt; is a madhouse, no
need to pull in all those dependencies when &lt;code&gt;sassc&lt;/code&gt; can do the job just as well.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Skype for Linux - Disable autostart</title>
      <link>https://ix5.org/tech/2021/skype-linux-autostart/</link>
      <pubDate>Fri, 08 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2021/skype-linux-autostart/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Insert &lt;code&gt;&amp;quot;app.autoStartEnabled&amp;quot;:false&lt;/code&gt; into
&lt;code&gt;~/.config/skypeforlinux/settings.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;See also &lt;a href=&#34;https://askubuntu.com/a/1306156/&#34;&gt;my answer at askubuntu.com&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;intro&#34;&gt;Intro&lt;/h3&gt;
&lt;p&gt;The native Skype app for Linux - I guess I should be thankful there even is
one - auto-starts itself on boot&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, and there is no way to turn off that
behaviour as a guest because the Settings pane can only be accessed by logged-in
users.&lt;/p&gt;
&lt;p&gt;Auto-start works on Linux desktops works by inserting a &lt;code&gt;.desktop&lt;/code&gt; file in a
config folder, so Skype’s is at &lt;code&gt;~/.config/autostart/skypeforlinux.desktop&lt;/code&gt;.
Even if you delete the file, Skype just re-creates it every time it launches.
You could just empty and then &lt;code&gt;chmod a-w&lt;/code&gt; the desktop file, but that&amp;rsquo;s lame and
Skype might change their auto-start behaviour in the future using systemd units
or some other shenanigans; it&amp;rsquo;s always whack-a-mole since Skype&amp;rsquo;s business
interest lies in having its app always present to create &amp;ldquo;engagement&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;We have to find a way to access the auto-start setting from outside of the UI
then.&lt;/p&gt;
&lt;h3 id=&#34;digging-into-the-source&#34;&gt;Digging into the source&lt;/h3&gt;
&lt;p&gt;Since every &amp;ldquo;app&amp;rdquo; nowadays is just webshit upon turtles-all-the-way-down fragile
tech stacks, the whole &lt;a href=&#34;https://aur.archlinux.org/packages/skypeforlinux-preview-bin/&#34;&gt;skypeforlinux&lt;/a&gt; app is just a giant pile of
minified javascript running on Electron, whose source code you can thankfully
inspect.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/usr/share/skypeforlinux/resources/app.asar&lt;/code&gt;, is an
&lt;a href=&#34;https://github.com/electron/asar&#34;&gt;asar archive&lt;/a&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;
that you can extract using &lt;code&gt;asar extract app.asar app-extracted&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Packages for e.g. &lt;a href=&#34;https://snapcraft.io/install/asar/ubuntu&#34;&gt;Ubuntu&lt;/a&gt; or
&lt;a href=&#34;https://archlinux.org/packages/community/any/asar/&#34;&gt;Arch Linux&lt;/a&gt;
are available.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll find a file named &lt;code&gt;main.js&lt;/code&gt; which contains the settings handling and
autostart creation code.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I&amp;rsquo;ve pretty-printed relevant parts using
&lt;a href=&#34;https://github.com/beautify-web/js-beautify&#34;&gt;js-beautify&lt;/a&gt;, which is available
via &lt;code&gt;pip install jsbeautifier&lt;/code&gt; or as an
&lt;a href=&#34;https://archlinux.org/packages/community/python-jsbeautifier&#34;&gt;Arch Linux package&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;t.AutoStartLinux&lt;/code&gt; object contains the main creation logic:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;u&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;a&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;AutoStartBase&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;_enable&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_createFile&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_removeFile&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;_createFile&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ensureDir&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_dir&lt;/span&gt;), &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;writeFileSync&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_file&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_content&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;l&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getInstance&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;info&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[AutoStartLinux] Created file &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_file&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;l&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getInstance&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[AutoStartLinux] Unable to create file &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_file&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;_removeFile&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;unlinkSync&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_file&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;l&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getInstance&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;error&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[AutoStartLinux] Unable to remove file &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_file&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_dir&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;join&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;r&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;homedir&lt;/span&gt;(), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.config&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;autostart&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_file&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;o&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;join&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_dir&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;skypeforlinux.desktop&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_content&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[Desktop Entry]&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Name=Skype for Linux&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Comment=Skype Internet Telephony&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Exec=/usr/bin/skypeforlinux&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Icon=skypeforlinux&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Terminal=false&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Type=Application&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;StartupNotify=false&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X-GNOME-Autostart-enabled=true&amp;#34;&lt;/span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;join&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;t&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;AutoStartLinux&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;u&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;AutoStartBase&lt;/code&gt; class, which the &lt;code&gt;AutoStartLinux&lt;/code&gt; subclass inherits, reads a
setting called &lt;code&gt;autoStartEnabled&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;t&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;AutoStartBase&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;constructor&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_appSettings&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getInstance&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;sync&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_appSettings&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;init&lt;/span&gt;(), &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_appSettings&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;i&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;getInstance&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!!&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_appSettings&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;autoStartEnabled&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_isEnabled&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_isEnabled&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;===&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_enable&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;), &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;_isEnabled&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;e&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This setting is translated into a key read from the &lt;code&gt;json&lt;/code&gt; file by
&lt;code&gt;SettingsKeys&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;t&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;SettingsKeys&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;AutoStartEnabled&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;app.autoStartEnabled&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;OnCloseKeepRunning&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;app.onCloseKeepRunning&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Crashed&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;didCrashInLastSession&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;RegisterProtocols&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;app.registerProtocols&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;LaunchMinimized&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;app.launchMinimized&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;CheckNonAdminUser&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;app.checkNonAdmin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;LoggingLevel&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;logging.level&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;LoggingEnabled&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;logging.enabled&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;LoggingConsole&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;logging.console&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;UpgradedFromDelphi&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;app.upgradedFromDelphi&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;UpgradedFromDelphiDate&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;app.upgradedFromDelphiDate&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;MainWindowPosition&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main-window.position&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;WindowMaximized&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main-window.isMaximised&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;ZoomLevel&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;main-window.zoom-level&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gotcha!&lt;/p&gt;
&lt;h3 id=&#34;background&#34;&gt;Background&lt;/h3&gt;
&lt;p&gt;The whole working-from-home fad has reached me as well. Every person in a
position of authority insists on choosing &lt;em&gt;their&lt;/em&gt; own videoconferencing
solution, which wouldn&amp;rsquo;t be as bad if those products were at least all
web-based.&lt;/p&gt;
&lt;p&gt;But, because we live in the shittiest of all possible universes, every large
company scrambled to push their brittle technology out the door as fast as
possible, of course with maximum lock-in and native &amp;ldquo;apps&amp;rdquo; to increase user
retention, and hopefully sell some of that sweet data.&lt;/p&gt;
&lt;p&gt;Color me surprised then to find out Microsoft-owned Skype’s &amp;ldquo;Skype for Web&amp;rdquo; does
not work at all in both Firefox or Chromium but wants you to install Microsoft
Edge (a 1-to-1 clone of Chrome with different lipstick on top). Synergy!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;On every session login, not on every Skype login.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Yes, of course the javascript people had to &amp;ldquo;invent&amp;rdquo; their own archive format.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>flask-admin: Access row object in LinkRowAction</title>
      <link>https://ix5.org/tech/2021/flask-admin-linkrowaction/</link>
      <pubDate>Mon, 04 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2021/flask-admin-linkrowaction/</guid>
      <description>&lt;p&gt;I have an admin interface with tags that can be associated with any number of
entries. As a demonstration, &lt;a href=&#34;https://github.com/ix5/flaskadmintagdemo&#34;&gt;flaskadmintagdemo&lt;/a&gt; should give you an idea
of what my side looks like.&lt;/p&gt;
&lt;p&gt;I wanted to have a link next to each tag pointing to a filtered list of all
entries tagged with that specific tag.&lt;/p&gt;
&lt;p&gt;The logic for that is in &lt;a href=&#34;https://github.com/flask-admin/flask-admin/blob/43acc41ff8b392ad59907acdb7e1fa81dfd5ba6c/flask_admin/model/template.py#L34-L42&#34;&gt;flask-admin &amp;gt; model &amp;gt; template.py&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LinkRowAction&lt;/span&gt;(BaseListRowAction):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;render&lt;/span&gt;(self, context, row_id, row):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        m &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_resolve_symbol(context, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;row_actions.link&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# string_types = (str, unicode)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; isinstance(self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;url, string_types):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;url&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;format(row_id&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;row_id)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;url(self, row_id, row)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; m(self, url)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, we need to amend the &lt;code&gt;column_extra_row_actions&lt;/code&gt; to add a &lt;code&gt;LinkRowAction&lt;/code&gt;
that points to the filtered listing of entries:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TagView&lt;/span&gt;(ModelView):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PostURLObj&lt;/span&gt;(str):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        Fake str object that fails isinstance(str, unicode) so that we can
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        access the row object
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; __new__(self, cls, row_id, row):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            _url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/admin/?flt0_9=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; row&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; str&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;__new__(self, _url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    column_extra_row_actions &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# Cannot use EndpointLinkRowAction since we need access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# to the row object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        LinkRowAction(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;glyphicon glyphicon-eye-open fa fa-eye&amp;#34;&lt;/span&gt;, PostURLObj
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Instanciating a new &lt;code&gt;str&lt;/code&gt; subclassed object - in this case &lt;code&gt;PostURLObj&lt;/code&gt; - will
call &lt;code&gt;&amp;lt;cls&amp;gt;.__new__(args)&lt;/code&gt;, not &lt;code&gt;__init__()&lt;/code&gt;. Took me a while to figure that
out&amp;hellip;&lt;/p&gt;
&lt;p&gt;But, instead of fixating on working around &lt;code&gt;LinkRowAction&lt;/code&gt;, why not just
implement a more suitable action by subclassing &lt;code&gt;BaseListRowAction&lt;/code&gt;?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PostRowAction&lt;/span&gt;(BaseListRowAction):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; __init__(self, icon_class):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        super(PostRowAction, self)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;__init__()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;icon_class &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; icon_class
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;render&lt;/span&gt;(self, context, row_id, row):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        m &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_resolve_symbol(context, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;row_actions.link&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        url &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/admin/?flt0_9=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%s&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; row&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; m(self, url)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;TagView&lt;/span&gt;(ModelView):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    column_extra_row_actions &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        PostRowAction(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;glyphicon glyphicon-eye-open fa fa-eye&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Much easier.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Adding DuckDuckGo properly to Firefox</title>
      <link>https://ix5.org/tech/2021/duckduckgo-firefox/</link>
      <pubDate>Sun, 03 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2021/duckduckgo-firefox/</guid>
      <description>&lt;p&gt;Needed to re-add DuckDuckGo search to Firefox manually.&lt;/p&gt;
&lt;h3 id=&#34;install-add-on&#34;&gt;Install Add-on&lt;/h3&gt;
&lt;p&gt;Install &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/add-custom-search-engine/&#34;&gt;Add custom search engine&lt;/a&gt; addon from addons.mozilla.org.&lt;/p&gt;
&lt;h3 id=&#34;get-search-parameters&#34;&gt;Get search parameters&lt;/h3&gt;
&lt;p&gt;Navigate to &lt;a href=&#34;https://duckduckgo.com&#34;&gt;DuckDuckGo.com&lt;/a&gt;, enter the Settings page, click
&amp;ldquo;Show Bookmarklet and Settings Data&amp;rdquo;, copy the &amp;ldquo;Bookmarklet URL&amp;rdquo;.
For me, it looks like:
&lt;a href=&#34;https://duckduckgo.com/?kah=de-de&amp;amp;kl=de-de&amp;amp;k5=2&amp;amp;k1=-1&amp;amp;kk=-1&amp;amp;kaj=m&amp;amp;kay=b&amp;amp;kak=-1&amp;amp;kax=-1&amp;amp;kaq=-1&amp;amp;kap=-1&amp;amp;kao=-1&amp;amp;kau=-1&amp;amp;kt=n&amp;amp;kae=-1&amp;amp;ks=m&amp;amp;kw=w&amp;amp;ka=n&amp;amp;kd=-1&#34;&gt;duckduckgo.com/?kah=de&amp;hellip;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;enter-info-in-addon&#34;&gt;Enter info in addon&lt;/h3&gt;
&lt;p&gt;Open the interface to add a new search engine by locating the blue looking glass
icon in the menu bar (Not in Firefox Settings! It is an addon with its own
interface).&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;%s&lt;/code&gt; substituted for the search term, add the following as search URL in
the addon: &lt;a href=&#34;https://duckduckgo.com/?q=%25s&amp;amp;kah=de-de&amp;amp;kl=de-de&amp;amp;k5=2&amp;amp;k1=-1&amp;amp;kk=-1&amp;amp;kaj=m&amp;amp;kay=b&amp;amp;kak=-1&amp;amp;kax=-1&amp;amp;kaq=-1&amp;amp;kap=-1&amp;amp;kao=-1&amp;amp;kau=-1&amp;amp;kt=n&amp;amp;kae=-1&amp;amp;ks=m&amp;amp;kw=w&amp;amp;ka=n&amp;amp;kd=-1&#34;&gt;duckduckgo.com/?q=%s?kah&amp;hellip;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We do not need to use &lt;code&gt;POST&lt;/code&gt; queries here.&lt;/p&gt;
&lt;p&gt;The icon is available at &lt;a href=&#34;https://duckduckgo.com/favicon.ico&#34;&gt;favicon.ico&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Then check &amp;ldquo;Advanced settings&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Suggest URL&amp;rdquo; for auto-suggestions in the search bar is
&lt;a href=&#34;https://ac.duckduckgo.com/ac/?q=%7BsearchTerms%7D&#34;&gt;https://ac.duckduckgo.com/ac/?q={searchTerms}&lt;/a&gt; (Yes, &lt;code&gt;{searchTerms}&lt;/code&gt; this time
instead of &lt;code&gt;%s&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Give the engine a name, e.g. &amp;ldquo;DDG&amp;rdquo;, then hit &amp;ldquo;Add custom search engine, then, on
the next page, follow the instruction to add the search engine. You may also set
DDG as the default in &lt;a href=&#34;about:preferences#search&#34;&gt;Firefox search settings&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;full-opensearch-xml&#34;&gt;Full OpenSearch XML&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;OpenSearchDescription&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://a9.com/-/spec/opensearch/1.1/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;ShortName&amp;gt;&lt;/span&gt;DDG&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/ShortName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;Description&amp;gt;&lt;/span&gt;DuckDuckGo&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/Description&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;InputEncoding&amp;gt;&lt;/span&gt;UTF-8&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/InputEncoding&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;Image&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;height=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;width=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;16&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;https://duckduckgo.com/favicon.ico&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/Image&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;Url&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;method=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;template=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://duckduckgo.com/?q={searchTerms}&amp;amp;amp;kah=de-de&amp;amp;amp;kl=de-de&amp;amp;amp;k5=2&amp;amp;amp;k1=-1&amp;amp;amp;kk=-1&amp;amp;amp;kaj=m&amp;amp;amp;kay=b&amp;amp;amp;kak=-1&amp;amp;amp;kax=-1&amp;amp;amp;kaq=-1&amp;amp;amp;kap=-1&amp;amp;amp;kao=-1&amp;amp;amp;kau=-1&amp;amp;amp;kt=n&amp;amp;amp;kae=-1&amp;amp;amp;ks=m&amp;amp;amp;kw=w&amp;amp;amp;ka=n&amp;amp;amp;kd=-1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;Url&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;type=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;application/x-suggestions+json&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;method=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GET&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;template=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://ac.duckduckgo.com/ac/?q={searchTerms}&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/OpenSearchDescription&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Git tricks</title>
      <link>https://ix5.org/tech/2019/git-tricks/</link>
      <pubDate>Wed, 27 Feb 2019 20:05:40 +0100</pubDate>
      
      <guid>https://ix5.org/tech/2019/git-tricks/</guid>
      <description>&lt;h2 id=&#34;tips&#34;&gt;Tips&lt;/h2&gt;
&lt;p&gt;From &lt;a href=&#34;https://twitter.com/zeuxcg/status/1100455834461495298&#34;&gt;twitter.com/zeuxcg&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git rebase —autostash&lt;/code&gt; stashes and unstashes local changes for you&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git commit -v&lt;/code&gt; adds diffs to commit draft so that you can inspect them as you
write commit msg&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git rebase -i&lt;/code&gt; Also, you should configure autostash to be on by default, and
configure rebase to be default on pull. Pull without -r will screw you every
time!&lt;/p&gt;
&lt;p&gt;You probably know already but commit messages allow to autosquash commits.
&lt;code&gt;fixup! &amp;lt;hash&amp;gt;&lt;/code&gt;, &lt;code&gt;squash! &amp;lt;hash&amp;gt;&lt;/code&gt; Works best with &lt;code&gt;git rebase —interactive —autostash —autosquash&lt;/code&gt;
or simply &lt;code&gt;git commit --fixup &amp;lt;hash&amp;gt;&lt;/code&gt; (or &lt;code&gt;git commit --squash &amp;lt;hash&amp;gt;&lt;/code&gt;)
… easier than typing the relevant commit msgs.&lt;/p&gt;
&lt;p&gt;I didn’t know those. Thanks. I have 3 aliases to avoid typing: &lt;code&gt;git fixup &amp;lt;hash&amp;gt;&lt;/code&gt; &lt;code&gt;git squash &amp;lt;hash&amp;gt;&lt;/code&gt; &lt;code&gt;git oops&lt;/code&gt;.
git oops creates a fixup commit to the current HEAD commit. I use it when I
don’t want to amend to keep the history until a later rebase. Used countless
times already.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git config rebase.autostash true&lt;/code&gt; &lt;code&gt;git config pull.rebase true&lt;/code&gt; &lt;code&gt;git add —patch git gui&lt;/code&gt; (allows to stage by line)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;I&amp;rsquo;m using &lt;code&gt;git add -i&lt;/code&gt;, it&amp;rsquo;s a superset of &lt;code&gt;-p&lt;/code&gt;, allowing to revert changes and
add untracked files as well. Oh and &lt;code&gt;git checkout -p&lt;/code&gt;, the destructive inverse
of &lt;code&gt;add -p&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;misc&#34;&gt;Misc&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;git rebase&lt;/code&gt; has &lt;code&gt;--committer-date-is-author-date&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rebase -i &amp;lt;commit-to-rebase-on-top-of&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# set all to &amp;#34;edit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit --amend --date&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date -I&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; --no-edit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rebase --continue
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# finally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rebase &amp;lt;commit-to-rebase-on-top-of&amp;gt; --committer-date-is-author-date
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;split to new folder(not subtree)&lt;/strong&gt;:&lt;br&gt;
&lt;a href=&#34;https://help.github.com/en/articles/splitting-a-subfolder-out-into-a-new-repository&#34;&gt;from GitHub help&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git filter-branch --prune-empty --subdirectory-filter &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  FOLDER-NAME  BRANCH-NAME
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;cherry-pick commit while ignoring line endings&lt;/strong&gt;:&lt;br&gt;
e.g. after &lt;code&gt;dos2unix&lt;/code&gt; runs&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git cherry-pick -X ignore-all-space &amp;lt;commit-id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Rewrite commit date to author date while rebasing&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git filter-branch &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --env-filter &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;export GIT_COMMITTER_DATE=&amp;#34;$GIT_AUTHOR_DATE&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    &amp;lt;SHA&amp;gt;..HEAD
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Find commits in all branches that touch a path&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git log --all -- &amp;lt;path&amp;gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Find commits in all branches that contain message&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git log --all --grep &amp;lt;msg-or-regex&amp;gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Find code in all branches that matches regex&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git grep &amp;lt;regex&amp;gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;git rev-list --all&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Might be slow though!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bash</title>
      <link>https://ix5.org/tech/2019/bash/</link>
      <pubDate>Tue, 26 Feb 2019 20:05:40 +0100</pubDate>
      
      <guid>https://ix5.org/tech/2019/bash/</guid>
      <description>&lt;h2 id=&#34;getopt&#34;&gt;getopt&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;my-function&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# This is important for getopt or it will fail on the second invocation!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    local OPTIND
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; getopts &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;u:b:s:&amp;#39;&lt;/span&gt; _flag
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_flag=&lt;/span&gt;$_flag&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;_flag&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            u&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; GIT_URL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$OPTARG&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            b&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; GIT_BRANCH&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-b &lt;/span&gt;$OPTARG&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            s&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; SPEC&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$OPTARG&lt;span style=&#34;color:#e6db74&#34;&gt; &amp;#34;&lt;/span&gt; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            *&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;my-function(): Unexpected option &lt;/span&gt;$_flag&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;; exit 1; ;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Ubuntu install</title>
      <link>https://ix5.org/tech/2018/ubuntu-install/</link>
      <pubDate>Tue, 29 May 2018 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2018/ubuntu-install/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This is for personal reference, read up on the official
documentation before you brick something you did not want bricked&amp;hellip;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;create-disk&#34;&gt;Create disk&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dd &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;distro.iso of&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/dev/sdX status_progress bs&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1M
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;boot-live-cd&#34;&gt;Boot live cd&lt;/h2&gt;
&lt;p&gt;Set keymap, then prepare disks&lt;/p&gt;
&lt;p&gt;(If in virtualbox, make sure to activate EFI mode)&lt;/p&gt;
&lt;h2 id=&#34;partition-drive&#34;&gt;Partition drive&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;lsblk&lt;/code&gt; or &lt;code&gt;blkid&lt;/code&gt;, &lt;code&gt;fdisk -l&lt;/code&gt; to get an overview of the current situation,
then create GPT table and partitions with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sgdisk --zap-all /dev/sdX
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sgdisk --clear &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --new&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1:0:+550MiB --typecode&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1:ef00 --change-name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;1:EFI &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --new&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;2:0:0       --typecode&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;2:8300 --change-name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;2:system &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    /dev/sdX
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or use &lt;code&gt;cgdisk&lt;/code&gt; which is nice and interactive.&lt;/p&gt;
&lt;p&gt;Create FAT32 filesystem for ESP on first partition:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkfs.fat -F32 -n EFI /dev/diSk/by-partlabel/EFI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;cryptsetup&#34;&gt;Cryptsetup&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cryptsetup luksFormat /dev/sda2 --key-size &lt;span style=&#34;color:#ae81ff&#34;&gt;512&lt;/span&gt; --iter-time &lt;span style=&#34;color:#ae81ff&#34;&gt;2000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cryptsetup luksOpen /dev/sda2 cryptroot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Could also use &lt;code&gt;/dev/disk/by-partlabel/...&lt;/code&gt; instead of &lt;code&gt;/dev/sda2&lt;/code&gt;&amp;hellip;)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkfs.ext4 /dev/disk/by-partlabel/system
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Using &lt;code&gt;ext4&lt;/code&gt; because the Ubuntu installer &lt;code&gt;ubiquity&lt;/code&gt; will create subvolumes
for &lt;code&gt;/ → @&lt;/code&gt; and &lt;code&gt;/home → @home&lt;/code&gt; by default if using &lt;code&gt;btrfs&lt;/code&gt;)&lt;/p&gt;
&lt;h2 id=&#34;start-installation&#34;&gt;Start installation&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ubiquity -b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Select language, keymap(&lt;code&gt;de-latin1-nodeadkeys&lt;/code&gt;), then for “Installation type”
select ”Something else”, use &lt;code&gt;/dev/mapper/cryptroot&lt;/code&gt; as &lt;code&gt;/&lt;/code&gt; with &lt;code&gt;ext4&lt;/code&gt; and
&lt;code&gt;/dev/sda1&lt;/code&gt; as &lt;code&gt;esp&lt;/code&gt;(EFI system partition)&lt;/p&gt;
&lt;p&gt;Then click through the warnings, enter credentials.&lt;/p&gt;
&lt;p&gt;Then &lt;strong&gt;DO NOT REBOOT&lt;/strong&gt;, click “Continue testing”&lt;/p&gt;
&lt;h2 id=&#34;fix-partitions&#34;&gt;Fix partitions&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount /dev/mapper/cryptroot /mnt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p /mnt/boot/efi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount LABEL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;EFI /mnt/boot/efi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;chroot&#34;&gt;chroot&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Before you chroot&lt;/em&gt;, mount the following filesystems from the live system:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount --bind /proc /mnt/proc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount --bind /sys /mnt/sys
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount --bind /dev /mnt/dev
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount --bind /run /mnt/run
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount --bind /dev/pts /mnt/dev/pts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Otherwise the &lt;code&gt;cryptsetup&lt;/code&gt; hook from &lt;code&gt;update-initramfs&lt;/code&gt; will fail later.&lt;/p&gt;
&lt;p&gt;Finally&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chroot /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;fix-fstab-crypttab&#34;&gt;Fix fstab, crypttab&lt;/h2&gt;
&lt;p&gt;Find out UUID of root &lt;strong&gt;partition&lt;/strong&gt;(not mounted filesystem!) with &lt;code&gt;blkid&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Remove the &lt;code&gt;swap&lt;/code&gt; entry from &lt;code&gt;/etc/fstab&lt;/code&gt;, then create &lt;code&gt;/etc/crypttab&lt;/code&gt;, replace
&lt;code&gt;&amp;lt;UUID from blkid&amp;gt;&lt;/code&gt; of course:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#/etc/crypttab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cryptroot UUID&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;UUID from blkid&amp;gt; none luks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Check that &lt;code&gt;/dev/mapper/cryptroot&lt;/code&gt; is listed correctly in &lt;code&gt;/etc/fstab&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;update-initramfs&#34;&gt;Update initramfs&lt;/h2&gt;
&lt;p&gt;Regenerate the initramfs:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;update-initramfs -k all -u
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Should run without any errors; if it complains about not seeing devices you
probably forgot to mount &lt;code&gt;/dev&lt;/code&gt; into the chroot target.&lt;/p&gt;
&lt;p&gt;Then copy to ESP&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp /boot/initrd.img-* /boot/efi/initrd.img
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp /boot/vmlinuz-* /boot/efi/vmlinuz-generic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;bootloader&#34;&gt;Bootloader&lt;/h2&gt;
&lt;p&gt;Install &lt;code&gt;systemd-boot&lt;/code&gt; to the ESP&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bootctl --path&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/boot/efi install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then check efi vars with &lt;code&gt;efibootmgr -v&lt;/code&gt;, in case &lt;code&gt;bootctl&lt;/code&gt; failed to install
an entry, use&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;efibootmgr &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--create &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--disk /dev/nvme0n1 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--gpt &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--loader &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\EFI\systemd\systemd-bootx64.efi&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--label systemdboot &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--part &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--timeout &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--write-signature &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;--verbose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Set boot order if necessary, &lt;code&gt;0010&lt;/code&gt; would be &lt;code&gt;systemd-boot&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;efibootmgr -o 0010,0020
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Configure bootloader in &lt;code&gt;/boot/efi/loader/loader.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;default ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# leave timeout to debug&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;timeout 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# leave editor to debug&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;editor 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create boot entries&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /boot/efi/loader/entries/ubuntu.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title   Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;initrd  /initrd.img&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;linux   /vmlinuz-generic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;options r0 root&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;/dev/mapper/cryptroot quiet splash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;finishing&#34;&gt;Finishing&lt;/h2&gt;
&lt;p&gt;Unmount everything, exit chroot, shutdown, remove USB key, boot, enjoy.
If something is broken, hold down &lt;kbd&gt;space&lt;/kbd&gt; at boot for &lt;code&gt;systemd-boot&lt;/code&gt;
to halt, allowing editing of the kernel commandline by pressing &lt;kbd&gt;e&lt;/kbd&gt; on
a boot entry.&lt;/p&gt;
&lt;h2 id=&#34;outlook&#34;&gt;Outlook&lt;/h2&gt;
&lt;p&gt;This setup will not install kernel updates by itself, you&amp;rsquo;ll need a hook that
moves the updated initrd and kernel stubs onto the ESP and creates appropriate
boot manager entries.&lt;/p&gt;
&lt;h1 id=&#34;references&#34;&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://jeffmikels.org/posts/transfer-an-entire-ubuntu-system-to-a-new-drive/&#34;&gt;Transfer Ubuntu to a new drive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://thesimplecomputer.info/full-disk-encryption-with-ubuntu&#34;&gt;Full disk encryption with Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Site notice</title>
      <link>https://ix5.org/tech/site-notice/</link>
      <pubDate>Wed, 09 May 2018 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/site-notice/</guid>
      <description>&lt;h3 id=&#34;powered-by&#34;&gt;Powered by&lt;/h3&gt;
&lt;p&gt;Made with &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;, using the &lt;a href=&#34;https://github.com/mobybit/hugo-natrium-theme&#34;&gt;Natrium theme&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;license&#34;&gt;License&lt;/h3&gt;
&lt;p&gt;Unless otherwise noted, works on this site are licensed under &lt;a href=&#34;https://creativecommons.org/licenses/by-sa/4.0/&#34;&gt;Creative Commons Attribution-ShareAlike 4.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Logos used, including the ‘Felix Elsner’ and ‘X5’ wordmarks, are licensed “All rights reserved”.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Arch install</title>
      <link>https://ix5.org/tech/2018/arch-install/</link>
      <pubDate>Sun, 29 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2018/arch-install/</guid>
      <description>&lt;h2 id=&#34;create-disk&#34;&gt;Create disk&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo dd if=distro.iso of=/dev/sdX status_progress bs=1M
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;boot-arch&#34;&gt;Boot arch&lt;/h2&gt;
&lt;p&gt;Better connect ethernet, else use &lt;code&gt;wifi-menu&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;loadkeys de-latin1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;partition-drive&#34;&gt;Partition drive&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;lsblk&lt;/code&gt; or &lt;code&gt;blkid&lt;/code&gt;, &lt;code&gt;fdisk -l&lt;/code&gt; to get an overview of the current situation&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sgdisk --zap-all /dev/sdX
sgdisk --clear \
     --new=1:0:+550MiB --typecode=1:ef00 --change-name=1:EFI \
     --new=2:0:0       --typecode=2:8300 --change-name=2:system \
       /dev/sdX
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or use &lt;code&gt;cgdisk&lt;/code&gt; which is nice and interactive&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkfs.fat -F32 -n EFI /dev/disK/by-partlabel/EFI
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;cryptsetup&#34;&gt;Cryptsetup&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cryptsetup luksFormat /dev/sda2 --key-size 512 --iter-time 2000
[--align-payload=8192 -h sha512 -c aus-xts-plain64]
cryptsetup luksOpen /dev/sda2 cryptroot

mkfs.btrfs --force --label system /dev/mapper/cryptroot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then create btrfs filesystems, optionally with subvolumes&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# maybe use compress=lzo but that could be dangerous
o_btrfs=defaults,x-mount.mkdir,compress=zstd,ssd,noatime
mount -t btrfs /dev/mapper/cryptroot /mnt
# Using subvolumes:
btrfs subvolume create /mnt/root
btrfs subvolume create /mnt/home
btrfs subvolume create /mnt/snapshots
umount -R /mnt
# Mount created btrfs filesystem
mount -t btrfs -o $o_btrfs /dev/mapper/cryptroot /mnt
# Or using subvolumes:
mount -t btrfs -o subvol=root,$o_btrfs /dev/mapper/cryptroot /mnt
mount -t btrfs -o subvol=home,$o_btrfs /dev/mapper/cryptroot /mnt/home
mount -t btrfs -o subvol=snapshots,$o_btrfs /dev/mapper/cryptroot /mnt/.snapshots
mkdir -p /mnt/boot/efi
mount LABEL=EFI /mnt/boot/efi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;mirrorlist&#34;&gt;Mirrorlist&lt;/h2&gt;
&lt;p&gt;Use &lt;a href=&#34;https://wiki.archlinux.org/index.php/Reflector&#34;&gt;reflector&lt;/a&gt; if possible&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp /etc/pacman.d/{mirrorlist,mirrorlist.backup}
pacman -S reflector
reflector --country France --country Germany --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist

# Old school: uncomment country-specific mirrors in mirrorlist.backup; then
rankmirrors -n 6 /etc/pacman.d/mirrorlist.backup &amp;gt; /etc/pacman.d/mirrorlist
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;install-base-system&#34;&gt;Install base system&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pacstrap /mnt base
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;fstab&#34;&gt;fstab&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;genfstab -L -p /mnt &amp;gt;&amp;gt; /mnt/etc/fstab
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Should look something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# &amp;lt;file system&amp;gt; &amp;lt;dir&amp;gt; &amp;lt;type&amp;gt; &amp;lt;options&amp;gt; &amp;lt;dump&amp;gt; &amp;lt;pass&amp;gt;
# /dev/sda1 EFI ESP partition
UUID=6285-B457 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro	0 2

# /dev/sda2 with plain btrfs on top of luks:
# /dev/mapper/cryptroot UUID=XXXXXX
LABEL=cryptroot / btrfs rw,noatime,ssd,compress=zstd,space_cache,subvolid=5,subvol=/ 0 0

# /dev/sda2 with btrfs and subvolumes:
# /dev/mapper/cryptroot UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
/dev/mapper/cryptroot / btrfs rw,noatime,compress=zstd,ssd,space_cache,subvolid=257,subvol=/root,subvol=root	0 0
# /dev/mapper/cryptroot UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
/dev/mapper/cryptroot /home btrfs rw,noatime,compress=zstd,ssd,space_cache,subvolid=258,subvol=/home,subvol=home	0 0
# /dev/mapper/cryptroot UUID=...
/dev/mapper/cryptroot /.snapshots btrfs rw,noatime,compress=zstd,ssd,space_cache,subvolid=259,subvol=/snapshots,subvol=snapshots	0 0

# ext4 for refrence:
# /dev/sda2 with ext4
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 rw,relatime,data=ordered 0 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;chroot&#34;&gt;Chroot&lt;/h2&gt;
&lt;p&gt;Chroot into mounted new system, either via &lt;code&gt;systemd-nspawn&lt;/code&gt; or &lt;code&gt;chroot&lt;/code&gt;:
Use &lt;code&gt;systemd-nspawn&lt;/code&gt; to use &lt;code&gt;*ctl&lt;/code&gt; commands directly in “chroot”&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# -b is for boot
systemd-nspawn -bD /mnt
# or
arch-chroot /mnt
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;locale&#34;&gt;Locale&lt;/h2&gt;
&lt;p&gt;Edit &lt;code&gt;/etc/locale.gen&lt;/code&gt;, uncomment &lt;code&gt;de_DE.UTF-8&lt;/code&gt; and &lt;code&gt;en_US.UTF-8&lt;/code&gt;, run
&lt;code&gt;locale-gen&lt;/code&gt;, then use either &lt;code&gt;systemd-firstboot&lt;/code&gt; or &lt;code&gt;localectl&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemd-firstboot --prompt-locale
# or
localectl list-locales
↳ [...] en_US.UTF-8 [...]
localectl set-locale LANG=en_US.UTF-8
localectl set-keymap --no-convert de-latin1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;time&#34;&gt;Time&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;timedatectl&lt;/code&gt; and run configure ntp via &lt;code&gt;systemd-timedated&lt;/code&gt; and
&lt;code&gt;systemd-timesyncd&lt;/code&gt;, &lt;code&gt;ntpd&lt;/code&gt; is old&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;timedatectl set-ntp 1
timedatectl list-timezones
↳ ...
timedatectl set-timezone Europe/Berlin
hwclock --systohc
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;hostname&#34;&gt;Hostname&lt;/h2&gt;
&lt;p&gt;Set via &lt;code&gt;hostnamectl&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hostnamectl set-hostname myhostname
hostnamectl set-chassis &amp;quot;laptop&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Append to &lt;code&gt;/etc/hosts&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;127.0.0.1	localhost.localdomain	localhost
::1		localhost.localdomain	localhost
127.0.1.1	myhostname.localdomain	myhostname
# or via echo
echo &amp;quot;127.0.1.1	myhostname.localdomain myhostname&amp;quot; &amp;gt;&amp;gt; /etc/hosts
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;network&#34;&gt;Network&lt;/h2&gt;
&lt;p&gt;Ethernet can be managed by &lt;code&gt;systemd-networkd&lt;/code&gt; in case of NetworkManager failure&lt;/p&gt;
&lt;p&gt;Install &lt;code&gt;NetworkManager&lt;/code&gt;, then use in case of no GUI:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Scan
nmcli dev wifi
# Add connection, interactively
nmcli con add --ask
↳ Connection type: wifi
↳ No to all others
# Check
nmcli con show
↳ NAME UUID ..., note NAME
# Connect
nmcli con up id &#39;NAME&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;install-packages&#34;&gt;Install packages&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;pacman -Syu
pacman -S base-devel btrfs-progs gptfdisk
pacman -S adwaita-icon-theme ansible avahi bash binutils btrfs-progs bzip2
cantarell-fonts chrome-gnome-shell coreutils cryptsetup dconf-editor
device-mapper diffutils dosfstools e2fsprogs efibootmgr eog epiphany evince
fakeroot file file-roller filesystem findutils fish freetype2 gawk gcc
gcc-libs gdm gedit glibc gnome-backgrounds gnome-bluetooth gnome-calculator
gnome-clocks gnome-color-manager gnome-control-center gnome-desktop
gnome-icon-theme gnome-icon-theme-extras gnome-keyring gnome-menus
gnome-shell gnome-system-monitor gnome-terminal gnome-tweaks grep gvfs gzip
inetutils iproute2 iputils iw less librsvg libtool linux linux-headers
logrotate man-db man-pages mdadm nano nautilus networkmanager pacman patch
pciutils perl polkit pkg-config procps-ng psmisc pulseaudio sed shadow sudo
sysfsutils systemd-sysvcompat tar tracker ttf-dejavu usbutils util-linux
which xdg-user-dirs-gtk xfsprogs xterm xorg-server xorg-server-xwayland
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;initramfs&#34;&gt;initramfs&lt;/h2&gt;
&lt;p&gt;Backup &lt;code&gt;/etc/mkinitcpio.conf&lt;/code&gt;, then edit:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# /etc/mkinitcpio.conf
MODULES=(vfat i915)
BINARIES=()
FILES=()
HOOKS=(systemd sd-vconsole autodetect modconf block keymap sd-encrypt btrfs filesystems keyboard)
#HOOKS=(base udev autodetect modconf block filesystems keyboard fsck)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Regenerate the initramfs&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkinitcpio -p linux
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then copy to ESP&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cp /boot/initrd-linux.img /boot/efi
cp /boot/initrd-linux-fallback.img /boot/efi
cp /boot/vmlinuz-generic /boot/efi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;security&#34;&gt;Security&lt;/h2&gt;
&lt;p&gt;Set password, add to sudoers/wheel group&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;passwd
usermod -a -G wheel username
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;bootloader&#34;&gt;Bootloader&lt;/h2&gt;
&lt;p&gt;Install &lt;code&gt;systemd-boot&lt;/code&gt; to the ESP&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bootctl --path=/boot/efi install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then check efi vars with &lt;code&gt;efibootmgr -v&lt;/code&gt;, in case &lt;code&gt;bootctl&lt;/code&gt; failed to install
an entry, use&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;efibootmgr \
--create \
--disk /dev/nvme0n1 \
--gpt \
--loader &amp;quot;\EFI\systemd\systemd-bootx64.efi&amp;quot; \
--label systemdboot \
--part 1 \
--timeout 0 \
--write-signature \
--verbose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set boot order if necessary, &lt;code&gt;0010&lt;/code&gt; would be &lt;code&gt;systemd-boot&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;efibootmgr -o 0010,0020
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Configure bootloader in &lt;code&gt;/boot/efi/loader/loader.conf&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;default arch
# leave timeout to debug, can disable later
timeout 2
# leave editor to debug, should disable later(security risk!)
editor 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create boot entries:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get luks-uuid with: &lt;code&gt;sudo cryptsetup luksUUID /dev/nvme0n1p2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Device-mapper name is &lt;code&gt;luksroot&lt;/code&gt; here, be consistent&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# /boot/efi/loader/entries/arch.conf
title   Arch Linux
#initrd /acpi_override # applying DSDT patch later
initrd  /initrd-linux.img
linux   /vmlinuz-generic
options rd.luks.uuid=&amp;lt;uuid&amp;gt; rd.luks.name=&amp;lt;uuid&amp;gt;=luksroot root=/dev/mapper/luksroot rw quiet splash
# for btrfs subvoumes use rootflags=subvol=...
# Set &amp;#34;dangerous&amp;#34; options later:
#options rw root=/dev/nvme0n1p2 quiet splash acpi.ec_no_wakeup=1 psmouse.synaptics_intertouch=1 mem_sleep_default=deep loglevel=3 i915.modeset=1 i915.fastboot=1 i915.enable_guc=1
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# /boot/efi/loader/entries/arch-fallback.conf
title   Arch Linux fallback
initrd  /initrd-linux-fallback.img
linux   /vmlinuz-generic
options rd.luks.uuid=&amp;lt;uuid&amp;gt; rd.luks.name=&amp;lt;uuid&amp;gt;=luksroot root=/dev/mapper/luksroot rw
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Might have to fiddle around with &lt;code&gt;root=...&lt;/code&gt; and include subvol, encrypt stuff&lt;/p&gt;
&lt;h1 id=&#34;see-also&#34;&gt;See also&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/index.php/User:Altercation/Bullet_Proof_Arch_Install&#34;&gt;Altercation/Bulletproof Arch install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/index.php/Dm-crypt/Encrypting_an_entire_system#Btrfs_subvolumes_with_swap&#34;&gt;Encrypted system with btrfs subvolumes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wiki.archlinux.org/index.php/Snapper#Suggested_filesystem_layout&#34;&gt;Snapper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Rhythmbox</title>
      <link>https://ix5.org/tech/2017/rhythmbox/</link>
      <pubDate>Thu, 09 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2017/rhythmbox/</guid>
      <description>&lt;h3 id=&#34;remove-clutter-from-database&#34;&gt;Remove clutter from database&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;code&gt;lxml&lt;/code&gt; (&lt;code&gt;apt-get install python-lxml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Download &lt;a href=&#34;https://ix5.org/code/removehidden.py&#34;&gt;&lt;code&gt;removehidden.py&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://ix5.org/code/removeignored.py&#34;&gt;&lt;code&gt;removeignored.py&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;rhythmdb.xml&lt;/code&gt; over from &lt;code&gt;~/.local/share/rhythmbox&lt;/code&gt; into working
directory&lt;/li&gt;
&lt;li&gt;Run either script to remove hidden or ignored entries respectively&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;rhythmdb_new.xml&lt;/code&gt; back to the rhythmbox directory&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;plugins&#34;&gt;Plugins&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MediaServer2 D-Bus interface&lt;/strong&gt; (included by default in 3.x)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MPRIS D-Bus interface&lt;/strong&gt; (included by default in 3.x)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/donaghhorgan/rhythmbox-plugins-rating-filters&#34;&gt;Rating filters&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/donaghhorgan/rhythmbox-plugins-open-containing-folder&#34;&gt;Open containing
folder&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Brother DCP-L2520DW</title>
      <link>https://ix5.org/tech/2016/brother-dcp-l2520dw/</link>
      <pubDate>Mon, 01 Aug 2016 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2016/brother-dcp-l2520dw/</guid>
      <description>&lt;p&gt;Download files from the &lt;a href=&#34;http://support.brother.com/g/b/downloadlist.aspx?c=gb&amp;amp;lang=en&amp;amp;prod=dcpl2520dw_us_eu&amp;amp;os=128&#34;&gt;brother printer support page&lt;/a&gt;.&lt;br&gt;
Use either the install tool(will complain about missing &lt;code&gt;ia32-libs&lt;/code&gt; but works
fine) or install the packages manually.&lt;br&gt;
Assign a static ip address to the device and add the printer with &lt;code&gt;CUPS&lt;/code&gt;.
The device should appear with proper name and abilities.&lt;br&gt;
Do not install the generic packages(named &amp;lsquo;Generic LPR printer driver, Generic
CUPSwrapper printer driver&amp;rsquo;).&lt;/p&gt;
&lt;p&gt;(for Arch Linux: Install &lt;code&gt;brscan4&lt;/code&gt; from AUR)&lt;/p&gt;
&lt;p&gt;For scanning functionality, use &lt;code&gt;brsaneconfig4&lt;/code&gt;.
Run &lt;code&gt;brsaneconfig4 -q&lt;/code&gt; and confirm that the line &lt;code&gt;39 &amp;quot;DCP-L2520DW&amp;quot;&lt;/code&gt; appears.
Then run &lt;code&gt;brsaneconfig4 -a name=&#39;Friendly Name&#39; model=&#39;DCP-L2520DW&#39; ip=192.168..&lt;/code&gt;.&lt;br&gt;
Or use &lt;code&gt;nodename=printerhostname&lt;/code&gt; where printerhostname might be something
like &lt;code&gt;BRWxxxxxxxx.fritz.box&lt;/code&gt;, use &lt;code&gt;nmap -sn&lt;/code&gt; to find out.&lt;br&gt;
Use &lt;code&gt;simple-scan&lt;/code&gt; and select the device, then run a test scan. DPI can be set
to up to 2400.&lt;/p&gt;
&lt;p&gt;Edit &lt;code&gt;/lib/udev/rules.d/60-libsane.rules&lt;/code&gt; and add:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Brother scanners
ATTRS{idVendor}==&amp;#34;04f9&amp;#34;, ENV{libsane_matched}=&amp;#34;yes&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For scankey support run &lt;code&gt;brscankey-skey -l&lt;/code&gt;. Should it not display anything,
killing it with &lt;code&gt;brscankey -t&lt;/code&gt; and re-running the previous command might help.
(Haven&amp;rsquo;t gotten it to work yet, and I do not see a use for this.)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Update 2021&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On printer: Set static IP, enable ipv6 (nice to have), set printer hostname
(&amp;ldquo;nodename&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: Adding via hostname (even appending &amp;ldquo;.local&amp;rdquo;) does not work&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;CUPS: Add new lpd printer&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;lpd://192.168.1.50/BINARY_P1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;nmap:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo nmap -sn 192.168.1.1/24
# or
sudo nmap -p 631 192.168.1.1/24
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SANE:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo brsaneconfig4 -a name=NETWORK-Brother-DCP-L2520DW model=DCP-L2520DW ip=192.168.1.50
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    
    <item>
      <title>Banshee</title>
      <link>https://ix5.org/tech/2016/banshee/</link>
      <pubDate>Mon, 18 Jul 2016 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2016/banshee/</guid>
      <description>&lt;h3 id=&#34;remove-deleted-files-from-internal-database&#34;&gt;Remove deleted files from internal database&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;code&gt;libdbi-perl&lt;/code&gt; and &lt;code&gt;libdbd-sqlite3-perl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Make a backup of &lt;code&gt;~/.config/banshee-1/banshee.db&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Download &lt;code&gt;reap-dead-tracks.pl&lt;/code&gt; from
&lt;a href=&#34;https://ix5.org/code/reap-dead-tracks.pl&#34;&gt;this server&lt;/a&gt; or
&lt;a href=&#34;https://gist.github.com/ix5/8186a63400f90a3adfc7c8ac3db7df9c&#34;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;perl reap-dead-tracks.pl &amp;lt;db&amp;gt;&lt;/code&gt;, confirm deletion&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;reload-internal-database&#34;&gt;Reload internal database&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sqlite3 ~/.config/banshee-1/banshee.db &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;update coretracks \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;    set LastSyncedStamp = 0 where PrimarySourceID=1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ui&#34;&gt;UI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use right mouse button to resize time slider&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;sync&#34;&gt;Sync&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Make an &lt;code&gt;.is_audio_player&lt;/code&gt; file in root of external device, describe
capabilites&lt;/li&gt;
&lt;li&gt;Do not start banshee wile an mtp device is connected
(Just starting up banshee in the background will cause the connection to fail
and mess up everything)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Mixxx reference</title>
      <link>https://ix5.org/tech/2016/mixxx-reference/</link>
      <pubDate>Thu, 11 Feb 2016 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2016/mixxx-reference/</guid>
      <description>&lt;h2 id=&#34;autodj&#34;&gt;AutoDJ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Activate with &lt;code&gt;Shift-F12&lt;/code&gt;, a little android icon will appear in top left
corner and control over crossfader will be automated&lt;/li&gt;
&lt;li&gt;Skip track with &lt;code&gt;Shift-F11&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set fade time to negative value for breaks in between songs, don&amp;rsquo;t forget to
turn it off. Setting a negative value will make mixxx not respect cue points!&lt;/li&gt;
&lt;li&gt;Use crates to refill cue if necessary&lt;/li&gt;
&lt;li&gt;Seeking to cue point on load can be turned off in preferences&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;musicality&#34;&gt;Musicality&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The BPM detection is insufficicient&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;knobs&#34;&gt;Knobs&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Any&lt;/strong&gt; effect will increase audio latence, this includes key lock&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t forget to turn off filters after the song has ended&lt;/li&gt;
&lt;li&gt;Mind the crossfader&lt;/li&gt;
&lt;li&gt;Use the gain slider cautiously, and turn it off immediately afterwards&lt;/li&gt;
&lt;li&gt;For effects: select appropriate channel&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;recording&#34;&gt;Recording&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CTRL-R&lt;/code&gt; to start-stop recording, little icon will appear in top left corner&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;organizing&#34;&gt;Organizing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use playlists for tracks in a specific order
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tandas&lt;/strong&gt; are designated
&lt;code&gt;T:Genre:Artist(tempo):Singer/mood/etc. (year from-til)&lt;/code&gt;, where genres are
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Cd&lt;/code&gt; - Candombe&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Fx&lt;/code&gt; - Foxtrot&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Mi&lt;/code&gt; - Milonga (&lt;code&gt;Mi/Cd&lt;/code&gt;: Milonga Candombe)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ta&lt;/code&gt; - Tango&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Va&lt;/code&gt; - Vals&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X&amp;lt;Genre&amp;gt;&lt;/code&gt; - Fusion (genre), nuevo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setlists&lt;/strong&gt; are designated &lt;code&gt;Deployment:Date:Location&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use crates for collections of tracks&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tagging&#34;&gt;Tagging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Song title: &lt;code&gt;Name | Alternative Name (canta Singer y Another Singer y coro)(en vivo, extra information)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Extra information, in title or otherwhere, is in Spanish&lt;/li&gt;
&lt;li&gt;Singer also goes into &lt;code&gt;vocal&lt;/code&gt; field(which most players do not display)&lt;/li&gt;
&lt;li&gt;Artist: Just the name, omission of &amp;lsquo;Orquesta&amp;rsquo; if possible
e.g.: Carlos Di Sarli, Orquesta Típica Victor, Quinteto Francisco
Canaro(Dir. Antonio D&amp;rsquo;Alessandro)&lt;/li&gt;
&lt;li&gt;Album: &lt;code&gt;Title | Subtitle&lt;/code&gt;. If artist is mentioned in album title, include
the name in album tag(e.g. Milongueando con Canaro).
Disc number goes into a separate tag&lt;/li&gt;
&lt;li&gt;Genre is capitalized/title cased, e.g. &lt;code&gt;Milonga Candombe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Year: Either &lt;code&gt;YYYY&lt;/code&gt; or &lt;code&gt;YYYY-MM-DD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grouping&lt;/code&gt; tag is for eras(guardia vieja, early, late, &amp;hellip;), can be
displayed in mixxx&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;comment&lt;/code&gt; field for danceability information/tagging, trivia etc.
goes into my notebook&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tagging-todo&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Implement rating system from 0 to 100 like on tango-dj.at instead of
stars, rate for milonga suitability(and custom tag/commandeer one?)&lt;/li&gt;
&lt;li&gt;Grouping standards(maybe from tejastango)&lt;/li&gt;
&lt;li&gt;Where to put &lt;code&gt;Instrumental&lt;/code&gt; tag? In song title(&lt;code&gt;El chamuyo (Instrumental)&lt;/code&gt;)? Into grouping?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;search&#34;&gt;Search&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fuzzy matching: &lt;code&gt;~key:c#m&lt;/code&gt; finds &amp;ldquo;tracks with harmonically compatible keys to
C# minor&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;artist:Danger duration:&amp;gt;3m rating:&amp;gt;=4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;genre:hip-hop -year:1990&lt;/code&gt; (negate with &lt;code&gt;-&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;building-audio-format-support&#34;&gt;Building, audio format support&lt;/h2&gt;
&lt;p&gt;Don’t forget to install &lt;code&gt;libmp4v2-2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;for m4a support&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Ubuntu should have m4a support with &lt;code&gt;ubuntu-restricted-extras&lt;/code&gt; and
&lt;code&gt;ubuntu-restricted-addons&lt;/code&gt; installed&lt;/p&gt;
&lt;p&gt;If not, use these prebuilt files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://ix5.org/code/2.0.0-release-libsoundsourcem4a.so&#34;&gt;libsoundsourcem4a for 2.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://ix5.org/code/2.1.0-alpha-libsoundsourcem4a.so&#34;&gt;libsoundsourcem4a for 2.1.0 alpha&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;rename to &lt;code&gt;libsoundsourcem4a.so&lt;/code&gt; and move into
&lt;code&gt;/usr/lib/mixxx/plugins/soundsource/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;or build everything yourself like a madman:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;apt-get build-dep mixxx&lt;/code&gt;, put &lt;code&gt;deb-src [...] universe&lt;/code&gt; in &lt;code&gt;sources.list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;install &lt;code&gt;libupower-glib-dev&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;install &lt;code&gt;libavformat-dev libavcodec-dev&lt;/code&gt; for ffmpeg and m4a/aac support&lt;/li&gt;
&lt;li&gt;install &lt;a href=&#34;http://downloads.mixxx.org/builds/&#34;&gt;development build from mixxx.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scons --PREFIX=&amp;lt;prefix&amp;gt; -j &amp;lt;cores&amp;gt; optimize=native faad=1 ffmpeg=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;go to &lt;code&gt;lin64_build/plugins/lin64_build/m4a/&lt;/code&gt; and copy &lt;code&gt;libsoundsourcem4a.so&lt;/code&gt;
to &lt;code&gt;/usr/lib/mixxx/plugins/soundsource/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Links&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://permalink.gmane.org/gmane.comp.multimedia.mixxx.devel/3019&#34;&gt;gmane thread on m4a plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://mixxx.org/forums/viewtopic.php?f=3&amp;amp;t=8231&amp;amp;p=29018&amp;amp;hilit=m4a#p29018&#34;&gt;forum thread&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;importing&#34;&gt;Importing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Exact Audio Copy will write id3(?) tags that are hard to get rid of.
They do not appear in puddletag, but can be spotted with a hex editor(e.g.
&lt;code&gt;bless&lt;/code&gt;). Use &lt;code&gt;Tag Tools -&amp;gt; Remove id3/ape Tags&lt;/code&gt; in puddletag to remove them,
or use &lt;code&gt;mutagen&lt;/code&gt; to programatically get rid of those tags and weird output
like &lt;code&gt;Junto a tu corazon;Junto a tu corazon (feat. Alberto Podesta)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;usb-audio&#34;&gt;USB audio&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Check with &lt;code&gt;dmesg -w&lt;/code&gt; whether the device was recognized as USB AUDIO&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;aplay -l&lt;/code&gt; whether the interface(?) appears&lt;/li&gt;
&lt;li&gt;Check whether &lt;code&gt;snd_usb_audio&lt;/code&gt; kernel module is loaded with &lt;code&gt;lsmod&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;After a kernel update: reboot and check if issues persist&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;alsa-utils, alsa-firmware, alsa-plugins, pulseaudio-alsa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Manage with &lt;code&gt;pavucontrol&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;wishlist&#34;&gt;Wishlist&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Support for rating system from 0 to 1, in arbitrary increments&lt;/li&gt;
&lt;li&gt;Cue out points&lt;/li&gt;
&lt;li&gt;Saving metadata to files&lt;/li&gt;
&lt;li&gt;Displaying arbitrary tags&lt;/li&gt;
&lt;li&gt;Less weird sorting, reliable sorting either by Artist-Album-Discnr-Tracknr
or Album-Discnr-Tracknr&lt;/li&gt;
&lt;li&gt;Setting loudness, not just via ReplayGain but also manually, to make cortinas
more quiet&lt;/li&gt;
&lt;li&gt;&amp;lsquo;Danceability&amp;rsquo; tag(or maybe just use comment)&lt;/li&gt;
&lt;li&gt;Showing comment as multiline popover when hovering instead of a long string&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Firefox modifications</title>
      <link>https://ix5.org/tech/2015/firefox-modifications/</link>
      <pubDate>Sun, 20 Dec 2015 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2015/firefox-modifications/</guid>
      <description>&lt;h1 id=&#34;addons&#34;&gt;Addons&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Essential&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;uBlock Origin (with custom filters)&lt;/li&gt;
&lt;li&gt;Stylish&lt;/li&gt;
&lt;li&gt;Session Manager&lt;/li&gt;
&lt;li&gt;GrabMyBooks&lt;/li&gt;
&lt;li&gt;I don&amp;rsquo;t care about cookies&lt;/li&gt;
&lt;li&gt;Clean Uninstall&lt;/li&gt;
&lt;li&gt;New Tab override(since Firefox doesn&amp;rsquo;t allow setting newtab.url any more for
some reason)&lt;/li&gt;
&lt;li&gt;Suspend Tab (actually works, as opposed to UnloadTab)&lt;/li&gt;
&lt;li&gt;VimFx(with custom mappings, don&amp;rsquo;t forget to back up)&lt;/li&gt;
&lt;li&gt;wallabag(v2)&lt;/li&gt;
&lt;li&gt;Warn Before Quit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Unused&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UnloadTab (loses tabs, not recommended)&lt;/li&gt;
&lt;li&gt;Super Start (load a custom html page from &lt;code&gt;file:///&lt;/code&gt; instead)&lt;/li&gt;
&lt;li&gt;RSVP Reader&lt;/li&gt;
&lt;li&gt;ScrapBook&lt;/li&gt;
&lt;li&gt;HTML5 Video Everywhere! (works only sporadically)&lt;/li&gt;
&lt;li&gt;Resurrect Pages&lt;/li&gt;
&lt;li&gt;Tab Mix Plus&lt;/li&gt;
&lt;li&gt;Random Agent Spoofer&lt;/li&gt;
&lt;li&gt;Content Search X&lt;/li&gt;
&lt;li&gt;BetterPrivacy&lt;/li&gt;
&lt;li&gt;QuickMark&lt;/li&gt;
&lt;li&gt;Privacy Badger (or Disconnect or Ghostery)&lt;/li&gt;
&lt;li&gt;NoScript (even with javascript turned on, it still offers some security features)&lt;/li&gt;
&lt;li&gt;Mozilla Archive Format&lt;/li&gt;
&lt;li&gt;meta-q-override&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;misc&#34;&gt;misc&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;remove default mail providers&lt;/li&gt;
&lt;li&gt;turn off sync, hello, pocket, tiles, weed out search providers, turn off telemetry etc.&lt;/li&gt;
&lt;li&gt;set default search engine, disable search suggestions&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;aboutconfig&#34;&gt;about:config&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;browser.search.showOneOffButtons&lt;/code&gt; false (deprecated)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser.newtab.url&lt;/code&gt; and &lt;code&gt;browser.startup.homepage&lt;/code&gt; to &lt;code&gt;about:blank&lt;/code&gt;(obsolete, see new tab override)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser.pocket.enabled&lt;/code&gt; false&lt;/li&gt;
&lt;li&gt;&lt;code&gt;beacon.enabled&lt;/code&gt; false&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser.visited_color&lt;/code&gt; #00CCCC&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dom.max_script_run_time&lt;/code&gt; 40&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dom.max_chrome_script_run_time&lt;/code&gt; 40 (from 20)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dom.battery.enabled&lt;/code&gt; false (how could anyone think this was a good idea)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dom.event.clipboardevents.enabled&lt;/code&gt; false&lt;/li&gt;
&lt;li&gt;&lt;code&gt;general.warnOnAboutConfig&lt;/code&gt; false&lt;/li&gt;
&lt;li&gt;&lt;code&gt;geo.enabled&lt;/code&gt; false&lt;/li&gt;
&lt;li&gt;&lt;code&gt;network.dns.disablePrefetch&lt;/code&gt; true&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pdfjs.disable&lt;/code&gt; true&lt;/li&gt;
&lt;li&gt;&lt;code&gt;plugins.enumerate_names&lt;/code&gt; (empty)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;privacy.trackingprotection.enabled&lt;/code&gt; true&lt;/li&gt;
&lt;li&gt;&lt;code&gt;webgl.disabled&lt;/code&gt; true (will break fullscreen mode?)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser.fullscreen.{animateUp,autohide}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dom.serviceWorkers.enabled&lt;/code&gt; false (what a dumb idea to let scripts run after
closing a tab)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;privacy.file_unique_origin=false&lt;/code&gt; - See
&lt;a href=&#34;https://www.mozilla.org/en-US/security/advisories/mfsa2019-21/#CVE-2019-11730&#34;&gt;CVE-2019-11730&lt;/a&gt;
But I don&amp;rsquo;t particularly care
Needed so that &lt;code&gt;file://&lt;/code&gt; stuff works properly and doesn&amp;rsquo;t complain about CORS,
e.g. &lt;a href=&#34;https://stackoverflow.com/questions/49993633/uncaught-domexception-failed-to-read-the-cssrules-property&#34;&gt;for accessing cssRules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;devtools.inspector.color-scheme-simulation.enabled=true&lt;/code&gt; for testing out
&lt;code&gt;prefers-color-scheme&lt;/code&gt;, see
&lt;a href=&#34;https://stackoverflow.com/questions/56401662/firefox-how-to-test-prefers-color-scheme&#34;&gt;stackoverflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Debian cheatsheet</title>
      <link>https://ix5.org/tech/2014/debian-cheat-sheet/</link>
      <pubDate>Fri, 16 May 2014 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2014/debian-cheat-sheet/</guid>
      <description>&lt;p&gt;&lt;em&gt;This has grown into a very useful list of things
that make my life easier. Divided into sections for clarity.
Mostly applicable to Ubuntu as well.&lt;/em&gt;&lt;/p&gt;
&lt;!-- TODO: Make &lt;kbd&gt; tags, tables side-by-side for better overview --&gt;
&lt;h1 id=&#34;nifty-shortcuts-one-liners-and-useful-programs&#34;&gt;Nifty shortcuts, one-liners and useful programs&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;netcat for file transfer&lt;/strong&gt;
receiver: &lt;code&gt;nc -l -p 1234 &amp;gt; somefile.png&lt;/code&gt;&lt;br&gt;
sender: &lt;code&gt;nc -w 3 192.168.178.20 1234 &amp;lt; somefile.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ssh port forwarding&lt;/strong&gt;
&lt;code&gt;ssh -R 80:localhost:8080 user@server.com -i key.pem&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;multiple x sessions&lt;/strong&gt;
&lt;code&gt;exec startx -- :1 vt8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;get random SALT&lt;/strong&gt;
&lt;code&gt;openssl rand -base64 32&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;use imagemagick to resize pictures&lt;/strong&gt;
&lt;code&gt;convert &amp;lt;infile&amp;gt; -resize 100x100 [&amp;lt;outfile&amp;gt;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;force aspect ratio&lt;/strong&gt;
&lt;code&gt;convert &amp;lt;infile&amp;gt; -thumbnail &#39;100x100&amp;gt;&#39; -background white -alpha remove -gravity center -extent 100x100 [&amp;lt;outfile&amp;gt;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;use imagemagick to create quick thumbnails&lt;/strong&gt;
POSIX, only works with &lt;code&gt;.jpeg&lt;/code&gt;, height=200px:
&lt;code&gt;for f in *; do; echo $f; convert -thumbnail x200 -background white -alpha remove $f ${f:%.jpeg}_thumb.png; done&lt;/code&gt;&lt;br&gt;
with zsh:
&lt;code&gt;for f in *; do; echo $f; convert -thumbnail x200 -background white -alpha remove $f ${f:r}_thumb.png; done&lt;/code&gt;&lt;br&gt;
where &lt;code&gt;${f:r}&lt;/code&gt; means &amp;ldquo;remove file extension from &lt;code&gt;$f&lt;/code&gt;&amp;rdquo;, see
&lt;a href=&#34;https://www.zsh.org/mla/users/2006/msg00239.html&#34;&gt;zsh archive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fast video thumbnails with ffmpegthumbnailer&lt;/strong&gt;
&lt;code&gt;for f in *; do; echo $f; ffmpegthumbnailer -i $f -o ${f:r}_thumb.png -s 400; done&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;imagemagick: crop and then append images&lt;/strong&gt;
Images are 1080x1920, we want to crop them to the middle, but full height.
First, create the needed folders folders, with files named identically:
&lt;code&gt;mkdir before now cropped_{before,now}&lt;/code&gt;, so that you have e.g. &lt;code&gt;before/1.png&lt;/code&gt;,
&lt;code&gt;now/1.png&lt;/code&gt;, &lt;code&gt;before/2.png&lt;/code&gt;, &lt;code&gt;now/2.png&lt;/code&gt; and so forth.&lt;br&gt;
Then, figure out the crop dimensions, e.g. &lt;code&gt;800x1080+580+0&lt;/code&gt; where we want an
image 800x1080 in dimension, and we carve it out with the x-offset of 580 and
y-offset of 0.&lt;br&gt;
Then, run the following imagemagick commands:
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Crop all before images
for f in before/*; do
  i=${f#before/} &amp;amp;&amp;amp; echo $i &amp;amp;&amp;amp; \
  convert -crop 800x1080+580+0 before/$i cropped_before/cropped_$i
done`
# Crop all after images
for f in now/*; do
  i=${f#now/} &amp;amp;&amp;amp; echo $i &amp;amp;&amp;amp; \
  convert -crop 800x1080+580+0 now/$i cropped_now/cropped_$i
done`
# Merge the cropped before and after pictures side-by-side
for f in before/*; do
  i=${f#before/} &amp;amp;&amp;amp; echo $i &amp;amp;&amp;amp; \
  convert +append cropped_before/cropped_$i cropped_now/cropped_$i $i
done`
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ffmpeg gif optimizer&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | convert -loop 0 - output.gif&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;find and remove &amp;ldquo;~&amp;rdquo; files from emacs etc.&lt;/strong&gt;
&lt;code&gt;find . -name*\~ | xargs rm &lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;use quvi to download videos etc&lt;/strong&gt;
&lt;code&gt;quvi --exec &amp;quot;wget -O &amp;lt;name.webm&amp;gt; %u&amp;quot; &amp;lt;link&amp;gt;&lt;/code&gt;&lt;br&gt;
or just use &lt;code&gt;youtube-dl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;set .mp4 metadata from filename&lt;/strong&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; f in *.mp4; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      title&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${${&lt;/span&gt;f#&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Series Name to Remove&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;%&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;.mp4&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      exiftool &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$f&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; -Title&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$title&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; -Artist&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Where &lt;code&gt;Series Name to Remove&lt;/code&gt; is a prefix to remove&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;count words (or lines)&lt;/strong&gt;
&lt;code&gt;wc [-l]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;print all file types in a directory&lt;/strong&gt;
&lt;code&gt;find . -type f -name &amp;quot;*.*&amp;quot; | awk -F. &#39;{print $NF}&#39; | sort -u&lt;/code&gt;&lt;br&gt;
or just print number of files of one filetpye:
&lt;code&gt;find . -name &amp;quot;*.mp3&amp;quot; -type f | wc -l&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;count number of files&lt;/strong&gt;
&lt;code&gt;find &amp;lt;dir&amp;gt; -type f | wc -l&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;generate random number&lt;/strong&gt;
&lt;code&gt;shuf -i 2000-65000 -n 1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;recover data from btrfs partitions&lt;/strong&gt;
from &lt;a href=&#34;http://superuser.com/questions/415132/how-to-undelete-files-on-btrfs-partition&#34;&gt;superuser&lt;/a&gt;&lt;br&gt;
run &lt;code&gt;strings /dev/sda1 | less&lt;/code&gt; and then use &lt;code&gt;/&lt;/code&gt; to search for the strings
that could be in that file. delimit the start of it with &amp;ldquo;m&amp;rdquo; then move to
the end and use &lt;code&gt;|cat &amp;gt;file&lt;/code&gt; to save it to a file&lt;br&gt;
(&lt;strong&gt;note&lt;/strong&gt;: worked on text for me, binary could be difficult)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tre-agrep&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;cat file.txt | tre-agrep -i(ignorecase) -s(show match cost) -3(max cost of 3) &#39;Fuzzy match&#39;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-D&lt;/code&gt;: cost of missing characters&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-I&lt;/code&gt;: cost of extra characters&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-S&lt;/code&gt;: cost of substitutions(should be x2 since deletion and insertion are
2 operations)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;load testing&lt;/strong&gt;
use &lt;code&gt;siege --concurrent=100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;manipulate systemd units from users as root&lt;/strong&gt;
&lt;code&gt;systemctl --user --machine=&amp;lt;user&amp;gt;@.host list-units&lt;/code&gt; where &lt;code&gt;&amp;lt;user&amp;gt;&lt;/code&gt; the actual
user, but &lt;code&gt;host&lt;/code&gt; is written verbatim&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;pdf-handling&#34;&gt;Pdf handling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;use pdftk to split a document into multiple pages&lt;/strong&gt;
&lt;code&gt;pdftk A=input.pdf cat A1-100 output output-1-100.pdf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;use pdftk to join multiple pdfs&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;pdftk input1.pdf input2.pdf cat output output.pdf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;use pdfjam to make presentations printable&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;pdf90 inputs.pdf&lt;/code&gt;
&lt;code&gt;pdfjam Inputs_rotated.pdf --nup 2x1  --landscape --outfile Outname.pdf&lt;/code&gt;
&lt;code&gt;pdf270 Outname.pdf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;convenient fish function&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-fish&#34; data-lang=&#34;fish&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pp&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;-d&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Make presentations printable&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;pdf90&lt;/span&gt; $argv
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;-x&lt;/span&gt; pdf_file &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; $argv &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;cut&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;-f&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;-d&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;pdfjam&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; $pdf_file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;-rotated90.pdf &lt;span style=&#34;color:#a6e22e&#34;&gt;--nup&lt;/span&gt; 2x1 &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;--landscape&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;--outfile&lt;/span&gt; print-&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; $pdf_file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.pdf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;pdf270&lt;/span&gt; print-&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; $pdf_file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.pdf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;rm&lt;/span&gt; print-&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; $pdf_file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.pdf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;mv&lt;/span&gt; print-&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; $pdf_file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;-rotated270.pdf print-&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; $pdf_file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.pdf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;rm&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;echo&lt;/span&gt; $pdf_file&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;-rotated90.pdf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;k2pdfopt&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;-om 0.3&lt;/code&gt; for margins, &lt;code&gt;-n&lt;/code&gt; for disabling ocr and bitmap generation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;removing margins&lt;/strong&gt;&lt;br&gt;
use &lt;code&gt;pdfcrop&lt;/code&gt; to remove whitespace automatically&lt;br&gt;
use &lt;code&gt;--margins &#39;5 10 20 30&#39;&lt;/code&gt; to remove margins in pts(left, top, right,
bottom), use negative values (&lt;code&gt;-50 -50 -50 -50&lt;/code&gt;) for actually cropping away&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;generate blank page&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;echo &amp;quot;&amp;quot; | ps2pdf -sPAPERSIZE=a4 - blankpage.pdf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;misc&#34;&gt;Misc&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;(Difficult-to-remember commands or usage of programs, accomplishing very
specific tasks)&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;tar&lt;/strong&gt;
&lt;code&gt;tar xvzf file&lt;/code&gt; to extract &lt;code&gt;file.tar.gz&lt;/code&gt;, &lt;code&gt;tar cvzf file.tar.gz files_to_include&lt;/code&gt; to create&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;find&lt;/strong&gt;
&lt;code&gt;find . -iname &amp;quot;*thing*&amp;quot;&lt;/code&gt;, case insensitive&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;multiple keyboard locales&lt;/strong&gt;
&lt;code&gt;setxkbmap -option grp:switch,grp:alt_shift_toggle,grp_led:scroll us,de&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;encrypt harddrive&lt;/strong&gt;
(from &lt;a href=&#34;http://www.hermann-uwe.de/blog/howto-disk-encryption-with-dm-crypt-luks-and-debian&#34;&gt;hermann-uwe.de&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;badblocks -c &lt;span style=&#34;color:#ae81ff&#34;&gt;10240&lt;/span&gt; -s -w -t random -v /dev/sdX
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# create partition using fdisk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cryptsetup --verbose --verify-passphrase luksFormat /dev/sdX1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cryptsetup luksOpen /dev/sdX1 name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkfs.ext3 -j -m &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; -O dir_index,filetype,sparse_super /dev/mapper/name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# mount it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# write to it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# unmount it&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cryptsetup luksClose /dev/mapper/name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;invert bash wildcards&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;shopt (-s)(-u) extglob&lt;/code&gt;&lt;br&gt;
&lt;code&gt;ls !(*.zip)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;the sudo tee duo&lt;/strong&gt;
&lt;code&gt;sh unprivileged-command | sudo tee output-file &amp;gt;/dev/null&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;sed instead of head&lt;/strong&gt;
&lt;code&gt;sed 11q file&lt;/code&gt; is equal to &lt;code&gt;head file&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sed &#39;3q;d&#39; file&lt;/code&gt; to get 3rd line of file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;bridge terminal and clipboard&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;echo test | xclip -selection c&lt;/code&gt; - put into clipboard&lt;br&gt;
&lt;code&gt;xclip -selection clipboard -o&lt;/code&gt; - print out clipboard contents&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;use notify-send sanely&lt;/strong&gt;&lt;br&gt;
use &lt;code&gt;notify-send &#39;Heading&#39; &#39;Body text&#39; --icon=dialog-information&lt;/code&gt;
with &lt;code&gt;--hint int:transient:1&lt;/code&gt; for ephemeral notifications that
do not clutter the message view&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;qemu&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;qemu-img create disk.img 10G&lt;/code&gt;&lt;br&gt;
&lt;code&gt;qemu -hda disk.img -boot d -cdrom distro.iso -m 1024&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;download a whole webpage&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;wget --recursive --no-clobber --page-requisites --html-extension --convert-links --domains domain.com domain.com&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;reinstall all python packages&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;sudo dpkg --get-selections | sed &#39;s:install$::&#39; | sed -e &#39;s/^[ \t]*//&#39; -e &#39;s/[ \t]*$//&#39; | grep -v &#39;python3&#39; | grep python&lt;/code&gt;
&lt;code&gt;sudo dpkg --get-selections | sed &#39;s:install$::&#39; | sed -e &#39;s/^[ \t]*//&#39; -e &#39;s/[ \t]*$//&#39; | grep python3 | xargs sudo apt-get --reinstall install&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;thunderbird: disable annoyances&lt;/strong&gt;
&lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Mozilla/Thunderbird/Deploying_Thunderbird_in_the_Enterprise/Thunderbird_Preferences_Relevant_to_Enterprises&#34;&gt;thunderbird for enterprise&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;upgrade all pip packages&lt;/strong&gt;&lt;br&gt;
add &lt;code&gt;--local&lt;/code&gt; for virtualenvs&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  pip install -U `pip list --outdated | awk &#39;{ print $1}&#39;`
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clear systemd journal&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;sudo journalctl --rotate &amp;amp;&amp;amp; sudo journalctl --vacuum-time=1s&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;use tar to back up a server&lt;/strong&gt;&lt;br&gt;
crude, but effective&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -zcvpf /archive/full-backup-&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;date &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;+%d-%B-%Y&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;.tar.gz --directory / &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;mnt --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;proc --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;var/spool/squid --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;sys &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;cdrom --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;sys --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;tmp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or from &lt;a href=&#34;https://www.serverpronto.com/kb/page.php?id=Backing+Up+and+Restore+Your+Server&#34;&gt;serverpronto.com&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar cvpzf /backups/backup.tgz --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/proc --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/lost+found &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/backups --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/dev --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/sys --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/boot/grub &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/etc/fstab --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/etc/network/interfaces &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/etc/udev/rules.d/70-persistent-net.rules /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar cvpzf /root/backups.tgz --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/root --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/proc &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/lost+found --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/backups --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/dev &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/sys --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/boot/grub --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/etc/fstab &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;    --exclude&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/etc/network/interfaces
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;rsync&#34;&gt;rsync&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;basic
&lt;code&gt;rsync -avs --delete -h . user@domain.tld:/home/user/server&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;copy directory structure only
&lt;code&gt;rsync -av -f&amp;quot;+ */&amp;quot; -f&amp;quot;- *&amp;quot; /path/to/src /path/to/dest/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ignore version control files(&lt;strong&gt;warning&lt;/strong&gt;: ignores folders named &lt;code&gt;core&lt;/code&gt;)
&lt;code&gt;rsync --cvs-exclude&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;git&#34;&gt;git&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;set up new repo&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;commit message&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote add remotename user@domain.tld:/home/user/proj.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push --set-upstream remotename master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# on server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git --bare init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;update submodules&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;git pull --recurse-submodules&lt;/code&gt;&lt;br&gt;
with proper commits: &lt;code&gt;git submodule update --recursive&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;change author info&lt;/strong&gt;&lt;br&gt;
from &lt;a href=&#34;https://help.github.com/articles/changing-author-info/&#34;&gt;github&lt;/a&gt;:&lt;br&gt;
&lt;code&gt;git clone --bare https://github.com/user/repo.git&lt;/code&gt;&lt;br&gt;
&lt;code&gt;cd repo.git&lt;/code&gt;&lt;br&gt;
run &lt;code&gt;git-author-rewrite.sh&lt;/code&gt;, check logs&lt;br&gt;
&lt;code&gt;git push --force --tags origin &#39;refs/heads/*&#39;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;media&#34;&gt;Media&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;convert ogg to mp3&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;for name in *.ogg; do ffmpeg -i &amp;quot;$name&amp;quot; -ab 128k -map_metadata 0:s:0 &amp;quot;${name/.ogg/.mp3}&amp;quot;; done;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;convert flac to mp3(fish shell)&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;for i in (ls *.flac)
    ffmpeg -i $i -ab 320k -map_metadata 0 -id3v2_version 3 $i.flac
end
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ffmpeg: reduce video size&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;ffmpeg -i input.mp4 -preset medium -c:v libx265 -crf 28 -c:a copy output.mp4&lt;/code&gt;&lt;br&gt;
(&lt;code&gt;crf&lt;/code&gt;: low is better quality, high is worse. 20-28 are sane values, 23 is
default, see &lt;a href=&#34;https://superuser.com/questions/677576/what-is-crf-used-for-in-ffmpeg#677580&#34;&gt;stackoverflow&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ffmpeg: convert to x264 with good quality&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;ffmpeg -i input.mp4 -c:a copy -vcodec libx264 -crf 20 output.mp4&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ffmpeg: use VAAPI acceleration for converting&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ffmpeg -init_hw_device vaapi=default_vaapi:/dev/dri/renderD128 -hwaccel vaapi \
  -hwaccel_output_format vaapi -hwaccel_device default_vaapi \
  -i input.mkv -filter_hw_device default_vaapi -vf &amp;#39;format=nv12|vaapi,hwupload&amp;#39; \
  -preset medium -c:v hevc_vaapi -crf 25 -c:a copy output.mkv
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;See also &lt;a href=&#34;https://trac.ffmpeg.org/wiki/Hardware/VAAPI&#34;&gt;ffmpeg: VAAPI&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Codec                        | VAAPI name  
-----------------------------|------------
H.262 / MPEG-2 part 2        | mpeg2_vaapi 
H.264 / MPEG-4 part 10 (AVC) | h264_vaapi  
H.265 / MPEG-H part 2 (HEVC) | hevc_vaapi  
MJPEG / JPEG                 | mjpeg_vaapi 
VP8                          | vp8_vaapi   
VP9                          | vp9_vaapi   
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;change volume&lt;/strong&gt;
&lt;code&gt;ffmpeg -i input.mp3 -af &amp;quot;volume=0.8&amp;quot; output.mp3&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;save all mp3s from an m3u file&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;wget -r &#39;url.m3u&#39; -O - | wget -nd -N -i - &amp;amp;&amp;amp; ls *.mp3 *.ogg *.flac *.wav &amp;gt; play.m3u&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;split audio files without reencoding&lt;/strong&gt;&lt;br&gt;
install &lt;code&gt;mp3splt&lt;/code&gt;&lt;br&gt;
&lt;code&gt;mp3splt -S 5 input.mp3 (-D directory)&lt;/code&gt;: split into 5 equal parts&lt;br&gt;
&lt;code&gt;mp3splt -t 10.30 input.mp3&lt;/code&gt;: split into files of minutes.seconds&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;remove audio tracks from an mkv file&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;mkvmerge --identify input.mkv&lt;/code&gt; (get track info)&lt;br&gt;
&lt;code&gt;mkvmerge -o output.mkv --audio-tracks 2 input.mkv&lt;/code&gt;&lt;br&gt;
other usage: &lt;a href=&#34;https://mkvtoolnix.download/doc/mkvmerge.html&#34;&gt;mkvtoolnix documentation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;merge video and subtitles into container file&lt;/strong&gt;
&lt;code&gt;mkvmerge -o output.mkv --default-track 0 --language 0:eng subtitles.srt input.mp4&lt;/code&gt;&lt;br&gt;
more advanced:
&lt;code&gt;for f in *.mp4; do mkvmerge -o ${f:r}.mkv --language 1:ger --attachment-description &#39;Infos&#39; --attachment-mime-type text/txt --attach-file ${f:r}.txt ${f:r}.mp4 ${f:r}.srt; done&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;audio players&lt;/strong&gt;&lt;br&gt;
from &lt;a href=&#34;http://wiki.ubuntuusers.de/.is_audio_player&#34;&gt;ubuntuusers&lt;/a&gt;&lt;br&gt;
place a &lt;code&gt;.is_audio_player&lt;/code&gt; file in root directory of audio player&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;splitting flac files&lt;/strong&gt;
(from &lt;a href=&#34;https://ubuntugenius.wordpress.com/2014/03/20/split-flac-audio-album-with-cue-file-into-separate-flac-tracks-in-ubuntu-linux/&#34;&gt;ubuntugenius&lt;/a&gt;)&lt;br&gt;
install &lt;code&gt;cuetools&lt;/code&gt;, &lt;code&gt;shntool&lt;/code&gt; and &lt;code&gt;flac&lt;/code&gt; packages&lt;br&gt;
run &lt;code&gt;cuebreakpoints album.cue | shnsplit -o flac album.flac&lt;/code&gt; and then(after converting to mp3) &lt;code&gt;cuetag album.cue *.mp3&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;note&lt;/strong&gt;: enclose filesnames containing special characters with double quotes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;typography&#34;&gt;Typography&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;create specific unicode characters&lt;/strong&gt;
&lt;code&gt;CTRL-SHIFT-U &amp;lt;NUMBER&amp;gt; ENTER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;via compose key&lt;/strong&gt;
Set &lt;code&gt;Right control&lt;/code&gt;(makes most sense) as compose key using &lt;code&gt;gnome-tweak-tool&lt;/code&gt;,
then either look up the corresponding sequence &lt;a href=&#34;https://help.ubuntu.com/community/GtkComposeTable&#34;&gt;here&lt;/a&gt;
or try to guess it, the mappings make sense most of the time&lt;br&gt;
(No need to keep pressing the compose modifier while entering)&lt;br&gt;
&lt;strong&gt;Examples&lt;/strong&gt;:
- &lt;code&gt;. .&lt;/code&gt; for &lt;code&gt;…&lt;/code&gt; (&lt;em&gt;ellipsis&lt;/em&gt;)
- &lt;code&gt;~ n&lt;/code&gt; for &lt;code&gt;ñ&lt;/code&gt;(&lt;em&gt;eñe&lt;/em&gt;)
- &lt;code&gt;? ?&lt;/code&gt; for &lt;code&gt;¿&lt;/code&gt;(&lt;em&gt;inverted ?&lt;/em&gt;)
- &lt;code&gt;C C C P&lt;/code&gt;(uppercase!) for &lt;code&gt;☭&lt;/code&gt; (&lt;em&gt;hammer &amp;amp; sickle&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;display-management&#34;&gt;Display management&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;start display manager (xmonad, &amp;hellip;)&lt;/strong&gt;&lt;br&gt;
in &lt;code&gt;.xinitrc&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xrandr -s &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xmonad &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wait
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;set brightness&lt;/strong&gt;
&lt;code&gt;xrandr --output DVI0 --brightness 0.5&lt;/code&gt;&lt;br&gt;
also use &lt;code&gt;arandr&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;turn off display&lt;/strong&gt;
&lt;code&gt;xset dpms force off&lt;/code&gt;, combine with lock: &lt;code&gt;xset dpms force off; slock&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;system-deployment&#34;&gt;System deployment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;manipulate installed packages&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;sudo dpkg --get-selections &amp;gt; packages.txt&lt;/code&gt; to back up&lt;br&gt;
then &lt;code&gt;sudo dpkg --clear-selections&lt;/code&gt; to set all to &lt;code&gt;deinstall&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo dpkg --set-selections &amp;lt; packages.txt&lt;/code&gt; to import the saved package list&lt;br&gt;
&lt;code&gt;sudo aptitude install&lt;/code&gt; or &lt;code&gt;sudo apt-get -u dselect-upgrade&lt;/code&gt;(much faster)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;fish-shell&#34;&gt;fish shell&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lsquo;clear cache&amp;rsquo; and speed up: remove &lt;code&gt;~/.config/fish/fishd*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;save alias: &lt;code&gt;alias la &#39;ls -la&#39;&lt;/code&gt; and then &lt;code&gt;funcsave &amp;lt;func&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;clipboard&lt;/strong&gt;: kill with &lt;code&gt;CTRL-w&lt;/code&gt; or &lt;code&gt;ALT-BCKSP&lt;/code&gt; -&amp;gt; kill ring.&lt;br&gt;
&lt;strong&gt;Paste&lt;/strong&gt;:&lt;code&gt;CTRL-y&lt;/code&gt;, &lt;strong&gt;cycle&lt;/strong&gt;: &lt;code&gt;ALT-y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;man dmenu&lt;/code&gt; has a good explanation of movement&lt;/li&gt;
&lt;li&gt;use &lt;code&gt;ALT&lt;/code&gt; and left/right to move through directory history&lt;/li&gt;
&lt;li&gt;use &lt;code&gt;z&lt;/code&gt; with tab completion for a fuzzy ncurses-like file manager&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- todo: break table up for better readability --&gt;
&lt;h2 id=&#34;shortcuts-from-emacs-mode&#34;&gt;Shortcuts from emacs-mode&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Shortcut&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Action&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;TAB&lt;/code&gt; and &lt;code&gt;SHIFT&lt;/code&gt;+&lt;code&gt;TAB&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;completion&lt;/strong&gt; cycling&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;a&lt;/code&gt; and &lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;e&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;jump to beginning/end of line&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;forward: &lt;code&gt;ALT&lt;/code&gt;+&lt;code&gt;f&lt;/code&gt;&lt;/br&gt;backward: &lt;code&gt;ALT&lt;/code&gt;+&lt;code&gt;b&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;move by words&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;left: &lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;b&lt;/code&gt;&lt;br&gt;right: &lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;f&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;moving, &lt;strong&gt;autosuggestions&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;up: &lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;p&lt;/code&gt;&lt;br&gt; down: &lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;n&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;searching command history&lt;/strong&gt; &lt;br&gt;(&lt;code&gt;ALT&lt;/code&gt; with up/down only for &lt;em&gt;tokens&lt;/em&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;h&lt;/code&gt;&lt;br&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;d&lt;/code&gt;&lt;br&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;j&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;backspace&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;forward delete&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;enter&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;c&lt;/code&gt;&lt;br&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;k&lt;/code&gt;&lt;br&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;u&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;deletes whole line&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;cursor to end&lt;/strong&gt;&lt;br&gt; &lt;strong&gt;beginning to cursor&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;w&lt;/code&gt;&lt;br&gt;&lt;code&gt;ALT&lt;/code&gt;+&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;deletes the next part&lt;br&gt; deletes last part&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;ALT&lt;/code&gt;+&lt;code&gt;l&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;em&gt;list&lt;/em&gt; contents of current dir&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;ALT&lt;/code&gt;+&lt;code&gt;p&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;pipe output to &lt;code&gt;less&lt;/code&gt; for &lt;em&gt;paged output&lt;/em&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;ALT&lt;/code&gt;+&lt;code&gt;w&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;show command description&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;&lt;code&gt;CTRL&lt;/code&gt;+&lt;code&gt;t&lt;/code&gt;&lt;br&gt;&lt;code&gt;ALT&lt;/code&gt;+&lt;code&gt;t&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;switches (&lt;em&gt;transposes&lt;/em&gt;) the last two characters&lt;br&gt; the last two words&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;div style=&#34;clear: both&#34;&gt;&lt;/div&gt;
&lt;h1 id=&#34;fix-specific-application-problems-or-configure-for-desired-mode-of-operation&#34;&gt;Fix specific application problems or configure for desired mode of operation&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;apt-get without diffs&lt;/strong&gt;
diff files are great for low bandwidth connections but they are not needed
most of the time&lt;br&gt;
either run &lt;code&gt;apt-get update&lt;/code&gt; with &lt;code&gt;-o Acquire::Pdiffs=false&lt;/code&gt;&lt;br&gt;
or edit &lt;code&gt;/etc/apt/apt.conf&lt;/code&gt; to include &lt;code&gt;Acquire::PDiffs &amp;quot;false&amp;quot;;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;apt: disable automatic updates&lt;/strong&gt;
edit &lt;code&gt;/etc/apt/apt.conf.d/10periodic&lt;/code&gt; and set
&lt;code&gt;APT::Periodic::Update-Package-Lists &amp;quot;0&amp;quot;;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fix alsa problems&lt;/strong&gt;
&lt;code&gt;(sudo) alsactl init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pandoc generate proper html with utf-8 encoding&lt;/strong&gt;
&lt;code&gt;pandoc -f markdown infile.mkd -t html -s -o outfile.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pandoc: website to epub&lt;/strong&gt;
&lt;code&gt;pandoc -s -r html http://url.tld/page -o epub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;try to explicitly log into an ssh server using password instead of an ssh
key&lt;/strong&gt;
&lt;code&gt;ssh -o PreferredAuthentications=keyboard-interactive -o \ PubkeyAuthentication=no user@host&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gnome, systemd dependency madness on ubuntu&lt;/strong&gt;
from &lt;a href=&#34;http://shallowsky.com/blog/linux/install/blocking-deb-dependencies.html&#34;&gt;shallowsky.com
&lt;/a&gt;&lt;br&gt;
install &lt;code&gt;equivs&lt;/code&gt; package&lt;br&gt;
run &lt;code&gt;equivs-control&lt;/code&gt;, edit &lt;code&gt;Package&lt;/code&gt; to package name, &lt;code&gt;Version&lt;/code&gt; to 2:42 or
something high, &lt;code&gt;Maintainer&lt;/code&gt; to some name and &lt;code&gt;&amp;lt;email@address.com&amp;gt;&lt;/code&gt;&lt;br&gt;
run &lt;code&gt;equivs-build&lt;/code&gt; and install with &lt;code&gt;dpkg -i &amp;lt;packagename&amp;gt;&lt;/code&gt;&lt;br&gt;
Use this to remove e.g. &lt;code&gt;evolution-data-server&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;package that a file belongs to&lt;/strong&gt;
&lt;code&gt;dpkg -S file&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;disable bootup of services on ubuntu&lt;/strong&gt;
&lt;code&gt;update-rc.d cups remove&lt;/code&gt; (&lt;strong&gt;note&lt;/strong&gt;: at least for now, systemd might change
this)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;let apt ignore dependencies&lt;/strong&gt;
edit &lt;code&gt;/var/lib/dpkg/status&lt;/code&gt; and remove &lt;code&gt;Depends:&lt;/code&gt; entries (&lt;strong&gt;note&lt;/strong&gt;: only
short-term, this will get overwritten)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;flask&lt;/strong&gt;
install directly from github tarball to use &lt;code&gt;flask *&lt;/code&gt; commands&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;use sudo without entering your password all the time&lt;/strong&gt;
&lt;code&gt;sudo visudo&lt;/code&gt;&lt;br&gt;
&lt;code&gt;user ALL=NOPASSWD: ALL&lt;/code&gt;&lt;br&gt;
however, this is very insecure, so it is better to just whitelist specific
commands:&lt;br&gt;
&lt;code&gt;user    ALL=(root) NOPASSWD: /usr/bin/command [args]&lt;/code&gt;&lt;br&gt;
&lt;code&gt;%group  ALL=(root) NOPASSWD: /path/to/comand [args]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sudo password asterisks&lt;/strong&gt;
&lt;code&gt;Defaults env_reset,pwfeedback&lt;/code&gt; in &lt;code&gt;visudo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pip problems&lt;/strong&gt;
&lt;code&gt;cryptography&lt;/code&gt; need &lt;code&gt;libssl-dev&lt;/code&gt; on ubuntu&lt;br&gt;
&lt;code&gt;cffi&lt;/code&gt; needs &lt;code&gt;python-cffi&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Pillow&lt;/code&gt; needs &lt;code&gt;libjpeg-dev&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;stop mongodb from allocating 3GB of space&lt;/strong&gt;
(shutdown mongodb),  edit &lt;code&gt;/etc/mongodb.conf&lt;/code&gt; and insert &lt;code&gt;smallfiles=true&lt;/code&gt;&lt;br&gt;
remove &lt;code&gt;/var/lib/mongodb/journal/\*&lt;/code&gt;, (startup mongodb)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;partition woes&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;partprobe /dev/sdX&lt;/code&gt; or &lt;code&gt;kpartx /dev/sdX&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;try &lt;code&gt;hdparm -Z /dev/sdX&lt;/code&gt; or &lt;code&gt;sfdisk -R /dev/sdX&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QT5&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;set ENVVAR with &lt;code&gt;export QT_AUTO_SCREEN_SCALE_FACTOR=0.8&lt;/code&gt; in &lt;code&gt;/etc/profile.d/qt.sh&lt;/code&gt;
or try with &lt;code&gt;.bash_profile, .profile, .bashrc&lt;/code&gt; etc.&lt;/li&gt;
&lt;li&gt;install &lt;code&gt;libqt5libqgtk2 qt5-image-formats-plugins qtwayland5 qt5-qmltooling-plugins&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;qt5ct&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;power-management-and-laptop-handling&#34;&gt;Power management and laptop handling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;power saving&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;install &lt;code&gt;laptop-mode-tools&lt;/code&gt; or, preferably &lt;code&gt;tlp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;install &lt;code&gt;powertop&lt;/code&gt; and set toggles&lt;/li&gt;
&lt;li&gt;utilize your desktop environment&amp;rsquo;s built-in solution, or run
&lt;code&gt;pm-suspend&lt;/code&gt;, &lt;code&gt;pm-hibernate&lt;/code&gt; or &lt;code&gt;pm-suspend-hybrid&lt;/code&gt; like an animal&lt;/li&gt;
&lt;li&gt;edit &lt;code&gt;/etc/systemd/logind.conf&lt;/code&gt; and set &lt;code&gt; HandleLidSwitch=ignore&lt;/code&gt;, then run
&lt;code&gt;systemctl restart systemd-logind.service&lt;/code&gt; clean up boot with
&lt;code&gt;update-rc.d&lt;/code&gt; or disable systemd units, use the &lt;code&gt;Startup applications&lt;/code&gt;
program to manage autostarts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;gsettings&#34;&gt;gsettings&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reset app grid&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;gsettings reset org.gnome.shell app-picker-layout&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;List tracker settings&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;gsettings list-recursively | grep -i org.freedesktop.Tracker | sort | uniq&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;systemctl---user&#34;&gt;systemctl &amp;ndash;user&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Get DBus access as &lt;code&gt;su&lt;/code&gt;-d normal user&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus&lt;/code&gt;
See &lt;a href=&#34;https://michlstechblog.info/blog/linux-start-user-processes-or-systemd-units-at-boot-time-with-systemd/&#34;&gt;Start systemd units at boot time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;fix-problems-pertaining-to-specific-hardware-configurations&#34;&gt;Fix problems pertaining to specific hardware configurations&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;wifi on Asus EEE PC 1000H&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;install &lt;code&gt;firmware-ralink&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;edit &lt;code&gt;/etc/network/interfaces&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  auto wlan0
  iface wlan0 inet dhcp
      wpa-ssid YOUR-SSID-HERE
      wpa-psk YOUR-PASSWORD-HERE
  /etc/init.d/networking restart
  iwlist
  iwconfig -a
  iwconfig wlan0 down
  ifconfig wlan0 hw ether 01:23:45:67:89:00
  ifconfig wlan0 up
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;I don&amp;rsquo;t use my old netbook any more, I hear OpenBSD has good drivers for
wireless networking. Go have fun installing that one.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;mitigate problems with intel ac 7260&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;edit &lt;code&gt;/etc/modprobe.d/iwlwifi-11n.conf&lt;/code&gt; and add
&lt;code&gt;options iwlwifi 11n_disable=8&lt;/code&gt; (or &lt;code&gt;disable=1&lt;/code&gt;)&lt;br&gt;
(at runtime) run &lt;code&gt;sudo rmmod {iwlmvm,iwlwifi}&lt;/code&gt;,
then &lt;code&gt;sudo modprobe iwlwifi 11n_disable=1&lt;/code&gt;, &lt;code&gt;sudo modprobe iwlmvm&lt;/code&gt;&lt;br&gt;
edit &lt;code&gt;/etc/default/crda&lt;/code&gt; and change &lt;code&gt;REGDOMAIN=&lt;/code&gt; to your country code&lt;br&gt;
&lt;strong&gt;note&lt;/strong&gt;: this still does not fix all problems, especially eduroam is still
wonky&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;bluetooth&lt;/strong&gt;&lt;br&gt;
purge &lt;code&gt;gnome-bluetooth&lt;/code&gt;&lt;br&gt;
install &lt;code&gt;bluez-tools bluetooth blueman bluez-hcidump python-bluez&lt;/code&gt;
and &lt;code&gt;pulseaudio-module-blueooth&lt;/code&gt; (for audio)&lt;br&gt;
run &lt;code&gt;sudo hciconfig hci0 reset&lt;/code&gt; and
&lt;code&gt;sudo pactl load-module module-blueotooth-discover&lt;/code&gt;&lt;br&gt;
if applicable, edit &lt;code&gt;/etc/bluetooth/main.conf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Vim cheat sheet</title>
      <link>https://ix5.org/tech/2014/vim-cheat-sheet/</link>
      <pubDate>Fri, 16 May 2014 00:00:00 +0000</pubDate>
      
      <guid>https://ix5.org/tech/2014/vim-cheat-sheet/</guid>
      <description>&lt;h2 id=&#34;folds&#34;&gt;Folds&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;za&lt;/code&gt; to &lt;strong&gt;toggle current fold&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zm&lt;/code&gt; to &lt;strong&gt;close&lt;/strong&gt;, &lt;code&gt;zr&lt;/code&gt; to &lt;strong&gt;open&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--
- `zM` to close all folds, `zr` to reduce one level  
- `zR` to open all folds, `zm` to open one level  
- visual select and then `zf` to manually fold
--&gt;
&lt;h2 id=&#34;windows&#34;&gt;Windows&lt;/h2&gt;
&lt;p&gt;from &lt;a href=&#34;http://vimdoc.sourceforge.net/htmldoc/windows.html&#34;&gt;windows&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;buffer&lt;/strong&gt; is the in-memory text of a file.&lt;br&gt;
A &lt;strong&gt;window&lt;/strong&gt; is a viewport on a buffer.&lt;br&gt;
A &lt;strong&gt;tab page&lt;/strong&gt; is a collection of windows.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Opening&lt;/strong&gt;: &lt;code&gt;CTRL-W&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt;(vert), &lt;code&gt;s&lt;/code&gt;(split/duplicate), &lt;code&gt;n&lt;/code&gt;(horiz)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Closing&lt;/strong&gt;: &lt;code&gt;CTRL-W&lt;/code&gt; and &lt;code&gt;q&lt;/code&gt;(quit), &lt;code&gt;c&lt;/code&gt;&lt;strong&gt;(close)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moving cursor&lt;/strong&gt;: &lt;code&gt;CTRL-W&lt;/code&gt; and up, down, left, right&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moving windows&lt;/strong&gt;: &lt;code&gt;CTRL-W CTRL-O&lt;/code&gt; make window the &lt;strong&gt;only&lt;/strong&gt;(maximize)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;plugin-mappings&#34;&gt;Plugin mappings&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;sensible&lt;/strong&gt;: &lt;code&gt;CTRL-u&lt;/code&gt; in insert mode: delete backwards, for real&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sneak&lt;/strong&gt;: &lt;code&gt;s&lt;/code&gt; or &lt;code&gt;S&lt;/code&gt; and then two letters for faster jumping, &lt;code&gt;;&lt;/code&gt; to repeat&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;table-mode&lt;/strong&gt;: &lt;code&gt;&amp;lt;leader&amp;gt;tm&lt;/code&gt; to toggle, &lt;code&gt;&amp;lt;leader&amp;gt;tr&lt;/code&gt; to realign,
&lt;code&gt;SHIFT-jklö&lt;/code&gt; to jump table cells&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;multiple cursors&lt;/strong&gt;: &lt;code&gt;CTRL-n&lt;/code&gt; to select word, &lt;code&gt;CTRL-p&lt;/code&gt; for undo, &lt;code&gt;CTRL-x&lt;/code&gt;
to skip the current one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Settings in vimrc&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::vim
&amp;quot; vimrc
&amp;quot; Remember last position
if has(&amp;quot;autocmd&amp;quot;)
  au BufReadPost * if line(&amp;quot;&#39;\&amp;quot;&amp;quot;) &amp;gt; 1 &amp;amp;&amp;amp; line(&amp;quot;&#39;\&amp;quot;&amp;quot;)
  \ &amp;lt;= line(&amp;quot;$&amp;quot;) | exe &amp;quot;normal! g&#39;\&amp;quot;&amp;quot; | endif
endif
&amp;quot; set pyton3
let g:python3_host_prog = &#39;/usr/bin/python3&#39;
&amp;quot; highlighting
hi Search cterm=black ctermfg=white ctermbg=red
&amp;quot; German keyboard layout
nnoremap j h
nnoremap k j
nnoremap l k
nnoremap ö l
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;movement&#34;&gt;Movement&lt;/h2&gt;
&lt;p&gt;see &lt;a href=&#34;http://vimdoc.sourceforge.net/htmldoc/scroll.html&#34;&gt;scroll&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;scroll line for line: &lt;code&gt;CTRL-e&lt;/code&gt;(up) &lt;code&gt;CTRL-y&lt;/code&gt;(down)&lt;/li&gt;
&lt;li&gt;scroll window half a screen: &lt;code&gt;CTRL-u&lt;/code&gt;(up) &lt;code&gt;CTRL-d&lt;/code&gt;(down)&lt;/li&gt;
&lt;li&gt;scroll full windows: &lt;code&gt;SHIFT-UP&lt;/code&gt; and &lt;code&gt;SHITFT-DOWN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;move line to top of window: &lt;code&gt;z-ENTER&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jump back&lt;/strong&gt;
&lt;code&gt;CTRL-o&lt;/code&gt; (and &lt;code&gt;CTRL-i&lt;/code&gt; for forward)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move to last position&lt;/strong&gt;
&lt;code&gt;&#39;&#39;&lt;/code&gt; or use double backticks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;delete&lt;/strong&gt;(in insert move): like in &lt;code&gt;fish&lt;/code&gt;:&lt;br&gt;
&lt;code&gt;CTRL-k&lt;/code&gt; to end, &lt;code&gt;CTRL-u&lt;/code&gt; to start,
&lt;code&gt;CTRL-w&lt;/code&gt; to delete word&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CTRL-h&lt;/code&gt; for backspace, &lt;code&gt;CTRL-j&lt;/code&gt; for enter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;run single command in insert mode&lt;/strong&gt;: &lt;code&gt;CTRL-O&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;deleting&lt;/strong&gt;(normal)(swap &lt;code&gt;a&lt;/code&gt; for &lt;code&gt;i&lt;/code&gt; for &lt;em&gt;inner&lt;/em&gt;):&lt;br&gt;
&lt;strong&gt;swap &lt;code&gt;c&lt;/code&gt; for &lt;code&gt;d&lt;/code&gt;: deletng, for &lt;code&gt;v&lt;/code&gt;: visual select, for &lt;code&gt;y&lt;/code&gt;: &amp;lsquo;copy&amp;rsquo;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ciw&lt;/code&gt;: change in word&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cis&lt;/code&gt;: change in sentence&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cib&lt;/code&gt; and &lt;code&gt;diB&lt;/code&gt;: change &lt;code&gt;()&lt;/code&gt; and &lt;code&gt;{}&lt;/code&gt; blocks&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cip&lt;/code&gt;: change in paragraph&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cit&lt;/code&gt;: change in tags(html)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;D&lt;/code&gt;&lt;/strong&gt; to delete from cursor to end of line&lt;/li&gt;
&lt;li&gt;move by whole words(no whitespace): &lt;code&gt;W&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;()&lt;/code&gt;, &lt;code&gt;{}&lt;/code&gt;: jump sentences, paragraphs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;H M L&lt;/code&gt;: move to top, middle, bottom of viewport&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;marks&lt;/strong&gt;:
&lt;code&gt;m(register)&lt;/code&gt;: mark point (here: &lt;code&gt;x&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&#39;x&lt;/code&gt;(single quote): jump to point(my mapping, default is backtick)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pasting&lt;/strong&gt;: &lt;code&gt;p&lt;/code&gt; after cursor, &lt;code&gt;P&lt;/code&gt; before cursor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CTRL-r-x&lt;/code&gt; to insert from register &lt;code&gt;x&lt;/code&gt; while in insert mode&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;very-useful&#34;&gt;Very useful&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;wrap lines&lt;/strong&gt;
visual select and then &lt;code&gt;gq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;use previous selection&lt;/strong&gt;
&lt;code&gt;gv&lt;/code&gt; for selecting previous visual selection
&lt;code&gt;gi&lt;/code&gt; to go into insert mode in previous position&lt;/li&gt;
&lt;li&gt;&lt;code&gt;o&lt;/code&gt; in visual mode jumps to other end of selection&lt;/li&gt;
&lt;li&gt;&lt;code&gt;=&lt;/code&gt; to &lt;strong&gt;reformat&lt;/strong&gt; text&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ciw&#39;&#39;P&lt;/code&gt;: enclose in quotes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;general&#34;&gt;General&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;get out of &amp;ldquo;completion mode&amp;rdquo; / resume flow control&lt;/strong&gt;
&lt;code&gt;CTRL-q&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;save and quit vim&lt;/strong&gt;
&lt;code&gt;ZZ&lt;/code&gt;, to only quit: &lt;code&gt;ZQ&lt;/code&gt;, to write all files and quit: &lt;code&gt;:xa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;escape&lt;/strong&gt;
&lt;code&gt;CTRL-c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;indents&lt;/strong&gt;
use &lt;code&gt;CTRL-i&lt;/code&gt;(indent) and &lt;code&gt;CTRL-d&lt;/code&gt;(remove indent) in insert move,&lt;br&gt;
use &lt;code&gt;&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;&lt;/code&gt;  in visual mode(once) and in normal(press twice)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jump to line&lt;/strong&gt;
&lt;code&gt;[line nr], G&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;recording&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;q [letter]&lt;/code&gt; to start recording&lt;br&gt;
&lt;code&gt;q&lt;/code&gt; to stop, &lt;code&gt;@ [letter]&lt;/code&gt; to play back&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;parenthesis&lt;/strong&gt; &lt;code&gt;([{&lt;/code&gt; &lt;strong&gt;jumping&lt;/strong&gt;
&lt;code&gt;%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;manipulate multiple lines&lt;/strong&gt;
use visual selection and then &lt;code&gt;:norm &amp;lt;command&amp;gt;&lt;/code&gt;, e.g. &lt;code&gt;:&#39;&amp;lt;,&#39;&amp;gt;norm A,&lt;/code&gt;&lt;br&gt;
or block(&lt;code&gt;CTRL-v&lt;/code&gt;) select and then &lt;code&gt;$A&amp;lt;text&amp;gt;&lt;/code&gt; to append to all lines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;numbers&lt;/strong&gt;
&lt;code&gt;CTRL-a&lt;/code&gt; and &lt;code&gt;CTRL-x&lt;/code&gt; increment and decrement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;netrw&lt;/strong&gt;
use &lt;code&gt;CTRL-o&lt;/code&gt; and &lt;code&gt;CTRL-i&lt;/code&gt; to switch, use &lt;code&gt;%&lt;/code&gt; to create a file&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;replacing/&amp;lsquo;substituting&amp;rsquo;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;set &lt;code&gt;incsearch&lt;/code&gt; and then search
&lt;code&gt;/oldstring&lt;/code&gt;, replace with &lt;code&gt;%s//newstring/&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;:s/oldstring/newstring&lt;/code&gt; (only once)&lt;br&gt;
&lt;code&gt;:s/oldstring/newstring/gic&lt;/code&gt;: global, ignore case and confirm each
&lt;code&gt;:[startline],[endline]s/oldstring/newstring/g&lt;/code&gt; replace only between
specified lines&lt;br&gt;
&lt;code&gt;&amp;amp;&lt;/code&gt;: **repeat last subsitution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;writing&lt;/strong&gt;&lt;br&gt;
visual selection only writes the selected part&lt;br&gt;
wr
&lt;code&gt;:r&lt;/code&gt; loads file, can be combined with &lt;code&gt;!&amp;lt;command&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;windows&lt;/strong&gt;
&lt;code&gt;CTRL-W CTRL-W&lt;/code&gt; switch windows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;neat&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CTRL-X [o p n]&lt;/code&gt; auto-complete and more&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~&lt;/code&gt; toggle upper/lowercase, in visual mode: &lt;code&gt;u&lt;/code&gt; and &lt;code&gt;U&lt;/code&gt; for
lower/uppercasing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:bro ol&lt;/code&gt; browse oldfiles&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dictionary&lt;/strong&gt;&lt;br&gt;
use &lt;code&gt;zg&lt;/code&gt; on a word to add it to dictionary&lt;br&gt;
located in &lt;code&gt;~/&amp;lt;vimdir&amp;gt;/spell/en.utf-8.add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fix encoding&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;:set bomb&lt;/code&gt;&lt;br&gt;
&lt;code&gt;:set fileencoding(s)=utf-8&lt;/code&gt;&lt;br&gt;
&lt;code&gt;:w&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;whitespace&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;%le&lt;/code&gt; for removing indents&lt;br&gt;
&lt;code&gt;g/^$/d&lt;/code&gt; for removing blank lines&lt;br&gt;
&lt;code&gt;:%s/\s\+$//&lt;/code&gt; for removing trailing whitespace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;centering&lt;/strong&gt;
&lt;code&gt;:ce columns&lt;/code&gt;: center with columns width&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;abbreviations&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ab lw Long word&lt;/code&gt;: expand &amp;rsquo;lw&amp;rsquo; to &amp;ldquo;Long word&amp;rdquo;
&lt;code&gt;una lw&lt;/code&gt;: unset the abbreviation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tabs to spaces&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;:retab&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;mappings&#34;&gt;Mappings&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;::vim
:nmap - Display normal mode maps
:imap - Display insert mode maps
:vmap - Display visual and select mode maps
:smap - Display select mode maps
:xmap - Display visual mode maps
:cmap - Display command-line mode maps
:omap - Display operator pending mode maps
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;todo&#34;&gt;Todo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use registers more often&lt;/li&gt;
&lt;li&gt;Use ci{ and the like more often&lt;/li&gt;
&lt;li&gt;Jump by &lt;code&gt;s&lt;/code&gt; and &lt;code&gt;f&lt;/code&gt; instead of hjkl&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;CTRL-h&lt;/code&gt; and &lt;code&gt;CTRL-j&lt;/code&gt; for backspace and enter&lt;/li&gt;
&lt;li&gt;map NOP to unused extension mappings for uncluttering :map and no surprises&lt;/li&gt;
&lt;li&gt;Explain d/D, y/Y, c/C, p/P, b/B, i/I, &amp;hellip; in various modes&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
