<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<title>Adventurous Computing</title>
	<subtitle>A blog by Cyryl Płotnicki about programming, hardware, and adventures in computing</subtitle>
	<link rel="self" type="application/atom+xml" href="https://blog.cyplo.dev/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://blog.cyplo.dev"/>
  
	<updated>2025-12-15T00:00:00+00:00</updated>
	
	<id>https://blog.cyplo.dev/feed.xml</id>
	<entry xml:lang="en">
		<title>Stopping systemd services under memory pressure</title>
		<published>2025-12-15T00:00:00+00:00</published>
		<updated>2025-12-15T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2025/12/stopping-services-under-memory-pressure/"/>
		<id>https://blog.cyplo.dev/posts/2025/12/stopping-services-under-memory-pressure/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2025/12/stopping-services-under-memory-pressure/">&lt;p&gt;Do you have your &quot;favourite&quot; server that is responsible for just a tiny number too many things ?&lt;&#x2F;p&gt;
&lt;p&gt;I know I have one, it&#x27;s my CI runner, but also serves as a platform to experiment with local LLMs, but also is a Nix builder for all other machines I have. Lots of responsiblities ! Luckily, I don&#x27;t need it to do all of those things at the same time, it just didn&#x27;t know that previously.
I would run a local build, it would get sent to that machine, but that machine would have e.g. an LLM loaded in memory and the build would OOM.
I would then need to go there, stop the LLM service and restart the build.
What if a computer could do it all by itself ?!&lt;&#x2F;p&gt;
&lt;p&gt;I present to you - a simple service that monitors available memory and based on that starts and stops other services dynamically.
The code is in Nix, that helps with keeping the service code and definition in one place, making sure paths make sense etc.
However, there is nothing fundamentally Nix specific to the service itself, you can just take the Bash code and use it anywhere.&lt;&#x2F;p&gt;
&lt;p&gt;Speaking of usage (from Nix) you can use it like so; if you want to, say, stop LLM server if available mem is under 8GB and start it again when it&#x27;s over whatever LLM needs (in my case it&#x27;s 64GB):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;services&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;custom&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;memoryManager&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;enable&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;stopThresholdMB&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;8192&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;startThresholdMB&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;llm&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;memoryRequirementMB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;checkIntervalSeconds&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;managedServices&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;llama-cpp-fast&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And this gives you&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;txt&quot; class=&quot;language-txt z-code&quot;&gt;&lt;code class=&quot;language-txt&quot; data-lang=&quot;txt&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Dec 15 12:05:22 memory-manager: Memory: 7543MB available | Decision: STOP (below 8192MB)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Dec 15 12:05:22 memory-manager: LOW MEMORY: Stopping llama-cpp-fast
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Dec 15 12:05:23 memory-manager: llama-cpp-fast stopped successfully
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Dec 15 12:08:53 memory-manager: Memory: 88902MB available | Decision: START (above 65536MB)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Dec 15 12:08:53 memory-manager: MEMORY OK: Starting llama-cpp-fast
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Dec 15 12:08:54 memory-manager: llama-cpp-fast started successfully
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And here is the module definition itself. The code is not the prettiest but it does help a lot already !&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;...
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-function z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-function z-nix&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;with&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;lib&lt;&#x2F;span&gt;;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;let&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;cfg&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;custom&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;memoryManager&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;monitorScript&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;writeShellScript&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;memory-manager&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-other z-start z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    set -euo pipefail
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    STOP_THRESHOLD_MB=&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-nix&quot;&gt;toString&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;stopThresholdMB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    START_THRESHOLD_MB=&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-nix&quot;&gt;toString&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;startThresholdMB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    CHECK_INTERVAL=&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-nix&quot;&gt;toString&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;checkIntervalSeconds&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    MANAGED_SERVICES=&amp;quot;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;concatStringsSep&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;managedServices&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    STATE_DIR=&amp;quot;&#x2F;run&#x2F;memory-manager&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    DEBUG=&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;debug&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;th&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;en&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;true&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;el&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;se&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;false&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    mkdir -p &amp;quot;$STATE_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    log() {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      echo &amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    get_available_memory_mb() {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;gawk&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;awk &amp;#39;&#x2F;^MemAvailable:&#x2F; { printf &amp;quot;%d&amp;quot;, $2 &#x2F; 1024 }&amp;#39; &#x2F;proc&#x2F;meminfo
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    is_service_stopped_by_us() {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      local service=&amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      [ -f &amp;quot;$STATE_DIR&#x2F;$service.stopped&amp;quot; ]
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    mark_service_stopped() {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      local service=&amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      touch &amp;quot;$STATE_DIR&#x2F;$service.stopped&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    mark_service_started() {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      local service=&amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      rm -f &amp;quot;$STATE_DIR&#x2F;$service.stopped&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    stop_service() {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      local service=&amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      if &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;systemctl is-active --quiet &amp;quot;$service&amp;quot;; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        log &amp;quot;LOW MEMORY: Stopping $service&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;systemctl disable --runtime --now &amp;quot;$service&amp;quot; 2&amp;gt;&#x2F;dev&#x2F;null || true
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        if ! &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;systemctl is-active --quiet &amp;quot;$service&amp;quot;; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          mark_service_stopped &amp;quot;$service&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          log &amp;quot;$service stopped successfully&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        else
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          log &amp;quot;WARNING: Failed to stop $service&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    start_service() {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      local service=&amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      if is_service_stopped_by_us &amp;quot;$service&amp;quot;; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        log &amp;quot;MEMORY OK: Starting $service&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;systemctl enable --runtime &amp;quot;$service&amp;quot; 2&amp;gt;&#x2F;dev&#x2F;null || true
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;systemctl start &amp;quot;$service&amp;quot; 2&amp;gt;&#x2F;dev&#x2F;null || true
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        if &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;systemctl is-active --quiet &amp;quot;$service&amp;quot;; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          mark_service_started &amp;quot;$service&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          log &amp;quot;$service started successfully&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        else
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          log &amp;quot;WARNING: Failed to start $service&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    log &amp;quot;Memory manager started&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    log &amp;quot;Stop threshold: &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{STOP_THRESHOLD_MB}MB, Start threshold: &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{START_THRESHOLD_MB}MB&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    log &amp;quot;Managed services: $MANAGED_SERVICES&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    log &amp;quot;Check interval: &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{CHECK_INTERVAL}s, Debug: $DEBUG&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    while true; do
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      AVAILABLE_MB=$(get_available_memory_mb)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      if [ &amp;quot;$AVAILABLE_MB&amp;quot; -lt &amp;quot;$STOP_THRESHOLD_MB&amp;quot; ]; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        DECISION=&amp;quot;STOP (below &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{STOP_THRESHOLD_MB}MB)&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        log &amp;quot;Memory: &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{AVAILABLE_MB}MB available | Decision: $DECISION&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        for service in $MANAGED_SERVICES; do
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          stop_service &amp;quot;$service&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        done
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      elif [ &amp;quot;$AVAILABLE_MB&amp;quot; -gt &amp;quot;$START_THRESHOLD_MB&amp;quot; ]; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        DECISION=&amp;quot;START (above &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{START_THRESHOLD_MB}MB)&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        NEEDS_START=false
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        for service in $MANAGED_SERVICES; do
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          if is_service_stopped_by_us &amp;quot;$service&amp;quot;; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;            NEEDS_START=true
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;            break
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        done
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        if [ &amp;quot;$NEEDS_START&amp;quot; = &amp;quot;true&amp;quot; ]; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          log &amp;quot;Memory: &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{AVAILABLE_MB}MB available | Decision: $DECISION&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          for service in $MANAGED_SERVICES; do
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;            start_service &amp;quot;$service&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          done
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        else
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          log &amp;quot;Memory: &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{AVAILABLE_MB}MB available | Decision: OK (services running)&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      else
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        if [ &amp;quot;$DEBUG&amp;quot; = &amp;quot;true&amp;quot; ]; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          DECISION=&amp;quot;WAIT (between &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{STOP_THRESHOLD_MB}MB and &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{START_THRESHOLD_MB}MB)&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          SERVICE_STATUS=&amp;quot;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          for service in $MANAGED_SERVICES; do
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;            if &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;systemctl is-active --quiet &amp;quot;$service&amp;quot;; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;              SERVICE_STATUS=&amp;quot;$SERVICE_STATUS $service=running&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;            elif is_service_stopped_by_us &amp;quot;$service&amp;quot;; then
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;              SERVICE_STATUS=&amp;quot;$SERVICE_STATUS $service=stopped-by-us&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;            else
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;              SERVICE_STATUS=&amp;quot;$SERVICE_STATUS $service=stopped&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;            fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          done
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;          log &amp;quot;Memory: &lt;span class=&quot;z-constant z-character z-escape z-nix&quot;&gt;&amp;#39;&amp;#39;$&lt;&#x2F;span&gt;{AVAILABLE_MB}MB available | Decision: $DECISION | Services:$SERVICE_STATUS&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      fi
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      sleep &amp;quot;$CHECK_INTERVAL&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    done
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-string z-other z-end z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;in&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;options&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;services&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;custom&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;memoryManager&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;enable&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mkEnableOption&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;memory pressure manager that stops&#x2F;starts services based on available memory&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;stopThresholdMB&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mkOption&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;types&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;default&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;8192&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;description&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Stop managed services when available memory drops below this threshold (in MB)&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;example&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;4096&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;startThresholdMB&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mkOption&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;types&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;default&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;16384&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;description&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Restart managed services when available memory rises above this threshold (in MB). Should be higher than stopThresholdMB to prevent flapping.&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;example&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;32768&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;checkIntervalSeconds&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mkOption&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;types&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;int&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;default&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;10&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;description&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;How often to check memory availability (in seconds)&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;example&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;30&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;managedServices&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mkOption&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;types&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;listOf&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;types&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;str&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;default&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;description&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;List of systemd service names to manage (without .service suffix)&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;example&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;llama-cpp-fast&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;debug&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mkOption&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;types&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;bool&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;default&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;description&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Enable debug logging (logs WAIT states on every check interval)&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;config&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mkIf&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;enable&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;assertions&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;assertion&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;startThresholdMB&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;stopThresholdMB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;message&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;services.custom.memoryManager.startThresholdMB must be greater than stopThresholdMB to prevent flapping&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;assertion&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;managedServices&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;!=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;message&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;services.custom.memoryManager.managedServices must not be empty when enabled&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;services&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;memory-manager&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;description&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Memory Pressure Service Manager&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;wantedBy&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;multi-user.target&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;after&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;multi-user.target&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;serviceConfig&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;Type&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;simple&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;Restart&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;always&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;RestartSec&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;10s&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;ExecStart&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;monitorScript&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;RuntimeDirectory&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;memory-manager&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;RuntimeDirectoryMode&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;0755&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Long posts in Mastodon, but now declarative !</title>
		<published>2025-12-06T00:00:00+00:00</published>
		<updated>2025-12-06T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2025/12/mastodon-limit-nix/"/>
		<id>https://blog.cyplo.dev/posts/2025/12/mastodon-limit-nix/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2025/12/mastodon-limit-nix/">&lt;p&gt;So much to say on the Fediverse and so little characters of text per post !
Well, at least on Mastodon.
But fear not - someone smarter than me &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;it-notes.dragas.net&#x2F;2024&#x2F;10&#x2F;09&#x2F;2024-modifying-limits-in-mastodon-4-3&#x2F;&quot;&gt;figured out what files to patch to increase the limit&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;As I am increasingly lazy, I dreaded the change as it would mean I would need to reapply the patch whenever I redeploy the server, which is more often than I want to admit.&lt;&#x2F;p&gt;
&lt;p&gt;Nix to the rescue !&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-function z-2 z-nix&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;inputs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;... &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-function z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-function z-nix&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;let&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mastodonCharacterLimit&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;5000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mastodonBase&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;inputs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nixpkgs-nixos-unstable&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;legacyPackages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;system&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodon&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;package&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonBase&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;overrideAttrs&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function z-4 z-nix&quot;&gt;old&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-function z-nix&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;postPatch&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;old&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;postPatch&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;or&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;)&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-other z-start z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      substituteInPlace app&#x2F;javascript&#x2F;mastodon&#x2F;features&#x2F;compose&#x2F;containers&#x2F;compose_form_container.js \
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        --replace-fail &amp;quot;max_characters&amp;#39;], 500)&amp;quot; &amp;quot;max_characters&amp;#39;], &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-nix&quot;&gt;toString&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonCharacterLimit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;)&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      substituteInPlace app&#x2F;validators&#x2F;status_length_validator.rb \
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;        --replace-fail &amp;quot;MAX_CHARS = 500&amp;quot; &amp;quot;MAX_CHARS = &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-nix&quot;&gt;toString&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonCharacterLimit&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-string z-other z-end z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;in&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;services&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mastodon&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;enable&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-inherit z-nix&quot;&gt;inherit&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-single z-nix&quot;&gt;package&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-inherit z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that is all ! Doctor Doom toots as he pleases !
See you on the fedi - ping me at &lt;code&gt;@cyplo@peninsula.industries&lt;&#x2F;code&gt; !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Creating a base OCI image for Nix flake builds within Gitea&#x2F;Forgejo</title>
		<published>2023-09-18T00:00:00+00:00</published>
		<updated>2023-09-18T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2023/09/act-runner-image/"/>
		<id>https://blog.cyplo.dev/posts/2023/09/act-runner-image/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2023/09/act-runner-image/">&lt;p&gt;I&#x27;ve been moving more and more of my infrastructure to be self-hosted recently.
Part of that involves setting up CI jobs for testing and publishing artifacts, mostly rust crates but also this very blog.&lt;&#x2F;p&gt;
&lt;p&gt;I really wanted to re-use my existing Nix flakes for those projects, this way I know my &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;blog&#x2F;src&#x2F;branch&#x2F;main&#x2F;flake.nix#L15&quot;&gt;local dev env&lt;&#x2F;a&gt; would be the same env then &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;blog&#x2F;src&#x2F;branch&#x2F;main&#x2F;.forgejo&#x2F;workflows&#x2F;build.yaml#L14&quot;&gt;used on CI&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I am &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;explore&#x2F;&quot;&gt;self-hosting&lt;&#x2F;a&gt; a Gitea instance (will probably be migrating to Forgejo) and it uses a &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;docs.gitea.com&#x2F;usage&#x2F;actions&#x2F;overview&#x2F;&quot;&gt;CI system&lt;&#x2F;a&gt; built to resemble &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;actions&quot;&gt;Github actions&lt;&#x2F;a&gt; - basically you run your jobs as containers and within those you can run arbitrary commands. You can also take advantage of the existing ecosystem of &lt;code&gt;actions&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted a base image that would have on one hand &lt;code&gt;nix&lt;&#x2F;code&gt; with &lt;code&gt;flakes&lt;&#x2F;code&gt; enabled but on the other hand would be compatible with running popular actions from other authors. This meant having &lt;code&gt;nix&lt;&#x2F;code&gt;, &lt;code&gt;git&lt;&#x2F;code&gt; but also &lt;code&gt;nodejs&lt;&#x2F;code&gt; available amongts other things. I couldn&#x27;t find one that would have both, so I built one !&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m building on top of the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;docker-nixpkgs&#x2F;blob&#x2F;master&#x2F;images&#x2F;nix-flakes&#x2F;default.nix&quot;&gt;definitions&lt;&#x2F;a&gt; from &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;docker-nixpkgs&quot;&gt;docker-nixpkgs&lt;&#x2F;a&gt; and just tweaking them to add the things needed for &lt;code&gt;actions&lt;&#x2F;code&gt; and also for the definition itself to be a flake, for an added flavour. This allows me to add multiple image definitions in the same repo and the build them independently when needed.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s the whole definition in all of its glory, defining 2 images - &lt;code&gt;hello&lt;&#x2F;code&gt; and &lt;code&gt;flakes-action&lt;&#x2F;code&gt; - the &lt;code&gt;hello&lt;&#x2F;code&gt; being a test image for testing the process itself and &lt;code&gt;flakes-action&lt;&#x2F;code&gt; is the one I&#x27;m using on CI currently.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;description&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;docker base images&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;inputs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;nixpkgs&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;url&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;github:nixos&#x2F;nixpkgs&#x2F;nixos-unstable&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;flake-utils&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;url&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;github:numtide&#x2F;flake-utils&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;outputs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-entity z-function z-2 z-nix&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;nixpkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;flake-utils&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-entity z-function z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-function z-nix&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;flake-utils&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;eachDefaultSystem&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-function z-4 z-nix&quot;&gt;system&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-function z-nix&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;let&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-nix&quot;&gt;import&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nixpkgs&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-other z-inherit z-nix&quot;&gt;inherit&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-single z-nix&quot;&gt;system&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-inherit z-nix&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;pkgsStatic&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgsStatic&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;lib&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;in&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;packages&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;            &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;hello&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;dockerTools&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;buildImage&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;name&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;hello-docker&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;config&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;Cmd&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;hello&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;hello&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;            &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;            &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;flakes-action&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;dockerTools&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;buildImageWithNixDb&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;name&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;flakes-action&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;contents&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;with&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-string z-unquoted z-path z-nix&quot;&gt;.&#x2F;root&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;bash&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;coreutils&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;curl&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;gawk&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;gitFull&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;git-lfs&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;gnused&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nodejs&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;wget&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;sudo&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nixFlakes&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cacert&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;gnutar&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;gzip&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;openssh&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;xz&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;writeTextFile&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;name&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;nix.conf&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;destination&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;etc&#x2F;nix&#x2F;nix.conf&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;text&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-other z-start z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                    accept-flake-config = true
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                    experimental-features = nix-command flakes
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                  &lt;span class=&quot;z-punctuation z-definition z-string z-other z-end z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;)&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;extraCommands&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-other z-start z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                # for &#x2F;usr&#x2F;bin&#x2F;env
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                mkdir usr
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                ln -s ..&#x2F;bin usr&#x2F;bin
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                # make sure &#x2F;tmp exists
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                mkdir -m 1777 tmp
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                # need a HOME
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;                mkdir -vp root
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;              &lt;span class=&quot;z-punctuation z-definition z-string z-other z-end z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;config&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;Cmd&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;bin&#x2F;bash&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;Env&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;LANG=en_GB.UTF-8&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;ENV=&#x2F;etc&#x2F;profile.d&#x2F;nix.sh&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;BASH_ENV=&#x2F;etc&#x2F;profile.d&#x2F;nix.sh&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;NIX_BUILD_SHELL=&#x2F;bin&#x2F;bash&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;NIX_PATH=nixpkgs=&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-path z-nix&quot;&gt;.&#x2F;fake_nixpkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;PAGER=cat&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;PATH=&#x2F;usr&#x2F;bin:&#x2F;bin&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;SSL_CERT_FILE=&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;cacert&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;etc&#x2F;ssl&#x2F;certs&#x2F;ca-bundle.crt&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                  &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;USER=root&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;                &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;              &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;            &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you want to build this yourself you can:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; clone https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;base-images.git&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; base-images&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;nix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; build &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;.#flakes-action&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; load &lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; result &lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; this took me so much time, to realise I need `load` and not `import`...&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;docker tag &lt;span class=&quot;z-keyword z-control z-regexp z-set z-begin z-shell&quot;&gt;[&lt;&#x2F;span&gt;image id&lt;span class=&quot;z-keyword z-control z-regexp z-set z-end z-shell&quot;&gt;]&lt;&#x2F;span&gt; yourimage.repo&#x2F;base-images&#x2F;flakes-action:latest&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; push yourimage.repo&#x2F;base-images&#x2F;flakes-action:latest&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then to use on CI, an example of a Gitea CI config:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; class=&quot;language-yaml z-code&quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-constant z-language z-boolean z-yaml&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;push&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;jobs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;  &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;Publish&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;    &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;runs-on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;flakes-action&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;    &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;steps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;uses&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;actions&#x2F;checkout@v3&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;        &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Checkout&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-block z-sequence z-item z-yaml&quot;&gt;-&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;Build&lt;&#x2F;span&gt; 
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;        &lt;span class=&quot;z-string z-unquoted z-plain z-out z-yaml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-yaml&quot;&gt;run&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-mapping z-yaml&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-flow z-block-scalar z-literal z-yaml&quot;&gt;|&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-yaml&quot;&gt;&lt;span class=&quot;z-string z-unquoted z-block z-yaml&quot;&gt;          nix develop -c hugo --gc --minify
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It uses the image pushed and both a custom build script but also a well-known &lt;code&gt;checkout&lt;&#x2F;code&gt; action.&lt;&#x2F;p&gt;
&lt;p&gt;You need to teach your Gitea runner about the image first btw; if you use NixOS for the runner definition, it could look like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;services&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;gitea-actions-runner&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;instances&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;boltyone&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;enable&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;url&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;https:&#x2F;&#x2F;yourgitea.domain&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;tokenFile&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;sops&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;secrets&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;gitea-runner-token&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;name&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;bolty one&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;labels&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;flakes-action:docker:&#x2F;&#x2F;yourimage.repo&#x2F;base-images&#x2F;flakes-action:latest&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;ubuntu-kinetic:docker:&#x2F;&#x2F;ubuntu:kinetic&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;linux_amd64:host&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;P.S. shoutout to &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;nixery.dev&#x2F;&quot;&gt;nixery&lt;&#x2F;a&gt; that I tried first and the resulting images were just a bit off as it was not easy to get them to support flakes. I think it&#x27;s an amazing tool in its own right though and you should try it, you can do things like &lt;code&gt;docker run -ti nixery.dev&#x2F;shell&#x2F;git&#x2F;htop bash&lt;&#x2F;code&gt; and it will happily just give you an image with those arbitrary nixpkgs included !&lt;&#x2F;p&gt;
&lt;p&gt;Happy hacking !&lt;&#x2F;p&gt;
&lt;p&gt;Discuss this post on the Fediverse (original post no longer available: peninsula.industries&#x2F;@cyplo&#x2F;111087014413124274)&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>This blog is now self-hosted !</title>
		<published>2023-08-19T00:00:00+00:00</published>
		<updated>2023-08-19T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2023/08/selfhosting/"/>
		<id>https://blog.cyplo.dev/posts/2023/08/selfhosting/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2023/08/selfhosting/">&lt;p&gt;This is just a quick info that this blog is now self-hosted by yours truly. I&#x27;m using a small server at &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.mythic-beasts.com&#x2F;&quot;&gt;Mythic Beasts&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I have a small &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;blog&#x2F;actions&quot;&gt;CI situation&lt;&#x2F;a&gt; going on via (self-hosted) Gitea Actions, it &lt;code&gt;rsync&lt;&#x2F;code&gt;s the contents to the server. Good old &lt;code&gt;nginx&lt;&#x2F;code&gt; + &lt;code&gt;rsync&lt;&#x2F;code&gt; and that&#x27;s it.&lt;&#x2F;p&gt;
&lt;p&gt;I took this as an opportunity to hook up &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;wjdp&#x2F;htmltest&quot;&gt;htmltest&lt;&#x2F;a&gt; and it highlighted that a lot of places I linked to no longer exist or have moved. I&#x27;ve &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;blog&#x2F;commit&#x2F;df6aba4c4687918f31593e70048c28cf92482b09&quot;&gt;updated&lt;&#x2F;a&gt; all 13 years worth of blog posts and I&#x27;m happy to report that there&#x27;s no longer any dead link present !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Containerised Mastodon server on NixOS</title>
		<published>2023-01-15T00:00:00+00:00</published>
		<updated>2023-01-15T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2023/01/mastodon-nixos/"/>
		<id>https://blog.cyplo.dev/posts/2023/01/mastodon-nixos/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2023/01/mastodon-nixos/">&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;If you&amp;#39;re here to learn about how to set up a Mastodon server on NixOS the easy way - you can use services.mastodon.enable = true; and take it from there !
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;This post does describe a bit more convoluted setup than that.
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I&#x27;ve been on the fediverse on and off since &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;friendi.ca&#x2F;&quot;&gt;friendi.ca&lt;&#x2F;a&gt; started to be a thing.
I remember hosting an instance at ponk.pink that suddenly got popular and the server melted away while I was apologising to the users.
I can see someone bought the domain to host some psychedelic My Little Pony stuff, I&#x27;m all for that.&lt;&#x2F;p&gt;
&lt;p&gt;I moved to &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;todon.nl&#x2F;&quot;&gt;todon.nl&lt;&#x2F;a&gt; when it got started and was quite happy there - check it out if you&#x27;re looking for an instance !
The itch was there though, what if I host my own small cozy place on the fediverse myself.
I knew I didn&#x27;t have as much time to do server admin, so I decided to start small, with a single user instance and use the power of NixOS to help with maintenance.&lt;&#x2F;p&gt;
&lt;p&gt;Here is my full config - hosting Mastodon under the apex domain of &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;peninsula.industries&#x2F;&quot;&gt;peninsula.industries&lt;&#x2F;a&gt;, Mastodon is running inside a systemd container and the config is using nix-sops to store the secrets.
Few things that were unexpected&#x2F;of note&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I needed to create the folder structure with correct permissions so that Mastodon starts normally. This in turn required setting up users and groups both on host and inside the container so that their uids and gids match.&lt;&#x2F;li&gt;
&lt;li&gt;I&#x27;m decrypting secrets on the host and making them available read-only to the container. Not sure if this is better or worse than having sops inside of the container, but I was having some trouble using sops module from there, so left it as it is for now - something to look into in the future&lt;&#x2F;li&gt;
&lt;li&gt;I needed to change the postgres port that is running inside of the Mastodon container because I had another postgres on this host already.&lt;&#x2F;li&gt;
&lt;li&gt;If you&#x27;re gonna be playing with this a lot, you might need to remove the container and its data and start from scratch - you can do so by doing:
&lt;ul&gt;
&lt;li&gt;remove the container definition and &lt;code&gt;nixos-rebuild switch&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;rm -fr &#x2F;var&#x2F;lib&#x2F;nixos-containers&#x2F;mastodon&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;to use Mastodon CLI you need to be running it as a correct user and within the Nix-changed env:&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;nixos-container&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; root-login mastodon&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;u&lt;&#x2F;span&gt; mastodon bash&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-source z-shell&quot;&gt;source&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; mastodon-env&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;RAILS_ENV&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;production&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;tootctl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The below can use some refactoring, there is some weird repetition in some places still&lt;&#x2F;li&gt;
&lt;li&gt;You can find the newest version of this configuration at &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;boxes&#x2F;cupsnet&#x2F;mastodon.nix&quot;&gt;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;boxes&#x2F;cupsnet&#x2F;mastodon.nix&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Share your thoughts on the fedi thread for this article (original post no longer available: peninsula.industries&#x2F;@cyplo&#x2F;109692744740475900) !&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;inputs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;...
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-function z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-function z-nix&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;let&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;domain&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;peninsula.industries&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;streamingPort&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;55000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;webPort&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;55001&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;postgresPort&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;5433&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;path&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;var&#x2F;lib&#x2F;mastodon&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mailgunSmtpSecretName&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;mastodon-mailgun-smtp-password&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mailgunSmtpPasswordPath&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;run&#x2F;secrets&#x2F;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mailgunSmtpSecretName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mastodonDbSecretName&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;mastodon-db&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mastodonDbSecretPath&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;run&#x2F;secrets&#x2F;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonDbSecretName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;uid&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;2049&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;gid&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;3049&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;systemUserName&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;mastodon&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;systemGroupName&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;mastodon&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;users&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;users&lt;&#x2F;span&gt;.&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemUserName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-keyword z-other z-inherit z-nix&quot;&gt;inherit&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-single z-nix&quot;&gt;uid&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-inherit z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;isSystemUser&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;isNormalUser&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;group&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemGroupName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;groups&lt;&#x2F;span&gt;.&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemGroupName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-keyword z-other z-inherit z-nix&quot;&gt;inherit&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-single z-nix&quot;&gt;gid&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-inherit z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;members&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemUserName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;nginx&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;secretSettings&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;owner&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemUserName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;group&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemGroupName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;publicPath&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;public-system&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;package&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;inputs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nixpkgs-nixos-unstable&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;legacyPackages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;system&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodon&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;in&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;imports&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-path z-nix&quot;&gt;..&#x2F;nginx.nix&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;services&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;nginx&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;virtualHosts&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;domain&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;forceSSL&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;enableACME&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;root&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;package&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;public&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;locations&lt;&#x2F;span&gt;.&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;tryFiles&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;$uri @proxy&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;locations&lt;&#x2F;span&gt;.&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;system&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;alias&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;publicPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;locations&lt;&#x2F;span&gt;.&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;@proxy&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;proxyPass&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;http:&#x2F;&#x2F;127.0.0.1:&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-nix&quot;&gt;toString&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;webPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;proxyWebsockets&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;locations&lt;&#x2F;span&gt;.&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;api&#x2F;v1&#x2F;streaming&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;proxyPass&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;http:&#x2F;&#x2F;127.0.0.1:&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-nix&quot;&gt;toString&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;streamingPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;proxyWebsockets&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;sops&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;secrets&lt;&#x2F;span&gt;.&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mailgunSmtpSecretName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;sopsFile&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-path z-nix&quot;&gt;.&#x2F;mailgun.sops.yaml&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;path&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mailgunSmtpPasswordPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;secretSettings&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;sops&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;secrets&lt;&#x2F;span&gt;.&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonDbSecretName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;sopsFile&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-path z-nix&quot;&gt;.&#x2F;mastodon-db.sops.yaml&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;path&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonDbSecretPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;secretSettings&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-keyword z-other z-inherit z-nix&quot;&gt;inherit&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-single z-nix&quot;&gt;users&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-inherit z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;systemd&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;services&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mastodon-make-path&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;script&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-other z-start z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      mkdir -p &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      chown -R &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemUserName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;:&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemGroupName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      mkdir -p &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;publicPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      chmod -R o-rwx &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;publicPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      chmod -R g-rwx &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;publicPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      chmod -R g+X &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;publicPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      chmod -R g+r &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;publicPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;      chmod -R u+rwX &lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;publicPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-string z-other z-end z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;serviceConfig&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;Type&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;oneshot&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;before&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;container@mastodon.service&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;containers&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mastodon&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;autoStart&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;forwardPorts&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;containerPort&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;streamingPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;hostPort&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;streamingPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;containerPort&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;webPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;hostPort&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;webPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;bindMounts&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;hostPath&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;isReadOnly&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mailgunSmtpPasswordPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;hostPath&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mailgunSmtpPasswordPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;isReadOnly&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonDbSecretPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;hostPath&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonDbSecretPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;isReadOnly&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;config&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;config&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;lib&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;...
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-entity z-function z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-function z-nix&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;system&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;stateVersion&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;22.05&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;services&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;postgresql&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;port&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;postgresPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;users&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;users&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mutableUsers&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;allowNoPasswordLogin&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;services&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mastodon&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;enable&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-keyword z-other z-inherit z-nix&quot;&gt;inherit&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-single z-nix&quot;&gt;package&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-inherit z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;localDomain&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;domain&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;user&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemUserName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;group&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;systemGroupName&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;smtp&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;host&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;smtp.eu.mailgun.org&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;port&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;465&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;authenticate&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;user&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;postmaster@&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;domain&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;fromAddress&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Peninsula Industries Mastodon &amp;lt;mastodon@&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;domain&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&amp;gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;createLocally&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;passwordFile&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mailgunSmtpPasswordPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;extraConfig&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;SMTP_TLS&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;true&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;SMTP_ENABLE_STARTTLS_AUTO&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;true&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;SINGLE_USER_MODE&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;true&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;RAILS_SERVE_STATIC_FILES&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;true&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-keyword z-other z-inherit z-nix&quot;&gt;inherit&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-single z-nix&quot;&gt;streamingPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-inherit z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-keyword z-other z-inherit z-nix&quot;&gt;inherit&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-single z-nix&quot;&gt;webPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-inherit z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;configureNginx&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;enableUnixSocket&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;database&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;port&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;postgresPort&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;passwordFile&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mastodonDbSecretPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>How to use a non-default ssh port for a Nix distributed build host</title>
		<published>2022-11-01T00:00:00+00:00</published>
		<updated>2022-11-01T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2022/11/ssh-port-distributed-builds/"/>
		<id>https://blog.cyplo.dev/posts/2022/11/ssh-port-distributed-builds/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2022/11/ssh-port-distributed-builds/">&lt;p&gt;I wanted to host my ssh server on a different port than the default &lt;code&gt;22&lt;&#x2F;code&gt;, this allows me to skip on some spam in the logs, as the default port gets scanned quite often.
By changing that on the server I broke distributing my nix builds, as they were using the default port as well.
It took me a while to figure out how to configure the port the builder would use so I thought I would share here.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s an example of a &lt;em&gt;client-side&lt;&#x2F;em&gt; configuration -  using a build server &lt;code&gt;buildHostName&lt;&#x2F;code&gt; with a user named &lt;code&gt;nix-builder&lt;&#x2F;code&gt;, connecting via ssh to port &lt;code&gt;1234&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;programs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;ssh&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;extraConfig&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-other z-start z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;    Host buildHostName
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;	HostName buildHostName
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;	Port 1234
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;	StrictHostKeyChecking=accept-new
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-string z-quoted z-other z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-other z-end z-nix&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nix&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;buildMachines&lt;&#x2F;span&gt; &lt;span class=&quot;z-invalid z-illegal&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;hostName&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;buildHostName&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;sshUser&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;nix-builder&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;sshKey&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;path&#x2F;to&#x2F;key&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;systems&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;x86_64-linux&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;maxJobs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;speedFactor&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-nix&quot;&gt;2&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;supportedFeatures&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;kvm&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;mandatoryFeatures&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-invalid z-illegal&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>legdur - keep your legacy durable</title>
		<published>2022-06-25T00:00:00+00:00</published>
		<updated>2022-06-25T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2022/06/legdur/"/>
		<id>https://blog.cyplo.dev/posts/2022/06/legdur/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2022/06/legdur/">&lt;p&gt;Hey, I wrote a thing. Thing being a piece of software.
I have a collection of photos &amp;amp; documents that I really care about.
I synch them between computers using syncthing and also run backups regularly.
What I didn&#x27;t have was a way to quickly detect bitrot.&lt;&#x2F;p&gt;
&lt;p&gt;Enter &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;legdur&quot;&gt;legdur&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;legdur&lt;&#x2F;code&gt; is a simple CLI program to compute hashes of large sets of files in large directory structures and compare them with a previous snapshot.
Think having your photo collection you acquired over time and worrying about bitrot.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installation&quot;&gt;Installation&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;cargo install legdur --force&lt;&#x2F;code&gt; should get you there on a system that has Rust installed already.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;try-it-out-without-installation&quot;&gt;Try it out without installation&lt;&#x2F;h2&gt;
&lt;p&gt;If you have a nix-flakes enabled system:
&lt;code&gt;nix run git+https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;legdur.git&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;legdur path&#x2F;to&#x2F;a&#x2F;directory&#x2F;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;working:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;legdur&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;documents&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;2022-06-25T06:45:51.000214Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;  INFO legdur: scanning &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&#x2F;home&#x2F;cyryl&#x2F;documents&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;2022-06-25T06:45:51.044471Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;  INFO legdur: list of files acquired, calculating hashes...&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;█████████████████████████████████████████████████████████████░░░░░░░░░░░░░░░░&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; 2788&#x2F;3190&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;finished:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;2022-06-25T06:49:23.776229Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;  INFO legdur: hash calculation complete&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;2022-06-25T06:49:23.784499Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;  INFO legdur: &#x2F;home&#x2F;cyryl&#x2F;documents&#x2F;legdur.db saved&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;2022-06-25T06:49:23.792585Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;  INFO legdur: comparing &#x2F;home&#x2F;cyryl&#x2F;documents&#x2F;legdur.db with &#x2F;home&#x2F;cyryl&#x2F;documents&#x2F;legdur.old&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;2022-06-25T06:49:23.826548Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;  WARN legdur: &#x2F;home&#x2F;cyryl&#x2F;documents&#x2F;legdur.db: 395f65f5727f946c0208f79cfe1f3de1bd81e491bb7631ba6f41fc578d3db368 -&lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-file-descriptor z-shell&quot;&gt;7&lt;&#x2F;span&gt;d1b9748ed291eb6874c91917b5619eb8e1410e7cbfd37a517c5bd4ddf8c7895&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;2022-06-25T06:49:23.826715Z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;  WARN legdur: &#x2F;home&#x2F;cyryl&#x2F;documents&#x2F;legdur.old: e56cf4f6b7fdc2daa3ca3430e8e64bf9d042f1c0e465dcd452986709cb25f7d8 -&lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-file-descriptor z-shell&quot;&gt;395&lt;&#x2F;span&gt;f65f5727f946c0208f79cfe1f3de1bd81e491bb7631ba6f41fc578d3db368&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;how-it-works&quot;&gt;How it works&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;it will compute a hash of each file present in the directory structure (it works recursively).&lt;&#x2F;li&gt;
&lt;li&gt;if previously computed &lt;code&gt;legdur.db&lt;&#x2F;code&gt; exists it will compare the current state of the world to the one represented by &lt;code&gt;legdur.db&lt;&#x2F;code&gt; and output any differences. Only files that changed or got deleted get printed out, additions or file moves anywhere within the directory are not.&lt;&#x2F;li&gt;
&lt;li&gt;it will move the current &lt;code&gt;legdur.db&lt;&#x2F;code&gt; to &lt;code&gt;legdur.old&lt;&#x2F;code&gt; and write the new state of the world to a new &lt;code&gt;legdur.db&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;contact-contributions&quot;&gt;Contact &amp;amp; contributions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Let me know if you&#x27;d like to hack on this by contacting me on &lt;code&gt;legdur@cyplo.dev&lt;&#x2F;code&gt; or via &lt;code&gt;cyplo@peninsula.industries&lt;&#x2F;code&gt; on the Fediverse.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;git clone https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;legdur.git&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Quick reproducible zig dev env using nix flakes</title>
		<published>2022-01-01T00:00:00+00:00</published>
		<updated>2022-01-01T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2022/01/zig-direnv/"/>
		<id>https://blog.cyplo.dev/posts/2022/01/zig-direnv/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2022/01/zig-direnv/">&lt;p&gt;Want this great feeling of entering a directory and having all your dev setup done but can never remember how to set up nix flakes ?&lt;&#x2F;p&gt;
&lt;p&gt;What you&#x27;ll need is, in addition to a working &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;direnv.net&#x2F;&quot;&gt;direnv&lt;&#x2F;a&gt; with &lt;code&gt;nix&lt;&#x2F;code&gt; and &lt;code&gt;nix flake&lt;&#x2F;code&gt; enabled, is:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;.envrc&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;txt&quot; class=&quot;language-txt z-code&quot;&gt;&lt;code class=&quot;language-txt&quot; data-lang=&quot;txt&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;use flake
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;.gitignore&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;txt&quot; class=&quot;language-txt z-code&quot;&gt;&lt;code class=&quot;language-txt&quot; data-lang=&quot;txt&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;.direnv&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;flake.nix&lt;&#x2F;code&gt; (this &lt;code&gt;nixpkgs&lt;&#x2F;code&gt; hash points to the first revision with zig 0.9 present):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;inputs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;nixpkgs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;type&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;github&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;owner&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;nixos&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;repo&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;nixpkgs&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;ref&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;e1eeb53e64159fbb2610ba7810ed511e4d5c10ca&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;flake-compat&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;url&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;github:edolstra&#x2F;flake-compat&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;flake&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;false&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;outputs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-entity z-function z-2 z-nix&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;nixpkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-function z-1 z-nix&quot;&gt;flake-compat&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-entity z-function z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-function z-nix&quot;&gt;:&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nixpkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;legacyPackages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;x86_64-linux&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;in&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;devShell&lt;&#x2F;span&gt;.&lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;x86_64-linux&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;mkShell&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;buildInputs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;with&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;pkgs&lt;&#x2F;span&gt;;&lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;            &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nixpkgs-fmt&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;            &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;zig&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;            &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;zls&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;          &lt;span class=&quot;z-punctuation z-definition z-list z-nix&quot;&gt;]&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;        &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and some &lt;code&gt;shell.nix&lt;&#x2F;code&gt; for this extra bit of &lt;code&gt;nix-shell&lt;&#x2F;code&gt; compatibility, if you&#x27;d want it:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;nix&quot; class=&quot;language-nix z-code&quot;&gt;&lt;code class=&quot;language-nix&quot; data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-nix&quot;&gt;import&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;(&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;let&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;lock&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-nix&quot;&gt;builtins&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;fromJSON&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-nix&quot;&gt;builtins&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;readFile&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-path z-nix&quot;&gt;.&#x2F;flake.lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-nix&quot;&gt;in&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;fetchTarball&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;url&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-nix&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-double z-start z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;https:&#x2F;&#x2F;github.com&#x2F;edolstra&#x2F;flake-compat&#x2F;archive&#x2F;&lt;span class=&quot;z-markup z-italic&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-begin z-nix&quot;&gt;${&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nodes&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;flake-compat&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;locked&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;rev&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-embedded z-end z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;.tar.gz&lt;span class=&quot;z-punctuation z-definition z-string z-double z-end z-nix&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;      &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;sha256&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;lock&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;nodes&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;flake-compat&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;locked&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;narHash&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;)&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset-or-function z-nix&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;    &lt;span class=&quot;z-entity z-other z-attribute-name z-multipart z-nix&quot;&gt;src&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bind z-nix&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-unquoted z-path z-nix&quot;&gt;.&#x2F;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-bind z-nix&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-nix&quot;&gt;  &lt;span class=&quot;z-punctuation z-definition z-attrset z-nix&quot;&gt;}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-expression z-nix&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-nix&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-name z-nix&quot;&gt;shellNix&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Don&#x27;t forget to:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git add&lt;&#x2F;code&gt; all of the above, otherwise nix flake operations might not work&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;direnv allow&lt;&#x2F;code&gt; this directory&lt;&#x2F;li&gt;
&lt;li&gt;have fun !&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Using own OpenWRT router with Vodafone&#x2F;Cityfibre</title>
		<published>2021-11-04T00:00:00+00:00</published>
		<updated>2021-11-04T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2021/11/own-router-with-cityfibre/"/>
		<id>https://blog.cyplo.dev/posts/2021/11/own-router-with-cityfibre/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2021/11/own-router-with-cityfibre/">&lt;p&gt;For something very different this time, a quick recipe for a very specific situation.&lt;&#x2F;p&gt;
&lt;p&gt;One of the very few fiber-to-the-home solutions in the UK is through Cityfibre, sold as Vodafone &quot;Gigafast&quot; packages where I live. As with other ISPs they give you their own internet router. If you would like to use your own, here&#x27;s how.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;TLDR; Obtain PPPoE credentials specific to your account from Vodafone, then use them to configure your router, you need to tag all your packets with VLAN 911.&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Obtain PPPoE credentials from Vodafone. You can do so by using the chat feature on their website. Here&#x27;s an example chat transcript pasted here for your enjoyment and pleasure&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; Tobi : I’m TOBi - Vodafone’s chatbot Ask me anything, I’m here to help.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : hi, I would like to swap the provider router for the own router, could you share the PPPoE credentials I would need to use ? thank you
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Tobi : Please try asking your question again using fewer words, making sure you only ask one question at a time. You’ll be able to ask other questions later if you need to.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : ppoe credentials
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Tobi : TOBi is thinking...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TOBi : Sorry, I didn&amp;#39;t understand the question. Can you please try rephrasing?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : own router ppoe credentials
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TOBi : Sorry, I didn&amp;#39;t understand the question. Can you please try rephrasing?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : can I speak to a human please ?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TOBi : Could you tell me your full name please?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : xxxxxxxxxxxxxxx
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TOBi : Could you please tell me your phone number?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : xxxxxxxxxxx
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TOBi : Please tell me what type of account you have with us:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TOBi :
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Pay Monthly
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Pay As You Go
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Small Business
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Broadband
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : Broadband
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Hi , you&amp;#39;re now connected to Broadband chat support. Please give me 1-2 minutes as I quickly go through your conversation so that you don&amp;#39;t have to repeat yourself.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : Hi, perfect, thank you :)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Cyryl , Thank you for waiting
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : As per the pre chat , I understand that you wish to have PPOE details , right , Cyryl ?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : that&amp;#39;s correct, I&amp;#39;m trying to establish connection using own hardware
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Cyryl , Thank you lets do a quick security check ,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Please share your broadband account number or home phone number once so I can locate your account and proceed further.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : account number xxxxxxxxxx
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Thank you very much
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : I have your account ready. Let&amp;#39;s complete a quick security check so that I can try to resolve this for you.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Confirm the 2nd and 3rd digit of the security PIn ?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : xxxxxxx
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Thank you let me verify it
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Brilliant that matches the record
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Would you mind being online for few minutes, while I am checking the details ?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;You : no problem, thank you
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Thank you , Moving away from the chat window or not responding for 8 mins may result in losing the chat. If it does, here&amp;#39;s a link to get back to us faster than usual: https:&#x2F;&#x2F;www.vodafone.co.uk&#x2F;bbservcd
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Thank you for waiting
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Here is the username - dsl123456789@broadband.vodafone.co.uk
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Pragya : Password is - XXXXXXXX
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;armed with that knowledge you can configure your router, I&#x27;m gonna give an example of configuring an OpenWRT router via their GUI interface LuCI&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;backup your settings&lt;&#x2F;li&gt;
&lt;li&gt;-&amp;gt; Network-&amp;gt;Interfaces&lt;&#x2F;li&gt;
&lt;li&gt;note down the physical interface of current WAN interface - (&lt;code&gt;WAN&lt;&#x2F;code&gt;-&amp;gt;Edit-&amp;gt;Physical Settings), e.g. &lt;code&gt;eth2&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;remove existing &lt;code&gt;WAN&lt;&#x2F;code&gt; interface, press &lt;code&gt;save and apply&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;add a new PPPoE interface:
&lt;ul&gt;
&lt;li&gt;Name: &lt;code&gt;WAN&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Protocol: &lt;code&gt;PPPoE&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;interface - type in the &lt;code&gt;custom&lt;&#x2F;code&gt; field - name of your physical interface followed by a dot and &lt;code&gt;911&lt;&#x2F;code&gt; indicating the VLAN number to tag packets with - e.g. &lt;code&gt;eth2.911&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;-&amp;gt; create interface&lt;&#x2F;li&gt;
&lt;li&gt;PAP&#x2F;CHAP username: (username from Vodafone)&lt;&#x2F;li&gt;
&lt;li&gt;PAP&#x2F;CHAP password: (password from Vodafone)&lt;&#x2F;li&gt;
&lt;li&gt;-&amp;gt; Firewall settings&lt;&#x2F;li&gt;
&lt;li&gt;Create &#x2F; Assign firewall-zone: &lt;code&gt;WAN&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;-&amp;gt; save&lt;&#x2F;li&gt;
&lt;li&gt;-&amp;gt; save and apply&lt;&#x2F;li&gt;
&lt;li&gt;wait around a minute for the router to connect&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>My 2020 setup</title>
		<published>2020-12-29T00:00:00+00:00</published>
		<updated>2020-12-29T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2020/12/setup/"/>
		<id>https://blog.cyplo.dev/posts/2020/12/setup/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2020/12/setup/">&lt;blockquote&gt;
&lt;p&gt;Update 2023 - updated links to the most current code store - git.cyplo.dev instead of sr.ht&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Hello and welcome to the second edition of me doing a summary of the year of using tech tools.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a list of software and some hardware I find useful, either things that I use daily or things that make an unusual task pleasant instead of incredibly difficult.
This is constantly evolving, so please mind the publish date of this post, please also check the &lt;a href=&quot;https:&#x2F;&#x2F;blog.cyplo.dev&#x2F;posts&#x2F;2020&#x2F;12&#x2F;setup&#x2F;my-2019-setup.html&quot;&gt;last year&#x27;s installment&lt;&#x2F;a&gt; as this article will make references to the previous setup.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;laptop-os-and-other-work-hardware&quot;&gt;Laptop, OS and other work hardware&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.thinkwiki.org&#x2F;wiki&#x2F;Category:T480#Lenovo_ThinkPad_T480&quot;&gt;Thinkpad T480&lt;&#x2F;a&gt;, the device-specific config lives &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;boxes&#x2F;foryog&#x2F;default.nix&quot;&gt;here&lt;&#x2F;a&gt; (foureighty has been migrated to foryog).&lt;&#x2F;li&gt;
&lt;li&gt;CalDigit TS3 Plus usb-c hub&lt;&#x2F;li&gt;
&lt;li&gt;Iiyama ProLite 27&quot; 4K monitor&lt;&#x2F;li&gt;
&lt;li&gt;IKEA BEKANT motorised standing desk&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;No dramatic changes here since the &lt;a href=&quot;https:&#x2F;&#x2F;blog.cyplo.dev&#x2F;posts&#x2F;2020&#x2F;12&#x2F;setup&#x2F;my-2019-setup.html&quot;&gt;last year&lt;&#x2F;a&gt;, I&#x27;m still on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;&quot;&gt;NixOS&lt;&#x2F;a&gt; on the T480. Thinkpad got a RAM upgrade to 48GiB and is handling it well, despite it being above it stated memory limit. I&#x27;ve also managed to get my &lt;code&gt;home-manager&lt;&#x2F;code&gt; config called from the main system configuration, so now I just need to do &lt;code&gt;sudo nixos-rebuild switch --upgrade&lt;&#x2F;code&gt; once and it does my &lt;code&gt;home-manager&lt;&#x2F;code&gt; setup as well. This allowed me to split the config into modules a bit better.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m really happy with the standing desk as it allows me to switch from sitting to standing and back very quickly.&lt;&#x2F;p&gt;
&lt;p&gt;For the USB-C hub, I switched from the StarTech one I had before and this one is much more stable now.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;todos-for-2021&quot;&gt;TODOs for 2021:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;to look into &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;nixos.wiki&#x2F;wiki&#x2F;Flakes&quot;&gt;&lt;code&gt;flakes&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and see if I want to port my config over to that style.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;networking&quot;&gt;Networking&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.turris.com&#x2F;en&#x2F;products&#x2F;omnia&#x2F;&quot;&gt;Turris Omnia&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.devolo.co.uk&#x2F;magic-2-wifi&quot;&gt;Devolo Magic 2 WiFi&lt;&#x2F;a&gt; powerline adapters&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;While I stopped having WiFi speed problems with the purchase of the Netgear R7800 router, it started dropping packets in the summer. I suspect it started overheating, whether it was solely a problem with the hardware itself or was also influenced by where the router was placed and the airflow avaiable I don&#x27;t know. As I needed this solved quickly I bought Turris Omnia as a replacement and am quite happy with it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;todos-for-2021-1&quot;&gt;TODOs for 2021:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;debug the overheating problem&lt;&#x2F;li&gt;
&lt;li&gt;try to port &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;gti.telent.net&#x2F;dan&#x2F;liminix&quot;&gt;Liminix&lt;&#x2F;a&gt; (evolution of NixWRT) to run on R7800&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;graphical-interface&quot;&gt;Graphical interface&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;i3&quot;&gt;i3&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;i3&#x2F;grobi.nix&quot;&gt;grobi&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Running &lt;code&gt;grobi&lt;&#x2F;code&gt; now instead of &lt;code&gt;autorandr&lt;&#x2F;code&gt; but otherwise the config seems to be stabilising.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;secrets-management&quot;&gt;Secrets management&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.veracrypt.fr&#x2F;en&#x2F;Home.html&quot;&gt;veracrypt&lt;&#x2F;a&gt; + &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;syncthing.net&#x2F;&quot;&gt;syncthing&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.passwordstore.org&#x2F;&quot;&gt;password store&lt;&#x2F;a&gt; + &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;passff&#x2F;passff&quot;&gt;passff&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;bitwarden.com&#x2F;&quot;&gt;bitwarden&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I have a &lt;code&gt;veracrypt&lt;&#x2F;code&gt; encrypted container, where my secrets reside, with a small set of scripts to &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;home-manager&#x2F;scripts&#x2F;mount-vault.nix&quot;&gt;mount&lt;&#x2F;a&gt; and &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;home-manager&#x2F;scripts&#x2F;umount-vault.nix&quot;&gt;unmount&lt;&#x2F;a&gt; it. The container is synced between different machines using &lt;code&gt;syncthing&lt;&#x2F;code&gt;.
Inside the container, among other things, there is a &lt;code&gt;password store&lt;&#x2F;code&gt; directory, which I use from either command line or from Firefox.&lt;&#x2F;p&gt;
&lt;p&gt;For when I need to share a secret I use &lt;code&gt;bitwarden&lt;&#x2F;code&gt; as it allows for that in a quite an easy way.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sync&quot;&gt;Sync&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;syncthing.net&#x2F;&quot;&gt;Syncthing&lt;&#x2F;a&gt; just keeps working, no matter how many devices I attach and what is their configuration. I run it on all my machines, including mobile devices and it just works. This is how I keep all my documents, photos and other data always fresh between all devices. Just make sure to encrypt the data at rest when using it, you don&#x27;t want to sync to a device which someone else can take from you and read all the data off of.
Sync is also not a replacement for backup, as file deletions and corruption can spread easily across your fleet.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;backups&quot;&gt;Backups&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;restic.net&#x2F;&quot;&gt;restic&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Here is where I am not that happy with the overall setup, and not that much has changed from 2019.
Currently I use &lt;code&gt;restic&lt;&#x2F;code&gt; to package and encrypt the backup and then ship it off of individual machines to my central NAS storage. Then from there it is being copied to Backblaze&#x27;s &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.backblaze.com&#x2F;cloud-storage&quot;&gt;b2&lt;&#x2F;a&gt; for off-site storage.&lt;&#x2F;p&gt;
&lt;p&gt;I made some progress on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;bakare&quot;&gt;bakare&lt;&#x2F;a&gt;, a small backup engine in Rust, but it&#x27;s not ready for production use yet. &lt;a href=&quot;mailto:bakare@cyplo.net&quot;&gt;Let me know&lt;&#x2F;a&gt; if you would be interested in collaborating with me on it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;todos-for-2021-2&quot;&gt;TODOs for 2021:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;finish bakare ?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;editors&quot;&gt;Editors&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;vim &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;vim&quot;&gt;configured via nix&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;VSCode (no longer configured via nix in this setup)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Not much of a change here.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fonts&quot;&gt;Fonts&lt;&#x2F;h2&gt;
&lt;p&gt;I settled on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tonsky&#x2F;FiraCode&quot;&gt;Fira Code Retina&lt;&#x2F;a&gt; for most of my programming and terminal needs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;terminal&quot;&gt;Terminal&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;sw.kovidgoyal.net&#x2F;kitty&#x2F;&quot;&gt;kitty&lt;&#x2F;a&gt; and &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;kitty&quot;&gt;my config&lt;&#x2F;a&gt; for it&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.zsh.org&#x2F;&quot;&gt;zsh&lt;&#x2F;a&gt; + &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;zsh&quot;&gt;config&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tmux&#x2F;tmux&#x2F;wiki&quot;&gt;tmux&lt;&#x2F;a&gt; + &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;home-manager&#x2F;programs&#x2F;tmux.nix&quot;&gt;config&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;While I still like &lt;code&gt;termite&lt;&#x2F;code&gt; and &lt;code&gt;alacritty&lt;&#x2F;code&gt;, I have switched to &lt;code&gt;kitty&lt;&#x2F;code&gt; lately as it is still quite fast while providing for some fancy shenanigans like graphics in the terminal. I&#x27;m not fully happy with my setup yet, as, for example, kitty sometimes requires restart for the graphics feature to work.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a small collection of other tools I found help a lot when on the terminal:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;newsboat.org&#x2F;&quot;&gt;newsboat&lt;&#x2F;a&gt; - a new one on the list, I find it providing a cool and relaxing way of reading RSS in the terminal, see &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;nixos&#x2F;home-manager&#x2F;programs&#x2F;newsboat.nix&quot;&gt;here&lt;&#x2F;a&gt; for my config, including my subscriptions list&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;ripgrep&quot;&gt;ripgrep&lt;&#x2F;a&gt; - it is just so much faster than grep&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;fd&quot;&gt;fd&lt;&#x2F;a&gt; - same but for &lt;code&gt;find&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;bat&quot;&gt;bat&lt;&#x2F;a&gt; - a cooler &lt;code&gt;cat&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;lib.rs&#x2F;crates&#x2F;genpass&quot;&gt;genpass&lt;&#x2F;a&gt; for generating passwords&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;skywind3000&#x2F;z.lua&quot;&gt;z.lua&lt;&#x2F;a&gt; for faster navigation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;todos-for-2021-3&quot;&gt;TODOs for 2021:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;make &lt;code&gt;kitty&lt;&#x2F;code&gt;&#x27;s image mode always work out of the box&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;code-hosting&quot;&gt;Code hosting&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;m trying to migrate off of GitHub, I&#x27;m trying out &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;sr.ht&#x2F;&quot;&gt;sr.ht&lt;&#x2F;a&gt; now. I like its simplicity and ease of setup, especially when it comes to the built-in CI.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-end&quot;&gt;The end&lt;&#x2F;h2&gt;
&lt;p&gt;And that&#x27;s it !&lt;&#x2F;p&gt;
&lt;p&gt;I hope you&#x27;ll find this list useful and do not hesitate to &lt;a href=&quot;mailto:blog@cyplo.net&quot;&gt;contact me&lt;&#x2F;a&gt; on &lt;code&gt;blog@cyplo.net&lt;&#x2F;code&gt; if you would have any questions or comments. Happy hacking !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Don&#x27;t let failures spread over your suite with process-based tests isolation</title>
		<published>2020-12-28T00:00:00+00:00</published>
		<updated>2020-12-28T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2020/12/fail-and-fork/"/>
		<id>https://blog.cyplo.dev/posts/2020/12/fail-and-fork/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2020/12/fail-and-fork/">&lt;p&gt;Being able to precisely control what failures in underlying systems occur and at what time can be really useful in achieving a fast and stable test suite. While I am a big proponent of dependency inversion and being able to control dependencies via the explicit injection points in your API, sometimes it&#x27;s impractical to do so. This is where &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;lib.rs&#x2F;crates&#x2F;fail&quot;&gt;&lt;code&gt;fail&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; can help us immensely, providing an escape hatch for situations like those as it allows to inject failures into previously defined failure points.&lt;&#x2F;p&gt;
&lt;p&gt;It comes at a price though. If you would mix your other unit tests and tests activating fail points you will notice some unexpected failures in the test suite. As &lt;code&gt;cargo test&lt;&#x2F;code&gt; runs tests in parallel by default, the tests activating a fail point can interfere with another test that did not want that fail point active at all that is ran at the same time. The crate authors &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;fail&#x2F;#usage-in-tests&quot;&gt;recommend&lt;&#x2F;a&gt; running all of the tests using fail points in a separate executable and using &lt;code&gt;FailScenario&lt;&#x2F;code&gt; to serialise test execution.&lt;&#x2F;p&gt;
&lt;p&gt;There is another way, that I found simpler for the way I write tests, if you allow for yet another helper crate. We can run each test in a separate process, effectively isolating it from the rest, stopping failures from spreading.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s take a look at an example from &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;bakare&quot;&gt;&lt;code&gt;bakare&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - my experiment in writing a backup system.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;cargo.toml&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; class=&quot;language-toml z-code&quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-begin z-toml&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-table z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;dependencies&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-end z-toml&quot;&gt;]&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-key z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-toml&quot;&gt;fail&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-key-value z-toml&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;0.4&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-begin z-toml&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-table z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;dev-dependencies&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-end z-toml&quot;&gt;]&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-key z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-toml&quot;&gt;two-rusty-forks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-key-value z-toml&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;0.4.0&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-begin z-toml&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-table z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;features&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-end z-toml&quot;&gt;]&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-key z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-toml&quot;&gt;failpoints&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-key-value z-toml&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-array z-begin z-toml&quot;&gt;[&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;fail&#x2F;failpoints&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-array z-end z-toml&quot;&gt;]&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;lock.rs&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; this function is called from `Lock::lock()`
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;create_lock_file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;lock_id&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Uuid, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;index_directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;VfsPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;...&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;fail_point!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;create-lock-file&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Option&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Err&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;anyhow!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;e&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; file &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; lock_file_path&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;create_file&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;...&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-module z-rust&quot;&gt;mod&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-module z-rust&quot;&gt;must&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;super&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Lock&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;anyhow&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Result&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; only import the macro when `failpoints` feature is enabled
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;feature &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;failpoints&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;two_rusty_forks&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;rusty_fork_test&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;vfs&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;MemoryFS&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; VfsPath&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;test&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; this is a normal unit test
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; we don&amp;#39;t want for it to be affected by the fail points being active
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;be_released_when_dropped&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Result&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; temp_dir&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; VfsPath &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;MemoryFS&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; _lock &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Lock&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;lock&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;temp_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; entries &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; temp_dir&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;read_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;?&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;count&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;entries&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;feature &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;failpoints&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;rusty_fork_test!&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; use the macro to create a separate process for this test
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;test&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;be_able_to_lock_when_creating_lock_file_fails_sometimes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-comment z-line z-documentation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&#x2F;&lt;&#x2F;span&gt; activate the fail point
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;fail&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;cfg&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;create-lock-file&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;90%10*return(some lock file creation error)-&amp;gt;off&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; path &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;MemoryFS&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;into&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; lock &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Lock&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;lock&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            lock&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;release&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-operator z-range z-rust&quot;&gt;...&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Buttermilk cornbread</title>
		<published>2020-10-10T00:00:00+00:00</published>
		<updated>2020-10-10T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2020/10/cornbread/"/>
		<id>https://blog.cyplo.dev/posts/2020/10/cornbread/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2020/10/cornbread/">&lt;p&gt;I like baking, as it can be something that does not involve any computers.
Please have this recipe for cornbread, based on buttermilk and baked in a skillet.
As for baking goes, this recipe is quite forgiving and you don&#x27;t need to watch ratios as closely as with others.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;p&gt;This is for a 20cm (8&quot;) skillet, which gives you enough bread for you and one other person to enjoy over a weekend. For a 25cm (10&quot;) skillet - double the amounts. It&#x27;s best to use a cast iron skillet as it has enough thermal mass to take pouring cold batter into it and still be reasonably hot afterwards. Flour and cornmeal volume measurements are for flour poured into a cup.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1&#x2F;2 tablespoon vegetable oil
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;300ml cornmeal
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;150ml all-purpose flour
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1&#x2F;2 teaspoons salt
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1 teaspoons baking powder
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;1&#x2F;2 teaspoon baking soda
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;300ml ​​buttermilk
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 eggs
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;2 tablespoons melted butter
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;steps&quot;&gt;Steps&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Put the veggie oil in the skillet, put the skillet in the oven, preheat to 200C. This takes a while and gives you time to prepare the batter. The oil shouldn&#x27;t smoke.&lt;&#x2F;li&gt;
&lt;li&gt;Combine all dry ingredients in a large bowl, mix well.&lt;&#x2F;li&gt;
&lt;li&gt;In another bowl whisk eggs and then melted butter into the buttermilk. No need for any extensive whisking, just to combine well.&lt;&#x2F;li&gt;
&lt;li&gt;Make sure your oven came to temp.&lt;&#x2F;li&gt;
&lt;li&gt;Pour wet ingredients into the dry, mix well. Acid from the buttermilk will start to react with bases from the baking soda and powder leavening the mixture. Do not overmix and work reasonably quickly, to not lose the bubblage. The resulting batter should be thick, barely pourable.&lt;&#x2F;li&gt;
&lt;li&gt;Take the hot skillet out of the oven, make sure the oil is spread evenly.&lt;&#x2F;li&gt;
&lt;li&gt;Pour the batter onto the hot skillet, most of it should pour but the last of it you may need to transfer using a spoon. Even out the surface, but don&#x27;t be too pedantic about it.&lt;&#x2F;li&gt;
&lt;li&gt;Put the skillet back into the oven, reduce heat to 185C&lt;&#x2F;li&gt;
&lt;li&gt;Bake for around 20-30 minutes, it does not burn easily, you can put it under a broiler for few minutes at the end if you want more brownage. The time needed does not change as much with the volume.&lt;&#x2F;li&gt;
&lt;li&gt;After baking you can keep it in the skillet, or take it out. It does not need to release much moisture, but also should come out pretty easily when fully baked.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>My 2019 setup</title>
		<published>2019-11-16T00:00:00+00:00</published>
		<updated>2019-11-16T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2019/11/tools/"/>
		<id>https://blog.cyplo.dev/posts/2019/11/tools/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2019/11/tools/">&lt;blockquote&gt;
&lt;p&gt;Update 2023: my dotfiles are self-hosted now at &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&quot;&gt;git.cyplo.dev&lt;&#x2F;a&gt;;
They also have a different structure than described here; I&#x27;ve removed now-dead links to github.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Here&#x27;s a list of software and some hardware I find useful, either things that I use daily or things that make an unusual task pleasant instead of incredibly difficult.
This is constantly evolving, so please mind the publish date of this post to gauge how dated it is. The best place to get most recent settings I currently use is my &lt;a href=&quot;#&quot;&gt;dotfiles&lt;&#x2F;a&gt; repository, especially the &lt;a href=&quot;#&quot;&gt;nixos&lt;&#x2F;a&gt; configuration.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;laptop-and-os&quot;&gt;Laptop and OS&lt;&#x2F;h2&gt;
&lt;p&gt;My daily driver is &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.thinkwiki.org&#x2F;wiki&#x2F;Category:T480#Lenovo_ThinkPad_T480&quot;&gt;Thinkpad T480&lt;&#x2F;a&gt; running &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;nixos.org&#x2F;&quot;&gt;NixOS&lt;&#x2F;a&gt;. I like the hardware for its matte screen, nice keyboard and general sturdiness. It&#x27;s also black and black is nice.
The device-specific config lives &lt;a href=&quot;#&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I use &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rycee&#x2F;home-manager&quot;&gt;home manager&lt;&#x2F;a&gt; to manage my dotfiles.
I still haven&#x27;t found a good way of having all this setup ported exactly to non-NixOS operating systems.
Within the NixOS land I&#x27;m all set up now though, as an example -
I have an older laptop that I used previously, and installing NixOS there took total of around half an hour, giving me &lt;strong&gt;exactly&lt;&#x2F;strong&gt; the same look and feel to all the software I run as I&#x27;m used to.&lt;&#x2F;p&gt;
&lt;p&gt;NixOS&#x27;s ability to boot into a previous version of the whole system is another big plus to me, as I like to experiment with my settings and sometimes I break something important. It creates an environment that does not punish you for trying something new, it encourages that.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;networking-gear&quot;&gt;Networking gear&lt;&#x2F;h2&gt;
&lt;p&gt;I had a lot of problems with network speed over wifi previously, because of that I bought a Netgear &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.netgear.com&#x2F;home&#x2F;wifi&#x2F;routers&#x2F;r7800&#x2F;&quot;&gt;Nighthawk X4S R7800&lt;&#x2F;a&gt; router and installed &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;openwrt.org&#x2F;&quot;&gt;OpenWRT&lt;&#x2F;a&gt; on it. After all this change, I am able to run very frequent multi-gigabyte backup transfers over wifi and everything works nicely.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;graphical-interface&quot;&gt;Graphical interface&lt;&#x2F;h2&gt;
&lt;p&gt;I started running &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;i3wm.org&#x2F;&quot;&gt;i3&lt;&#x2F;a&gt; recently because of the strain Gnome3 was putting on my system, and I am liking it so far, mostly for the speed of navigation and little resource usage. There&#x27;s &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;polybar&#x2F;polybar&quot;&gt;polybar&lt;&#x2F;a&gt; on top and not much else in terms of bells and whistles present.
I use &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;phillipberndt&#x2F;autorandr&quot;&gt;autorandr&lt;&#x2F;a&gt; to keep track of different display devices on different machines - it will automatically set the best resolution for whatever the screen combination I am currently using. See &lt;a href=&quot;#&quot;&gt;config&lt;&#x2F;a&gt; for more details.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.mozilla.org&#x2F;en-GB&#x2F;firefox&#x2F;new&#x2F;&quot;&gt;Firefox&lt;&#x2F;a&gt; remains my browser of choice, I highly recommend you try it, it is so much faster now than it used to be. Make sure to switch the tracking protection on.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;secrets-management&quot;&gt;Secrets management&lt;&#x2F;h2&gt;
&lt;p&gt;I have a &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.veracrypt.fr&#x2F;en&#x2F;Home.html&quot;&gt;veracrypt&lt;&#x2F;a&gt; encrypted container, where my secrets reside, with a small set of scripts to &lt;a href=&quot;#&quot;&gt;mount&lt;&#x2F;a&gt; and &lt;a href=&quot;#&quot;&gt;unmount&lt;&#x2F;a&gt; it. The container is synced between different machines using &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;syncthing.net&#x2F;&quot;&gt;syncthing&lt;&#x2F;a&gt;.
Inside the container, among other things, there is a &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.passwordstore.org&#x2F;&quot;&gt;password store&lt;&#x2F;a&gt; directory, which I use from either command line or from Firefox, using &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;passff&#x2F;passff&quot;&gt;this plugin&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sync&quot;&gt;Sync&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;syncthing.net&#x2F;&quot;&gt;Syncthing&lt;&#x2F;a&gt; just keeps working, no matter how many devices I attach and what is their configuration. I run it on all my machines, including mobile devices and it just works. This is how I keep all my documents, photos and other data always fresh between all devices. Just make sure to encrypt the data at rest when using it, you don&#x27;t want to sync to a device which someone else can take from you and read all the data off of.
Sync is also not a replacement for backup, as file deletions and corruption can spread easily across your fleet.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;backups&quot;&gt;Backups&lt;&#x2F;h2&gt;
&lt;p&gt;Here is where I am not that happy with the overall setup.
Currently I use &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;restic.net&#x2F;&quot;&gt;restic&lt;&#x2F;a&gt; to encrypt the backup and then ship it off of individual machines to my central NAS storage. Then from there it is being shipped to Backblaze&#x27;s &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.backblaze.com&#x2F;cloud-storage&quot;&gt;b2&lt;&#x2F;a&gt; for off-site storage.&lt;&#x2F;p&gt;
&lt;p&gt;In principle, the setup I would like to retain, where the encryption credentials are only on machines creating backups and everything else only sees already encrypted files. In practice, restic itself seems to have a lot of troubles with the source machines being laptops and being constantly opened and closed, caused the running backup process to go through hibernation cycles. This locks&#x2F;damages the central backup repo quite frequently and I need to run &lt;code&gt;restic rebuild-index&lt;&#x2F;code&gt; quite often to keep things working.&lt;&#x2F;p&gt;
&lt;p&gt;For this reason I started working on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;bakare&quot;&gt;bakare&lt;&#x2F;a&gt;, a small backup engine in Rust - &lt;a href=&quot;mailto:bakare@cyplo.net&quot;&gt;let me know&lt;&#x2F;a&gt; if you would be interested in collaborating with me on it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;editors&quot;&gt;Editors&lt;&#x2F;h2&gt;
&lt;p&gt;I use a combination of &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.vim.org&#x2F;&quot;&gt;vim&lt;&#x2F;a&gt;, &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;code.visualstudio.com&#x2F;&quot;&gt;VSCode&lt;&#x2F;a&gt; and different &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.jetbrains.com&#x2F;&quot;&gt;JetBrains&#x27;&lt;&#x2F;a&gt; IDEs for work. I like IDEs mostly for refactoring and debugging capabilities, while vim and VSCode for speed of editing individual files. I still use vim-mode in IDEs though.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fonts&quot;&gt;Fonts&lt;&#x2F;h2&gt;
&lt;p&gt;I settled on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tonsky&#x2F;FiraCode&quot;&gt;Fira Code Retina&lt;&#x2F;a&gt; for most of my programming and terminal needs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;terminal&quot;&gt;Terminal&lt;&#x2F;h2&gt;
&lt;p&gt;I find &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;thestinger&#x2F;termite&quot;&gt;termite&lt;&#x2F;a&gt; quite fast, while supporting extended character and colour sets.
My shell is &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.zsh.org&#x2F;&quot;&gt;zsh&lt;&#x2F;a&gt; with minimal &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;robbyrussell&#x2F;oh-my-zsh&quot;&gt;oh-my-zsh&lt;&#x2F;a&gt; &lt;a href=&quot;#&quot;&gt;config&lt;&#x2F;a&gt;. I always run it inside a &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tmux&#x2F;tmux&#x2F;wiki&quot;&gt;tmux&lt;&#x2F;a&gt; session though, and no matter how many terminal windows I open, I am always greeted with the same state. All history and window state is shared between all terminal windows all tmux windows as well - it is always the same one tmux session. Because I am always running tmux, sometimes I end up in a situation when I ssh into some box and need to run tmux there - for that reason I have my main tmux session having different leader key than the default, this way I can choose which tmux session will receive my command - my machine or the one I&#x27;m connecting to. All of the above comes from a combination of &lt;a href=&quot;#&quot;&gt;shell&lt;&#x2F;a&gt; and &lt;a href=&quot;#&quot;&gt;tmux&lt;&#x2F;a&gt; settings.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s a small collection of other tools I found help a lot when on the terminal:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BurntSushi&#x2F;ripgrep&quot;&gt;ripgrep&lt;&#x2F;a&gt; - it is just so much faster than grep&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;fd&quot;&gt;fd&lt;&#x2F;a&gt; - same but for &lt;code&gt;find&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;bat&quot;&gt;bat&lt;&#x2F;a&gt; - a cooler &lt;code&gt;cat&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;lib.rs&#x2F;crates&#x2F;genpass&quot;&gt;genpass&lt;&#x2F;a&gt; for generating passwords&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;skywind3000&#x2F;z.lua&quot;&gt;z.lua&lt;&#x2F;a&gt; for faster navigation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And that&#x27;s it !
I hope you&#x27;ll find this list useful and do not hesitate to &lt;a href=&quot;mailto:blog@cyplo.net&quot;&gt;contact me&lt;&#x2F;a&gt; on &lt;code&gt;blog@cyplo.net&lt;&#x2F;code&gt; if you would have any questions or comments. Happy hacking !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Fuzzers and how to run them.</title>
		<published>2019-04-17T00:00:00+00:00</published>
		<updated>2019-04-17T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2019/04/fuzzers/"/>
		<id>https://blog.cyplo.dev/posts/2019/04/fuzzers/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2019/04/fuzzers/">&lt;p&gt;I am fascinated by the concept of fuzzing. It fits well with my desire to test weird code paths by using more of computer&#x27;s time and less that of a programmer.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-is-fuzzing&quot;&gt;What is fuzzing ?&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s a type of automated testing, especially good with finding edge cases in your code. It runs totally outside of your code and knows nothing about it - it just throws random data at it. Modern fuzzers instrument your code to be able to tell if by changing input they change the code paths covered and by doing that they try to achieve maximum coverage. While this sounds like a very naive approach it can lead to finding incredibly interesting bugs. For that reason fuzzers are oftentimes used in the security community for finding vulnerabilities. Fuzzing is a type of a black box testing - but how you define that box is entirely up to you. It can be the whole program, it can be a single function. It just needs a clear entry point with ability to manipulate input data.&lt;&#x2F;p&gt;
&lt;p&gt;An example may be in order. We&#x27;ll look into one provided by &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-fuzz&quot;&gt;Rust Fuzzing Authority&lt;&#x2F;a&gt; - people behind &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;rust-fuzz.github.io&#x2F;book&#x2F;cargo-fuzz.html&quot;&gt;cargo fuzz&lt;&#x2F;a&gt; and &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;rust-fuzz.github.io&#x2F;book&#x2F;afl.html&quot;&gt;afl.rs&lt;&#x2F;a&gt;.
Imagine you&#x27;re trying to see if you&#x27;ve handled all cases in your url parser. You can just do&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;fuzz_target!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;[&lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u8&lt;&#x2F;span&gt;]&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-rust&quot;&gt;Ok&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;str&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;from_utf8&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;data&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;_&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;url&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Url&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;parse&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-closure z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that&#x27;s it ! You define a function that takes raw bytes, discards the ones that are outside of a UTF8 string space and then tries to invoke the function under test with the said string. We assume that if this function completes then the run is considered ok, if it panics then not.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to use this example because it is very typical of how a fuzzer would be used.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;get random input from the engine&lt;&#x2F;li&gt;
&lt;li&gt;discard some of the input&lt;&#x2F;li&gt;
&lt;li&gt;drive the function under test&lt;&#x2F;li&gt;
&lt;li&gt;check some simple property of the run - the faster the property to check the better. For this reason - the &#x27;did not crash&#x27; property is used often, however you can use any condition you want, as long as fuzzer has a way of distinguishing between successful and failed runs.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;how-does-it-compare-to-property-based-tests&quot;&gt;How does it compare to property-based tests ?&lt;&#x2F;h2&gt;
&lt;p&gt;When thinking about other types of tests that are driven by randomness and are generally black-box-ish - property-based tests come to mind. How does fuzzing compare ?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Fuzzing is good with finding hidden properties of the existing code, it used after the code is written, while property-based tests can also be used in a TDD workflow&lt;&#x2F;li&gt;
&lt;li&gt;In property-based tests you typically want to describe behaviour - they serve as good documentation. Fuzzing is not really as good with that. It can automatically collect the examples though, that then can be manually transformed into a property.&lt;&#x2F;li&gt;
&lt;li&gt;As you want your program to always hold all properties true you run all property-based tests within your CI&#x2F;CD pipeline. For this reason they tend to test only things that are relatively fast to check, execution-time wise. Fuzzers are typically ran over nights or weeks - finding those edge cases, providing more properties for you to know and care about.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;want-help-with-fuzzing-your-open-source-project&quot;&gt;Want help with fuzzing your open source project ?&lt;&#x2F;h2&gt;
&lt;p&gt;If you&#x27;re not sure what fuzzing is, or you want help with adding fuzzer support to your open source project - just tell me ! &lt;a href=&quot;mailto:fuzzing@cyplo.dev&quot;&gt;Email&lt;&#x2F;a&gt; works best ! I&#x27;m happy to jump on a call, pair program or whatever you fancy ! I know the most about the Rust fuzzing space, but happy to help with other languages as well - this allows me to learn :)&lt;&#x2F;p&gt;
&lt;p&gt;I also run a fuzzing server where I can test your project overnight and see if we find anything.&lt;&#x2F;p&gt;
&lt;p&gt;With that in mind - happy fuzzing !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Website refresh</title>
		<published>2019-04-09T00:00:00+00:00</published>
		<updated>2019-04-09T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2019/04/blog-refresh/"/>
		<id>https://blog.cyplo.dev/posts/2019/04/blog-refresh/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2019/04/blog-refresh/">&lt;p&gt;Hello !&lt;&#x2F;p&gt;
&lt;p&gt;As you may have noticed - this website looks different now ! Why is that ? I&#x27;ve not only changed the visual theme but also a lot of underlying infrastructure.
Let&#x27;s start with describing the old setup and see where we can improve.
The site previously ran on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;getnikola.com&#x2F;&quot;&gt;Nikola&lt;&#x2F;a&gt;, was built on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;travis-ci.org&#x2F;cyplo&#x2F;blog&quot;&gt;Travis&lt;&#x2F;a&gt; and then pushed to &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.netlify.com&#x2F;&quot;&gt;Netlify&lt;&#x2F;a&gt;, which I later changed to &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;pages.github.com&#x2F;&quot;&gt;Github Pages&lt;&#x2F;a&gt;. While it worked it had some issues of its own;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Image galleries were hard to navigate and looked a bit out of place.&lt;&#x2F;li&gt;
&lt;li&gt;The site was not rendering the main menu correctly on mobile devices.&lt;&#x2F;li&gt;
&lt;li&gt;It was slow to build the site, especially on CI - it took 15 to 30 minutes for the CI run on travis to get the site deployed - not ideal for fast feedback&lt;&#x2F;li&gt;
&lt;li&gt;Lack of previews for the work in progress - it was hard for me to set up a preview per branch, updated automatically.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;All of the above, mixed with me having a bit of a time off, resulted in getting this site migrated to some new and exciting stack !&lt;&#x2F;p&gt;
&lt;p&gt;It now runs on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;gohugo.io&#x2F;&quot;&gt;Hugo&lt;&#x2F;a&gt; and uses Netlify as the deployment target. I fixed all of the problems above and added some more niceties !&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;I&#x27;m using &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;themes.gohugo.io&#x2F;beautifulhugo&#x2F;&quot;&gt;Beautiful Hugo&lt;&#x2F;a&gt;&#x27;s Gallery now - see this &lt;a href=&quot;&#x2F;posts&#x2F;2016&#x2F;06&#x2F;12&#x2F;dont-throw-away-fix&#x2F;&quot;&gt;old post&lt;&#x2F;a&gt; for an example&lt;&#x2F;li&gt;
&lt;li&gt;This theme also makes the site mobile-friendly out of the box&lt;&#x2F;li&gt;
&lt;li&gt;It takes 1-3 minutes for the full site deploy&lt;&#x2F;li&gt;
&lt;li&gt;Previews just work :)&lt;&#x2F;li&gt;
&lt;li&gt;No need to use &lt;a href=&quot;&#x2F;posts&#x2F;2017&#x2F;03&#x2F;netlify-incremental-deployer&#x2F;&quot;&gt;custom Netlify sync script I wrote&lt;&#x2F;a&gt; anymore, as Hugo is natively supported on Netlify&lt;&#x2F;li&gt;
&lt;li&gt;Netlify supports TLS on multiple domains - you can now use &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;blog.cyplo.dev&#x2F;&quot;&gt;cyplo.dev&lt;&#x2F;a&gt; as well as &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;blog.cyplo.net&quot;&gt;cyplo.net&lt;&#x2F;a&gt; to reach this site :)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;As for how the actual migration was done - it was a bit of work, as you can see in this &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;blog&#x2F;pull&#x2F;46&quot;&gt;PR&lt;&#x2F;a&gt;. While I could migrate the content mostly automatically, I chose to actually use this opportunity to review all the posts manually !
This allowed me to spot and fix some additional issues, like broken links, editorial mistakes etc.&lt;&#x2F;p&gt;
&lt;p&gt;Overall I think this was worth it - the site is now more modern, the sources are smaller and it is fast to build.
If you&#x27;re curious about the details - all the sources are &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;blog&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Happy blogging !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Generate Rust tests from data files</title>
		<published>2018-12-25T00:00:00+00:00</published>
		<updated>2018-12-25T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2018/12/generate-rust-tests-from-data/"/>
		<id>https://blog.cyplo.dev/posts/2018/12/generate-rust-tests-from-data/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2018/12/generate-rust-tests-from-data/">&lt;p&gt;Sometimes you just have a bunch of example data laying around and you want to make sure your code works with all of them.
Some of them are probably short and sweet and could live happily as &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;rustdoc&#x2F;documentation-tests.html&quot;&gt;doctests&lt;&#x2F;a&gt;, which are amazing btw. But some of them are more awkward to present in such form, because, for example, of their size or number. Typically when you have an example of how the program should behave you write an example-based unit test. Ideally, each of them would represent an isolated example and they should fail independently. But, converting your source data files into a unit test one by one, manually, can be a bit tedious.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;cargo&#x2F;reference&#x2F;build-scripts.html&quot;&gt;Rust build scripts&lt;&#x2F;a&gt; to the rescue !&lt;&#x2F;p&gt;
&lt;p&gt;What if you could could just iterate over the data files you have already and then produce unit tests accordingly ?
What follows is an example of such, where we iterate over directories and generate one unit test per each, assuming all of them contain files named according to our convention.&lt;&#x2F;p&gt;
&lt;p&gt;I chose to generate integration tests here, but you can generate pretty much any code using this technique.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;tests&#x2F;test_loader.rs&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; include tests generated by `build.rs`, one test per directory in tests&#x2F;data
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;include!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;concat!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;env!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;OUT_DIR&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;tests.rs&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;build.rs&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;env&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;fs&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;read_dir&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;fs&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;DirEntry&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;fs&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;File&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;io&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Write&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;use&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;std&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;path&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;Path&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; build script&amp;#39;s entry point
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; out_dir &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;env&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;var&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;OUT_DIR&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; destination &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Path&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;out_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;tests.rs&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; test_file &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;File&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;create&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;destination&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; write test file header, put `use`, `const` etc there
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-function z-rust&quot;&gt;write_header&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; test_file&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; test_data_directories &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;read_dir&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;.&#x2F;tests&#x2F;data&#x2F;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-keyword z-control z-rust&quot;&gt;for&lt;&#x2F;span&gt; directory &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;in&lt;&#x2F;span&gt; test_data_directories &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-function z-rust&quot;&gt;write_test&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; test_file&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;directory&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;write_test&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;test_file&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; File, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;DirEntry&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; directory &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; directory&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;path&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;canonicalize&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; path &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; directory&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;display&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; test_name &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;format!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;            &lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;prefix_if_needed_&lt;span class=&quot;z-constant z-other z-placeholder z-rust&quot;&gt;{}&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;            directory&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;file_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;to_string_lossy&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;write!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        test_file,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-support z-macro z-rust&quot;&gt;include_str!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;.&#x2F;tests&#x2F;test_template&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        name &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; test_name&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        path &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; path
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;write_header&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;test_file&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; File&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;write!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        test_file,&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;        &lt;span class=&quot;z-string z-quoted z-double z-raw z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-string z-rust&quot;&gt;r&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;#&lt;&#x2F;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-raw z-rust&quot;&gt;use crate_under_test::functionality_under_test;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-raw z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;tests&#x2F;test-template&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;test&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; input &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;include_str!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;{path}&#x2F;input-data&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; expected_output &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;include_str!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;{path}&#x2F;output-data&lt;span class=&quot;z-punctuation z-definition z-string z-end z-rust&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; actual_output &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;functionality_under_test&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;input&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;expected_output&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; actual_output&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So to recap - first the &lt;code&gt;build.rs&lt;&#x2F;code&gt; script creates &lt;code&gt;$OUT_DIR&#x2F;tests.rs&lt;&#x2F;code&gt; file containing all the generated tests code.
The compiler does not know there are tests to launch using normal integration tests procedure there though,
so then we use &lt;code&gt;tests&#x2F;test_loader.rs&lt;&#x2F;code&gt; to tell it so, basically including the generated Rust code into that file.
After the compilation proceeds normally, giving us one unit test per directory, giving us ability to pinpoint test cases that are problematic more precisely.&lt;&#x2F;p&gt;
&lt;p&gt;You can then further improve on that, e.g. add more directory structure, split tests into modules etc - you can generate any Rust code this way.&lt;&#x2F;p&gt;
&lt;p&gt;Happy hacking !&lt;&#x2F;p&gt;
&lt;p&gt;p.s.
there are more &lt;a href=&quot;&#x2F;series&#x2F;rust-testing-tricks&quot;&gt;Rust testing tricks&lt;&#x2F;a&gt; and let me know if you&#x27;d like to &lt;a href=&quot;&#x2F;posts&#x2F;2018&#x2F;05&#x2F;pair-with-me-on-rust&quot;&gt;pair program with me on anything !&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Testing tricks in Rust</title>
		<published>2018-09-25T00:00:00+00:00</published>
		<updated>2018-09-25T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2018/09/rust-testing-tricks/"/>
		<id>https://blog.cyplo.dev/posts/2018/09/rust-testing-tricks/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2018/09/rust-testing-tricks/">&lt;h1 id=&quot;use-verbs-as-test-module-names&quot;&gt;Use verbs as test module names&lt;&#x2F;h1&gt;
&lt;p&gt;Who said that the test module needs to be named &lt;code&gt;test&lt;&#x2F;code&gt; ?
Experiment with different module names, pay attention to how the test runner displays the results.&lt;&#x2F;p&gt;
&lt;p&gt;A structure that I like, an example:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;worker.rs:&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; some production code here
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-module z-rust&quot;&gt;mod&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-module z-rust&quot;&gt;should&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;test&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;consume_message_from_queue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; mock queue, create worker with that queue injected
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; start worker
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; check if queue&amp;#39;s &amp;#39;get_message&amp;#39; was invoked
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Cargo prints &lt;code&gt;worker::should::consume_message_from_queue&lt;&#x2F;code&gt; when running this test, which reads nicely and exposes the requirement.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;interior-mutability-for-controlling-state-of-variables-injected-from-the-test&quot;&gt;Interior mutability for controlling state of variables injected from the test&lt;&#x2F;h1&gt;
&lt;p&gt;Use e.g. the &lt;code&gt;atomic&lt;&#x2F;code&gt; types family or &lt;code&gt;RefCell&lt;&#x2F;code&gt; itself to get an immutable handle to a internally mutable data.
Useful when you don&#x27;t want your production code to accept anything that can mutate but you still want to control that value from the test.&lt;&#x2F;p&gt;
&lt;p&gt;See injecting the system clock example in &lt;a href=&quot;&#x2F;posts&#x2F;2018&#x2F;07&#x2F;rust-injection&#x2F;&quot;&gt;my previous blog post&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;write-the-test-first&quot;&gt;Write the test first&lt;&#x2F;h1&gt;
&lt;p&gt;Not really a Rust trick, but hey.
Try writing your test first, before production code.
If you&#x27;re building a feature or fixing a bug that will affect external behaviour - start with an integration test at the crate level.&lt;&#x2F;p&gt;
&lt;p&gt;Try thinking what would be the ideal code you would like to interact with, what would be the types, what would be the functions ? A broad-strokes scenario, not caring much about implementation details, not caring much about covering all edge cases. Write that code. It does not compile. But it looks nice, you&#x27;re pleased.&lt;&#x2F;p&gt;
&lt;p&gt;Read through again, add assertions. Add the types. For each missing feature or a bug that is present in this high level scenario - write a unit test. Satisfy that test with changes to production code. Maybe refactor a bit in between. Once the big test is green - you&#x27;re done !&lt;&#x2F;p&gt;
&lt;p&gt;There is no Rust-focused TDD book just yet for me to recommend, but here, have some for other languages:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Kent Beck - Test Driven Development: By Example&lt;&#x2F;li&gt;
&lt;li&gt;Steve Freeman, Nat Pryce - Growing Object-Oriented Software, Guided by Tests&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Rust allows for more cool tricks and generally writing less test code than mentioned in these books, so please use your judgment - and the tricks from this article !&lt;&#x2F;p&gt;
&lt;h1 id=&quot;let-s-talk&quot;&gt;Let&#x27;s talk !&lt;&#x2F;h1&gt;
&lt;p&gt;Have any questions ? Would like to pair on Rust ? Curious about TDD ? Ping me !
Email is good - &lt;a href=&quot;mailto:hello@cyplo.net&quot;&gt;hello@cyplo.net&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;thanks !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Rust - controlling side effects from the test.</title>
		<published>2018-07-30T00:00:00+00:00</published>
		<updated>2018-07-30T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2018/07/rust-injection/"/>
		<id>https://blog.cyplo.dev/posts/2018/07/rust-injection/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2018/07/rust-injection/">&lt;h1 id=&quot;rust-controlling-side-effects-from-the-test&quot;&gt;Rust: controlling side effects from the test.&lt;&#x2F;h1&gt;
&lt;p&gt;Hello and welcome to the newest episode on testing in Rust.
Imagine you want to write a timestamping repository of some sorts, that will associate the timestamp of when the storage operation was invoked with the stored value.
How to write it in Rust ? And more importantly - how to test it ?
I would like to share a solution I found and talk a bit about how it works.&lt;&#x2F;p&gt;
&lt;p&gt;Please note that this solution can be used anywhere where you need to pass a handle that is remembered by the production code, and that thing it points to - you then want to change from the test.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust z-code&quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-trait z-rust&quot;&gt;trait&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-trait z-rust&quot;&gt;Clock&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;now&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Instant&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-trait z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;SystemClock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;SystemClock&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        SystemClock &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;Clock &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;SystemClock&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;now&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Instant&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Instant&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;now&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;TimestampingRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;, ClockType&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;where
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;    ClockType: Clock + &amp;#39;a,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;clock&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt; ClockType,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;storage&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;Instant, &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;, &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; (timestamp, value)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;, ClockType&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;TimestampingRepository&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;, ClockType&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;where&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;    ClockType&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Clock + &lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt;,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;with_clock&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;clock&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-lifetime z-rust&quot;&gt;&amp;#39;a&lt;&#x2F;span&gt; ClockType&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        TimestampingRepository &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            clock&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            storage&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;vec!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;store&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;value&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;storage&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;push&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;clock&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;now&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; value&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;all_stored&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-generic z-rust&quot;&gt;&lt;span class=&quot;z-support z-type z-rust&quot;&gt;Vec&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-rust&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;Instant, &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-rust&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;storage&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;clone&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;cfg&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;test&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-annotation z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-module z-rust&quot;&gt;mod&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-module z-rust&quot;&gt;should&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-annotation z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-annotation z-rust&quot;&gt;#&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-annotation z-rust&quot;&gt;test&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;handle_seconds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; clock &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;FakeClock&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;with_time&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Instant&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;now&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-rust&quot;&gt;mut&lt;&#x2F;span&gt; repository &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;TimestampingRepository&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;with_clock&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-bitwise z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;clock&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        repository&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;store&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        clock&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;move_by&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Duration&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;from_secs&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        repository&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;store&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; time_difference &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-rust&quot;&gt;time_difference_between_two_stored&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;repository&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-support z-macro z-rust&quot;&gt;assert_eq!&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;32&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; time_difference&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_secs&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-struct z-rust&quot;&gt;struct&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-struct z-rust&quot;&gt;FakeClock&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;now&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; Instant,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-variable z-other z-member z-rust&quot;&gt;move_by_secs&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-type z-rust&quot;&gt;:&lt;&#x2F;span&gt; AtomicUsize,
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-struct z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;FakeClock&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;with_time&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;now&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Instant&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;Self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            FakeClock &lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                now&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                move_by_secs&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;AtomicUsize&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;new&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-rust&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-rust&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; WAT no `mut`
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;move_by&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;, &lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;duration&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;:&lt;&#x2F;span&gt; Duration&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;move_by_secs
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;                &lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;store&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;duration&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;as_secs&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;usize&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Ordering&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;SeqCst&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-impl z-rust&quot;&gt;impl&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;Clock &lt;span class=&quot;z-keyword z-other z-rust&quot;&gt;for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt; &lt;span class=&quot;z-entity z-name z-impl z-rust&quot;&gt;FakeClock&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-rust&quot;&gt;fn&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-function z-rust&quot;&gt;now&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-parameters z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt; &lt;span class=&quot;z-meta z-function z-return-type z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-rust&quot;&gt;-&amp;gt;&lt;&#x2F;span&gt; Instant&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-rust&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;let&lt;&#x2F;span&gt; move_by_secs &lt;span class=&quot;z-keyword z-operator z-assignment z-rust&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;move_by_secs&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-function z-rust&quot;&gt;load&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Ordering&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;SeqCst&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-rust&quot;&gt;as&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-rust&quot;&gt;u64&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-rust&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;            &lt;span class=&quot;z-variable z-language z-rust&quot;&gt;self&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-rust&quot;&gt;.&lt;&#x2F;span&gt;now &lt;span class=&quot;z-keyword z-operator z-arithmetic z-rust&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-rust&quot;&gt;Duration&lt;span class=&quot;z-punctuation z-accessor z-rust&quot;&gt;::&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;from_secs&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-rust&quot;&gt;(&lt;&#x2F;span&gt;move_by_secs&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-rust&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-function z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-meta z-impl z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-rust&quot;&gt;&lt;span class=&quot;z-meta z-module z-rust&quot;&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-block z-rust&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-rust&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That&#x27;s a lot of code. And I already skipped &lt;code&gt;use&lt;&#x2F;code&gt;s and some definitions to make it less.
If you want to get the full source code that to follow along - try this &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;play.rust-lang.org&#x2F;?gist=7f47c441732b543a918cb491487196d4&amp;amp;version=stable&amp;amp;mode=debug&amp;amp;edition=2015&quot;&gt;playground&lt;&#x2F;a&gt; or &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;rust-dependency-injection&quot;&gt;this repo&lt;&#x2F;a&gt; for the full project including production code usage.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s start with the test itself.
The clock appears to be immutable (immovable) in the test, yet we call &lt;code&gt;move_by&lt;&#x2F;code&gt; on it and the whole thing appears to be working somehow.
First question: can&#x27;t we just make the clock mutable and skip all this ?
It appears that sadly (but fortunately) Rust prevents us from doing so.
We &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;second-edition&#x2F;ch04-02-references-and-borrowing.html&quot;&gt;cannot&lt;&#x2F;a&gt; both have a immutable and mutable borrow of the clock in the same scope.
For the full example with an error go &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;play.rust-lang.org&#x2F;?gist=3e496f857f1e016c596ec7c4060538df&amp;amp;version=stable&amp;amp;mode=debug&amp;amp;edition=2015&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;What is this sorcery then ?
We use a type that provides &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;second-edition&#x2F;ch15-05-interior-mutability.html&quot;&gt;&lt;code&gt;Interior Mutability&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, namely &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;rust-lang-ja.github.io&#x2F;the-rust-programming-language-ja&#x2F;1.6&#x2F;std&#x2F;sync&#x2F;atomic&#x2F;struct.AtomicUsize.html&quot;&gt;&lt;code&gt;AtomicUsize&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.
On the outside - it look immutable, yet it provides a thread-safe and very narrow method of mutating the underlying state.
As we trust &lt;code&gt;AtomicUsize&lt;&#x2F;code&gt; to be written correctly, we can then proceed and write our Rust code as usual, relying fully on the borrow checker. Rust compiler is happy and our test code is happy.&lt;&#x2F;p&gt;
&lt;p&gt;I wouldn&#x27;t use this as a pattern in production code - the borrow checker rules are there for a reason.
Please treat it as an escape hatch to be used in specific situations, situations like this.&lt;&#x2F;p&gt;
&lt;p&gt;Happy Rusting !&lt;&#x2F;p&gt;
&lt;p&gt;p.s. if you&#x27;d like to chat about Rust - &lt;a href=&quot;mailto:rust@cyplo.dev&quot;&gt;ping me an email&lt;&#x2F;a&gt; !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Resources for starting your adventure with Rust</title>
		<published>2018-05-22T00:00:00+00:00</published>
		<updated>2018-05-22T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2018/05/rust-resources/"/>
		<id>https://blog.cyplo.dev/posts/2018/05/rust-resources/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2018/05/rust-resources/">&lt;p&gt;As I&#x27;ve been running several intro to Rust sessions throughout the last year, I&#x27;ve assembled a set of resources that help people ease into the language.&lt;&#x2F;p&gt;
&lt;p&gt;Depending on your learning style you might like:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rustlings&#x2F;rustlings&quot;&gt;Rustlings&lt;&#x2F;a&gt; - This is a good set of starter exercises if you want to have a feeling for the language - have links to relevant book sections for each exercises so you can either start with the book or trying to figure it out yourself first. Ah, and it uses the Playground, which means you don&#x27;t need to install anything on your machine to start.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;book&#x2F;second-edition&#x2F;index.html&quot;&gt;The book itself&lt;&#x2F;a&gt; - Second edition. Good when you want a solid baseline understanding of the language first.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;stable&#x2F;rust-by-example&#x2F;&quot;&gt;Rust by example&lt;&#x2F;a&gt; - An set of examples that are runnable within a browser, intertwined with explanatory prose.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;exercism.io&#x2F;&quot;&gt;Exercism&lt;&#x2F;a&gt;’s Rust exercises - a CLI app that guides you through exercises of increasing difficulty.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;intorust.com&#x2F;&quot;&gt;IntoRust&lt;&#x2F;a&gt; - A set of short screencasts for the foundational topics.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Make sure to stay up to date with:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;this-week-in-rust.org&#x2F;&quot;&gt;This week in Rust&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;rust.libhunt.com&#x2F;&quot;&gt;Awesome Rust&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And finally:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.rustaceans.org&#x2F;findwork&#x2F;starters&quot;&gt;contribute back&lt;&#x2F;a&gt; !&lt;&#x2F;li&gt;
&lt;li&gt;don&#x27;t forget to join the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;users.rust-lang.org&#x2F;&quot;&gt;user forums&lt;&#x2F;a&gt; for the warm welcome.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If you&#x27;d like someone to ask questions to or pair program with, &lt;a href=&quot;mailto:rust@cyplo.dev&quot;&gt;ping me an email&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>I’m running Rust pair programming sessions !</title>
		<published>2018-05-20T00:00:00+00:00</published>
		<updated>2018-05-20T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2018/05/pair-with-me-on-rust/"/>
		<id>https://blog.cyplo.dev/posts/2018/05/pair-with-me-on-rust/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2018/05/pair-with-me-on-rust/">&lt;p&gt;Why ? Rust has such a wonderful community and I want to give back as much as I can.
I am not an expert in Rust but I am not a beginner either. In addition to that I love pair programming !
The result is always much better than I could produce myself. I am happy to both share the knowledge and learn.&lt;&#x2F;p&gt;
&lt;p&gt;I would love to pair with you !
If you’re a new Rustacean, fresh to the language - come on in ! If you’re an expert - welcome !&lt;&#x2F;p&gt;
&lt;p&gt;We can work on any of the following:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Any project of yours !&lt;&#x2F;li&gt;
&lt;li&gt;Contribute back to a larger open source project (I am a contributor to e.g. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;cargo&#x2F;&quot;&gt;cargo&lt;&#x2F;a&gt;, &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rust&#x2F;&quot;&gt;rustc&lt;&#x2F;a&gt; and &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang-nursery&#x2F;rustup.rs&#x2F;&quot;&gt;rustup&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;A project of mine - e.g. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;lib.rs&#x2F;crates&#x2F;genpass&quot;&gt;genpass&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Ping me an &lt;a href=&quot;mailto:rust@cyplo.dev&quot;&gt;email&lt;&#x2F;a&gt; to schedule a session - can be a remote one or in person somewhere in London.&lt;&#x2F;p&gt;
&lt;p&gt;Thank you !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Configure AWS Elastic Beanstalk Docker environment variables</title>
		<published>2018-04-23T12:00:00+00:00</published>
		<updated>2018-04-23T12:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2018/04/beanstalk-docker-environment-variables/"/>
		<id>https://blog.cyplo.dev/posts/2018/04/beanstalk-docker-environment-variables/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2018/04/beanstalk-docker-environment-variables/">&lt;p&gt;AWS Beanstalk is a good &#x27;intermediate&#x27; level hosting for Docker containers. It gives you load balancing and scalability pretty much out of the box in exchange for being a bit more opaque to configure. The Docker bits are a bit more hidden away there.
In a typical production setup you would want to have Docker images not containing anything environment related, e.g. to be able to run them both in production and locally. An easy way to achieve that with Docker is via environment variables. On the local environment it&#x27;s &lt;code&gt;docker run --env NAME=VALUE&lt;&#x2F;code&gt; - what would be a Beanstalk equivalent though ?&lt;&#x2F;p&gt;
&lt;p&gt;It turns out that Beanstalk has a magical configuration directory structure that you can pass to an environment.
It goes like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;configuration.zip
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Dockerrun.aws.json
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   .ebextensions&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       environmentvariables.config
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Where &lt;code&gt;Dockerrun.aws.json&lt;&#x2F;code&gt; is your regular Docker definition file for Beanstalk, can look like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &amp;quot;AWSEBDockerrunVersion&amp;quot;: &amp;quot;1&amp;quot;,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &amp;quot;Image&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        &amp;quot;Name&amp;quot;: &amp;quot;image:latest&amp;quot;,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        &amp;quot;Update&amp;quot;: &amp;quot;true&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    },
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &amp;quot;Ports&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        &amp;quot;ContainerPort&amp;quot;: &amp;quot;1234&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;While &lt;code&gt;.ebextensions&#x2F;environmentvariables.config&lt;&#x2F;code&gt; is where, well, you set the environment variables that will be defined in the container. Example:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;option_settings:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - option_name: ENV_VAR1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    value: &amp;quot;some value&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  - option_name: ENV_VAR2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    value: &amp;quot;some other value&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But wait, there&#x27;s more ! Get the zip file and upload it to some S3 bucket, I&#x27;m going to assume that the file is at &lt;code&gt;BUCKET_NAME&#x2F;CONFIG_PATH&lt;&#x2F;code&gt; in the example below.
Then you need to tell Beanstalk where the file is located. This can be achieved by creating a new application version:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;aws elasticbeanstalk create-application-version --application-name APPLICATION_NAME --version-label VERSION --source-bundle S3Bucket=BUCKET_NAME,S3Key=CONFIG_PATH
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;aws elasticbeanstalk update-environment --environment-name ENVIRONMENT_NAME --version-label VERSION
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Waiting for AWS Elastic Beanstalk environment to become ready</title>
		<published>2018-04-23T00:00:00+00:00</published>
		<updated>2018-04-23T00:00:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2018/04/wait-for-beanstalk/"/>
		<id>https://blog.cyplo.dev/posts/2018/04/wait-for-beanstalk/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2018/04/wait-for-beanstalk/">&lt;p&gt;Elastic Beanstalk on AWS seems to be one of those services that are pretty cool but it&#x27;s hard to get to know them.
One of the tasks you may encounter while working with it is that after making some change to its configuration you would like to wait for it to be finished before proceeding further. The change may be setting an environment variable but can also be deploying a new version of the application. I created a small bash script to help with that, can be useful when you try to run this process unattended, e.g. from CI.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-set z-shell&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;e&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-set z-shell&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;o&lt;&#x2F;span&gt; pipefail&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;application_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;environment_name&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;timeout_seconds&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-shell&quot;&gt;function&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-function z-shell&quot;&gt;getStatus&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-shell&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-shell&quot;&gt;)&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-section z-braces z-begin z-shell&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-echo z-shell&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-command z-backticks z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;aws&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; elasticbeanstalk describe-environments &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-command z-backticks z-shell&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;    --&lt;&#x2F;span&gt;application-name&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;application_name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;environment-name&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;environment_name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-command z-backticks z-shell&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;jq&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;r&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;.Environments | .[]?&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;jq&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;r&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;.Status&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-end z-shell&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;sleep_time_seconds&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;5&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;max_iterations_count&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-arithmetic z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-shell&quot;&gt;((&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;timeout_seconds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-arithmetic z-shell&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;sleep_time_seconds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-shell&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;iterations&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;0&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-echo z-shell&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Waiting for a maximum of &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;timeout_seconds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; seconds for &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;environment_name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; to become ready&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;status&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-command z-parens z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-shell&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;getStatus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-shell&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-while z-shell&quot;&gt;while&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-double-brace z-begin z-shell&quot;&gt;[[&lt;&#x2F;span&gt; ( &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;status&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-shell&quot;&gt;!=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Ready&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; ) &lt;span class=&quot;z-keyword z-operator z-logical z-shell&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; ( &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;iterations&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;lt&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;max_iterations_count&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; ) &lt;span class=&quot;z-support z-function z-double-brace z-end z-shell&quot;&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-continue z-shell&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-do z-shell&quot;&gt;do&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;status&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-command z-parens z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-shell&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;getStatus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-shell&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-echo z-shell&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;status&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sleep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;sleep_time_seconds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-group z-arithmetic z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-arithmetic z-begin z-shell&quot;&gt;((&lt;&#x2F;span&gt;iterations&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;+=&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-shell&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-arithmetic z-end z-shell&quot;&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-loop z-end z-shell&quot;&gt;done&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Happy coding !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Setting up Rust development environment using VSCode on a Mac</title>
		<published>2017-11-25T13:50:27+00:00</published>
		<updated>2017-11-25T13:50:27+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2017/11/rust-vscode-mac/"/>
		<id>https://blog.cyplo.dev/posts/2017/11/rust-vscode-mac/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2017/11/rust-vscode-mac/">&lt;h2 id=&quot;completion-and-highlighting&quot;&gt;Completion and highlighting&lt;&#x2F;h2&gt;
&lt;p&gt;While on Linux VSCode with the Rust plugin seems to work more or less out of the box, on a Mac I needed to spend some time configuring it.&lt;&#x2F;p&gt;
&lt;p&gt;First things first though, let&#x27;s start by installing Rust version manager, rustup.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;curl https:&#x2F;&#x2F;sh.rustup.rs -sSf | sh
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We will be using nightly version of rust as to have one version that can compile all of our tools. This is mostly due to &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-lang-nursery&#x2F;rust-clippy&quot;&gt;&lt;code&gt;clippy&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; requiring a nightly compiler.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rustup install nightly
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rustup default nightly
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We will need Rust Language Server to provide the code completion.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rustup component add rls-preview --toolchain nightly
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rustup component add rust-analysis --toolchain nightly
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rustup component add rust-src --toolchain nightly
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For a more wholesome experience, please have some tools as well:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cargo install clippy rustfmt rustsym
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now finally, for the VSCode itself, press &lt;code&gt;cmd-p&lt;&#x2F;code&gt; and &lt;code&gt;ext install vscode-rust&lt;&#x2F;code&gt;. I&#x27;m using the new &lt;code&gt;Rust&lt;&#x2F;code&gt; extension as &lt;code&gt;Rusty Code&lt;&#x2F;code&gt; has been discontinued.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re lucky - that&#x27;s it, you should have working completion and highlighting in Rust files. Check this by opening any Rust source code file.
If you&#x27;re greeted by this message: &lt;code&gt;You have chosen RLS mode but neither RLS executable path is specified nor rustup is installed&lt;&#x2F;code&gt; - then we need to get the extension to get to know your setup a bit:&lt;&#x2F;p&gt;
&lt;p&gt;In VSCode go to &lt;code&gt;Settings&lt;&#x2F;code&gt; using &lt;code&gt;cmd-,&lt;&#x2F;code&gt; and put the following config elements there:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;language-json z-code&quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;rust.cargoPath&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;Users&#x2F;yourusername&#x2F;.cargo&#x2F;bin&#x2F;cargo&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;rust.cargoHomePath&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;Users&#x2F;yourusername&#x2F;.cargo&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;rust.rustfmtPath&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;Users&#x2F;yourusername&#x2F;.cargo&#x2F;bin&#x2F;rustfmt&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;rust.rustsymPath&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;Users&#x2F;yourusername&#x2F;.cargo&#x2F;bin&#x2F;rustsym&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;rust.rustLangSrcPath&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;Users&#x2F;yourusername&#x2F;.rustup&#x2F;toolchains&#x2F;nightly-x86_64-apple-darwin&#x2F;lib&#x2F;rustlib&#x2F;src&#x2F;rust&#x2F;src&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;rust.mode&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;rls&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;rust.rls&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;executable&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;Users&#x2F;yourusername&#x2F;.cargo&#x2F;bin&#x2F;rls&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;useRustfmt&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt;true&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As the paths in the config need to be absolute, remember to adjust to your situation (system username) accordingly.&lt;&#x2F;p&gt;
&lt;p&gt;Now when you reload and start editing a Rust file you should see &lt;code&gt;RLS: Analysis finished&lt;&#x2F;code&gt; on the bottom bar and the completion and highlighting should all work. Yay !&lt;&#x2F;p&gt;
&lt;h2 id=&quot;building-and-testing&quot;&gt;Building and testing&lt;&#x2F;h2&gt;
&lt;p&gt;VSCode has a system of tasks that we can leverage to run the build and test from within VSCode.
If you go to &lt;code&gt;Tasks-&amp;gt;Configure&lt;&#x2F;code&gt; tasks it will create an empty &lt;code&gt;tasks.json&lt;&#x2F;code&gt; file in your repository.
Change it to the following to allow for &lt;code&gt;cargo&lt;&#x2F;code&gt; to be hooked up as your build tool and test runner.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;language-json z-code&quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;version&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;2.0.0&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;tasks&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-begin z-json&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;    &lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;label&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;build&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;type&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;shell&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;command&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;cargo build&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;group&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;kind&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;build&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;isDefault&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt;true&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;problemMatcher&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-begin z-json&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-end z-json&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;    &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-sequence z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;    &lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;label&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;test&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;type&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;shell&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;command&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;cargo test&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;group&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;kind&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;test&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;isDefault&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-constant z-language z-json&quot;&gt;true&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;    &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;  &lt;span class=&quot;z-punctuation z-section z-sequence z-end z-json&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can use &lt;code&gt;cmd-shift-b&lt;&#x2F;code&gt; to run the build now.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;debugging&quot;&gt;Debugging&lt;&#x2F;h2&gt;
&lt;p&gt;For the native debugger to work we need to install another extension to VSCode called &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vadimcn&#x2F;vscode-lldb&#x2F;blob&#x2F;master&#x2F;MANUAL.md&quot;&gt;&#x27;LLDB Debugger&#x27;&lt;&#x2F;a&gt;. That would be &lt;code&gt;cmd-p&lt;&#x2F;code&gt; and &lt;code&gt;ext install vadimcn.vscode-lldb&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;After reloading VSCode you should be able to set breakpoints on the side gutter and run the program using debugger by pressing &lt;code&gt;F5&lt;&#x2F;code&gt;. First time doing this will result in the debugger choice window. Choose &lt;code&gt;LLDB Debugger&lt;&#x2F;code&gt; as your debugger and you will be greeted with a JSON configuration file in which you need to tell the debugger a few details on your project. It may look like this:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;language-json z-code&quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;version&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;0.2.0&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;configurations&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-begin z-json&quot;&gt;[&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;    &lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;type&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;lldb&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;request&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;launch&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;name&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Debug&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;program&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;${workspaceRoot}&#x2F;target&#x2F;debug&#x2F;name_of_your_executable&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;args&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-begin z-json&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-sequence z-end z-json&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;cwd&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;${workspaceRoot}&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;      &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;preLaunchTask&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;build&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;    &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-sequence z-json&quot;&gt;  &lt;span class=&quot;z-punctuation z-section z-sequence z-end z-json&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And that should be it !&lt;&#x2F;p&gt;
&lt;p&gt;Now you should be able to set breakpoints and debug through the code.&lt;&#x2F;p&gt;
&lt;p&gt;Start the debugging session by pressing &lt;code&gt;F5&lt;&#x2F;code&gt; again - this should result in the build proceeding and then the debugger launching.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;questions&quot;&gt;Questions ?&lt;&#x2F;h2&gt;
&lt;p&gt;Any questions ? Ask on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;users.rust-lang.org&#x2F;&quot;&gt;https:&#x2F;&#x2F;users.rust-lang.org&#x2F;&lt;&#x2F;a&gt; and ping me the link via email to me at &lt;a href=&quot;mailto:blog@cyplo.net&quot;&gt;blog@cyplo.net&lt;&#x2F;a&gt;. This way the answer will be visible to everyone in the community.&lt;&#x2F;p&gt;
&lt;p&gt;Keep on Rusting !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Adding graphs to posts in Nikola</title>
		<published>2017-07-15T20:13:50+00:00</published>
		<updated>2017-07-15T20:13:50+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2017/07/adding-graphs-to-posts-in-nikola/"/>
		<id>https://blog.cyplo.dev/posts/2017/07/adding-graphs-to-posts-in-nikola/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2017/07/adding-graphs-to-posts-in-nikola/">&lt;p&gt;&lt;strong&gt;Update as of April 2019&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This blog no longer runs on Nikola so the embedded examples do not work anymore.
The method described in the post is still valid though.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;I really like to teach, try to explain things in a simple manner. There is often no better way of making an explanation than visualizing it.
The problem is that I really can&#x27;t draw, especially on a computer.
Wouldn&#x27;t it be awesome if I could make the computer draw for me ?
I found out that, unsurprisingly, there is a software for that already. The one I like is called mermaid - it renders a simple text description of a graph or diagram into an html representation. Can look something like this.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; class=&quot;language-html z-code&quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-meta z-tag z-block z-any z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-html&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-block z-any z-html&quot;&gt;div&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-attribute-with-value z-class z-html&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-class z-html&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-html&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-html&quot;&gt;&lt;span class=&quot;z-meta z-class-name z-html&quot;&gt;mermaid&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-html&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  graph TB subgraph one a1--&amp;gt;a2 end subgraph two b1--&amp;gt;b2 end subgraph three
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  c1--&amp;gt;c2 end c1--&amp;gt;a2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-meta z-tag z-block z-any z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-html&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-block z-any z-html&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-html&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This blog is rendered by Nikola hence I would like to show you how I&#x27;ve added mermaid support to my Nikola installation.
I use &lt;code&gt;USE_BUNDLES = False&lt;&#x2F;code&gt; in &lt;code&gt;conf.py&lt;&#x2F;code&gt; as for it gives me more control and is more HTTP&#x2F;2 friendly.
With that disabled I can include mermaid&#x27;s style and js files like so (also in &lt;code&gt;conf.py&lt;&#x2F;code&gt;):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python z-code&quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;EXTRA_HEAD_DATA&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text&#x2F;css&amp;quot; href=&amp;quot;&#x2F;assets&#x2F;css&#x2F;fontawesome.css&amp;quot;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text&#x2F;css&amp;quot; href=&amp;quot;&#x2F;assets&#x2F;css&#x2F;titillium.css&amp;quot;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text&#x2F;css&amp;quot; href=&amp;quot;&#x2F;assets&#x2F;css&#x2F;mermaid.forest.css&amp;quot;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-qualified-name z-python&quot;&gt;&lt;span class=&quot;z-variable z-other z-constant z-python&quot;&gt;BODY_END&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-python&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-python&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&amp;lt;script src=&amp;quot;&#x2F;assets&#x2F;js&#x2F;mermaid.js&amp;quot;&amp;gt;&amp;lt;&#x2F;script&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&amp;lt;script&amp;gt;mermaid.initialize({startOnLoad:true, cloneCssStyles: false});&amp;lt;&#x2F;script&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-python&quot;&gt;&lt;span class=&quot;z-meta z-string z-python&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-block z-python&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-python&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Where do all these files come from though ? In my case, I have a custom theme, based on &lt;code&gt;zen&lt;&#x2F;code&gt; called &lt;code&gt;zen-cyplo&lt;&#x2F;code&gt;. The assets in the sources are located under &lt;code&gt;themes&#x2F;zen-cyplo&#x2F;assets&#x2F;&lt;&#x2F;code&gt;. Oh, and &lt;code&gt;cloneCssStyles: false&lt;&#x2F;code&gt; is there as the default of &lt;code&gt;true&lt;&#x2F;code&gt; made the different css styles on my blog clash.
Finally, to use mermaid in the post do (for reStructured Text):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; class=&quot;language-html z-code&quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-meta z-tag z-block z-any z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-html&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-block z-any z-html&quot;&gt;div&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-attribute-with-value z-class z-html&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-class z-html&quot;&gt;class&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-html&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-html&quot;&gt;&lt;span class=&quot;z-meta z-class-name z-html&quot;&gt;mermaid&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-html&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  graph TB subgraph one a1--&amp;gt;a2 end subgraph two b1--&amp;gt;b2 end subgraph three
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  c1--&amp;gt;c2 end c1--&amp;gt;a2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-meta z-tag z-block z-any z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-html&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-block z-any z-html&quot;&gt;div&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-html&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;del&gt;You can click on &lt;code&gt;source&lt;&#x2F;code&gt; button located below the title of this post to see it in action. If you are interested in the build process and how all these come together - the complete sources for this blog are hosted under https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;blog&lt;&#x2F;del&gt;&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Upload your site to Netlify using their incremental deployment API</title>
		<published>2017-03-20T19:25:00+00:00</published>
		<updated>2017-03-20T19:25:00+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2017/03/netlify-incremental-deployer/"/>
		<id>https://blog.cyplo.dev/posts/2017/03/netlify-incremental-deployer/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2017/03/netlify-incremental-deployer/">&lt;p&gt;I&#x27;ve recently switched to a setup where I do all my builds for this blog on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;travis-ci.org&#x2F;cyplo&#x2F;blog&quot;&gt;Travis&lt;&#x2F;a&gt;. While doing so I needed to migrate away from using Netlify&#x27;s internal build infrastructure. This resulted in a quick &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;netlify_deployer&quot;&gt;python script&lt;&#x2F;a&gt; that allows you to upload arbitrary directory tree to Netlify and does so using their &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.netlify.com&#x2F;docs&#x2F;api&#x2F;#deploying-to-netlify&quot;&gt;incremental deployment API&lt;&#x2F;a&gt;. All that means that while this site is quite big in size the deployments go rather quickly ! There are some &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;netlify_deployer&#x2F;issues&quot;&gt;known issues&lt;&#x2F;a&gt; but apart from them the script should just work for any custom Netlify deployment you would like to have. I use it on this very site, to have a preview of any PR before merging it as well as for deploying the main site after the PR is merged. I hope you will find it useful and please do not hesitate if you want to post an issue or a PR !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Running host programs in isolation inside one-off Docker containers</title>
		<published>2017-02-17T22:08:46+00:00</published>
		<updated>2017-02-17T22:08:46+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2017/02/testing-local-scripts-in-isolation-inside-one-off-docker-containers/"/>
		<id>https://blog.cyplo.dev/posts/2017/02/testing-local-scripts-in-isolation-inside-one-off-docker-containers/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2017/02/testing-local-scripts-in-isolation-inside-one-off-docker-containers/">&lt;p&gt;I am quite bad at remembering how to launch docker to have everything set up correctly. Hence the following - a script that launches any commandline specified in its arguments inside a new docker container. Current directory is mounted inside the container automatically, so the thing you are executing can have its local dependencies satisfied.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;USERNAME&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-command z-backticks z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;whoami&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;MOUNT_PATH&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&#x2F;mnt&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;CURRENT_DIRECTORY&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-command z-backticks z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-pwd z-shell&quot;&gt;pwd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;P&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; untangle symbolic links if needed - SELinux needs the real path&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;IMAGE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;debian:jessie&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-shell&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-double-brace z-begin z-shell&quot;&gt;[[&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;z&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-double-brace z-end z-shell&quot;&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-continue z-shell&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-conditional z-then z-shell&quot;&gt;then&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-echo z-shell&quot;&gt;echo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;usage: &lt;span class=&quot;z-meta z-group z-expansion z-command z-backticks z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;basename&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; command_to_run_inside_a_container&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-exit z-shell&quot;&gt;exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; 1&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-end z-shell&quot;&gt;fi&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;RESOLVED_ARGUMENTS&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-language z-shell&quot;&gt;@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;docker&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; run&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;t&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;v&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;CURRENT_DIRECTORY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;:&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;MOUNT_PATH&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;:Z &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;IMAGE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; bash&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;c&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;useradd -M -d &amp;#39;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;MOUNT_PATH&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&amp;#39; &lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;USERNAME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &amp;amp;&amp;amp; cd &amp;#39;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;MOUNT_PATH&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&amp;#39; &amp;amp;&amp;amp; bash -c &amp;#39;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;RESOLVED_ARGUMENTS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&amp;#39;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; restore SELinux context for the current directory&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;restorecon_path&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-command z-backticks z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;which&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; restorecon&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-shell&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-double-brace z-begin z-shell&quot;&gt;[[&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;x&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;restorecon_path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-double-brace z-end z-shell&quot;&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-continue z-shell&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-conditional z-then z-shell&quot;&gt;then&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;restorecon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;R&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;CURRENT_DIRECTORY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-end z-shell&quot;&gt;fi&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I use vanilla Debian Jessie as a run platform there, mostly because this is what most of my servers run.
The script covers setting up SELinux and mounting the directory from which it is run as &lt;code&gt;&#x2F;mnt&lt;&#x2F;code&gt; inside the container while also having the default non-root user added.&lt;&#x2F;p&gt;
&lt;p&gt;Run Jessie, run !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Using ad hoc Docker volumes on SELinux systems</title>
		<published>2016-12-30T18:28:50+00:00</published>
		<updated>2016-12-30T18:28:50+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2016/12/using-ad-hoc-docker-volumes-on-selinux-enabled-systems/"/>
		<id>https://blog.cyplo.dev/posts/2016/12/using-ad-hoc-docker-volumes-on-selinux-enabled-systems/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2016/12/using-ad-hoc-docker-volumes-on-selinux-enabled-systems/">&lt;p&gt;I&#x27;ve recently tried running some quick Docker commands using host&#x27;s directory as a volume:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;docker run -i -t -v `pwd`:&#x2F;mnt debian:jessie bash -c &amp;quot;ls -hal &#x2F;mnt&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ls: cannot open directory &#x2F;mnt: Permission denied
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I use Fedora as my main OS, which, it turns out, has some pretty nice SELinux settings. These deny access from inside the container to the outside.
Said Fedora consists mostly of almost-newest-but-stable everything though, which makes Docker to be in a fairly recent version.
A version that understands how to change a SELinux context for the directory we&#x27;re mounting, by itself !
You need at least Docker v1.7 for this.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;docker run -i -t -v `pwd`:&#x2F;mnt:Z debian:jessie bash -c &amp;quot;ls -hal &#x2F;mnt&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;total 8.0K
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;drwxrwxr-x.  2 1000 1000 4.0K Dec 30 18:34 .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;drwxr-xr-x. 21 root root  242 Dec 30 19:07 ..
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Please note the capital &lt;code&gt;Z&lt;&#x2F;code&gt; as a mount parameter.
And that is it. Mostly. Some cleanup remains, as docker leaves the host&#x27;s directory with a changed SELinux context.
To restore it you need to&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;restorecon -R `pwd`
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Or use any other path you&#x27;d like instead of &lt;code&gt;pwd&lt;&#x2F;code&gt; in the examples above.&lt;&#x2F;p&gt;
&lt;p&gt;Happy dockering !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>RustFest - organization was the best. Also rhymes.</title>
		<published>2016-09-18T18:43:47+00:00</published>
		<updated>2016-09-18T18:43:47+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2016/09/rustfest-organization-was-the-best/"/>
		<id>https://blog.cyplo.dev/posts/2016/09/rustfest-organization-was-the-best/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2016/09/rustfest-organization-was-the-best/">&lt;h1 id=&quot;i-went-to-rustfest-and-it-was-amazing&quot;&gt;I went to RustFest and it was amazing !&lt;&#x2F;h1&gt;
&lt;p&gt;It was clearly the best conference organizational-wise I&#x27;ve been to so far.
It made me think of what I really liked there. What made it so awesome and welcomy ?
To me this was a large number of small things just coming together. I listing them here for me to remember and for others to use.
Let&#x27;s make conferences at least this friendly, together !&lt;&#x2F;p&gt;
&lt;h2 id=&quot;before-the-event&quot;&gt;Before the event:&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;very clear emails, repeating messages couple of times in different emails for the important stuff&lt;&#x2F;li&gt;
&lt;li&gt;maps of the popular routes provided, e.g. from the airport and bus station&lt;&#x2F;li&gt;
&lt;li&gt;supporter ticket sale - two times the price - you pay for another person that wouldn&#x27;t be able to get a ticket otherwise&lt;&#x2F;li&gt;
&lt;li&gt;survey on dietary requirements&#x2F;allergies&lt;&#x2F;li&gt;
&lt;li&gt;survey on childcare needs&lt;&#x2F;li&gt;
&lt;li&gt;clear statement of the code of conduct for the conference&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;during-the-event&quot;&gt;During the event:&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;very good MC person&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;keeping people entertained through the tech breaks&lt;&#x2F;li&gt;
&lt;li&gt;keeping tabs on the talk length, allowing appropriate amount of questions if the time allowed&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;live captioning of all talks - small screen outside of the view of the main screen with the text live&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;getting the next speaker prepared and mic-tested before the end of the current talk&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;quiet room to rest with clear rules on no talking and interrupting there&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;clear signage for the different parts of the venue (washrooms, quiet room, party space etc)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;washrooms&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;all same, ungendered&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;basic items for free in said washrooms&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;chewing gum&lt;&#x2F;li&gt;
&lt;li&gt;tooth paste&lt;&#x2F;li&gt;
&lt;li&gt;tampons, pads&lt;&#x2F;li&gt;
&lt;li&gt;baby wipes&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;info desk&#x2F;registration&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;clear info during registration, handing out programme&lt;&#x2F;li&gt;
&lt;li&gt;asking people if they want to be on the photos - giving out lanyards accordingly - flashy red lanyards for people who do not want photos of them taken&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;emergency number to call with stated purpose&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;code of conduct violation&lt;&#x2F;li&gt;
&lt;li&gt;if you are lost in the city&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>The best terminal emulator for Windows 10&#x27;s Bash or how to run X applications</title>
		<published>2016-07-06T19:21:13+00:00</published>
		<updated>2016-07-06T19:21:13+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2016/07/06/terminal-emulator-windows-10/"/>
		<id>https://blog.cyplo.dev/posts/2016/07/06/terminal-emulator-windows-10/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2016/07/06/terminal-emulator-windows-10/">&lt;p&gt;&lt;strong&gt;update as of 03&#x2F;2017&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;As this article is by far the most popular on my site right now I feel that an update is necessary, as the landscape evolved a bit since the original publish date.
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;conemu.github.io&#x2F;&quot;&gt;Conemu&lt;&#x2F;a&gt; started to support Bash on Windows properly now and this is what I settled on in the end.
The article below is still relevant for &lt;em&gt;the running X applications on Windows&lt;&#x2F;em&gt; part though.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;I&#x27;ve been playing a bit with
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;mikegerwitz.com&#x2F;2016&#x2F;04&#x2F;GNU-kWindows&quot;&gt;GNU&#x2F;kWindows&lt;&#x2F;a&gt; a.k.a.
Bash on Windows a.k.a Windows Subsystem for Linux (Beta). I was
especially interested whether I can use my regular Linux
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;dotfiles&#x2F;&quot;&gt;dotfiles&lt;&#x2F;a&gt; to recreate my working
environment of zsh + tmux + vim. The biggest troubles I had were with
the terminal emulator. While the default one, invoked by saying &lt;strong&gt;bash&lt;&#x2F;strong&gt;
is much better than powershell or cmd.exe already - it lacks some things
I&#x27;ve learned to rely on, like 256-colour palette support. Thus the
search for the ultimate terminal emulator begun. I tried &lt;strong&gt;ConEmu&lt;&#x2F;strong&gt;,
&lt;strong&gt;cmder&lt;&#x2F;strong&gt; and their spinoffs to no avail. Either the colours were
lacking, or the emulator would swallow up certain strokes like the arrow
keys. Then I thought - hey, I use &lt;strong&gt;terminator&lt;&#x2F;strong&gt; on Linux, maybe it
would be possible to use it here as well. To my surprise the answer was - yes !&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;install Windows Subsystem for Linux&lt;&#x2F;li&gt;
&lt;li&gt;restart Windows&lt;&#x2F;li&gt;
&lt;li&gt;install &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;sourceforge.net&#x2F;projects&#x2F;vcxsrv&quot;&gt;VcXsrv&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;run VcXsrv&lt;&#x2F;li&gt;
&lt;li&gt;invoke the following from the bash console:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo apt-get install terminator
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;DISPLAY=:0 terminator -u
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;profit !&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;{{&amp;lt; figure src=&quot;&#x2F;images&#x2F;terminal-emulator-windows-10&#x2F;capture.png&quot; postition=&quot;center&quot; &amp;gt;}}&lt;&#x2F;p&gt;
&lt;p&gt;The font rendering is not ideal and the borderless mode does
not work, but hey, it is quite usable nonetheless ! It even has
bidirectional clipboard sharing with Windows&#x27; windows, which is good.
P.S. konsole and gnome-terminal do seem to have troubles launching
(crashy-crashes there)&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Don&#x27;t throw away. Fix.</title>
		<published>2016-06-12T12:25:34+00:00</published>
		<updated>2016-06-12T12:25:34+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2016/06/12/dont-throw-away-fix/"/>
		<id>https://blog.cyplo.dev/posts/2016/06/12/dont-throw-away-fix/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2016/06/12/dont-throw-away-fix/">&lt;p&gt;Try fixing your things. It&#x27;s already broken - no need to sweat.
You might learn something.
Level 2 - push for things to be easily fixable.
It&#x27;s good for you. It&#x27;s good for the planet.&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;ifixit_self-repair_manifesto_900x1390.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;thumbnails&#x2F;ifixit_self-repair_manifesto_900x1390.jpg&quot; alt=&quot;ifixit_self-repair_manifesto_900x1390.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;IMG_20160612_120723.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;thumbnails&#x2F;IMG_20160612_120723.jpg&quot; alt=&quot;IMG_20160612_120723.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;IMG_20160612_120730.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;thumbnails&#x2F;IMG_20160612_120730.jpg&quot; alt=&quot;IMG_20160612_120730.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;IMG_20160612_120814.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;thumbnails&#x2F;IMG_20160612_120814.jpg&quot; alt=&quot;IMG_20160612_120814.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;IMG_20160612_120945.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;thumbnails&#x2F;IMG_20160612_120945.jpg&quot; alt=&quot;IMG_20160612_120945.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;IMG_20160612_121012.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;dont-throw-away-fix&#x2F;thumbnails&#x2F;IMG_20160612_121012.jpg&quot; alt=&quot;IMG_20160612_121012.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Conferences you did not know existed and now you know you just need to go to</title>
		<published>2016-03-13T11:43:03+00:00</published>
		<updated>2016-03-13T11:43:03+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2016/03/13/conferences/"/>
		<id>https://blog.cyplo.dev/posts/2016/03/13/conferences/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2016/03/13/conferences/">&lt;h1 id=&quot;go-to-conferences-it-s-good-for-you&quot;&gt;Go to conferences. It&#x27;s good for you.&lt;&#x2F;h1&gt;
&lt;p&gt;Ever wondered why to go to conferences ? Is it worth it, especially if
you &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;sage.thesharps.us&#x2F;2016&#x2F;02&#x2F;02&#x2F;first-timers-guide-to-foss-conferences&#x2F;&quot;&gt;do not feel confident&lt;&#x2F;a&gt;
that the conference is on something that would be in an immediate realm
of your day-to-day interests ? Just go ! You might end up learning
something and meeting new people. And new people mean more variables to
mix up your life. A bit scary, I know. Still worth it though. Wondered
what conference in &lt;strong&gt;Europe&lt;&#x2F;strong&gt; are weird enough so people wouldn&#x27;t mind
having another misfit ? Here you go.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;nucl-ai&quot;&gt;nucl.ai&lt;&#x2F;h1&gt;
&lt;p&gt;Now imagine something niche within the industry. To me, AI comes to
mind. Mages in robes in their towers, sending out autonomous robot
armies against each other. Right ? There&#x27;s a conference for that ! At
&lt;a href=&quot;#&quot;&gt;nucl.ai&lt;&#x2F;a&gt;, in July, in Vienna, you can meet AI
professionals from academia and industry alike, most of them coming from
game development background. The atmosphere is very newcomer-friendly,
the only requirement is that you&#x27;re interested in AI, not necessarily
having anything to do with it professionally. Petra and Alex, the
organizers, are wonderful people that make this conference quite unique.
It&#x27;s happy fun to see ideas floating from academia to the industry and
vice versa. Don&#x27;t forget the presentations on work-in-progress major AAA
games ! I&#x27;ve learned there that the everyday programming in the games
industry is quite different than the one I do in terms of best practices
and patterns. Definitely worth a try !&lt;&#x2F;p&gt;
&lt;h1 id=&quot;erlang-user-conference&quot;&gt;Erlang User Conference&lt;&#x2F;h1&gt;
&lt;p&gt;Speaking of something completely different. Erlang ! Was functional
before being functional was &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=xrIjfIjssLE&quot;&gt;considered cool&lt;&#x2F;a&gt;. Very practical,
very fast, parallelize everything ! Processes everywhere ! Message
passing ! Want to feel the groove as well ? Visit Stockholm in September
for &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.erlang-factory.com&#x2F;&quot;&gt;Erlang User Conference&lt;&#x2F;a&gt;. Meet
creators of the language, talk about massive scale deployments. Other FP
languages are welcome. I would even say, the more strange the better.
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.idris-lang.org&#x2F;&quot;&gt;Idris&lt;&#x2F;a&gt; seems to be the topic of interest
as well. Eat good food, walk the city of dynamite. Erlang has a quite
close-knit community which gives you this warm family feeling.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;socrates&quot;&gt;SoCraTes&lt;&#x2F;h1&gt;
&lt;p&gt;Speaking of family. There&#x27;s a family of conferences known as
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.socrates-conference.de&#x2F;&quot;&gt;SoCraTes&lt;&#x2F;a&gt;. Software
Crafstmanship and Testing. SoCraTes. Get it ? :D As it&#x27;s more than one
conference a year, it&#x27;s harder to go to all of them. I only went to
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.codefreeze.fi&#x2F;&quot;&gt;Codefreeze&lt;&#x2F;a&gt;, in Finland, in January, and
only once, but loved it already. Codefreeze, Finland, in January. Get it
?! :D First thing is that you don&#x27;t know what will happen there. You
just go, meet the people and then you sit down and everyone talks about
what they would like to learn and what they can share. This way you come
up with some loose agenda you follow more or less. One track, very
intense. Talking, swimming in ice water, learning, sauna going. Very
intimate feel, not many people, lots of things to learn.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;chaos-communication-congress&quot;&gt;Chaos Communication Congress&lt;&#x2F;h1&gt;
&lt;p&gt;Speaking of lots of people and intimate feel. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Chaos_Communication_Congress&quot;&gt;Chaos Communication Congress&lt;&#x2F;a&gt; is, I think, the biggest gathering of all nerds and freaks in Europe,
yet being there feels quite at home. The best organized conference I&#x27;ve
been to. Friendly people showing their wares on their humble tables, 4
simultaneous tracks, huge building with intricate hallways. It&#x27;s
cyberpunk, it&#x27;s inclusive, it&#x27;s about hardcore infosec topics, it&#x27;s
about politics. Everything&#x27;s there, everyone&#x27;s there. 4 days of data
being constantly uploaded to your brain, riding on the waves of &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Club-Mate&quot;&gt;Club
Mate&lt;&#x2F;a&gt;. Feels like an
extended holiday present, as it&#x27;s happening in the last week of
December.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-camps&quot;&gt;The Camps&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Observe._Hack._Make.&quot;&gt;The Dutch Camp&lt;&#x2F;a&gt;, &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.emfcamp.org&#x2F;&quot;&gt;EMF Camp&lt;&#x2F;a&gt; and
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Chaos_Communication_Camp&quot;&gt;Chaos Communication Camp&lt;&#x2F;a&gt;.
Imagine CCC, the Congress, but in the woods. Middle of nowhere,
multigigabit internet connection. sleeping in the tent, then going to a
world-class lecture. BothCCC, the camp, and The Dutch Camp, the camp,
are happening every 4 years, each of them taking alternating slots. So
every 2 years there is a camp somewhere. EMF is there even more frequently - every 2 years !
Did I mention that the location changes with almost every event ? Happy camping !&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;&#x2F;h2&gt;
&lt;p&gt;So go out there. Explore. Meet people. Learn. Have fun. None of the
above are much expensive and most of the events have a policy of &quot;write
to us if you want to go but can&#x27;t afford the ticket&quot;. Friendly people
fixing problems together.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;nucl.ai: July, tickets around 250EUR&lt;&#x2F;li&gt;
&lt;li&gt;EUC: September, tickets around 350EUR&lt;&#x2F;li&gt;
&lt;li&gt;SoCraTes: the cost and the time depend on the event&lt;&#x2F;li&gt;
&lt;li&gt;CCC: last week of December, tickets around 100EUR&lt;&#x2F;li&gt;
&lt;li&gt;The Camps: summer, tickets around 125EUR&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Productive New Year&#x27;s Eve</title>
		<published>2015-12-31T20:11:35+00:00</published>
		<updated>2015-12-31T20:11:35+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/12/31/productive-new-years-eve/"/>
		<id>https://blog.cyplo.dev/posts/2015/12/31/productive-new-years-eve/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/12/31/productive-new-years-eve/">&lt;p&gt;It turns out that the last day of the year can be quite productive. I&#x27;ve
managed to sneak in a PCB layout for the input measurement and
protection board for my &lt;a href=&quot;&#x2F;series&#x2F;sunpowered&quot;&gt;sunpowered&lt;&#x2F;a&gt;. Got it
ordered, can&#x27;t wait to test it ! I got carried away with via stitching
there a bit - we&#x27;ll see how hard it will be to solder the larger
components because of that. The whole project is hosted
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;sunpowered&#x2F;tree&#x2F;master&#x2F;electronics&quot;&gt;here&lt;&#x2F;a&gt; - it&#x27;s
open hardware so please do take a look.&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;productive-new-years-eve&#x2F;angled.png&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;productive-new-years-eve&#x2F;thumbnails&#x2F;angled.png&quot; alt=&quot;angled.png&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;productive-new-years-eve&#x2F;bottom.png&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;productive-new-years-eve&#x2F;thumbnails&#x2F;bottom.png&quot; alt=&quot;bottom.png&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;productive-new-years-eve&#x2F;top.png&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;productive-new-years-eve&#x2F;thumbnails&#x2F;top.png&quot; alt=&quot;top.png&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Sporting Let&#x27;s Encrypt certificate</title>
		<published>2015-11-17T09:51:25+00:00</published>
		<updated>2015-11-17T09:51:25+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/11/17/lets-encrypt-certificate/"/>
		<id>https://blog.cyplo.dev/posts/2015/11/17/lets-encrypt-certificate/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/11/17/lets-encrypt-certificate/">&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;letsencrypt.org&#x2F;&quot;&gt;Let&#x27;s Encrypt&lt;&#x2F;a&gt; is a soon to be publicly
available service to provide TLS certificates for free and in automated
fashion. I&#x27;m helping them test their systems by participating in the
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;letsencrypt.org&#x2F;2015&#x2F;11&#x2F;12&#x2F;public-beta-timing.html&quot;&gt;beta programme&lt;&#x2F;a&gt;.
Because of that this site is now sporting, publicly recognizable
certificate from Let&#x27;s Encrypt. Yay ! The work they are doing I believe
is of much importance. Lack of easy path for getting TLS certificate was
a major hurdle for the most of the website owners, otherwise keen on
getting their traffic encrypted. This, in turn, is important for two
reasons. Not allowing the content you are viewing on the internet to be
snooped at, not leaking you private data is one thing. Other, less
known, but as much important, is countering the ability of injecting any
malicious code&#x2F;data into the responses from the servers you got and in
turn preventing lots of man in the middle attacks. Hopefully, when Let&#x27;s
Encrypt becomes publicly available we would be on the path to much more
friendly internet for all.  &lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Fixing timeouts running Android integration tests</title>
		<published>2015-10-25T09:55:54+00:00</published>
		<updated>2015-10-25T09:55:54+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/10/25/android-integration-test-timeouts/"/>
		<id>https://blog.cyplo.dev/posts/2015/10/25/android-integration-test-timeouts/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/10/25/android-integration-test-timeouts/">&lt;p&gt;I run Android tests on CI and after having switched to Lollipop recently the integration tests wouldn&#x27;t run. Invoking
&lt;code&gt;androidConnectedTest&lt;&#x2F;code&gt; gradle target always resulted in crashing with
&lt;code&gt;ShellCommandUnresponsiveException&lt;&#x2F;code&gt;. Internet says that in such a case
ou just need to set &lt;code&gt;ADB_INSTALL_TIMEOUT&lt;&#x2F;code&gt;. I tried to no avail.
Sourcediving it is then !&lt;&#x2F;p&gt;
&lt;p&gt;A long while after that I got to this file:
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;android.googlesource.com&#x2F;platform&#x2F;tools&#x2F;base&#x2F;+&#x2F;master&#x2F;ddmlib&#x2F;src&#x2F;main&#x2F;java&#x2F;com&#x2F;android&#x2F;ddmlib&#x2F;Device.java&quot;&gt;Device.java&lt;&#x2F;a&gt; (linking to master, here&#x27;s the commit hash: &lt;code&gt;1cb1a4c2976b99ae53d28d7f01d975232c85f990&lt;&#x2F;code&gt;, as I don&#x27;t seem to be able to find how to link to that hash directly) 
What do we see there ? That indeed &lt;code&gt;ADB_INSTALL_TIMEOUT&lt;&#x2F;code&gt; is being used:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;java&quot; class=&quot;language-java z-code&quot;&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-java&quot;&gt;static&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-java&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt; installTimeout &lt;span class=&quot;z-meta z-assignment z-rhs z-java&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-java&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;getenv&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;ADB_INSTALL_TIMEOUT&lt;span class=&quot;z-punctuation z-definition z-string z-end z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-storage z-type z-primitive z-java&quot;&gt;long&lt;&#x2F;span&gt; time &lt;span class=&quot;z-meta z-assignment z-rhs z-java&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-java&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-java&quot;&gt;4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-keyword z-control z-conditional z-if z-java&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-parens z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;installTimeout &lt;span class=&quot;z-keyword z-operator z-comparison z-java&quot;&gt;!=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-language z-java&quot;&gt;null&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-java&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;		&lt;span class=&quot;z-keyword z-control z-exception z-try z-java&quot;&gt;try&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-java&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;			time &lt;span class=&quot;z-meta z-assignment z-rhs z-java&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-java&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;Long&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;parseLong&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;installTimeout&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;		&lt;span class=&quot;z-punctuation z-section z-block z-end z-java&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-catch z-java&quot;&gt;&lt;span class=&quot;z-keyword z-control z-exception z-catch z-java&quot;&gt;catch&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-catch z-parameters z-java&quot;&gt;&lt;span class=&quot;z-meta z-parens z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;NumberFormatException&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-java&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-java&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;			&lt;span class=&quot;z-comment z-line z-double-slash z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-java&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; use default value
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;		&lt;span class=&quot;z-punctuation z-section z-block z-end z-java&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-punctuation z-section z-block z-end z-java&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-constant z-other z-java&quot;&gt;INSTALL_TIMEOUT_MINUTES&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-assignment z-rhs z-java&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-java&quot;&gt;=&lt;&#x2F;span&gt; time&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-java&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So far so good,
&lt;code&gt;ADB_INSTALL_TIMEOUT&lt;&#x2F;code&gt; system variable seems to be respected when
invoking package installation tools. Are the above the only methods that
can install a package though ? Going further on that hunch we see that
in addition to installing single packages there is a possibility of
having a multi-package installation session.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;java&quot; class=&quot;language-java z-code&quot;&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-java&quot;&gt;public&lt;&#x2F;span&gt; void &lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;installPackages&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;List&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-java&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-java&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; apkFilePaths&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-primitive z-java&quot;&gt;int&lt;&#x2F;span&gt; timeOutInMs&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-primitive z-java&quot;&gt;boolean&lt;&#x2F;span&gt; reinstall&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt; extraArgs&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; throws &lt;span class=&quot;z-support z-class z-java&quot;&gt;InstallException&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-java&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-assertion z-java&quot;&gt;&lt;span class=&quot;z-keyword z-control z-flow z-assert z-java&quot;&gt;assert&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-parens z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-java&quot;&gt;!&lt;&#x2F;span&gt;apkFilePaths&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;isEmpty&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-java&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-parens z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;getApiLevel&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-java&quot;&gt;&amp;lt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-java&quot;&gt;21&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-java&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-support z-class z-java&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;w&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Internal error : installPackages invoked with device &amp;lt; 21 for %s&lt;span class=&quot;z-punctuation z-definition z-string z-end z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;Joiner&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;,&lt;span class=&quot;z-punctuation z-definition z-string z-end z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;apkFilePaths&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-keyword z-control z-conditional z-if z-java&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-parens z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;apkFilePaths&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;size&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-comparison z-java&quot;&gt;==&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-java&quot;&gt;1&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-java&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;		&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;installPackage&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;apkFilePaths&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-java&quot;&gt;0&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; reinstall&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; extraArgs&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;		&lt;span class=&quot;z-keyword z-control z-flow z-return z-java&quot;&gt;return&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-punctuation z-section z-block z-end z-java&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-support z-class z-java&quot;&gt;Log&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;e&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Internal error : installPackages invoked with device &amp;lt; 21 for multiple APK : %s&lt;span class=&quot;z-punctuation z-definition z-string z-end z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;Joiner&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;,&lt;span class=&quot;z-punctuation z-definition z-string z-end z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;apkFilePaths&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;	&lt;span class=&quot;z-keyword z-control z-flow z-throw z-java&quot;&gt;throw&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-instantiation z-java&quot;&gt;&lt;span class=&quot;z-keyword z-other z-storage z-new z-java&quot;&gt;new&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;InstallException&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-parens z-constructor-arguments z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Internal error : installPackages invoked with device &amp;lt; 21 for multiple APK : &lt;span class=&quot;z-punctuation z-definition z-string z-end z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-arithmetic z-java&quot;&gt;+&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;Joiner&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;on&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;,&lt;span class=&quot;z-punctuation z-definition z-string z-end z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;join&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;apkFilePaths&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-java&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;[&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt; sessionId &lt;span class=&quot;z-meta z-assignment z-rhs z-java&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-java&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;createMultiInstallSession&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;apkFilePaths&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; extraArgsList&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; reinstall&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Aha ! Non-Lollipop check here, with a
fallback to the old method - we may be onto something ! Some lines pass
and we can see an invocation of &lt;code&gt;createMultiInstallSession&lt;&#x2F;code&gt;. What&#x27;s
there ?&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;java&quot; class=&quot;language-java z-code&quot;&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-java&quot;&gt;private&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;createMultiInstallSession&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;List&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-java&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-java&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; apkFileNames&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; @&lt;span class=&quot;z-support z-class z-java&quot;&gt;NonNull&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;Collection&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-java&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-java&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; extraArgs&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-primitive z-java&quot;&gt;boolean&lt;&#x2F;span&gt; reinstall&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; throws &lt;span class=&quot;z-support z-class z-java&quot;&gt;TimeoutException&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;AdbCommandRejectedException&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;ShellCommandUnresponsiveException&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;IOException&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-java&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;[&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt; cmd &lt;span class=&quot;z-meta z-assignment z-rhs z-java&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-java&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;String&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;format&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-java&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;pm install-create %1$s -S %2$d&lt;span class=&quot;z-punctuation z-definition z-string z-end z-java&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; parameters&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; totalFileSize&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;executeShellCommand&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;cmd&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; receiver&lt;span class=&quot;z-punctuation z-separator z-comma z-java&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-class z-java&quot;&gt;DdmPreferences&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-java&quot;&gt;&lt;span class=&quot;z-variable z-function z-java&quot;&gt;getTimeOut&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-java&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-java&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-java&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-java&quot;&gt;&lt;span class=&quot;z-meta z-block z-java&quot;&gt;[&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-java&quot;&gt;.&lt;&#x2F;span&gt;]
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A different invocation of
&lt;code&gt;executeShellCommand&lt;&#x2F;code&gt;, now using &lt;code&gt;DdmPreferences.getTimeOut()&lt;&#x2F;code&gt; as a
timeout value source.&lt;&#x2F;p&gt;
&lt;p&gt;Summarizing - this only happens if you install
multiple applications for your &lt;code&gt;androidConnectedTest&lt;&#x2F;code&gt; and you are using
android device to test on that has api version that is equal or greater
to 21. That is all cool that we had this little Computer Science
Investigation, but how to fix that - i.e. how to have proper timeouts
for your installations ? Ideally from somewhere you configure and&#x2F;or
invoke your builds. It turns out that gradle supports invoking just
enough Java for us to use there. In your &lt;code&gt;gradle.build&lt;&#x2F;code&gt; as the very
first lines:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;groovy&quot; class=&quot;language-groovy z-code&quot;&gt;&lt;code class=&quot;language-groovy&quot; data-lang=&quot;groovy&quot;&gt;&lt;span class=&quot;z-source z-groovy&quot;&gt;&lt;span class=&quot;z-support z-function z-print z-groovy&quot;&gt;println&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-groovy&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-groovy&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;setting global timeout for apk installation to 10 minutes&lt;span class=&quot;z-punctuation z-definition z-string z-end z-groovy&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-groovy&quot;&gt;&lt;span class=&quot;z-storage z-type z-class z-groovy&quot;&gt;com.android.ddmlib.DdmPreferences&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-groovy&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method-call z-groovy&quot;&gt;&lt;span class=&quot;z-meta z-method z-groovy&quot;&gt;setTimeOut&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-method-parameters z-begin z-groovy&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-groovy&quot;&gt;600000&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-method-parameters z-end z-groovy&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-groovy&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-groovy&quot;&gt;android &lt;span class=&quot;z-meta z-block z-groovy&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-groovy&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-groovy&quot;&gt;&lt;span class=&quot;z-meta z-block z-groovy&quot;&gt;	compileSdkVersion compileSdk
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-groovy&quot;&gt;&lt;span class=&quot;z-meta z-block z-groovy&quot;&gt;	buildToolsVersion buildTools
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-groovy&quot;&gt;&lt;span class=&quot;z-meta z-block z-groovy&quot;&gt;&lt;span class=&quot;z-meta z-structure z-groovy&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-structure z-begin z-groovy&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-range z-groovy&quot;&gt;..&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-groovy&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-structure z-end z-groovy&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That&#x27;s it. Invoke your android tests with
&lt;code&gt;ADB_INSTALL_TIMEOUT&lt;&#x2F;code&gt; env variable set &lt;strong&gt;AND&lt;&#x2F;strong&gt; have the
&lt;code&gt;DddPreference&lt;&#x2F;code&gt; set in your &lt;code&gt;gradle.build&lt;&#x2F;code&gt; as in the example above and
you should be golden. Happy droiding !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Tools - precision gauge holder</title>
		<published>2015-10-17T13:46:36+00:00</published>
		<updated>2015-10-17T13:46:36+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/10/17/tools-indicator-holder/"/>
		<id>https://blog.cyplo.dev/posts/2015/10/17/tools-indicator-holder/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/10/17/tools-indicator-holder/">&lt;p&gt;This is the second part in the &lt;a href=&quot;&#x2F;series&#x2F;tools&quot;&gt;series&lt;&#x2F;a&gt; on the tools I use. Tools that are
surprisingly useful, tools that are not that obvious to find. Today:
how to calibrate the CNC axis without actually cutting anything ? Use a
test indicator ! How to hold the meter steady though, ? Attach it to the
frame of your router using the power of magnets ! Sample item on Amazon
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.amazon.com&#x2F;gp&#x2F;product&#x2F;B00OZA71H6&#x2F;ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B00OZA71H6&amp;amp;linkCode=as2&amp;amp;tag=adventucomput-20&amp;amp;linkId=6ZJKCJHMA2YON4LY&quot;&gt;here&lt;&#x2F;a&gt;
(affiliate link warning)&lt;&#x2F;p&gt;
&lt;p&gt;Despite being attached to the frame by its back instead of the bottom it
still holds beautifully.&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;tools-indicator-holder&#x2F;IMG_1389.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;tools-indicator-holder&#x2F;thumbnails&#x2F;IMG_1389.jpg&quot; alt=&quot;IMG_1389.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;tools-indicator-holder&#x2F;IMG_1390.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;tools-indicator-holder&#x2F;thumbnails&#x2F;IMG_1390.jpg&quot; alt=&quot;IMG_1390.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;tools-indicator-holder&#x2F;IMG_1391.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;tools-indicator-holder&#x2F;thumbnails&#x2F;IMG_1391.jpg&quot; alt=&quot;IMG_1391.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Enabling USB 3.0 in already existing Virtualbox VMs</title>
		<published>2015-09-27T12:09:05+00:00</published>
		<updated>2015-09-27T12:09:05+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/09/27/usb-3-0-virtualbox-vms/"/>
		<id>https://blog.cyplo.dev/posts/2015/09/27/usb-3-0-virtualbox-vms/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/09/27/usb-3-0-virtualbox-vms/">&lt;p&gt;Just a quick note on how to get USB 3.0 in Virtualbox for VMs that were
created with USB 1.1 support only. First, download VirtualBox Extension
Pack from &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.virtualbox.org&#x2F;wiki&#x2F;Downloads&quot;&gt;here&lt;&#x2F;a&gt;. Install
it. Then quit Virtualbox completely. Go to your directory that contains
your virtual machine and edit &lt;code&gt;.vbox&lt;&#x2F;code&gt; file. Replace the whole
&lt;code&gt;&amp;lt;USBController&amp;gt;&lt;&#x2F;code&gt; section with the following:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;xml&quot; class=&quot;language-xml z-code&quot;&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;z-text z-xml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-xml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-xml&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-localname z-xml&quot;&gt;USB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-xml&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-xml&quot;&gt;    &lt;span class=&quot;z-meta z-tag z-xml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-xml&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-localname z-xml&quot;&gt;Controllers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-xml&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-xml&quot;&gt;        &lt;span class=&quot;z-meta z-tag z-xml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-xml&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-localname z-xml&quot;&gt;Controller&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-localname z-xml&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-xml&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-xml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-xml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;xHCI&lt;span class=&quot;z-punctuation z-definition z-string z-end z-xml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-attribute-name z-localname z-xml&quot;&gt;type&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-xml&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-xml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-xml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;XHCI&lt;span class=&quot;z-punctuation z-definition z-string z-end z-xml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-xml&quot;&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-xml&quot;&gt;    &lt;span class=&quot;z-meta z-tag z-xml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-xml&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-localname z-xml&quot;&gt;Controllers&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-xml&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-xml&quot;&gt;    &lt;span class=&quot;z-meta z-tag z-xml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-xml&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-localname z-xml&quot;&gt;DeviceFilters&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-xml&quot;&gt;&#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-xml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-xml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-xml&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-localname z-xml&quot;&gt;USB&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-xml&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That&#x27;s it, let me know if it works for you !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>When life gives you temp space - make lemonade !</title>
		<published>2015-09-02T20:00:24+00:00</published>
		<updated>2015-09-02T20:00:24+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/09/02/swap-on-temp-disk/"/>
		<id>https://blog.cyplo.dev/posts/2015/09/02/swap-on-temp-disk/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/09/02/swap-on-temp-disk/">&lt;p&gt;Some VPS providers, e.g. Azure provide you with 2 disk drives for
your VPSes. One, of very limited size, system disk, and the other one,
spacy but with not guarantees that the data survives reboot. Basically
it means that you can have a small VPS, with a small amount of RAM but
large temp disk space. Why this could be useful ? Imagine tasks with
lots of mem requirements but that not need to be extra fast, where
swapping is allowed. Like complex nightly builds. Here is a set of super
simple scripts I&#x27;ve come up with to quickly boot up a system, and then
in the background add a new swap file on the temp drive there. The temp
drive is assumed to be under &#x2F;mnt.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;root@someazurehost:~# cat &#x2F;etc&#x2F;rc.local
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#!&#x2F;bin&#x2F;sh -e
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;set -v
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# do not wait for swap to become online,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# proceed with the boot further,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# with swap being created in the background
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;etc&#x2F;make_and_enable_swap &amp;amp;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;exit 0
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;root@someazurehost:~# cat &#x2F;etc&#x2F;make_and_enable_swap
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#!&#x2F;bin&#x2F;sh
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;set -e
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;set -v
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# create new 2GB swap file
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dd if=&#x2F;dev&#x2F;zero of=&#x2F;mnt&#x2F;swap bs=1M count=2048
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;chmod 0600 &#x2F;mnt&#x2F;swap
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;mkswap &#x2F;mnt&#x2F;swap
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;swapon &#x2F;mnt&#x2F;swap
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Don&#x27;t forget to make &lt;code&gt;&#x2F;etc&#x2F;make_and_enable_swap&lt;&#x2F;code&gt; executable !
Do not add this swap file to fstab, as it is being read before rc.local,
and this may certainly result in a boot failure, as the swap file would
not be ready yet.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Containerized zombie spawner</title>
		<published>2015-08-12T21:21:13+00:00</published>
		<updated>2015-08-12T21:21:13+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/08/12/containerized-zombie-spawner/"/>
		<id>https://blog.cyplo.dev/posts/2015/08/12/containerized-zombie-spawner/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/08/12/containerized-zombie-spawner/">&lt;p&gt;Recently I was playing with a fully Dockerized setup of Jenkins at work
and found a curious issue there. Whenever Jenkins was polling the git
server the side effect was that it created a zombie ssh process. The
issue is actually
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jenkinsci&#x2F;docker&#x2F;issues&#x2F;54&quot;&gt;remediated&lt;&#x2F;a&gt; by the
Jenkins team now by &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jenkinsci&#x2F;docker&#x2F;commit&#x2F;d5aea67dcae9d62fe4ca6ad961ffe66f65d9a591&quot;&gt;explicitly using&lt;&#x2F;a&gt;
a tiny init system called ... &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;krallin&#x2F;tini&quot;&gt;tini&lt;&#x2F;a&gt; started as the main
container&#x27;s process instead of just starting Jenkins there. This tiny
tini thing can properly adopt and reap the children. I was all like -
wow, what a great blog entry is coming at me. I was planning to describe
how zombies come to existence on Linux and why Docker should, in my
opinion, provide an adopter-reaper by default and other very interesting
things ! But then I found a really excellent article by the
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.phusion.nl&#x2F;&quot;&gt;Phusion&lt;&#x2F;a&gt; team
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;blog.phusion.nl&#x2F;2015&#x2F;01&#x2F;20&#x2F;docker-and-the-pid-1-zombie-reaping-problem&#x2F;&quot;&gt;here&lt;&#x2F;a&gt;
explaining all that and more. It is very good. You should read it. That
is it. The end. Happy reaping !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>My CNC machining workflow</title>
		<published>2015-05-28T19:01:33+00:00</published>
		<updated>2015-05-28T19:01:33+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/05/28/cnc-workflow/"/>
		<id>https://blog.cyplo.dev/posts/2015/05/28/cnc-workflow/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/05/28/cnc-workflow/">&lt;p&gt;Hello ! Today we&#x27;ll talk about driving CNC machines, toolpaths and
Debian, so stay tuned ! I have a separate old PC for driving the CNC
machine via parallel port. This is, as they say, the Only Proper Way and
It Was Always Like That. I&#x27;m thinking about changing this to
USB+&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;grbl&#x2F;grbl&quot;&gt;grbl&lt;&#x2F;a&gt; in the future then ;) Up
till now, my workflow went as follows;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Do the research and drawing&#x2F;parts modeling in FreeCad, on my main workstation&lt;&#x2F;li&gt;
&lt;li&gt;Export to e.g. DXF&lt;&#x2F;li&gt;
&lt;li&gt;Import in HeeksCad&lt;&#x2F;li&gt;
&lt;li&gt;Design machining operations, export gcode&lt;&#x2F;li&gt;
&lt;li&gt;Copy gcode to a network drive&lt;&#x2F;li&gt;
&lt;li&gt;Switch the monitor and keyboard to the one of the old PC&lt;&#x2F;li&gt;
&lt;li&gt;Open gcode in LinuxCNC and go&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;What happens if it&#x27;s not perfect at first try though ?! Most commonly the issue  is with the
toolpath, like I want to change feeds or speeds or depth of cut, rarely
it is with the part itself, fortunately. It may have something to do
with the fact that I&#x27;m mostly working with other people&#x27;s parts for now
;) Anyway, to do any correction I need to switch back to the main
workstation, correct in Heeks, re-export to the network drive and switch
back, reimport. Not very annoying but not very convenient either. But
wait. What if...I install Heeks on the old PC ?! It&#x27;s running
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;linuxcnc.org&#x2F;&quot;&gt;LinuxCNC&lt;&#x2F;a&gt; realtime distro, which is based on
Debian wheezy. Heeks packages are available prepackaged for Ubuntu only.
With the help of the
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;code.google.com&#x2F;p&#x2F;heekscad&#x2F;wiki&#x2F;BuildDebianPackages&quot;&gt;documentation&lt;&#x2F;a&gt;
and the comments there and in other corners of the internet I was able
to get this little script done:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;!&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-set z-shell&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;e&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-set z-shell&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;v&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; apt-get update&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; apt-get&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;y&lt;&#x2F;span&gt; install liboce-visualization-dev libwxgtk2.8-dev libgtkglext1-dev python-dev build-essential bzr git libboost-dev libboost-python-dev subversion debhelper cmake liboce-ocaf2 liboce-ocaf-dev oce-draw&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; heeks_build&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; heeks_build&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;svn&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; checkout http:&#x2F;&#x2F;libarea.googlecode.com&#x2F;svn&#x2F;trunk&#x2F; libarea&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; libarea&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;dpkg-buildpackage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;us&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;uc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; ..&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; dpkg&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt; libarea&lt;span class=&quot;z-keyword z-operator z-regexp z-quantifier z-shell&quot;&gt;*&lt;&#x2F;span&gt;.deb python-area&lt;span class=&quot;z-keyword z-operator z-regexp z-quantifier z-shell&quot;&gt;*&lt;&#x2F;span&gt;.deb&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;svn&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; checkout http:&#x2F;&#x2F;heekscad.googlecode.com&#x2F;svn&#x2F;trunk&#x2F; heekscad&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; heekscad&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;dpkg-buildpackage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;us&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;uc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; ..&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; dpkg&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-regexp z-quantifier z-shell&quot;&gt;*&lt;&#x2F;span&gt;heeks&lt;span class=&quot;z-keyword z-operator z-regexp z-quantifier z-shell&quot;&gt;*&lt;&#x2F;span&gt;.deb&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;svn&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; checkout http:&#x2F;&#x2F;heekscnc.googlecode.com&#x2F;svn&#x2F;trunk&#x2F; heekscnc&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; heekscnc&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;dpkg-buildpackage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;us&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;uc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; ..&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; clone https:&#x2F;&#x2F;github.com&#x2F;aewallin&#x2F;opencamlib.git&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; opencamlib&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;bzr&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; branch lp:&lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;neomilium&#x2F;opencamlib&#x2F;packaging debian&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;dpkg-buildpackage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;b&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;us&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;uc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-cd z-shell&quot;&gt;cd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; ..&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; dpkg&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt; python-ocl&lt;span class=&quot;z-keyword z-operator z-regexp z-quantifier z-shell&quot;&gt;*&lt;&#x2F;span&gt;.deb&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; dpkg&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;i&lt;&#x2F;span&gt; heekscnc&lt;span class=&quot;z-keyword z-operator z-regexp z-quantifier z-shell&quot;&gt;*&lt;&#x2F;span&gt;.deb&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Run this on your LinuxCNC machine and that&#x27;s it. It will download and
build all the dependencies and Heeks CAD and CAM packages. This way, my
current workflow goes more like this:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Do the research and drawing&#x2F;parts modeling in FreeCad, on my main workstation&lt;&#x2F;li&gt;
&lt;li&gt;Export to e.g. DXF to a network drive&lt;&#x2F;li&gt;
&lt;li&gt;Switch the monitor and keyboard to the one of the old PC&lt;&#x2F;li&gt;
&lt;li&gt;Import in HeeksCad&lt;&#x2F;li&gt;
&lt;li&gt;Design machining operations, export gcode&lt;&#x2F;li&gt;
&lt;li&gt;Open gcode in LinuxCNC and go&lt;&#x2F;li&gt;
&lt;li&gt;Repeat last 2 steps if necessary - no machine switching&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Update on the sunpowered server</title>
		<published>2015-05-02T14:54:05+00:00</published>
		<updated>2015-05-02T14:54:05+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/05/02/sunpowered-data/"/>
		<id>https://blog.cyplo.dev/posts/2015/05/02/sunpowered-data/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/05/02/sunpowered-data/">&lt;blockquote&gt;
&lt;p&gt;Update 2023: I no longer hosts those dashboards anymore and the server no longer runs in the form described.
You could argue I still run sunpowered servers, as my new house has solar PV ;)&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Some, rather long, time ago I&#x27;ve added a &lt;a href=&quot;&#x2F;posts&#x2F;2014&#x2F;04&#x2F;21&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;&quot;&gt;custom python&lt;&#x2F;a&gt;
data acquisition and graphing to my sunpowered RaspberryPi installation
on the balcony. Since then I&#x27;ve upgraded it to Raspi2 and ported the
data thingy to influxdb + grafana. All 3 of those things I am very
positively surprised by.&lt;&#x2F;p&gt;
&lt;p&gt;RaspberryPi2 - definitely worth the upgrade - it&#x27;s a speed demon now.  Small caveat - I recommend
installing raspbian from scratch, especially if you had some custom
overclocking config, as these do not seem to be compatible between Pi1 and Pi2. Also RasPi2 needs a microsd card instead of full-sized one. As for
the software - since everything went surprisingly smoothly this post is
not much of a tutorial. Just go to &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;influxdb.com&#x2F;&quot;&gt;influxdb&lt;&#x2F;a&gt;
and &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;grafana.org&#x2F;&quot;&gt;Grafana&lt;&#x2F;a&gt; and go through the respective
installation documentation. You need x86 64bit server to host this, so
unfortunately no self-hosting on RaspberryPi - at least I wasn&#x27;t able to
compile the software there. I&#x27;ve &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;sunpowered&#x2F;tree&#x2F;master&#x2F;software&quot;&gt;changed the original python scripts slightly&lt;&#x2F;a&gt;,
to upload the data to influxdb instead of graphing directly via
matplotlib. Then configured grafana to display some cool graphs and that
was pretty much it - you can see the result at
&lt;a href=&quot;#&quot;&gt;data.cyplo.net&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Right now I&#x27;m testing 2 different sizes of solar panels and
batteries, hooked at the same time. The ADC is connected as it was
before though, so a TODO is to add more measurements, to see how the
individual  panels&#x27; output change during the data and how does it affect
each of the batteries.&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered-data&#x2F;IMG_1290.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered-data&#x2F;thumbnails&#x2F;IMG_1290.jpg&quot; alt=&quot;IMG_1290.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered-data&#x2F;IMG_1291.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered-data&#x2F;thumbnails&#x2F;IMG_1291.jpg&quot; alt=&quot;IMG_1291.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>CNC router arrives</title>
		<published>2015-04-26T13:17:05+00:00</published>
		<updated>2015-04-26T13:17:05+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/04/26/cnc-router-arrives/"/>
		<id>https://blog.cyplo.dev/posts/2015/04/26/cnc-router-arrives/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/04/26/cnc-router-arrives/">&lt;p&gt;After 2 months of waiting - my CNC router arrives. 8 weeks lead time
they said - 7 weeks and 4 days it was ! Who are they ?
TanieCNC people (company no longer exists: tanie-cnc.pl) - CheapCNC in Polish.
Although it may look like they don&#x27;t know how to make websites AND their
name does not instill a lot of confidence - but hey, they certainly
know how to weld and make precise machinery ! The size of the package
caught me off guard, I&#x27;ve spent an hour disassembling the crate in full
sun. After that I wasn&#x27;t able to get it through the stairs myself,
fortunately a friendly neighbour gave me their pair of hands. Lifting
the machine by 2 people is okay, it&#x27;s still not lightweight, but
bearable. Putting it on the table was a different affair entirely.
Careful not to damage anything, especially the motor assemblies - we&#x27;ve
put it on a impromptu wood ramp. Using heavy duty straps, we&#x27;ve lifted it
up little by little. Then some inspection - the quality is really
superb, especially of the metal frame ! After that I got an old PC with
Windows XP and parallel port running Mach3 software - I wanted to set it
up as in any other shop at start. Later on I&#x27;m planning on moving to
LinuxCNC and then gradually off parallel port on to a USB stack,
something more like an arduino parsing gcode and driving motors instead
of relying of the accurate timing of the PC. TODOs:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;add an MDF bed layer on top of existing bed&lt;&#x2F;li&gt;
&lt;li&gt;get better clamps&lt;&#x2F;li&gt;
&lt;li&gt;get more router bits&lt;&#x2F;li&gt;
&lt;li&gt;get a vacuum attachment for the spindle&lt;&#x2F;li&gt;
&lt;li&gt;move to LinuxCNC&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1254.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1254.jpg&quot; alt=&quot;IMG_1254.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1255.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1255.jpg&quot; alt=&quot;IMG_1255.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1257.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1257.jpg&quot; alt=&quot;IMG_1257.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1261.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1261.jpg&quot; alt=&quot;IMG_1261.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1262.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1262.jpg&quot; alt=&quot;IMG_1262.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1263.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1263.jpg&quot; alt=&quot;IMG_1263.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1264.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1264.jpg&quot; alt=&quot;IMG_1264.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1266.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1266.jpg&quot; alt=&quot;IMG_1266.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1268.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1268.jpg&quot; alt=&quot;IMG_1268.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1270.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1270.jpg&quot; alt=&quot;IMG_1270.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1272.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1272.jpg&quot; alt=&quot;IMG_1272.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1277.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1277.jpg&quot; alt=&quot;IMG_1277.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1278.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1278.jpg&quot; alt=&quot;IMG_1278.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1279.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1279.jpg&quot; alt=&quot;IMG_1279.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1280.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1280.jpg&quot; alt=&quot;IMG_1280.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1281.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1281.jpg&quot; alt=&quot;IMG_1281.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;IMG_1282.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;cnc-router-arrives&#x2F;thumbnails&#x2F;IMG_1282.jpg&quot; alt=&quot;IMG_1282.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Tools - PCB holder</title>
		<published>2015-03-28T18:33:53+00:00</published>
		<updated>2015-03-28T18:33:53+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/03/28/tools-pcb-holder/"/>
		<id>https://blog.cyplo.dev/posts/2015/03/28/tools-pcb-holder/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/03/28/tools-pcb-holder/">&lt;p&gt;I thought it would be cool to share with you the tools I find
surprisingly useful. Behold the first in the series: the PCB holder ! I
cannot overstate how much is that of a difference from the &#x27;third
hand&#x27;-type of holders. The grip is very firm but won&#x27;t scratch the
surface nor short anything because the jaws are made from a soft
plastic. And the whole thing &lt;strong&gt;ROTATES&lt;&#x2F;strong&gt; !&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;tools-pcb-holder&#x2F;IMG_1248.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;tools-pcb-holder&#x2F;thumbnails&#x2F;IMG_1248.jpg&quot; alt=&quot;IMG_1248.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;tools-pcb-holder&#x2F;IMG_1249.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;tools-pcb-holder&#x2F;thumbnails&#x2F;IMG_1249.jpg&quot; alt=&quot;IMG_1249.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;tools-pcb-holder&#x2F;IMG_1250.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;tools-pcb-holder&#x2F;thumbnails&#x2F;IMG_1250.jpg&quot; alt=&quot;IMG_1250.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Backing up and restoring whole block devices</title>
		<published>2015-02-14T08:30:51+00:00</published>
		<updated>2015-02-14T08:30:51+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/02/14/backing-restoring-whole-block-devices/"/>
		<id>https://blog.cyplo.dev/posts/2015/02/14/backing-restoring-whole-block-devices/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/02/14/backing-restoring-whole-block-devices/">&lt;p&gt;SD cards are not really a reliable storage, especially when used
constantly e.g. while sitting in always powered-on Raspberry Pi. Because
of that I&#x27;ve recently needed to perform lots of backup&#x2F;restore
operations ;) I wrote this script for backing up:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;if [[ -z $1 ]]; then
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    echo &amp;quot;usage: $0 device_to_clone&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    exit
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;device=$1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;timestamp=`date +%Y%m%d`
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dest_file=&amp;quot;&#x2F;tmp&#x2F;$timestamp.dd.xz&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;about to clone $device to $dest_file&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;ctrl-c or [enter]&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;read
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo umount $device?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo umount $device
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo sync
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo pv -tpreb $device | dd bs=4M | pixz &amp;gt; $dest_file
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo sync
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And this one for restoring:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;if [[ -z $1 ]] || [[ -z $2 ]]; then
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    echo &amp;quot;usage: $0 restore_file.xz device_to_restore_to&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    exit
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;source_file=$1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;if [[ ! -f $source_file ]]; then
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    echo &amp;quot;cannot open $source_file&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    exit
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;device=$2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;about to restore $source_file onto $device&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;ctrl-c or [enter]&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;read
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo umount $device?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo umount $device
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;pv -tpreb $source_file | pixz -d | sudo dd bs=4M of=$device
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo sync
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sudo eject $device
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Some of the more fun features include progressbars and making sure you&#x27;ve unmounted the
device properly before ;) This also uses parallel threads to deflate the
data, so the XZ compression should not be a bottleneck on any modern
machine. The scripts above were used to backup and restore SD cards but
will work for any block device, be it an external or internal disk
drive, etc. usage example (remember to use the whole device, not just
its partition as an argument):&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;.&#x2F;backup_sdcard &#x2F;dev&#x2F;sdc
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;about to clone &#x2F;dev&#x2F;sdc to &#x2F;tmp&#x2F;20150214.dd.xz
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ctrl-c or [enter]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;[sudo] password for cyryl:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;umount: &#x2F;dev&#x2F;sdc1: not mounted
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;umount: &#x2F;dev&#x2F;sdc2: not mounted
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;umount: &#x2F;dev&#x2F;sdc: not mounted
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;19,6MiB 0:00:02 [9,72MiB&#x2F;s] [&amp;gt;                       ]  0% ETA 0:52:26
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Standing desk</title>
		<published>2015-01-06T14:19:40+00:00</published>
		<updated>2015-01-06T14:19:40+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2015/01/06/standing-desk/"/>
		<id>https://blog.cyplo.dev/posts/2015/01/06/standing-desk/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2015/01/06/standing-desk/">&lt;p&gt;It was some time since the last photo-story so, please accept these
pictures of my standing desk. On the actual desk, there is a laptop
stand serving a role of a keyboard and mouse rest. Laptop itself is
flipped on its back, motherboard attached to the back of what once was a
lid. The whole thing is flying on standard monitor desk mount, using
custom vesa-to-acrylic mounting system ;)&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;IMG_1238.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;thumbnails&#x2F;IMG_1238.jpg&quot; alt=&quot;IMG_1238.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;IMG_1239.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;thumbnails&#x2F;IMG_1239.jpg&quot; alt=&quot;IMG_1239.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;IMG_1240.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;thumbnails&#x2F;IMG_1240.jpg&quot; alt=&quot;IMG_1240.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;IMG_1241.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;thumbnails&#x2F;IMG_1241.jpg&quot; alt=&quot;IMG_1241.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;IMG_1245.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;thumbnails&#x2F;IMG_1245.jpg&quot; alt=&quot;IMG_1245.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;IMG_1246.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;standing-desk&#x2F;thumbnails&#x2F;IMG_1246.jpg&quot; alt=&quot;IMG_1246.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>GUI Vagrant box</title>
		<published>2014-11-09T16:02:13+00:00</published>
		<updated>2014-11-09T16:02:13+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/11/09/gui-vagrant-box/"/>
		<id>https://blog.cyplo.dev/posts/2014/11/09/gui-vagrant-box/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/11/09/gui-vagrant-box/">&lt;p&gt;Recently I&#x27;ve started working on changing my default development
workflow. I&#x27;m evaluating vagrant as a main env manager, and then docker
for extra speed. In short, my &lt;code&gt;vagrant up&lt;&#x2F;code&gt; boots up new dev box and
then couple of docker containers. What I&#x27;ve found is that there is not
really a plethora of GUI-enabled vagrant boxes, so I&#x27;ve created one ! If
you want to use it, go:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;vagrant init
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cyplo&#x2F;ubuntu-gnome-utopic-gui vagrant up
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I will write about the whole setup later, as I&#x27;m not yet sure what approach is best for me.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Tor talk</title>
		<published>2014-11-01T12:19:49+00:00</published>
		<updated>2014-11-01T12:19:49+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/11/01/tor-talk/"/>
		<id>https://blog.cyplo.dev/posts/2014/11/01/tor-talk/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/11/01/tor-talk/">&lt;p&gt;I gave a talk this Monday, an important one I think. The one from the
kind of spreading  knowledge on the safe internet usage to people not
necessarily of the tech background. This was my first one given to a
such audience and to add to it all, it was given in Polish. The biggest
challenge ? Finding good equivalent for the English tech terms. I think
the talk went quite okay and the discussion afterwards was
lively. I talked a bit on how the internet works and what&#x27;s wrong with
that, to transition later to what problems Tor addresses and which it
does not. I tried to emphasize that using Tor does not make you
automatically immune to the dangers of the internet. Big thanks to the
organizers, Praxis (site no longer available: praxis.ue.wroc.pl) student group from
the Wroclaw University of Economy. You can find my slides
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;talks&#x2F;tree&#x2F;master&#x2F;tor_for_beginners&quot;&gt;here&lt;&#x2F;a&gt;, along with speaker notes.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Running Eagle on Ubuntu 14.10 64bit</title>
		<published>2014-11-01T11:08:10+00:00</published>
		<updated>2014-11-01T11:08:10+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/11/01/running-eagle-ubuntu-14-10-64bit/"/>
		<id>https://blog.cyplo.dev/posts/2014/11/01/running-eagle-ubuntu-14-10-64bit/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/11/01/running-eagle-ubuntu-14-10-64bit/">&lt;p&gt;Eagle is still the first choice when it comes to Open Hardware
electronics design. That&#x27;s a bit unfortunate because the software itself
is proprietary. Sometimes you need to run it though. For example to
migrate projects over to non-proprietary software ! Say, you&#x27;d like to
run new Eagle 7.1 under Ubuntu ? Try repos. Repos have the old major
version 6 only. The harder to get proprietary software the better, I
suppose. Download the blob then:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;$ wget -c http:&#x2F;&#x2F;web.cadsoft.de&#x2F;ftp&#x2F;eagle&#x2F;program&#x2F;7.1&#x2F;eagle-lin-7.1.0.run
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;$ chmod a+x eagle-lin-7.1.0.run
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Inspect and run:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;$ vim eagle-lin-7.1.0.run
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;$ .&#x2F;eagle-lin-7.1.0.run
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Ensure the following 32 bit libraries are available:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    libXrender.so.1 =&amp;gt; not found
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    libXrandr.so.2 =&amp;gt; not found
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    libXcursor.so.1 =&amp;gt; not found
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    libfreetype.so.6 =&amp;gt; not found
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    libfontconfig.so.1 =&amp;gt; not found
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    libXi.so.6 =&amp;gt; not found
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    libssl.so.1.0.0 =&amp;gt; not found
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    libcrypto.so.1.0.0 =&amp;gt; not found
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;32bit craziness, you say.
New Ubuntu does not have ia32 libs prepackaged, you say ? Here, have
this handy list of all of the dependencies then:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    $ sudo apt-get install libxrandr2:i386 libxrender1:i386 libxcursor1:i386 libfreetype6:i386 libfontconfig:i386 libxi6:i386 libssl1.0.0:i386 libcrypto++9:i386
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    # should show you the installation wizard [sic !]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    $ .&#x2F;eagle-lin-7.1.0.run
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Poor man&#x27;s secrets storage</title>
		<published>2014-09-26T10:33:31+00:00</published>
		<updated>2014-09-26T10:33:31+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/09/26/poor-mans-secrets-storage/"/>
		<id>https://blog.cyplo.dev/posts/2014/09/26/poor-mans-secrets-storage/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/09/26/poor-mans-secrets-storage/">&lt;p&gt;I&#x27;m a bit cautious when it comes to storing my passwords and other
secrets. I do not use any web or desktop applications to do this for me.
How do I remember those passphrases then ? I have a central file server,
accessible via a tunnel. I store there a gpg-encrypted file containing a
tar archive of a directory with various files containing secrets.
Syncing these files across computers became a bit cumbersome lately. I&#x27;m
using git to version them, but because I do not want to have the sync
server to contain unencrypted secrets I needed to bake some custom
solution. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;access.redhat.com&#x2F;articles&#x2F;1200223&quot;&gt;Bash&lt;&#x2F;a&gt; to the
rescue ! There are still some assumptions made here about permissions,
directories layout and some stuff not failing, but I&#x27;m sure you&#x27;ll be
able to figure this out and tweak to your needs.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TUNNEL_CREDS=&amp;quot;user@tunnelhost&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TUNNEL_PORT=123
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;STORAGE_CREDS=&amp;quot;storage_user@localhost&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;STORAGE_ADDRESS=&amp;quot;storagehost.example.org&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;SOCKET=&amp;quot;&#x2F;tmp&#x2F;black_socket&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;REMOTE_VAULT_PATH=&amp;quot;&#x2F;somepath&#x2F;.vault.tar.gpg&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TMP_VAULT=&amp;quot;&#x2F;tmp&#x2F;.vault.tar.gpg&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TMP_VAULT_TAR=&amp;quot;&#x2F;tmp&#x2F;.vault.tar&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TMP_VAULT_DIR=&amp;quot;&#x2F;tmp&#x2F;.vault&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;TMP_LOCAL_PORT=10022
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;LOCAL_VAULT_DIR=&amp;quot;$HOME&#x2F;.vault&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;LOCAL_VAULT_BACKUP_DIR=&amp;quot;$LOCAL_VAULT_DIR.bak&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;pushd `pwd`
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;removing old vault backup at $LOCAL_VAULT_BACKUP_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rm -rI &amp;quot;$LOCAL_VAULT_BACKUP_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;set -e
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;backing up local vault...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cp -r &amp;quot;$LOCAL_VAULT_DIR&amp;quot; &amp;quot;$LOCAL_VAULT_BACKUP_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;establishing tunnel ...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ssh -L $TMP_LOCAL_PORT:$STORAGE_ADDRESS:22 $TUNNEL_CREDS -p $TUNNEL_PORT -N -f -M -S &amp;quot;$SOCKET&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;tunnel ready, copying remote version of the vault...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rsync --progress -avz -e &amp;quot;ssh -p $TMP_LOCAL_PORT&amp;quot; &amp;quot;$STORAGE_CREDS:$REMOTE_VAULT_PATH&amp;quot; &amp;quot;$TMP_VAULT&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;decrypting new vault...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;gpg -d &amp;quot;$TMP_VAULT&amp;quot; &amp;gt; &amp;quot;$TMP_VAULT_TAR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;unpacking new vault...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;mkdir -p &amp;quot;$TMP_VAULT_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;tar xf &amp;quot;$TMP_VAULT_TAR&amp;quot; -C &amp;quot;$TMP_VAULT_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;pulling from remote vault...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cd &amp;quot;$LOCAL_VAULT_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;git pull &amp;quot;$TMP_VAULT_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;pulling to remote vault...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cd &amp;quot;$TMP_VAULT_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;git pull &amp;quot;$LOCAL_VAULT_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;cleaning up a bit...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rm -fr &amp;quot;$TMP_VAULT_TAR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rm -fr &amp;quot;$TMP_VAULT&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;packing refreshed remote vault...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;tar pcf &amp;quot;$TMP_VAULT_TAR&amp;quot; -C &amp;quot;$TMP_VAULT_DIR&amp;quot; .
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;encrypting refreshed remote vault...&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;gpg -c &amp;quot;$TMP_VAULT_TAR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;sending out updated vault&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rsync --progress -avz &amp;quot;$TMP_VAULT&amp;quot; -e &amp;quot;ssh -p $TMP_LOCAL_PORT&amp;quot; &amp;quot;$STORAGE_CREDS:$REMOTE_VAULT_PATH&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;cleaning up.. &amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rm -fr &amp;quot;$TMP_VAULT_DIR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rm -fr &amp;quot;$TMP_VAULT_TAR&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rm -fr &amp;quot;$TMP_VAULT&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;closing tunnel..&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ssh -S &amp;quot;$SOCKET&amp;quot; -O exit $TUNNEL_CREDS
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;popd
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Compiling git 2.0 on cygwin</title>
		<published>2014-07-05T10:06:59+00:00</published>
		<updated>2014-07-05T10:06:59+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/07/05/compiling-git-2-0-cygwin/"/>
		<id>https://blog.cyplo.dev/posts/2014/07/05/compiling-git-2-0-cygwin/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/07/05/compiling-git-2-0-cygwin/">&lt;p&gt;I had some troubles compiling git 2.0 under cygwin. I present you with a
very dirty hack to do so. Proper patch will probably follow. Did I
mention that the hack is dirty and will make your hands burn if you&#x27;re
gonna type it in ?&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;git clone https:&#x2F;&#x2F;github.com&#x2F;git&#x2F;git.git
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cd git
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;git checkout v2.0.1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;autoconf
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;.&#x2F;configure
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# so far so good...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;make
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# oops
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# ....
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;SUBDIR perl
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;make[2]: &#x2F;home&#x2F;cplotnicki&#x2F;dev&#x2F;git&#x2F;perl&#x2F;0: Command not found
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;perl.mak:375: recipe for target &amp;#39;blib&#x2F;lib&#x2F;.exists&amp;#39; failed
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;make[2]: *** [blib&#x2F;lib&#x2F;.exists] Error 127
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Makefile:16: recipe for target &amp;#39;all&amp;#39; failed
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;make[1]: *** [all] Error 2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Makefile:1653: recipe for target &amp;#39;all&amp;#39; failed
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;make: *** [all] Error 2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Want perl as &#x27;0&#x27; ? Well, why not. Here you are:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# link perl as 0 to some directory that is in your path
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ln -s &#x2F;usr&#x2F;bin&#x2F;perl ~&#x2F;tools&#x2F;0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# also link here, obviously.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# &amp;#39;perl&amp;#39; is a direct subdir for your git checkout
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ln -s &#x2F;usr&#x2F;bin&#x2F;perl perl&#x2F;0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;make # should now compile
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# cygwin&amp;#39;s permission scheme is very peculiar
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# here, have a dirty hack for your default install
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# where there is no su or sudo
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;chmod a+rwX -R &#x2F;usr&#x2F;local&#x2F;share&#x2F;man&#x2F;man3
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;chmod a+rwX -R &#x2F;usr&#x2F;local&#x2F;lib&#x2F;perl5&#x2F;site_perl
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;make install
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;git --version
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# should display 2.0.1.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# update man pages&amp;#39; cache manually
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;etc&#x2F;postinstall&#x2F;man-db.sh
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Mount your filament spool on the wall</title>
		<published>2014-06-19T13:01:59+00:00</published>
		<updated>2014-06-19T13:01:59+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/06/19/filament-spool-wall/"/>
		<id>https://blog.cyplo.dev/posts/2014/06/19/filament-spool-wall/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/06/19/filament-spool-wall/">&lt;p&gt;I find it useful to hang as much stuff as possible on the walls, instead
of using shelf&#x2F;floor&#x2F;desk space for that. Here is just a quick hack I
did to allow filament spools to be mounted securely to a wall. It turns
out that if you cut off the bent part the rod it fits perfectly into the
spool&#x27;s handle hole.&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;filament-spool-wall&#x2F;IMG_1071.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;filament-spool-wall&#x2F;thumbnails&#x2F;IMG_1071.jpg&quot; alt=&quot;IMG_1071.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;filament-spool-wall&#x2F;IMG_1073.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;filament-spool-wall&#x2F;thumbnails&#x2F;IMG_1073.jpg&quot; alt=&quot;IMG_1073.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;filament-spool-wall&#x2F;IMG_1074.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;filament-spool-wall&#x2F;thumbnails&#x2F;IMG_1074.jpg&quot; alt=&quot;IMG_1074.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Better crypto initiative</title>
		<published>2014-06-19T12:38:07+00:00</published>
		<updated>2014-06-19T12:38:07+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/06/19/better-crypto-initiative/"/>
		<id>https://blog.cyplo.dev/posts/2014/06/19/better-crypto-initiative/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/06/19/better-crypto-initiative/">&lt;p&gt;It&#x27;s not common for me to put just one link here as the content of the
article. Today, however, is one of these days. The
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;bettercrypto.org&#x2F;&quot;&gt;bettercrypto&lt;&#x2F;a&gt; folks came up with
really excellent practical guide to securing your servers. A draft for
now, but already sporting a high concentration of knowledge. BTW - it
being a draft means that you should read it and contribute to it as
well.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Adding voltage and current measurements to the sunpowered Pi</title>
		<published>2014-04-21T14:39:13+00:00</published>
		<updated>2014-04-21T14:39:13+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/04/21/adding-voltage-current-measurements-sunpowered-pi/"/>
		<id>https://blog.cyplo.dev/posts/2014/04/21/adding-voltage-current-measurements-sunpowered-pi/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/04/21/adding-voltage-current-measurements-sunpowered-pi/">&lt;p&gt;Remember my &lt;a href=&quot;&#x2F;posts&#x2F;2014&#x2F;02&#x2F;16&#x2F;sunpowered-server-setup&#x2F;&quot;&gt;sunpowered Pi&lt;&#x2F;a&gt;
installation on the balcony ? The only indication I had, since recently,
on how well the system is doing was an LED blinking red when battery was
low. Not really helpful in making predictions or making measurements
over the time. I&#x27;ve searched for simple ADC solution to hook up into Pi
and allow for some voltage and power measurements. I&#x27;ve decided on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.abelectronics.co.uk&#x2F;p&#x2F;69&#x2F;adc-pi-raspberry-pi-analogue-to-digital-converter&quot;&gt;ADC Pi&lt;&#x2F;a&gt;,
as it seemed very straightforward in its design and also comes with
example python code. Did I say Python ?! It turns
out that Python has an excellent &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;matplotlib.org&#x2F;&quot;&gt;graph plotting library&lt;&#x2F;a&gt; as well as it is very well equipped
with general purpose functions and hardware specific stuff support, like
i2c. But back to the system design. The solar panel itself can generate up to
about 30V under no load. Battery is 12V nominal but can get to 14.5V
when charging, the specs say. ADC Pi however, can measure up to 5V. You
have some resistors laying around you say ? Voltage divider it is. For
current measurement I&#x27;ve used &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.pololu.com&#x2F;product&#x2F;1185&quot;&gt;hall effect sensor module&lt;&#x2F;a&gt; from Pololu. Summarising,
I have 8 measurement lines, hooked up as follows:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;unused :D&lt;&#x2F;li&gt;
&lt;li&gt;voltage of the power line from Pi to current sensor&lt;&#x2F;li&gt;
&lt;li&gt;panel voltage&lt;&#x2F;li&gt;
&lt;li&gt;battery voltage&lt;&#x2F;li&gt;
&lt;li&gt;load voltage&lt;&#x2F;li&gt;
&lt;li&gt;regulated 12V rail voltage&lt;&#x2F;li&gt;
&lt;li&gt;regulated 5V rail voltage&lt;&#x2F;li&gt;
&lt;li&gt;current sensor reading voltage&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;It turned out that for the current measurement to be accurate I can&#x27;t
trust the voltage coming from the Pi to be stable. I actually measure
that and use that to calculate the real reading. The docs round the hall
sensor are not that obvious at the first sight, so here&#x27;s the formula I
came up with, for the greater good:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;current = (measured_sensor_voltage - (voltage_powering_sensor&#x2F;2))&#x2F;0.185&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Finally, sprinkle all of the above with &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyplo&#x2F;sunpowered&quot;&gt;some python&lt;&#x2F;a&gt; and get the following:&lt;&#x2F;p&gt;
&lt;p&gt;{{&amp;lt; figure src=&quot;&#x2F;images&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;voltages.png&quot; position=&quot;center&quot; &amp;gt;}}&lt;&#x2F;p&gt;
&lt;p&gt;Looking at this you can spot 2 things. One - April the 5th
was supercloudy superrainy and the battery did not get much charge. And
the second being that on the average day the battery gets to the full
capacity near the half of the sunny period. This is the data I was after
! I think this means that I can add more batteries to the system and on
a sunny day they will get filled up and this should suffice for couple
of rainy days in a row. Here, get some photos as the bonus, also:&lt;&#x2F;p&gt;
&lt;p&gt;TODOs, for me, and everyone else, to remember that nothing is ever finished in the
realm of hobby projects:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;add graph for power usage&lt;&#x2F;li&gt;
&lt;li&gt;would be super cool to add the weather data to the graphs&lt;&#x2F;li&gt;
&lt;li&gt;clean up python stuff, add more unit tests there&lt;&#x2F;li&gt;
&lt;li&gt;write next post on the above ;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0947.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0947.jpg&quot; alt=&quot;IMG_0947.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0948.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0948.jpg&quot; alt=&quot;IMG_0948.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0949.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0949.jpg&quot; alt=&quot;IMG_0949.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0950.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0950.jpg&quot; alt=&quot;IMG_0950.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0951.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0951.jpg&quot; alt=&quot;IMG_0951.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0952.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0952.jpg&quot; alt=&quot;IMG_0952.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0953.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0953.jpg&quot; alt=&quot;IMG_0953.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0954.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0954.jpg&quot; alt=&quot;IMG_0954.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;IMG_0955.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;thumbnails&#x2F;IMG_0955.jpg&quot; alt=&quot;IMG_0955.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Changing Terminal preferences in Gnome 3 from the commandline</title>
		<published>2014-03-29T22:34:21+00:00</published>
		<updated>2014-03-29T22:34:21+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/03/29/changing-terminal-preferences-gnome-3/"/>
		<id>https://blog.cyplo.dev/posts/2014/03/29/changing-terminal-preferences-gnome-3/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/03/29/changing-terminal-preferences-gnome-3/">&lt;p&gt;It turns out this was not that obvious, at least for me, how to change
various profile preferences for Gnome Terminal under Gnome 3 from the commandline. You can go
and fetch the list of profiles this way:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;~# dconf list &#x2F;org&#x2F;gnome&#x2F;terminal&#x2F;legacy&#x2F;profiles:&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;:b1dcc9dd-5262-4d8d-a863-c897e6d979b9&#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And then you can use the profile id to list and change various settings:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;~# dconf list &#x2F;org&#x2F;gnome&#x2F;terminal&#x2F;legacy&#x2F;profiles:&#x2F;:b1dcc9dd-5262-4d8d-a863-c897e6d979b9&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;foreground-color
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;login-shell
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;palette
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;use-system-font
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;use-theme-colors
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;font
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;bold-color-same-as-fg
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;bold-color
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;background-color
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;audible-bell
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;~# dconf write &#x2F;org&#x2F;gnome&#x2F;terminal&#x2F;legacy&#x2F;profiles:&#x2F;:b1dcc9dd-5262-4d8d-a863-c897e6d979b9&#x2F;font &amp;quot;&amp;#39;Inconsolata for Powerline Medium 18&amp;#39;&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;~# dconf write &#x2F;org&#x2F;gnome&#x2F;terminal&#x2F;legacy&#x2F;profiles:&#x2F;:b1dcc9dd-5262-4d8d-a863-c897e6d979b9&#x2F;login-shell true
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>PoC or GTFO</title>
		<published>2014-03-17T10:08:21+00:00</published>
		<updated>2014-03-17T10:08:21+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/03/17/poc-gtfo/"/>
		<id>https://blog.cyplo.dev/posts/2014/03/17/poc-gtfo/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/03/17/poc-gtfo/">&lt;blockquote&gt;
&lt;p&gt;Update 2023: I no longer host PoCorGTFO here, it&#x27;s very much available elsewhere on the internet and I couldn&#x27;t afford the costs for this server sadly.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Hey – to all you curious folks – the new issue of PoC or GTFO is well,
out ! The best minds in infosec on exploits and more. Lots of hardcore
programming knowledge to obtain. For your convenience, as it’s not that
easy to get this on the webs, I’ve took a liberty of uploading them
&lt;a href=&quot;#&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>WiFi on RaspberryPi</title>
		<published>2014-02-24T20:45:32+00:00</published>
		<updated>2014-02-24T20:45:32+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/02/24/wifi-raspberrypi/"/>
		<id>https://blog.cyplo.dev/posts/2014/02/24/wifi-raspberrypi/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/02/24/wifi-raspberrypi/">&lt;p&gt;Easiest way I&#x27;ve found to configure wifi on RaspberryPi, not really
being mentioned when you search for such. Not using separate
wpa_supplicant configuration at all.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;root@frontend:~# cat &#x2F;etc&#x2F;network&#x2F;interfaces
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;auto lo
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;iface lo inet loopback
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;iface eth0 inet dhcp
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;allow-hotplug wlan0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;iface wlan0 inet dhcp
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;wpa-ssid  NETWORK_NAME
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;wpa-psk NETWORK_KEY
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;iface default inet dhcp
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Sunpowered server setup</title>
		<published>2014-02-16T21:13:46+00:00</published>
		<updated>2014-02-16T21:13:46+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/02/16/sunpowered-server-setup/"/>
		<id>https://blog.cyplo.dev/posts/2014/02/16/sunpowered-server-setup/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/02/16/sunpowered-server-setup/">&lt;p&gt;Remember my &lt;a href=&quot;&#x2F;tags&#x2F;nas&quot;&gt;NAS&lt;&#x2F;a&gt; ? It
turned out great ! Very reliable storage, I had a disk failure once and
haven&#x27;t noticed for some time because all the files were just there.
Hardware enhanced virtualization is another great stuff. I ended up
migrating  all my of infrastructure there, each service in separate
virtual machine; email, calendar, contacts, tor node and such. Only
caveat ? Power consumption. This setup just eats Watts. About 50W
constant power usage is not something you want to have turned on
24h&#x2F;day. One such day I had a realization that this giant ball of plasma
that is hanging out there might be of some use. One side of my balcony
is to the south somewhat, gets lots of sunshine no matter whether it&#x27;s
morning or evening. Why not exploit that ? That&#x27;s how my first
solarpowered server setup was born. Enjoy the photos ! Also please find
upgrade options and general notes after the break ! There&#x27;s a &lt;a href=&quot;&#x2F;posts&#x2F;2014&#x2F;04&#x2F;21&#x2F;adding-voltage-current-measurements-sunpowered-pi&#x2F;&quot;&gt;part 2&lt;&#x2F;a&gt; of this post you might be interested in as well.&lt;&#x2F;p&gt;
&lt;p&gt;Setup itself consists of:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;144W solar panel&lt;&#x2F;li&gt;
&lt;li&gt;33Ah 12V battery&lt;&#x2F;li&gt;
&lt;li&gt;trusty old WRT54GL&lt;&#x2F;li&gt;
&lt;li&gt;Raspberry Pi model B&lt;&#x2F;li&gt;
&lt;li&gt;charging controller&lt;&#x2F;li&gt;
&lt;li&gt;12V and 5V step up&#x2F;step down converters. Don&#x27;t use linear converters,
especially for the 5V rail. As these will give you the 5V by
dissipating the difference from 12V directly onto their heatsinks,
huge power loses.&lt;&#x2F;li&gt;
&lt;li&gt;around one hundred M3 hexhead screws with nuts and washers. yup.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The router acts as wireless bridge to my home WiFi network, there are no
cables running from inside the house to the balcony. Router and raspi
use about 8W total. It is winter in here now and  this seems to be
holding nicely, panel being able to charge the battery for the night
during relatively short day, even if the weather is bad. However, I want
more computing power there and this setup does not seem to be very
scalable. Another raspi model B means another 4W constant power usage. I
estimate the whole thing will start loosing power during the night with
about 15W constant consumption. Which is okay for stuff like email
server, but not really for blog or other sites. Hence my first idea for
improvement: discard router and change for the separate raspis, model A,
with wireless network cards each. Should be much better. Some general
notes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Use equipment specifically designed for DC. You want to disconnect
the solar panel or battery sometimes. To be able to to that without
that fancy sparks show you need proper DC switch able to handle high
currents. AC switches as any other equipment dragged from AC land are
not really a choice. If you use AC mains switch to switch high
current DC you might end up with nice weld in place of your switch.
Same for fuses.&lt;&#x2F;li&gt;
&lt;li&gt;My ability to cut acrylic to line is nonexistent. Probably maybe use
better tools ? Or even, since I now know how the box should be cut -
just order pieces for box 2.0 cut to size already.&lt;&#x2F;li&gt;
&lt;li&gt;Same for my ability to make stuff look nice and clean&lt;&#x2F;li&gt;
&lt;li&gt;I like the look of bare PCBs inside of transparent box though&lt;&#x2F;li&gt;
&lt;li&gt;The box itself seems to be holding up nicely against below zero
temperatures as well as rain.&lt;&#x2F;li&gt;
&lt;li&gt;Air flow is nice, nothing is heating up. Air enters from the bottom,
heats up a bit and moves up. Goes through the holes on the left, into
the funnel and exist on the right. Water does not enter as there is
pretty steep slope there.&lt;&#x2F;li&gt;
&lt;li&gt;Watch for SD card corruption. Most often, the cause is having 5V not
really being 5V. Raspi does not really like lower voltages. One
preventive measure would be not to use some cheap voltage converters.
Another is to mount SD card with very conservative options. I use &lt;code&gt;&#x2F;dev&#x2F;mmcblk0p2 &#x2F; ext4 defaults,rw,data=journal,journal_checksum,discard 0 1&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Make sure your electronic components are rated for -40C to +80C&lt;&#x2F;li&gt;
&lt;li&gt;I&#x27;m a bit worried of battery being in such proximity to the airco
unit. We&#x27;ll see in the summer whether it needs relocation, for now
the unit is completely powered off.&lt;&#x2F;li&gt;
&lt;li&gt;mountain climbing equipment comes in handy when hanging stuff from
your balcony&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Future improvements:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;most pressing: get the power usage down by changing to model A + wifi
card&lt;&#x2F;li&gt;
&lt;li&gt;add monitoring, something like ADC connected to raspi&#x27;s GPIO ports,
gathering voltages all across. I would like to get readings on: solar
panel voltage, battery voltage, 5V rail actual voltage and the whole
system power usage at least&lt;&#x2F;li&gt;
&lt;li&gt;more safety fuses and bypass diodes&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0910.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0910.jpg&quot; alt=&quot;IMG_0910.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0911.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0911.jpg&quot; alt=&quot;IMG_0911.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0912.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0912.jpg&quot; alt=&quot;IMG_0912.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0913.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0913.jpg&quot; alt=&quot;IMG_0913.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0915.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0915.jpg&quot; alt=&quot;IMG_0915.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0916.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0916.jpg&quot; alt=&quot;IMG_0916.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0917.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0917.jpg&quot; alt=&quot;IMG_0917.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0918.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0918.jpg&quot; alt=&quot;IMG_0918.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0921.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0921.jpg&quot; alt=&quot;IMG_0921.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0922.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0922.jpg&quot; alt=&quot;IMG_0922.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0923.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0923.jpg&quot; alt=&quot;IMG_0923.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0924.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0924.jpg&quot; alt=&quot;IMG_0924.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0925.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0925.jpg&quot; alt=&quot;IMG_0925.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0926.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0926.jpg&quot; alt=&quot;IMG_0926.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0927.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0927.jpg&quot; alt=&quot;IMG_0927.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0928.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0928.jpg&quot; alt=&quot;IMG_0928.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0929.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0929.jpg&quot; alt=&quot;IMG_0929.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0930.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0930.jpg&quot; alt=&quot;IMG_0930.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0931.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0931.jpg&quot; alt=&quot;IMG_0931.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0932.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0932.jpg&quot; alt=&quot;IMG_0932.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0933.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0933.jpg&quot; alt=&quot;IMG_0933.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0934.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0934.jpg&quot; alt=&quot;IMG_0934.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0935.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0935.jpg&quot; alt=&quot;IMG_0935.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0937.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0937.jpg&quot; alt=&quot;IMG_0937.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_09381.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_09381.jpg&quot; alt=&quot;IMG_09381.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0939.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0939.jpg&quot; alt=&quot;IMG_0939.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0940.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0940.jpg&quot; alt=&quot;IMG_0940.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0941.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0941.jpg&quot; alt=&quot;IMG_0941.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;IMG_0942.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;sunpowered&#x2F;thumbnails&#x2F;IMG_0942.jpg&quot; alt=&quot;IMG_0942.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Today we fight back</title>
		<published>2014-02-11T15:47:54+00:00</published>
		<updated>2014-02-11T15:47:54+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/02/11/today-fight-back/"/>
		<id>https://blog.cyplo.dev/posts/2014/02/11/today-fight-back/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/02/11/today-fight-back/">&lt;p&gt;If you don&#x27;t have JS disabled you might have noticed the huge black
banner on the bottom of this blog. Stop mass surveillance. This is the
day we fight back. https:&#x2F;&#x2F;thedaywefightback.org&#x2F;international&#x2F;&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Compiling tarsnap on RaspberryPi</title>
		<published>2014-02-01T21:59:27+00:00</published>
		<updated>2014-02-01T21:59:27+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/02/01/compiling-tarsnap-raspberrypi/"/>
		<id>https://blog.cyplo.dev/posts/2014/02/01/compiling-tarsnap-raspberrypi/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/02/01/compiling-tarsnap-raspberrypi/">&lt;p&gt;Just a quickie for &lt;code&gt;tarsnap 1.0.35.&lt;&#x2F;code&gt; Featuring my new favourite, download software called aria2.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;aptitude install aria2 libssl-dev zlib1g-dev e2fslibs-dev
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;aria2c https:&#x2F;&#x2F;www.tarsnap.com&#x2F;download&#x2F;tarsnap-autoconf-1.0.35.tgz
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;aria2c https:&#x2F;&#x2F;www.tarsnap.com&#x2F;download&#x2F;tarsnap-sigs-1.0.35.asc
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;gpg --recv-key 2F102ABB
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;gpg --decrypt tarsnap-sigs-1.0.35.asc
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sha256sum tarsnap-autoconf-1.0.35.tgz # should get the value from sig file, 6c9f67....9a
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;tar xf tarsnap-autoconf-1.0.35.tgz
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cd tarsnap-autoconf-1.0.35&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;.&#x2F;configure
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;time nice ionice make -j2
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;How do I know that &lt;code&gt;-j2&lt;&#x2F;code&gt; really gives some advantage on raspi ? Well, here is the benchmark:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#fresh, j1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;real    14m7.129s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;user    6m30.790s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sys 0m21.640s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#-j2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;real    11m33.868s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;user    6m36.690s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sys 0m19.880s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#-j1 again, caches warmed up
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;real    12m38.598s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;user    6m30.960s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sys 0m20.470s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#-j2 again
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;real    10m14.975s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;user    6m34.980s
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sys 0m20.710s
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Meetings</title>
		<published>2014-01-21T20:13:05+00:00</published>
		<updated>2014-01-21T20:13:05+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/01/21/meetings/"/>
		<id>https://blog.cyplo.dev/posts/2014/01/21/meetings/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/01/21/meetings/">&lt;p&gt;Meetings come in different shapes and forms. Let&#x27;s chat about them.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;decisions&quot;&gt;Decisions&lt;&#x2F;h1&gt;
&lt;p&gt;Most of the meetings come from the desire to have a decision made. The
problem is in most cases is that these are not decisions to be made now.
Software prototyping is cheap. We should just try to build a working
solution and iterate around. Let&#x27;s prototype. Get someone most annoyed
with the problem and leave them to build it. Of course, the clearer
communication of what they are actually doing the better. It should be
something like ‘hey I’m gonna build this – okay’ or even ‘hey, I&#x27;ve
built that, let’s see how it behaves’ Does not need to be “we should now spend
multiple meetings on discussing how this should be done’.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;sharing-the-knowledge&quot;&gt;Sharing the knowledge&lt;&#x2F;h1&gt;
&lt;p&gt;Other possible reasoning behind having a meeting can be that of some
knowledge needs to be shared. And that&#x27;s a noble cause. Just don&#x27;t make
a meeting out of it. Make a lecture. A presentation. No audience members
interacting with each other. Speaker talking and maybe sometimes
allowing questions. The knowledge sharing sessions are oftentimes a
prelude to the decisionmaking meetings. See above.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;confirming-your-ideas&quot;&gt;Confirming your ideas&lt;&#x2F;h1&gt;
&lt;p&gt;Sometimes however somebody just wants some confirmation on their idea,
maybe before building a prototype. Then, there is a good chance that
they already know who they should ask. No meeting then. Just ask the
people you know you should ask. 1-on-1 interaction. Maybe somebody will
overhear and start listening. Notice that the social dynamic is very
different from the meeting then, two people having a conversation and
another one politely listening, maybe being invited to the conversation
after some while. Just look how it works in between the talks on
conferences. Very different from “everybody says everything” meetings.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;the-meetings-that-are-left&quot;&gt;The meetings that are left&lt;&#x2F;h1&gt;
&lt;p&gt;Also, if for some reason you really need to have a meeting – make
it opt-in. Just the people who are interested coming. Set the timer.
There is one I particularly like - a clock showing amount of money
wasted so far by this meeting.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;post-scriptum&quot;&gt;Post scriptum&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;m.signalvnoise.com&#x2F;meetings-are-toxic&#x2F;&quot;&gt;37 signals on meetings&lt;&#x2F;a&gt;:
These folks have the idea of every communication should be async and read
when convenient, hence their emphasis on email. That gets you to really
think of your proposal and really describe it, which is good. To stop and think, RFC-style.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Wordpress and nonstandard ports and protocols</title>
		<published>2014-01-01T11:32:36+00:00</published>
		<updated>2014-01-01T11:32:36+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2014/01/01/wordpress-https-nonstandard-port/"/>
		<id>https://blog.cyplo.dev/posts/2014/01/01/wordpress-https-nonstandard-port/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2014/01/01/wordpress-https-nonstandard-port/">&lt;p&gt;I needed to set up a Wordpress installation where https is on
nonstandard port and the admin interface lives in that land, while the
site itself is using plain http.&lt;&#x2F;p&gt;
&lt;p&gt;In &lt;code&gt;wp-config.php&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;php&quot; class=&quot;language-php z-code&quot;&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&lt;span class=&quot;z-embedding z-php&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;if (!empty($_SERVER[&amp;#39;HTTPS&amp;#39;])) {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-embedding z-php&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    define(&amp;#39;WP_SITEURL&amp;#39;, &amp;#39;https:&#x2F;&#x2F;example.com:12345&amp;#39;);
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-embedding z-php&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    define(&amp;#39;WP_HOME&amp;#39;, &amp;#39;https:&#x2F;&#x2F;example.com:12345&amp;#39;);
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-embedding z-php&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-embedding z-php&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;else {
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-embedding z-php&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    define(&amp;#39;WP_SITEURL&amp;#39;, &amp;#39;http:&#x2F;&#x2F;example.com&amp;#39;);
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-embedding z-php&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    define(&amp;#39;WP_HOME&amp;#39;, &amp;#39;http:&#x2F;&#x2F;example.com&amp;#39;);
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-embedding z-php&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This allows the installation to properly see resources like
images and css if accessed via nonstandard port. So if you don&#x27;t see
image previews in the admin panel, your styles look weird, or you just
don&#x27;t see new posts&#x27; previewes - this might be it.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>30C3</title>
		<published>2013-12-28T12:08:16+00:00</published>
		<updated>2013-12-28T12:08:16+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/12/28/30c3/"/>
		<id>https://blog.cyplo.dev/posts/2013/12/28/30c3/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/12/28/30c3/">&lt;p&gt;I&#x27;m writing this on the beginning of the day 2 of 30C3, as day 1 was so
packed with action that I was not able to sit down and type, not even
for a little while. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=gyA6NZ9C9pM&quot;&gt;Glen Greenwald&#x27;s keynote&lt;&#x2F;a&gt; was
moving the crowd, making the audience interrupt him with rounds of
applause every few minutes. Lots of mobile phone network exploitation
talks along with general anti-buffer-overflow techniques. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=CJNxbpbHA-I&quot;&gt;Tor folks talking about the interesting times&lt;&#x2F;a&gt; we live in. Quite
a day. Here are some photos, with no Congress people, except for me, in
them, as the tradition goes.&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0826.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0826.jpg&quot; alt=&quot;IMG_0826.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0830.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0830.jpg&quot; alt=&quot;IMG_0830.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0831.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0831.jpg&quot; alt=&quot;IMG_0831.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0832.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0832.jpg&quot; alt=&quot;IMG_0832.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0833.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0833.jpg&quot; alt=&quot;IMG_0833.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0834.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0834.jpg&quot; alt=&quot;IMG_0834.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0835.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0835.jpg&quot; alt=&quot;IMG_0835.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0836.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0836.jpg&quot; alt=&quot;IMG_0836.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0837.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0837.jpg&quot; alt=&quot;IMG_0837.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0838.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0838.jpg&quot; alt=&quot;IMG_0838.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0839.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0839.jpg&quot; alt=&quot;IMG_0839.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0840.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0840.jpg&quot; alt=&quot;IMG_0840.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0841.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0841.jpg&quot; alt=&quot;IMG_0841.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0842.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0842.jpg&quot; alt=&quot;IMG_0842.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0843.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0843.jpg&quot; alt=&quot;IMG_0843.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0844.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0844.jpg&quot; alt=&quot;IMG_0844.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0845.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0845.jpg&quot; alt=&quot;IMG_0845.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0846.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0846.jpg&quot; alt=&quot;IMG_0846.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0847.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0847.jpg&quot; alt=&quot;IMG_0847.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0848.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0848.jpg&quot; alt=&quot;IMG_0848.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0849.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0849.jpg&quot; alt=&quot;IMG_0849.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0850.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0850.jpg&quot; alt=&quot;IMG_0850.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0851.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0851.jpg&quot; alt=&quot;IMG_0851.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0852.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0852.jpg&quot; alt=&quot;IMG_0852.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0853.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0853.jpg&quot; alt=&quot;IMG_0853.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0854.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0854.jpg&quot; alt=&quot;IMG_0854.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0855.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0855.jpg&quot; alt=&quot;IMG_0855.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0856.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0856.jpg&quot; alt=&quot;IMG_0856.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0859.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0859.jpg&quot; alt=&quot;IMG_0859.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0861.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0861.jpg&quot; alt=&quot;IMG_0861.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0862.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0862.jpg&quot; alt=&quot;IMG_0862.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0864.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0864.jpg&quot; alt=&quot;IMG_0864.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0865.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0865.jpg&quot; alt=&quot;IMG_0865.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0866.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0866.jpg&quot; alt=&quot;IMG_0866.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0868.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0868.jpg&quot; alt=&quot;IMG_0868.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0869.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0869.jpg&quot; alt=&quot;IMG_0869.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0871.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0871.jpg&quot; alt=&quot;IMG_0871.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0872.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0872.jpg&quot; alt=&quot;IMG_0872.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0873.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0873.jpg&quot; alt=&quot;IMG_0873.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0875.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0875.jpg&quot; alt=&quot;IMG_0875.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0876.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0876.jpg&quot; alt=&quot;IMG_0876.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0877.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0877.jpg&quot; alt=&quot;IMG_0877.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0878.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0878.jpg&quot; alt=&quot;IMG_0878.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0883.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0883.jpg&quot; alt=&quot;IMG_0883.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;30c3&#x2F;IMG_0884.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;30c3&#x2F;thumbnails&#x2F;IMG_0884.jpg&quot; alt=&quot;IMG_0884.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Booting Gentoo with LUKS+LVM2+systemd</title>
		<published>2013-11-10T21:20:26+00:00</published>
		<updated>2013-11-10T21:20:26+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/11/10/booting-gentoo-lukslvm2systemd/"/>
		<id>https://blog.cyplo.dev/posts/2013/11/10/booting-gentoo-lukslvm2systemd/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/11/10/booting-gentoo-lukslvm2systemd/">&lt;p&gt;I&#x27;ve spent quite some time recently trying to get a laptop running
Gentoo boot from an encrypted partition with LVM. I thought that this
might be useful for someone else, so here you are: First things first:
I&#x27;m assuming you&#x27;ve followed Gentoo handbook and are operating from
within livecd&#x27;s shell. You&#x27;ve done the regular luksFormat + lvm stuff
and you&#x27;ve come up with a layout similar to this one:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dagrey ~ # lsblk
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;NAME                          SIZE TYPE  MOUNTPOINT
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sda                           55.9G disk
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;└─sda1                        55.9G part
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    └─crypthome (dm-3)          55.9G crypt &#x2F;home
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sdb                           29.8G disk
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;├─sdb1                       485.4M part  &#x2F;boot
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;└─sdb2                        29.4G part
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    └─root_sdb2-vg-root (dm-0)  29.3G crypt
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ├─vg-swap (dm-1)             8G lvm   [SWAP]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    └─vg-root (dm-2)          21.3G lvm   &#x2F;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You need a kernel to boot this, a kernel that understands crypto stuff as well as
lvm.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;genkernel --symlink --save-config --no-mrproper --luks --lvm --udev --menuconfig all&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re using &lt;code&gt;gentoo-sources&lt;&#x2F;code&gt; you&#x27;ll notice the fancy gentoo-specific menu on top. Go there and check
systemd. Apart from the usual stuff, please make sure to check stuff on
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;wiki.gentoo.org&#x2F;wiki&#x2F;Systemd&quot;&gt;this list&lt;&#x2F;a&gt;, and also this one:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Device Drivers
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Multi-device support (RAID and LVM)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    [*] Multiple devices driver support (RAID and LVM)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &amp;lt;*&amp;gt;  Device mapper support
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &amp;lt;*&amp;gt;  Crypt target support
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Cryptographic API
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &amp;lt;*&amp;gt;  SHA256 digest algorithm
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &amp;lt;*&amp;gt;  AES cipher algorithms
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Your setup is so new that you need grub2. Grub2 is very picky about its configuration. Take this one and
avoid hours of reading:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dagrey ~ # cat &#x2F;etc&#x2F;default&#x2F;grub
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_DISTRIBUTOR=&amp;quot;Gentoo&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_DEFAULT=0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_HIDDEN_TIMEOUT=0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_HIDDEN_TIMEOUT_QUIET=true
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_TIMEOUT=3
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_PRELOAD_MODULES=lvm
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_CRYPTODISK_ENABLE=y
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_DEVICE=&#x2F;dev&#x2F;ram0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# Append parameters to the linux kernel command line
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;GRUB_CMDLINE_LINUX=&amp;quot;real_init=&#x2F;usr&#x2F;bin&#x2F;systemd quiet real_root=&#x2F;dev&#x2F;mapper&#x2F;vg-root crypt_root=&#x2F;dev&#x2F;sdb2 dolvm acpi_backlight=vendor&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You&#x27;re using initrd to set everything up for the kernel, so you need &lt;code&gt;real_root&lt;&#x2F;code&gt; and &lt;code&gt;real_init&lt;&#x2F;code&gt; instead of
regular ones. &lt;code&gt;cryptdevice&lt;&#x2F;code&gt; no longer works, use &lt;code&gt;crypt_root&lt;&#x2F;code&gt; And
&lt;code&gt;dolvm&lt;&#x2F;code&gt; is essential, without it only the first part will work, leaving
you with open crypt container and kernel panic just afterwards. Also
notice &lt;code&gt;GRUB_DEVICE&lt;&#x2F;code&gt;, &lt;code&gt;GRUB_CRYPTODISK_ENABLE&lt;&#x2F;code&gt; and &lt;code&gt;GRUB_PRELOAD_MODULES&lt;&#x2F;code&gt;. Make sure the first partition on the disk you&#x27;re
installing grub onto is starting at 2048. If it&#x27;s any earlier grub just
won&#x27;t be able to fit its magic in there. Finally, install grub&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;grub2-install --modules=&amp;quot;configfile linux crypto search_fs_uuid luks lvm&amp;quot; --recheck &#x2F;dev&#x2F;sda
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;grub2-mkconfig -o &#x2F;boot&#x2F;grub&#x2F;grub.cfg
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That should be sufficient to boot the system and initialize root. What
about those other encrypted partitions like &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt; though ? Well, init
subsystem needs to initialize them, OpenRC did such by reading
&lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt; and then &lt;code&gt;&#x2F;etc&#x2F;dmcrypt&#x2F;dmcrypt.conf&lt;&#x2F;code&gt; accordingly. Systemd is a
bit different here. You still need your &lt;code&gt;&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt; entries for it to
know which partitions need to be initialized. The place where you say
how to map and decrypt crypto containers, however, is in &lt;code&gt;&#x2F;etc&#x2F;crypttab.&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dagrey ~ # cat &#x2F;etc&#x2F;fstab
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;sdb1              &#x2F;boot     ext2    defaults    1 2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;vg-root    &#x2F;         ext4    defaults    0 1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;vg-swap    none      swap    sw          0 0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;crypthome  &#x2F;home     ext4    defaults    0 2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dagrey ~ # cat &#x2F;etc&#x2F;crypttab
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#crypthome &#x2F;dev&#x2F;sda1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;crypthome &#x2F;dev&#x2F;sda1 &#x2F;etc&#x2F;conf.d&#x2F;dmcrypt.key
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The keyfile is available from then already decrypted root partition. You can also skip the key and the
you&#x27;ll get a password prompt, sometimes hidden somewhere in systemd messages. Hit enter to reveal it once more.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>New dotfiles repository</title>
		<published>2013-10-26T10:35:52+00:00</published>
		<updated>2013-10-26T10:35:52+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/10/26/new-dotfiles-repository/"/>
		<id>https://blog.cyplo.dev/posts/2013/10/26/new-dotfiles-repository/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/10/26/new-dotfiles-repository/">&lt;blockquote&gt;
&lt;p&gt;Update from 10 years into the future ! It&#x27;s 2023 and the repo is still going strong, using lots of Nix and friends tho and also hosted elsewhere - edited the URLs.
All my dofiles live &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;git.cyplo.dev&#x2F;cyplo&#x2F;dotfiles&#x2F;&quot;&gt;here&lt;&#x2F;a&gt; now. Removed the links from the article below as they don&#x27;t work anymore.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Hi ! Just letting you know that I&#x27;ve been working for some time on
structuring my dotfiles and finally &lt;del&gt;published them to
&lt;a href=&quot;#&quot;&gt;github&lt;&#x2F;a&gt;.&lt;&#x2F;del&gt; (No github anymore, selfhosting!)
These contain e.g. my
&lt;a href=&quot;#&quot;&gt;vimrc&lt;&#x2F;a&gt; and
&lt;a href=&quot;#&quot;&gt;font&lt;&#x2F;a&gt;
&lt;a href=&quot;#&quot;&gt;configs&lt;&#x2F;a&gt;.
I&#x27;ve &lt;a href=&quot;#&quot;&gt;patched&lt;&#x2F;a&gt;
the famous &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;ethanschoonover.com&#x2F;solarized&quot;&gt;solarized&lt;&#x2F;a&gt; theme
for vim to allow better
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;airblade&#x2F;vim-gitgutter&quot;&gt;gitgutter&lt;&#x2F;a&gt; symbols
display. Enjoy !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Debuggers - how do they work ?</title>
		<published>2013-09-18T17:26:26+00:00</published>
		<updated>2013-09-18T17:26:26+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/09/18/anatomy-debugger/"/>
		<id>https://blog.cyplo.dev/posts/2013/09/18/anatomy-debugger/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/09/18/anatomy-debugger/">&lt;p&gt;I gave a talk &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.meetup.com&#x2F;wrocnet&#x2F;events&#x2F;138787702&#x2F;&quot;&gt;yesterday&lt;&#x2F;a&gt;. It was
on
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;prezi.com&#x2F;hzvnsznfkgwj&#x2F;anatomy-of-the-debugger&#x2F;&quot;&gt;debuggers&lt;&#x2F;a&gt;.
From VM-level debuggers to JTAG, quite a packed, high level overview. In
fact I gave it
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.meetup.com&#x2F;KGD-NET&#x2F;events&#x2F;113593522&#x2F;&quot;&gt;before&lt;&#x2F;a&gt; on another
occasions. And this time was different, hence this post. The thing I am
particularly proud of is that I was able to entertain the crowd for the
first half of an hour despite not having any computer launched and
connected. You know, like, interacting with actual people ! We had some
difficulties connecting to a beamer so I thought it&#x27;d be good to have an
open discussion first. We&#x27;ve started with &quot;unit tests vs debuggers&quot;. Is
having a rock solid unit tests suite enough for you to never touch a
debugger ? After some time I&#x27;ve transitioned to my presentation, talked
a bit about the history of debugging, then what are the features of
modern debuggers and finally how all of these work. And while we&#x27;re at
it I would like to give a shout out to the organizers of these 2 events.
Thanks !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Idea for a curated links directory</title>
		<published>2013-09-02T18:47:15+00:00</published>
		<updated>2013-09-02T18:47:15+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/09/02/links-directory/"/>
		<id>https://blog.cyplo.dev/posts/2013/09/02/links-directory/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/09/02/links-directory/">&lt;p&gt;I read a lot. Of books and news alike. Oh, and whitepapers too. And some
recipes maybe. Some of them I find by my RSS reader. Some are given to
me by colleagues at work, some arrive by mail, sometimes even in
somewhat curated, described form. I read through most of them. And
resend. Often I want to share a particular piece with friends of mine
and possibly some other people too. Most often I do this by pasting the
link into the IM window or email it to a particular person I know might
be interested. Then I recall the other person who would also love to
hear about this. Then I need to search the IM logs or my Delicious. And
all of this only to hear that the people mentioned did not have the time
to read the article referred but would love to in the future. Just not
right now. I need a system for this. I read something, I archive it in
the system. People sign up or I do sign them up. People receive my
curated links list in a more or less regular email. But there is also a
public, searchable web directory for all the previous editions. Is there
anything like it around ? Open source please. Selfhosted please. If not - I&#x27;m just gonna write it.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>New laptop</title>
		<published>2013-08-10T10:45:20+00:00</published>
		<updated>2013-08-10T10:45:20+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/08/10/new-laptop/"/>
		<id>https://blog.cyplo.dev/posts/2013/08/10/new-laptop/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/08/10/new-laptop/">&lt;p&gt;Hey, remember my &lt;a href=&quot;&#x2F;posts&#x2F;2013&#x2F;01&#x2F;15&#x2F;laptop-would-love-to-buy&#x2F;&quot;&gt;search for the new laptop&lt;&#x2F;a&gt; ?
It&#x27;s finally over ! I found that Clevo, Taiwanese custom laptop
manufacturer, has recently added 13&#x27;3 FullHD laptop base to their
offerings - W230ST. And to my surprise - there is a &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.bluemobility.pl&#x2F;&quot;&gt;Polish importer&lt;&#x2F;a&gt; which allows pretty neat specs
calibration for you. Game on you say ? Indeed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-i-like-about-it&quot;&gt;What I like about it:&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Haswell-based, so all the new tech is here, same as in the newest
MacBooks&lt;&#x2F;li&gt;
&lt;li&gt;up to 16GB RAM, I have 8GB installed for now and it works pretty good&lt;&#x2F;li&gt;
&lt;li&gt;2x mPCIx mSATA capable slots&lt;&#x2F;li&gt;
&lt;li&gt;nice copper cooling inside&lt;&#x2F;li&gt;
&lt;li&gt;FullHD matte display&lt;&#x2F;li&gt;
&lt;li&gt;4x USB&lt;&#x2F;li&gt;
&lt;li&gt;HDMI&lt;&#x2F;li&gt;
&lt;li&gt;typing on its keyboard, just clicks with me&lt;&#x2F;li&gt;
&lt;li&gt;survived &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;ohm2013.org&#x2F;&quot;&gt;OHM2013&lt;&#x2F;a&gt; camp - not scared of
humidity and hot air&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;what-i-do-not-like-so-much&quot;&gt;What I do not like so much:&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Haswell-based, so Linux support is not that great yet, everything
seems to be working okay, however power consumption is off the
limits. 60Wh battery lasts for ~2h tops.&lt;&#x2F;li&gt;
&lt;li&gt;while the outer side of the case is of nice rubberrized plastic, the
inside is cheap-looking grey one. There was no option to change it
unfortunately, while I see that &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.xoticpc.com&#x2F;&quot;&gt;other&lt;&#x2F;a&gt;
importers&#x2F;assemblers around the world have such mods avaiable.&lt;&#x2F;li&gt;
&lt;li&gt;the looks of the keyboard, purely visual stuff like the font used to
print the characters, the layout is okay&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;running-linux-on-it&quot;&gt;Running Linux on it:&lt;&#x2F;h2&gt;
&lt;p&gt;Everything seems to be working by default on
most of the distros. I&#x27;ve tested Gentoo, Arch, Fedora and Crunchbang.
The only thing that needed some tweaking was that by default I was
unable to control backlight brightness at all. Adding &lt;code&gt;acpi_backlight=vendor&lt;&#x2F;code&gt; to the kernel boot parameters, as suggested
on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;index.php&#x2F;Intel_Graphics#Backlight_not_fully_adjusting.2C_or_adjusting_at_all_after_resume.&quot;&gt;Arch wiki&lt;&#x2F;a&gt;,
solved the problem. I haven&#x27;t delved deeply into Optimus yet, so I don&#x27;t
know whether the graphics cards switching works correctly or not. The
one thing I&#x27;ve noticed is that, after waking from deep sleep, so after
leaving the lid closed for a long time, not for few minutes, there are
some visual artifacts on screen. Also, as mentioned before, power
consumption worries me a bit. Will keep you posted !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Automating running Debian in VirtualBox</title>
		<published>2013-07-16T14:22:47+00:00</published>
		<updated>2013-07-16T14:22:47+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/07/16/automating-running-debian-in-virtualbox/"/>
		<id>https://blog.cyplo.dev/posts/2013/07/16/automating-running-debian-in-virtualbox/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/07/16/automating-running-debian-in-virtualbox/">&lt;p&gt;I&#x27;m experimenting with service separation by having each service run in
its own operating system, all of the sharing hardware though. Why ?
Separation seems to be the only secure approach to running any software.
Check &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;theinvisiblethings.blogspot.com&#x2F;&quot;&gt;Joanna&#x27;s&lt;&#x2F;a&gt; blog out. I
went with VirtualBox on Debian 7 host, with, well, Debian 7 guests.
First I&#x27;ve prepared template VM by creating a new VM and just proceeding
with install. Then I tried spawning some clones of that, but having it
done manually takes quite some time  and is error prone. Did somebody
say automation ? Yes ! First, clone a VM, regenerating MAC addresses and
making sure the resource caps are good:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;vmrunner@storage:~$ cat prepare_vm
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;set -e
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;if [ $# -ne 2 ] ; then
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    echo &amp;quot;usage: $0 vm_name vm_number&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    exit 0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VM_NAME=&amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;RAM_AMOUNT=&amp;quot;128&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;DISK_SIZE=&amp;quot;2000&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VM_NUMBER=&amp;quot;$2&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;RDP_PORT=$(($2+3389))
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;EXECUTION_CAP=&amp;quot;50&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage clonevm fresh.cyplo.net --name $VM_NAME --mode machine --register
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --vrde on
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;setting RDP listening port to $RDP_PORT&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --memory $RAM_AMOUNT
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --vrdeport $RDP_PORT
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --nic1 bridged --bridgeadapter1 eth0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --pae on
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --cpuexecutioncap $EXECUTION_CAP
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --hpet on
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --hwvirtex on
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --pagefusion on
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --dvd none
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --autostart-enabled on
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --macaddress1 auto
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage modifyvm $VM_NAME --macaddress2 auto
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;vm set up, listing all VMs:&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;VBoxManage list vms
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then run the VM and change it into Debian
service host with new name and some software:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;vmrunner@storage:~$ cat kickstart_debian
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;set -e
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;if [ $# -ne 2 ] ; then
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    echo &amp;quot;usage: $0 new_hostname new_domainname&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    exit 0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fi
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;NEW_HOSTNAME=&amp;quot;$1&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;NEW_DOMAINNAME=&amp;quot;$2&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;NEW_FQDN=&amp;quot;$NEW_HOSTNAME.$NEW_DOMAINNAME&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;aptitude update
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;aptitude dist-upgrade -y
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;aptitude install vim atop sudo -y
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;hostname
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ifconfig
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;set -v
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;$NEW_FQDN&amp;quot; &amp;gt; &#x2F;etc&#x2F;mailname
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;echo &amp;quot;$NEW_HOSTNAME&amp;quot; &amp;gt; &#x2F;etc&#x2F;hostname
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sed -i &amp;quot;s&#x2F;dc_other_hostnames\=&amp;#39;.*&amp;#39;&#x2F;dc_other_hostnames=&amp;#39;$NEW_FQDN&amp;#39;&#x2F;g&amp;quot; &#x2F;etc&#x2F;exim4&#x2F;update-exim4.conf.conf
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;sed -i &amp;quot;s&#x2F;127\.0\.1\.1.*&#x2F;127.0.1.1 $NEW_FQDN $NEW_HOSTNAME&#x2F;g&amp;quot; &#x2F;etc&#x2F;hosts
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rm &#x2F;etc&#x2F;ssh&#x2F;ssh_host_*
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dpkg-reconfigure openssh-server
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;reboot
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The script above needs to be run on guest, I&#x27;m using scp with known ssh keys to upload it and
then run via ssh. This step is to be automated in the future. Points to
improve:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;updating all the guests at once (Chef?)&lt;&#x2F;li&gt;
&lt;li&gt;monitoring all guests at once (Nagios?)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Summarizing, I&#x27;m now running a Tor node, file server, caldav, carddav
and some other services on my home server. All of them in separate VMs.
And it&#x27;s running quite well with 2GB of RAM. For more info on my home
server build check its
&lt;a href=&quot;&#x2F;posts&#x2F;2013&#x2F;03&#x2F;31&#x2F;building-nas-hardware&#x2F;&quot;&gt;hardware&lt;&#x2F;a&gt; and basic
&lt;a href=&quot;&#x2F;posts&#x2F;2013&#x2F;05&#x2F;26&#x2F;building-nas-software&#x2F;&quot;&gt;software&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>How to remove multiarch in debian 7</title>
		<published>2013-06-13T09:04:37+00:00</published>
		<updated>2013-06-13T09:04:37+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/06/13/how-to-remove-multiarch-in-debian-7/"/>
		<id>https://blog.cyplo.dev/posts/2013/06/13/how-to-remove-multiarch-in-debian-7/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/06/13/how-to-remove-multiarch-in-debian-7/">&lt;p&gt;Just a quick one, for me to remember and for you to enjoy.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dpkg -l | grep :i386 | cut -s -d &amp;#39; &amp;#39; -f3 | xargs apt-get remove -y
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dpkg --remove-architecture i386
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;apt-get update
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Building NAS - software</title>
		<published>2013-05-26T21:32:07+00:00</published>
		<updated>2013-05-26T21:32:07+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/05/26/building-nas-software/"/>
		<id>https://blog.cyplo.dev/posts/2013/05/26/building-nas-software/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/05/26/building-nas-software/">&lt;h2 id=&quot;operating-system&quot;&gt;Operating system&lt;&#x2F;h2&gt;
&lt;p&gt;I think my NAS box build is no longer in much flux, so I thought it&#x27;d be
nice to describe it. I had some disks laying around, I had them
installed and started playing with the software setup.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Disk &#x2F;dev&#x2F;sda:  60.0 GB,  60022480896 bytes
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Disk &#x2F;dev&#x2F;sdb: 320.1 GB, 320072933376 bytes
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Disk &#x2F;dev&#x2F;sdc: 160.0 GB, 160041885696 bytes
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Disk &#x2F;dev&#x2F;sdd: 250.1 GB, 250059350016 bytes
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Disk &#x2F;dev&#x2F;sde: 500.1 GB, 500107862016 bytes
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;First one is an SSD drive, I used it for OS
installation.  I went for &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.bunsenlabs.org&#x2F;&quot;&gt;Crunchbang&lt;&#x2F;a&gt; as I
was already familiar with it, however now I&#x27;m thinking of just getting
newest Debian there, as it&#x27;s finally released. Nothing fancy about the
OS, a regular install really.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;storage# df -h
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Filesystem                   Size  Used Avail Use% Mounted on
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rootfs                        53G  2.4G   48G   5% &#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;sda1                    461M   31M  407M   7% &#x2F;boot
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;As you can see &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; filesystem takes little amount
of space, hence the next thing I plan on doing is actually move &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; to
USB3.0 pendrive and then free the SATA drive from it&#x27;s current duties.
I&#x27;m reluctant to do so right now, as moving swap to pendrive might
result in significant wear. I&#x27;m thinking of getting more RAM and then
getting rid of the swap at all. These stats were acquired after reboot,
there are some loads under which I saw swapping occur.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;storage# free -m
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;             total       used       free     shared    buffers
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Mem:          1636        282       1354          0         53
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;-&#x2F;+ buffers&#x2F;cache:        166       1470
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Swap:         1903          0       1903
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;software-configuration&quot;&gt;Software + configuration&lt;&#x2F;h2&gt;
&lt;p&gt;NAS means SAMBA, right ? That&#x27;s what I thougth. RAID5 + SAMBA for Win
clients and NFS for others. After a while I got accustomed to this setup
and started playing with my photo collection as it was laying on NAS.
The problem ? I deleted one photo and wanted it back. It was nowhere to
be found. RAID5, although having internal copies for resiliency, was
visible as one drive only and happily deleted the data when asked to.
What I really needed was a backup solution, not a NAS. My final answer
to that:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;storage# df -h
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Filesystem                   Size  Used Avail Use% Mounted on
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rootfs                        53G  2.4G   48G   5% &#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;md0                     294G   36G  243G  13% &#x2F;mnt&#x2F;array_back
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;sde1                    459G   35G  401G   8% &#x2F;mnt&#x2F;array_front
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;storage# cat &#x2F;etc&#x2F;fstab
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;vg_storage-root                &#x2F;               ext4    errors=remount-ro 0       1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;UUID=b9d32208-edc0-4981-ab74-5da1e7348a1a  &#x2F;boot           ext4    defaults          0       2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;mapper&#x2F;vg_storage-swap                none            swap    sw                0       0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;md0                                  &#x2F;mnt&#x2F;array_back  ext4    defaults          0       2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;sde1                                 &#x2F;mnt&#x2F;array_front ext4    defaults          0       2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;storage# mdadm --detail &#x2F;dev&#x2F;md0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;dev&#x2F;md0:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Version : 1.2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Creation Time : Sun Apr 21 22:47:38 2013
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Raid Level : raid5
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Array Size : 312318976 (297.85 GiB 319.81 GB)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Used Dev Size : 156159488 (148.93 GiB 159.91 GB)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Number   Major   Minor   RaidDevice State
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        0       8       17        0      active sync   &#x2F;dev&#x2F;sdb1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        1       8       33        1      active sync   &#x2F;dev&#x2F;sdc1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        3       8       49        2      active sync   &#x2F;dev&#x2F;sdd1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;One disk &lt;code&gt;[sde]&lt;&#x2F;code&gt; serves as a front for all user operations. After a while, all changes
except for deletions are being flushed onto &lt;code&gt;[array_back]&lt;&#x2F;code&gt; which is a
RAID5 matrix.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;storage# cat &#x2F;etc&#x2F;cron.daily&#x2F;90_sync_front_to_back
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#!&#x2F;bin&#x2F;bash
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;rsync -avr &#x2F;mnt&#x2F;array_front&#x2F; &#x2F;mnt&#x2F;array_back&#x2F;back
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;secret-sauce&quot;&gt;Secret sauce&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;owncloud.org&#x2F;&quot;&gt;ownCloud&lt;&#x2F;a&gt;. &lt;code&gt;[array_front]&lt;&#x2F;code&gt; is not directly
exposed via SAMBA or NFS, it&#x27;s governed by ownCloud instance, and then
only ownCloud sync client on the computer or phone gets to mess with the
data. By having such setup I get 3 copies of each file. One on device,
one on the front array and one on the back array. What is also cool
about ownCloud is that it also handles contacts and calendar storage for
me. One more step towards getting all my data off google ! Points for
improvement:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[array_front]&lt;&#x2F;code&gt; is not an array now. It&#x27;s just a disk. Make it an
proper disk array.&lt;&#x2F;li&gt;
&lt;li&gt;encrypt the data from array_back and send it to S3 and then let it
graduate to Glacier&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Building NAS - hardware</title>
		<published>2013-03-31T20:27:52+00:00</published>
		<updated>2013-03-31T20:27:52+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/03/31/building-nas-hardware/"/>
		<id>https://blog.cyplo.dev/posts/2013/03/31/building-nas-hardware/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/03/31/building-nas-hardware/">&lt;p&gt;For a long time I&#x27;ve wandered the voids of the intertubes in search for
the parts for my NAS&#x2F;backup&#x2F;home server solution.&lt;&#x2F;p&gt;
&lt;p&gt;Online backup solutions are fine to some extent, however, someone else
than you then is going through that cat picture collections of yours and
other private stuff. Also the cloud tends to not be the cheapest option
possible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;case&quot;&gt;Case&lt;&#x2F;h2&gt;
&lt;p&gt;{{&amp;lt; figure src=&quot;&#x2F;images&#x2F;building-nas-hardware&#x2F;Node304_nocover-top-view_lores.jpg&quot; postition=&quot;center&quot; &amp;gt;}}&lt;&#x2F;p&gt;
&lt;p&gt;The need for moar virtual disk space calls for moar physical disk space.
To build any reasonable RAID solution you need 4-5 disks at least, plus
maybe one for system disk. That is a minimum of 6 disk slots in the
computer case. As I have quite some variety of disks laying around I&#x27;d
like this case to have an option for using either 3.5&quot; or 2.5&quot; disks.
Ah, and the whole thing should not take big amounts of space. Hence
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.fractal-design.com&#x2F;?view=product&amp;amp;prod=94&quot;&gt;&quot;Node 304&quot; by Fractal Design&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Although I intend my NAS to be fanless in the future, I couldn&#x27;t resist
to leave the  original fans connected. These are beautiful, supersilent,
hydraulic bearing fans, all included in the Node&#x27;s package.&lt;&#x2F;p&gt;
&lt;p&gt;There are really only two things that you need to be wary of: metal
where the screwholes are is very soft and it is easy to damage - and
that if you have a PSU without detachable cables you&#x27;re going to have
bad time fitting these inside.&lt;&#x2F;p&gt;
&lt;p&gt;By the way, other small but nice thing is a user manual for this case.
Nice paper, nice clean print and friendly attitude. Attention to details
!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;motherboard&quot;&gt;Motherboard&lt;&#x2F;h2&gt;
&lt;p&gt;{{&amp;lt; figure src=&quot;&#x2F;images&#x2F;building-nas-hardware&#x2F;lkpq2whHjMbzUSAU_500.jpg&quot; postition=&quot;center&quot; &amp;gt;}}&lt;&#x2F;p&gt;
&lt;p&gt;What board supports at least 6 SATA disks, has low power consuption and
fits into miniITX format ? Easily obtainable in central Europe ? And not
super expensive ?&lt;&#x2F;p&gt;
&lt;p&gt;It took almost 3 months for me to find it, I present to you &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.asus.com&#x2F;Motherboards&#x2F;P8H77I&#x2F;&quot;&gt;Asus P8H77-I&lt;&#x2F;a&gt;. All the usual stuff, most of it I don&#x27;t need, frankly and not so low on power, but hey - 6 SATA in miniITX.&lt;&#x2F;p&gt;
&lt;p&gt;One caveat - it needs 2 power cables connected to function. The
usual 24-pin EATX and also 4-pin ATX 12V also called P4. What if your
PSU has only those fancy new EPS8 and EPS6 as mine do ? Fear not,
connect half of the EPS8 into P4 port and everything shall be okay.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Assembling RepRapPro Mendel</title>
		<published>2013-03-23T11:36:49+00:00</published>
		<updated>2013-03-23T11:36:49+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/03/23/assembling-reprap/"/>
		<id>https://blog.cyplo.dev/posts/2013/03/23/assembling-reprap/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/03/23/assembling-reprap/">&lt;p&gt;It was December, 3D printing fever struck me. Here is the first day of
me building ReprapPro Mendel printer.&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0362.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0362.jpg&quot; alt=&quot;IMG_0362.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0363.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0363.jpg&quot; alt=&quot;IMG_0363.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0364.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0364.jpg&quot; alt=&quot;IMG_0364.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0365.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0365.jpg&quot; alt=&quot;IMG_0365.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0366.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0366.jpg&quot; alt=&quot;IMG_0366.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0367.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0367.jpg&quot; alt=&quot;IMG_0367.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0368.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0368.jpg&quot; alt=&quot;IMG_0368.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0369.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0369.jpg&quot; alt=&quot;IMG_0369.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0370.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0370.jpg&quot; alt=&quot;IMG_0370.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0371.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0371.jpg&quot; alt=&quot;IMG_0371.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0372.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0372.jpg&quot; alt=&quot;IMG_0372.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0373.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0373.jpg&quot; alt=&quot;IMG_0373.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0374.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0374.jpg&quot; alt=&quot;IMG_0374.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0375.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0375.jpg&quot; alt=&quot;IMG_0375.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;IMG_0376.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-1&#x2F;thumbnails&#x2F;IMG_0376.jpg&quot; alt=&quot;IMG_0376.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

&lt;p&gt;Second day of building. Fun fact: you can see the daylight come and go ;)&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0377.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0377.jpg&quot; alt=&quot;IMG_0377.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0378.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0378.jpg&quot; alt=&quot;IMG_0378.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0379.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0379.jpg&quot; alt=&quot;IMG_0379.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0380.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0380.jpg&quot; alt=&quot;IMG_0380.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0381.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0381.jpg&quot; alt=&quot;IMG_0381.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0382.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0382.jpg&quot; alt=&quot;IMG_0382.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0383.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0383.jpg&quot; alt=&quot;IMG_0383.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0385.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0385.jpg&quot; alt=&quot;IMG_0385.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0386.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0386.jpg&quot; alt=&quot;IMG_0386.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0387.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0387.jpg&quot; alt=&quot;IMG_0387.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0388.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0388.jpg&quot; alt=&quot;IMG_0388.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0392.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0392.jpg&quot; alt=&quot;IMG_0392.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0393.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0393.jpg&quot; alt=&quot;IMG_0393.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0394.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0394.jpg&quot; alt=&quot;IMG_0394.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0395.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0395.jpg&quot; alt=&quot;IMG_0395.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0396.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0396.jpg&quot; alt=&quot;IMG_0396.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0397.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0397.jpg&quot; alt=&quot;IMG_0397.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0398.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0398.jpg&quot; alt=&quot;IMG_0398.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0400.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0400.jpg&quot; alt=&quot;IMG_0400.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0401.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0401.jpg&quot; alt=&quot;IMG_0401.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0402.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0402.jpg&quot; alt=&quot;IMG_0402.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0403.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0403.jpg&quot; alt=&quot;IMG_0403.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0404.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0404.jpg&quot; alt=&quot;IMG_0404.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;IMG_0405.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-2&#x2F;thumbnails&#x2F;IMG_0405.jpg&quot; alt=&quot;IMG_0405.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

&lt;p&gt;Next few days - Featuring hotbed and plastic extruder !&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0406.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0406.jpg&quot; alt=&quot;IMG_0406.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0408.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0408.jpg&quot; alt=&quot;IMG_0408.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0409.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0409.jpg&quot; alt=&quot;IMG_0409.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0410.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0410.jpg&quot; alt=&quot;IMG_0410.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0411.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0411.jpg&quot; alt=&quot;IMG_0411.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0413.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0413.jpg&quot; alt=&quot;IMG_0413.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0414.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0414.jpg&quot; alt=&quot;IMG_0414.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0415.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0415.jpg&quot; alt=&quot;IMG_0415.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0416.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0416.jpg&quot; alt=&quot;IMG_0416.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0419.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0419.jpg&quot; alt=&quot;IMG_0419.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0420.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0420.jpg&quot; alt=&quot;IMG_0420.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0421.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0421.jpg&quot; alt=&quot;IMG_0421.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0423.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0423.jpg&quot; alt=&quot;IMG_0423.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0425.1.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0425.1.jpg&quot; alt=&quot;IMG_0425.1.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0425.2.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0425.2.jpg&quot; alt=&quot;IMG_0425.2.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0425.3.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0425.3.jpg&quot; alt=&quot;IMG_0425.3.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0427.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0427.jpg&quot; alt=&quot;IMG_0427.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0429.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0429.jpg&quot; alt=&quot;IMG_0429.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0430.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0430.jpg&quot; alt=&quot;IMG_0430.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0431.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0431.jpg&quot; alt=&quot;IMG_0431.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0432.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0432.jpg&quot; alt=&quot;IMG_0432.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0433.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0433.jpg&quot; alt=&quot;IMG_0433.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0434.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0434.jpg&quot; alt=&quot;IMG_0434.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0435.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0435.jpg&quot; alt=&quot;IMG_0435.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0436.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0436.jpg&quot; alt=&quot;IMG_0436.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0437.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0437.jpg&quot; alt=&quot;IMG_0437.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0438.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0438.jpg&quot; alt=&quot;IMG_0438.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0439.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0439.jpg&quot; alt=&quot;IMG_0439.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0440.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0440.jpg&quot; alt=&quot;IMG_0440.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0442.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0442.jpg&quot; alt=&quot;IMG_0442.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0443.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0443.jpg&quot; alt=&quot;IMG_0443.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0444.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0444.jpg&quot; alt=&quot;IMG_0444.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;IMG_0445.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-3&#x2F;thumbnails&#x2F;IMG_0445.jpg&quot; alt=&quot;IMG_0445.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

&lt;p&gt;Yet another few days - Hot header installation, lots of wiring, tests and... it&#x27;s alive !&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_03651.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_03651.jpg&quot; alt=&quot;IMG_03651.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0446.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0446.jpg&quot; alt=&quot;IMG_0446.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0447.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0447.jpg&quot; alt=&quot;IMG_0447.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0448.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0448.jpg&quot; alt=&quot;IMG_0448.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0449.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0449.jpg&quot; alt=&quot;IMG_0449.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0450.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0450.jpg&quot; alt=&quot;IMG_0450.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0451.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0451.jpg&quot; alt=&quot;IMG_0451.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0452.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0452.jpg&quot; alt=&quot;IMG_0452.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0453.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0453.jpg&quot; alt=&quot;IMG_0453.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0454.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0454.jpg&quot; alt=&quot;IMG_0454.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0455.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0455.jpg&quot; alt=&quot;IMG_0455.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0456.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0456.jpg&quot; alt=&quot;IMG_0456.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0457.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0457.jpg&quot; alt=&quot;IMG_0457.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0459.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0459.jpg&quot; alt=&quot;IMG_0459.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0461.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0461.jpg&quot; alt=&quot;IMG_0461.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0462.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0462.jpg&quot; alt=&quot;IMG_0462.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0463.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0463.jpg&quot; alt=&quot;IMG_0463.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0464.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0464.jpg&quot; alt=&quot;IMG_0464.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0466.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0466.jpg&quot; alt=&quot;IMG_0466.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0468.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0468.jpg&quot; alt=&quot;IMG_0468.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0469.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0469.jpg&quot; alt=&quot;IMG_0469.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0470.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0470.jpg&quot; alt=&quot;IMG_0470.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0472.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0472.jpg&quot; alt=&quot;IMG_0472.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0473.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0473.jpg&quot; alt=&quot;IMG_0473.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;IMG_0474.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;assembling-reprap-4&#x2F;thumbnails&#x2F;IMG_0474.jpg&quot; alt=&quot;IMG_0474.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Erlang Tech night</title>
		<published>2013-03-06T18:41:34+00:00</published>
		<updated>2013-03-06T18:41:34+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/03/06/erlang-tech-night/"/>
		<id>https://blog.cyplo.dev/posts/2013/03/06/erlang-tech-night/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/03/06/erlang-tech-night/">&lt;p&gt;I recently gave a two hours presentation on Erlang 101 along with
Fabian. Because of the generous support
from Infusion I was able to speak at Institute of Computer Science at
University of Wroclaw. The event was a blast, and that is an opinion of
the people other than me also ;) Thanks for everyone who was there and
you can find the code and slides on
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;erlang-wroclaw&#x2F;erlang_tech_night&quot;&gt;github&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Laptop I&#x27;d love to buy</title>
		<published>2013-01-15T17:12:50+00:00</published>
		<updated>2013-01-15T17:12:50+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2013/01/15/laptop-would-love-to-buy/"/>
		<id>https://blog.cyplo.dev/posts/2013/01/15/laptop-would-love-to-buy/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2013/01/15/laptop-would-love-to-buy/">&lt;ul&gt;
&lt;li&gt;support for 16GB of RAM&lt;&#x2F;li&gt;
&lt;li&gt;contact smartcard reader&lt;&#x2F;li&gt;
&lt;li&gt;~2kg weight&lt;&#x2F;li&gt;
&lt;li&gt;11-14&quot; matte, non-glossy screen&lt;&#x2F;li&gt;
&lt;li&gt;good keyboard, with separate Home, End, Insert, Delete
buttons&lt;&#x2F;li&gt;
&lt;li&gt;screen resolution of &amp;gt;=1440&lt;&#x2F;li&gt;
&lt;li&gt;HDMI&lt;&#x2F;li&gt;
&lt;li&gt;at least 2x USB2.0 and 1x USB3.0&lt;&#x2F;li&gt;
&lt;li&gt;no optical drive&lt;&#x2F;li&gt;
&lt;li&gt;no thunderbolt&lt;&#x2F;li&gt;
&lt;li&gt;no firewire&lt;&#x2F;li&gt;
&lt;li&gt;TPM&lt;&#x2F;li&gt;
&lt;li&gt;HSDPA modem&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Is there something similar that you recommend for me to buy&#x2F;build ?&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>29c3</title>
		<published>2012-12-28T14:21:10+00:00</published>
		<updated>2012-12-28T14:21:10+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2012/12/28/29c3/"/>
		<id>https://blog.cyplo.dev/posts/2012/12/28/29c3/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2012/12/28/29c3/">






&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0481.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0481.jpg&quot; alt=&quot;IMG_0481.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0485.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0485.jpg&quot; alt=&quot;IMG_0485.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0488.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0488.jpg&quot; alt=&quot;IMG_0488.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0493.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0493.jpg&quot; alt=&quot;IMG_0493.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0496.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0496.jpg&quot; alt=&quot;IMG_0496.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0501.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0501.jpg&quot; alt=&quot;IMG_0501.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0502.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0502.jpg&quot; alt=&quot;IMG_0502.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0505.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0505.jpg&quot; alt=&quot;IMG_0505.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0508.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0508.jpg&quot; alt=&quot;IMG_0508.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0509.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0509.jpg&quot; alt=&quot;IMG_0509.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0513.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0513.jpg&quot; alt=&quot;IMG_0513.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0522.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0522.jpg&quot; alt=&quot;IMG_0522.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0523.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0523.jpg&quot; alt=&quot;IMG_0523.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0524.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0524.jpg&quot; alt=&quot;IMG_0524.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0525.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0525.jpg&quot; alt=&quot;IMG_0525.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0528.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0528.jpg&quot; alt=&quot;IMG_0528.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0530.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0530.jpg&quot; alt=&quot;IMG_0530.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0532.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0532.jpg&quot; alt=&quot;IMG_0532.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0534.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0534.jpg&quot; alt=&quot;IMG_0534.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0535.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0535.jpg&quot; alt=&quot;IMG_0535.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0536.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0536.jpg&quot; alt=&quot;IMG_0536.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0538.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0538.jpg&quot; alt=&quot;IMG_0538.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0547.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0547.jpg&quot; alt=&quot;IMG_0547.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0548.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0548.jpg&quot; alt=&quot;IMG_0548.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0549.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0549.jpg&quot; alt=&quot;IMG_0549.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0550.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0550.jpg&quot; alt=&quot;IMG_0550.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0551.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0551.jpg&quot; alt=&quot;IMG_0551.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0552.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0552.jpg&quot; alt=&quot;IMG_0552.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0553.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0553.jpg&quot; alt=&quot;IMG_0553.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0555.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0555.jpg&quot; alt=&quot;IMG_0555.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0556.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0556.jpg&quot; alt=&quot;IMG_0556.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0557.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0557.jpg&quot; alt=&quot;IMG_0557.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;29c3&#x2F;IMG_0560.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;29c3&#x2F;thumbnails&#x2F;IMG_0560.jpg&quot; alt=&quot;IMG_0560.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>I bought a book</title>
		<published>2012-12-22T15:20:47+00:00</published>
		<updated>2012-12-22T15:20:47+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2012/12/22/i-bought-a-book/"/>
		<id>https://blog.cyplo.dev/posts/2012/12/22/i-bought-a-book/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2012/12/22/i-bought-a-book/">&lt;p&gt;I bought a book I didn&#x27;t read before. On the Internet. Paying person I
don&#x27;t personally know, basing on his reputation only. Believing he would
send me a paper copy of his words from the remote land I&#x27;ve never even
visited. On the other hand he trusted me to write this review and gave
me the discount for the very fact. And yet everything worked out pretty
well. I transferred the money, got the book, read it and I&#x27;m writing the
promised review right now. How is that possible ? How does people trust
each other in this &quot;trust no one&quot; place of the &#x27;nets ? &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.amazon.com&#x2F;gp&#x2F;product&#x2F;1118143302&#x2F;ref=as_li_tf_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1118143302&amp;amp;linkCode=as2&amp;amp;tag=cyplonet-20&quot;&gt;Liars and
Outliers&lt;&#x2F;a&gt;
tries to answer that questions. Is this a good read, breathtaking one ?
No, I sometimes struggled to get through. Does it need to be so
intriguing though ? Also no. It is a solid collection of examples on how
does the trust work in our societies and where it did all come from. It
tries to categorize the situations in which trusting is needed and
provides a look into how such can be exploited by some. If you are even
somewhat interested in the cogs moving the society, this book might turn
some of your implicit, intuitive knowledge into explicit one.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>How to build minimalistic REST server in .Net</title>
		<published>2012-11-01T13:22:39+00:00</published>
		<updated>2012-11-01T13:22:39+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2012/11/01/minimalistic-rest-server-in-dotnet/"/>
		<id>https://blog.cyplo.dev/posts/2012/11/01/minimalistic-rest-server-in-dotnet/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2012/11/01/minimalistic-rest-server-in-dotnet/">&lt;p&gt;Install &quot;Microsoft ASP.NET Web API Self Host&quot; and all of its
dependencies via NuGet.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;cs&quot; class=&quot;language-cs z-code&quot;&gt;&lt;code class=&quot;language-cs&quot; data-lang=&quot;cs&quot;&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-cs&quot;&gt;using&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-cs&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-cs&quot;&gt;using&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-cs&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Collections&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Generic&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-cs&quot;&gt;using&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-cs&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Linq&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-cs&quot;&gt;using&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-cs&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Text&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-cs&quot;&gt;using&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-cs&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Threading&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-cs&quot;&gt;using&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-cs&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Threading&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Tasks&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-cs&quot;&gt;using&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-cs&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Web&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Http&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-control z-import z-cs&quot;&gt;using&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-path z-cs&quot;&gt;System&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Web&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;Http&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-namespace z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-path z-cs&quot;&gt;SelfHost&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-storage z-type z-namespace z-cs&quot;&gt;namespace&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-namespace z-cs&quot;&gt;resttest&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-access z-cs&quot;&gt;public&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-class z-cs&quot;&gt;&lt;span class=&quot;z-storage z-type z-class z-cs&quot;&gt;class&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-class z-cs&quot;&gt;ExampleData&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-modifier z-access z-cs&quot;&gt;public&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-cs&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-property z-cs&quot;&gt;&lt;span class=&quot;z-variable z-other z-member z-cs&quot;&gt;Id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-property z-cs&quot;&gt; &lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-property z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt; &lt;span class=&quot;z-meta z-method z-cs&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-accessor z-get z-cs&quot;&gt;get&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-cs&quot;&gt;&lt;span class=&quot;z-storage z-type z-function z-accessor z-set z-cs&quot;&gt;set&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-cs&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-property z-cs&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;    &lt;span class=&quot;z-storage z-modifier z-access z-cs&quot;&gt;public&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-class z-cs&quot;&gt;&lt;span class=&quot;z-storage z-type z-class z-cs&quot;&gt;class&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-class z-cs&quot;&gt;ExampleController&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-separator z-type z-cs&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-other z-inherited-class z-cs&quot;&gt;ApiController&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-cs&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-cs&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; &#x2F;api&#x2F;job
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;        &lt;span class=&quot;z-storage z-modifier z-access z-cs&quot;&gt;public&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-cs&quot;&gt;IEnumerable&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-cs&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-cs&quot;&gt;&lt;span class=&quot;z-support z-type z-cs&quot;&gt;ExampleData&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-cs&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-cs&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-cs&quot;&gt;Get&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-cs&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-flow z-return z-cs&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-new z-cs&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-support z-type z-cs&quot;&gt;List&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-begin z-cs&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-cs&quot;&gt;&lt;span class=&quot;z-support z-type z-cs&quot;&gt;ExampleData&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-generic z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-generic z-end z-cs&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;            &lt;span class=&quot;z-punctuation z-section z-braces z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;                &lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-new z-cs&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-support z-type z-cs&quot;&gt;ExampleData&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt; &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Id&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-cs&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-cs&quot;&gt;2&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-array-element z-cs&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;                &lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-new z-cs&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-support z-type z-cs&quot;&gt;ExampleData&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt; &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Id&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-cs&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-cs&quot;&gt;4&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;            &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;        &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;        &lt;span class=&quot;z-comment z-line z-double-slash z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-cs&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt; &#x2F;api&#x2F;job&#x2F;3
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;        &lt;span class=&quot;z-storage z-modifier z-access z-cs&quot;&gt;public&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-type z-cs&quot;&gt;ExampleData&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-cs&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-cs&quot;&gt;Get&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-cs&quot;&gt;&lt;span class=&quot;z-storage z-type z-cs&quot;&gt;int&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-cs&quot;&gt;id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-cs&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-flow z-return z-cs&quot;&gt;return&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-new z-cs&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-support z-type z-cs&quot;&gt;ExampleData&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt; &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Id&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-cs&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-cs&quot;&gt;3&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-braces z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;        &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;    &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;    &lt;span class=&quot;z-meta z-class z-cs&quot;&gt;&lt;span class=&quot;z-storage z-type z-class z-cs&quot;&gt;class&lt;&#x2F;span&gt; &lt;span class=&quot;z-entity z-name z-class z-cs&quot;&gt;Program&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-cs&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;        &lt;span class=&quot;z-storage z-modifier z-cs&quot;&gt;static&lt;&#x2F;span&gt; &lt;span class=&quot;z-storage z-type z-cs&quot;&gt;void&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-method z-cs&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-cs&quot;&gt;Main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-cs&quot;&gt;&lt;span class=&quot;z-storage z-type z-cs&quot;&gt;string&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-brackets z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-begin z-cs&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-brackets z-end z-cs&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-cs&quot;&gt;args&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-parameters z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-parameters z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-cs&quot;&gt;        &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-storage z-type z-variable z-cs&quot;&gt;var&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;configuration&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-variable z-cs&quot;&gt;=&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;                &lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-new z-cs&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-support z-type z-cs&quot;&gt;HttpSelfHostConfiguration&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;http:&#x2F;&#x2F;localhost:1337&lt;span class=&quot;z-punctuation z-definition z-string z-end z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-comment z-line z-double-slash z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-cs&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;Setup the routes
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;configuration&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Routes&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-variable z-function z-cs&quot;&gt;MapHttpRoute&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-cs&quot;&gt;name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-argument z-value z-cs&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;DefaultApiRoute&lt;span class=&quot;z-punctuation z-definition z-string z-end z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-argument z-cs&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-cs&quot;&gt;routeTemplate&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-argument z-value z-cs&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;api&#x2F;{controller}&#x2F;{id}&lt;span class=&quot;z-punctuation z-definition z-string z-end z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-argument z-cs&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;                &lt;span class=&quot;z-variable z-parameter z-cs&quot;&gt;defaults&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-argument z-value z-cs&quot;&gt;:&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-new z-cs&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;                    &lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-anonymous z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-anonymous z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt; &lt;span class=&quot;z-variable z-other z-member z-cs&quot;&gt;controller&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-cs&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;ExampleController&lt;span class=&quot;z-punctuation z-definition z-string z-end z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-class z-cs&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-member z-cs&quot;&gt;id&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-cs&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;RouteParameter&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Optional&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;                &lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-storage z-type z-variable z-cs&quot;&gt;var&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;server&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-variable z-cs&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-new z-cs&quot;&gt;new&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-support z-type z-cs&quot;&gt;HttpSelfHostServer&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-instance z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;configuration&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;server&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-variable z-function z-cs&quot;&gt;OpenAsync&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-variable z-function z-cs&quot;&gt;Wait&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Out&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-variable z-function z-cs&quot;&gt;WriteLine&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Press ESC to quit&lt;span class=&quot;z-punctuation z-definition z-string z-end z-cs&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-keyword z-control z-loop z-do z-cs&quot;&gt;do&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;                &lt;span class=&quot;z-keyword z-control z-loop z-while z-cs&quot;&gt;while&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-cs&quot;&gt;!&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;KeyAvailable&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;                &lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-begin z-cs&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;                    &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Thread&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-variable z-function z-cs&quot;&gt;Sleep&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-constant z-numeric z-integer z-decimal z-cs&quot;&gt;256&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;                &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;            &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-loop z-while z-cs&quot;&gt;while&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Console&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-variable z-function z-cs&quot;&gt;ReadKey&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-cs&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-cs&quot;&gt;&lt;span class=&quot;z-meta z-group z-cs&quot;&gt;&lt;span class=&quot;z-constant z-language z-cs&quot;&gt;true&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Key&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-cs&quot;&gt;!=&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-cs&quot;&gt;ConsoleKey&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-accessor z-dot z-cs&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-cs&quot;&gt;Escape&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-group z-end z-cs&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-terminator z-statement z-cs&quot;&gt;;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-method z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;        &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-meta z-class z-body z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;    &lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-cs&quot;&gt;&lt;span class=&quot;z-meta z-namespace z-cs&quot;&gt;&lt;span class=&quot;z-meta z-block z-cs&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-block z-end z-cs&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We can launch it and query it using any http-enabled client:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;$ curl http:&#x2F;&#x2F;localhost:1337&#x2F;api&#x2F;Example [{&quot;Id&quot;:2},{&quot;Id&quot;:4}]&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Happy hacking !&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Boosting your WiFi signal with cooking utensils</title>
		<published>2012-08-01T18:13:31+00:00</published>
		<updated>2012-08-01T18:13:31+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2012/08/01/boosting-your-wifi-signal/"/>
		<id>https://blog.cyplo.dev/posts/2012/08/01/boosting-your-wifi-signal/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2012/08/01/boosting-your-wifi-signal/">&lt;p&gt;I love cooking and well made utensils. That is a part of the
solution. And the problem ? Boosting WiFi signal. Get WiFi USB dongle
and put it where the bowl&#x27;s focal point is. Or near it, wherever you get
strongest signal boost. I get up to 2x stronger reception with the
antenna presented.&lt;&#x2F;p&gt;
&lt;p&gt;{{&amp;lt; figure src=&quot;&#x2F;images&#x2F;boosting-your-wifi-signal&#x2F;IMG_0230.jpg&quot; position=&quot;center&quot; &amp;gt;}}&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Enabling wireless on Dell Latitude 2110 under CrunchBang Linux</title>
		<published>2012-07-08T09:18:59+00:00</published>
		<updated>2012-07-08T09:18:59+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2012/07/08/enabling-wireless-latitude-2110-crunchbang-linux/"/>
		<id>https://blog.cyplo.dev/posts/2012/07/08/enabling-wireless-latitude-2110-crunchbang-linux/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2012/07/08/enabling-wireless-latitude-2110-crunchbang-linux/">&lt;blockquote&gt;
&lt;p&gt;Update 2023: crunchbang is no longer a thing, replaced by &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.bunsenlabs.org&#x2F;&quot;&gt;bunsenlabs&lt;&#x2F;a&gt;
Please note that I no longer host this kernel as it is very old and also Crunchbang is no more.**&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Some time ago I got my hands on &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;CrunchBang_Linux&quot;&gt;CrunchBang Linux&lt;&#x2F;a&gt; distro, which is great. The only thing there that could be better is that my Broadcom BCM43224 WiFi card is not working. But I&#x27;m used to it, as many
Linux distros do not provide it. As I happen to
know from my Fedora experiences that it is resolved in kernel version
3.4 . Also as that kernel tends to be generally faster on my machine, I
decided to compile just this one. Here you are. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.kernel.org&#x2F;pub&#x2F;linux&#x2F;kernel&#x2F;v3.0&#x2F;linux-3.4.4.tar.bz2&quot;&gt;Vanilla 3.4.4&lt;&#x2F;a&gt;
kernel, &lt;a href=&quot;#&quot;&gt;compiled&lt;&#x2F;a&gt;
for Intel Atom and with BCM43224 support. This is a 64bit kernel.
Download crunchbanglinux-kernel-3.4.4-intel_atom.tar.bz2 (no longer available)
and:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dpkg --remove firmware-linux
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dpkg --remove firmware-linux-nonfree
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;tar jxf crunchbanglinux-kernel-3.4.4-intel_atom.tar.bz2
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cd linux-3.4.4-intel_atom&#x2F;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dpkg -i *.deb
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;reboot
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Should work for Debian Squeeze also but not tested on that system. Email me if you&#x27;d
like it compiled any other way, e.g. for another processor.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Bitcoin wallet recovery using Photorec</title>
		<published>2012-04-01T21:06:01+00:00</published>
		<updated>2012-04-01T21:06:01+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2012/04/01/bitcoin-wallet-recovery-photorec/"/>
		<id>https://blog.cyplo.dev/posts/2012/04/01/bitcoin-wallet-recovery-photorec/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2012/04/01/bitcoin-wallet-recovery-photorec/">&lt;p&gt;Ever cried over damaged disk holding your bitcoin wallet ? Ever
formatted storage holding a perfectly valid and the only copy of your
wallet.dat ? Yes, me too. Well, there&#x27;s
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;PhotoRec&quot;&gt;Photorec&lt;&#x2F;a&gt;, an opensource file
recovery software. It just skips the partition and filesystem info and
scans for plain file signatures on the disk. Unfortunately it does not
recognize Bitcoin&#x27;s Wallet as a file format. Bitcoin wiki
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;en.bitcoin.it&#x2F;wiki&#x2F;Wallet&quot;&gt;states&lt;&#x2F;a&gt; that wallet.dat is just a
good old BerkeleyDB. Just let me check that with the famous &lt;code&gt;file&lt;&#x2F;code&gt;
command:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;[cyryl@uglybook ~]$ file .bitcoin&#x2F;wallet.dat
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;.bitcoin&#x2F;wallet.dat: Berkeley DB (Btree, version 9, native byte-order)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That is right. Photorec however, has its own file-type
detection magic. Let&#x27;s see whether it works on the wallet.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;[cyryl@uglybook ~]$ fidentify .bitcoin&#x2F;wallet.dat
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;.bitcoin&#x2F;wallet.dat: unknown
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Uhoh. Do not abandon hope for not all is lost ! Photorec [provides a
way
for you to add custom signatures. The only missing ingredient appears to
be the knowledge possed by the &lt;code&gt;file&lt;&#x2F;code&gt; command. Just check your linux installation for
&lt;code&gt;file&lt;&#x2F;code&gt;&#x27;s detection signatures. On my system these are to be found
under &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;misc&#x2F;magic&lt;&#x2F;code&gt;. We need file extensions, offset and some
magic number for Photorec to work. Well, extension is &lt;code&gt;.dat&lt;&#x2F;code&gt;, magics
and offsets are stored in the file mentioned above. Translate offsets
from decimal-based to hexs and take care of endianess and done :)&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;[cyryl@uglybook ~]# cat .photorec.sig
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0x0 0x00061561
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0x0 0x61150600
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0x0 0x00053162
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0x0 0x62310500
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0xc 0x00061561
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0xc 0x61150600
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0xc 0x00053162
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0xc 0x62310500
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0xc 0x00042253
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0xc 0x53220400
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0xc 0x00040988
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;dat 0xc 0x88090400
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That is it. Happy wallet recovery.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Disassembling Pioneer SE-50 headphones</title>
		<published>2011-12-20T11:12:11+00:00</published>
		<updated>2011-12-20T11:12:11+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2011/12/20/disassembling-pioneer-se-50-headphones/"/>
		<id>https://blog.cyplo.dev/posts/2011/12/20/disassembling-pioneer-se-50-headphones/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2011/12/20/disassembling-pioneer-se-50-headphones/">&lt;p&gt;Today&#x27;s story is a photostory ! Here&#x27;s how to disassemble Pioneer SE-50
headphones, as I found this task quite difficult, mainly because no info
available on the internet on how to open the can from the back. As you
can see Pioneer signs on the side of each can are removable. Take them
off to uncover the screws. Research made possible by
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Kabanos&quot;&gt;kabanosy&lt;&#x2F;a&gt; - best multitool
ever. Some more info on the headphones: &lt;a href=&quot;&#x2F;pdf&#x2F;disassembling-pioneer-se-50&#x2F;se-50-b-user-manual.pdf&quot;&gt;scan of the user manual&lt;&#x2F;a&gt;
Produced between &#x27;68 and &#x27;72.
Two speakers per can !
Photos taken after replacing the cable and before pots rejuvenation.
Enjoy :)&lt;&#x2F;p&gt;







&lt;div class=&quot;gallery&quot;&gt;

  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0011.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0011.jpg&quot; alt=&quot;IMG_0011.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0014.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0014.jpg&quot; alt=&quot;IMG_0014.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0015.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0015.jpg&quot; alt=&quot;IMG_0015.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0017.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0017.jpg&quot; alt=&quot;IMG_0017.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0018.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0018.jpg&quot; alt=&quot;IMG_0018.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0024.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0024.jpg&quot; alt=&quot;IMG_0024.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0026.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0026.jpg&quot; alt=&quot;IMG_0026.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0027.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0027.jpg&quot; alt=&quot;IMG_0027.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0029.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0029.jpg&quot; alt=&quot;IMG_0029.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0032.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0032.jpg&quot; alt=&quot;IMG_0032.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0033.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0033.jpg&quot; alt=&quot;IMG_0033.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0037.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0037.jpg&quot; alt=&quot;IMG_0037.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0038.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0038.jpg&quot; alt=&quot;IMG_0038.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0039.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0039.jpg&quot; alt=&quot;IMG_0039.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0040.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0040.jpg&quot; alt=&quot;IMG_0040.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0041.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0041.jpg&quot; alt=&quot;IMG_0041.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0044.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0044.jpg&quot; alt=&quot;IMG_0044.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0047.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0047.jpg&quot; alt=&quot;IMG_0047.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0048.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0048.jpg&quot; alt=&quot;IMG_0048.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0049.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0049.jpg&quot; alt=&quot;IMG_0049.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0050.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0050.jpg&quot; alt=&quot;IMG_0050.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0051.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0051.jpg&quot; alt=&quot;IMG_0051.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0053.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0053.jpg&quot; alt=&quot;IMG_0053.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0055.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0055.jpg&quot; alt=&quot;IMG_0055.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0057.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0057.jpg&quot; alt=&quot;IMG_0057.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0059.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0059.jpg&quot; alt=&quot;IMG_0059.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0060.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0060.jpg&quot; alt=&quot;IMG_0060.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0061.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0061.jpg&quot; alt=&quot;IMG_0061.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0062.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0062.jpg&quot; alt=&quot;IMG_0062.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0064.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0064.jpg&quot; alt=&quot;IMG_0064.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0068.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0068.jpg&quot; alt=&quot;IMG_0068.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0074.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0074.jpg&quot; alt=&quot;IMG_0074.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0076.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0076.jpg&quot; alt=&quot;IMG_0076.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0077.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0077.jpg&quot; alt=&quot;IMG_0077.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0079.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0079.jpg&quot; alt=&quot;IMG_0079.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0080.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0080.jpg&quot; alt=&quot;IMG_0080.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0082.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0082.jpg&quot; alt=&quot;IMG_0082.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0083.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0083.jpg&quot; alt=&quot;IMG_0083.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0085.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0085.jpg&quot; alt=&quot;IMG_0085.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0086.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0086.jpg&quot; alt=&quot;IMG_0086.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0089.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0089.jpg&quot; alt=&quot;IMG_0089.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0091.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0091.jpg&quot; alt=&quot;IMG_0091.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0095.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0095.jpg&quot; alt=&quot;IMG_0095.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0096.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0096.jpg&quot; alt=&quot;IMG_0096.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0097.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0097.jpg&quot; alt=&quot;IMG_0097.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0101.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0101.jpg&quot; alt=&quot;IMG_0101.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0106.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0106.jpg&quot; alt=&quot;IMG_0106.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0107.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0107.jpg&quot; alt=&quot;IMG_0107.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0108.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0108.jpg&quot; alt=&quot;IMG_0108.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0110.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0110.jpg&quot; alt=&quot;IMG_0110.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0111.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0111.jpg&quot; alt=&quot;IMG_0111.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0112.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0112.jpg&quot; alt=&quot;IMG_0112.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0113.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0113.jpg&quot; alt=&quot;IMG_0113.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  
  &lt;a href=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;IMG_0115.jpg&quot; target=&quot;_blank&quot; class=&quot;gallery-item&quot;&gt;
    &lt;img src=&quot;&#x2F;gallery&#x2F;disassembling-pioneer-se-50&#x2F;thumbnails&#x2F;IMG_0115.jpg&quot; alt=&quot;IMG_0115.jpg&quot; loading=&quot;lazy&quot; &#x2F;&gt;
  &lt;&#x2F;a&gt;
  

&lt;&#x2F;div&gt;

&lt;style&gt;
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 0.5rem;
  margin: 1.5rem 0;
}
.gallery-item {
  display: block;
  border: none;
}
.gallery-item img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-radius: 4px;
  transition: transform 0.2s ease;
}
.gallery-item:hover img {
  transform: scale(1.02);
}
&lt;&#x2F;style&gt;

</content>
	</entry>
	<entry xml:lang="en">
		<title>Configuring Tor non-exit relay</title>
		<published>2011-10-06T15:33:49+00:00</published>
		<updated>2011-10-06T15:33:49+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2011/10/06/configuring-tor-non-exit-relay/"/>
		<id>https://blog.cyplo.dev/posts/2011/10/06/configuring-tor-non-exit-relay/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2011/10/06/configuring-tor-non-exit-relay/">&lt;p&gt;I&#x27;m for privacy. I&#x27;m for cryptography. I do provide
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.torproject.org&#x2F;&quot;&gt;Tor&lt;&#x2F;a&gt; relays for the good of all people.
Here&#x27;s how to configure a classic non-exit Tor relay on your machine. In
my case I got it running on the VPS server, with 2 IP addresses and some
bandwidth quota applied. I wanted the Tor traffic to be easily
recognizable from outside as different from the &#x27;normal&#x27; traffic coming
from my server. Second requirement was to make Tor not use my whole
traffic quota up. Here&#x27;s my config, with some notes&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;cyryl@serv:~$ cat &#x2F;etc&#x2F;tor&#x2F;torrc
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;SocksPort 0 # what port to open for local application connections
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;SocksListenAddress 127.0.0.1 # accept connections only from localhost
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;RunAsDaemon 1
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;DataDirectory &#x2F;var&#x2F;lib&#x2F;tor
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ORPort 9001 #switches Tor to server mode
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ORListenAddress tor.cyplo.net
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;OutboundBindAddress 91.213.195.28 #what IP address use to direct the outbound traffic
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Nickname cyplonet
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Address tor.cyplo.net
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;ExitPolicy reject *:* # no exits allowed
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;AccountingStart day 09:00
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;AccountingMax 2 GB
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;MyFamily cyplonethome, cyplonet
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Ubuntu 11.10 Beta1</title>
		<published>2011-09-22T09:40:22+00:00</published>
		<updated>2011-09-22T09:40:22+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2011/09/22/ubuntu-11-10-beta1/"/>
		<id>https://blog.cyplo.dev/posts/2011/09/22/ubuntu-11-10-beta1/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2011/09/22/ubuntu-11-10-beta1/">&lt;p&gt;What do I think ? Easy to install, hard to disable Unity, some programs crash sometimes and some things are weird. Despite that I have the faith in the Ubuntu folks that the system would be ready when 11.10 comes.&lt;&#x2F;p&gt;
&lt;p&gt;As whining itself never got anybody anywhere, I&#x27;ve reported all of these here:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;bugs.launchpad.net&#x2F;ubuntu&#x2F;+source&#x2F;linux&#x2F;+bug&#x2F;855901&quot;&gt;#855901&lt;&#x2F;a&gt;
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;bugs.launchpad.net&#x2F;ubuntu&#x2F;+source&#x2F;software-center&#x2F;+bug&#x2F;834425&quot;&gt;#834425&lt;&#x2F;a&gt;
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;bugs.launchpad.net&#x2F;ubuntu&#x2F;+source&#x2F;unity-2d&#x2F;+bug&#x2F;855945&quot;&gt;#855945&lt;&#x2F;a&gt;
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;bugs.launchpad.net&#x2F;ubuntu&#x2F;+source&#x2F;empathy&#x2F;+bug&#x2F;855917&quot;&gt;#855917&lt;&#x2F;a&gt;
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;bugs.launchpad.net&#x2F;ubuntu&#x2F;+source&#x2F;thunderbird&#x2F;+bug&#x2F;855919&quot;&gt;#855919&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve even got one OOPS. However, since I&#x27;m writing this post under
11.10, it seems usable, even the OOPS was not of disturbance as it got
nice GUI window displayed and no system crash then.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>How to hire a programmer, a.k.a. tech recruitment explained</title>
		<published>2011-07-24T20:31:55+00:00</published>
		<updated>2011-07-24T20:31:55+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2011/07/24/how-to-hire-people/"/>
		<id>https://blog.cyplo.dev/posts/2011/07/24/how-to-hire-people/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2011/07/24/how-to-hire-people/">&lt;p&gt;Today’s post is not a recipe at all. Here’s what I think the tech recruitment should look
like. It won’t be cheap. Start by describing the position. Who are you looking for,
what would they do for you, how would they bring money to your company.
Use words, not techie talk. I found most of the job descriptions online
do not match the real expectations of the employer. You just want a good
programmer, a person who thinks about what they does. It really doesn’t
matter if they know Haskell and you write in Erlang. I doesn’t matter if
they think in asm when you’re looking for Forth. I doesn’t matter if
they are Linux nerds and you’re Windows-only, if they know how
computers work. As long as they think about what they do and agree with your goals, that’s perfectly fine. If you
translate your desire for a good programmer into a bulletpoint list of
tech words you dehumanize it. Don’t look for skillsets, look for people. How to check whether someone is a good programmer then ? How to
score people against such a vague job description ? You don’t score
people, you just sort the set of people. Start by a rather loose
conversation. Tell me about the point in life you’re in, tell me
something about what fascinates you in the programming and finally
what’s your motivation for changing the job and why do you want to work
with us ? Somewhere in the middle I ask about the projects, what
technologies you do like, what not, why not. Do you feel comfortable
teaching others ? If someone is fascinated by
The Machines you&#x27;re noticing it by now. Same with
boring people or annoying people. If you do not want to work with them
then do not hire them. Even if they’re brilliant. How does the computer
work then ? How does this happen that I have this text file full of
strange writings and suddenly they make the computer do stuff ? Why it’s
not a good idea to get the modern pc to fly a space shuttle ? What’s a
stack and what’s a heap ? Is the stack memory different from the heap
memory ? Why so. And the why. The most important question for me is the
mighty why. Not only should they understand how something works, but
more importantly why it works like that. I enjoy working with people who
are microwave-curious than the hex-feared ones. How does the microwave
oven heat things ? Does the DEADBEEF scare your ? Talk with people, make notes. What annoys you, what
impresses you. Do the exercises with them. Ask them how would they solve
a simple but a reallife problem. Design the solution with them. The more
lifelike the work scenario the better. Do the things you’d normally do
with your work colleague. And order the set of candidates. Work as the
simple max function. Decide
which one seems better suited for you. Then take the next one and
compare her to the current max. And please hire people only when you’re
ready to hire them. UPDATE. After writing this post I&#x27;ve stumbled onto
this &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;37signals.com&#x2F;svn&#x2F;posts&#x2F;2628-how-to-hire-a-programmer-when-youre-not-a-programmer&quot;&gt;37signal&#x27;s article&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Speeding up Eclipse&#x2F;Aptana</title>
		<published>2011-05-23T12:29:49+00:00</published>
		<updated>2011-05-23T12:29:49+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2011/05/23/speeding-up-eclipse-aptana/"/>
		<id>https://blog.cyplo.dev/posts/2011/05/23/speeding-up-eclipse-aptana/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2011/05/23/speeding-up-eclipse-aptana/">&lt;p&gt;As you know Aptana is Eclipse. And Eclipse is a Java-based IDE
which means it&#x27;s not particularly a speedy one. However if you have a
decent amount of ram, like 4gb, it&#x27;s fairly easy to speed the Eclipse
up. Find &lt;code&gt;eclipse.ini&lt;&#x2F;code&gt; or &lt;code&gt;aptana.ini&lt;&#x2F;code&gt; or other file which
contents look similar. These settings are from my Linux box - I know that
MacOS can get scared by higher values there; if you encounter any problems - try lowering the &lt;code&gt;Xmx&lt;&#x2F;code&gt;
and&#x2F;or others.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;--launcher.XXMaxPermSize
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;512m
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;--launcher.defaultAction
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;openFile
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;-vmargs
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;-Xms128m
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;-Xmx2048m
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;These settings are for the 4gb ram box, try to find the ones which suit you best. &lt;code&gt;MaxPermSize&lt;&#x2F;code&gt;
stands for the maximum amount of the memory to be used by the Java
internals, &lt;code&gt;Xms&lt;&#x2F;code&gt; gives the amount of heap allocated on the VM start and
&lt;code&gt;Xmx&lt;&#x2F;code&gt; is the heap size limit. Start by upping &lt;code&gt;Xms&lt;&#x2F;code&gt; value as it&#x27;s often
too small which causes the Java VM to make lots of heap resizes on the
app start.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Installing MacOSX Server 10.6 on VirtualBox</title>
		<published>2011-05-07T14:23:30+00:00</published>
		<updated>2011-05-07T14:23:30+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2011/05/07/installing-macosx-server-on-virtualbox/"/>
		<id>https://blog.cyplo.dev/posts/2011/05/07/installing-macosx-server-on-virtualbox/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2011/05/07/installing-macosx-server-on-virtualbox/">&lt;blockquote&gt;
&lt;p&gt;Updated 2023: sadly nawcom is no more, I&#x27;ve removed dead links&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;It all started with my work assignment of installing MacOSX Server 10.6
on the XServe rack. Briefly speaking, after debugging some hardware problem
with the CPU temperature meter, I managed to install the base OSX server
system there. After that I needed to set up VMs with 10.6 64bit and 10.4 32bit
on top of that. Why so if already having 10.6 as the base system ?
Simply I wanted to avoid constant reinstallation of the base system, as
the machines are meant to be used for development and testing. Also the
XServe hardware was needed instead of classic blade system to meet Apple
license requirements. Having the internet read twice I decided to give
VirtualBox a try. My way of thinking was that I am already familliar
with that piece of software and know it as a easy to use one. In
addition to being pretty fool-proof it also enables features like operating from the commandline only. So what&#x27;s the deal ?
Bring up VirtualBox GUI, click on new virtual machine creation button,
choose MacOSXServer, insert the iso file made from the installation dvd
and volia ? Not even remotely close. It appears that Apple has embedded
some kind of valid processors db into the system and checks the
processors present against it on every boot. The only configuration I managed to install
and launch was single-core. Both 32 and 64bit guests seem to be working
fine. But what&#x27;s the point of having many cores there if only one can be
used per a VM ? Some time after that I found brilliant blog pair by
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;prasys.info&#x2F;&quot;&gt;prasys&lt;&#x2F;a&gt; and
&lt;a href=&quot;#&quot;&gt;nawcom&lt;&#x2F;a&gt;. It seems that the latter one
produces what&#x27;s called &lt;a href=&quot;#&quot;&gt;ModCD&lt;&#x2F;a&gt; which
allows booting with the processor checks disabled. Recipe for amd64:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;create new MacOSX vm in VirtualBox&lt;&#x2F;li&gt;
&lt;li&gt;change it to non-EFI type&lt;&#x2F;li&gt;
&lt;li&gt;boot ModCD&lt;&#x2F;li&gt;
&lt;li&gt;swap iso image for the one with the MacOS install&lt;&#x2F;li&gt;
&lt;li&gt;press f5&lt;&#x2F;li&gt;
&lt;li&gt;type -force64&lt;&#x2F;li&gt;
&lt;li&gt;press enter&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For me the installer crashed on the last step before reboot, but then it
rebooted successfully and continued on with the installation. Don&#x27;t
forget to donate to nawcom if you can.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>How not to blog</title>
		<published>2011-03-27T22:25:23+00:00</published>
		<updated>2011-03-27T22:25:23+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2011/03/27/do-blog/"/>
		<id>https://blog.cyplo.dev/posts/2011/03/27/do-blog/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2011/03/27/do-blog/">&lt;p&gt;Today&#x27;s post is definitely not a tech one. Or maybe just a bit. It&#x27;s
about blogging, from the other side of the keyboard. PEBKAC-style.
Fun-fact: Did you know that &#x27;kac&#x27; in Polish means &#x27;hangover&#x27; ? To the
point. I realised that I have dozens of posts in the state of started
but definitely not finished. Why is that so ? Is it that I am superbusy
with my new work ? Kinda. Is that that I am the guy responsible for the
installation of the sound system in one of the new Wrocław&#x27;s clubs ?
Sounds pretty serious but still not a perfect excuse. The thing is that
there is no right excuse for not doing something you want to do. Do it
or don&#x27;t. Don&#x27;t pretend to. The funny thing is that the smallest
possible posts, like
&lt;a href=&quot;&#x2F;posts&#x2F;2011&#x2F;01&#x2F;29&#x2F;netbeans-6-9-rails-3-ubuntu-10-10&#x2F;&quot;&gt;this one&lt;&#x2F;a&gt; brought me
the most views. I don&#x27;t wanna loose you guys because I don&#x27;t feel like
blogging recently. Mine unfinished tech posts won&#x27;t probably make it
because I just don&#x27;t remember what were these small tech tricks I used
to solve that problems. Not even wrote them down as I was so enlightened
by the superiority of my solutions. Don&#x27;t do that. Take notes about
everything which you would possibly need and start working on the
sentences and wording. Right now. Go. Hit publish and let the world
know. Thanks go to
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;techcrunch.com&#x2F;2011&#x2F;03&#x2F;27&#x2F;why-startups-need-to-blog-and-what-to-talk-about&#x2F;&quot;&gt;TC&lt;&#x2F;a&gt;
&amp;amp; &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;techcrunch.com&#x2F;author&#x2F;mark-suster&#x2F;&quot;&gt;Mark Suster&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Netbeans 6.9 for Rails 3 on Ubuntu 10.10</title>
		<published>2011-01-29T14:51:07+00:00</published>
		<updated>2011-01-29T14:51:07+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2011/01/29/netbeans-6-9-rails-3-ubuntu-10-10/"/>
		<id>https://blog.cyplo.dev/posts/2011/01/29/netbeans-6-9-rails-3-ubuntu-10-10/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2011/01/29/netbeans-6-9-rails-3-ubuntu-10-10/">&lt;p&gt;I am a lazy person. I do like things to just work, run out of the box,
name it. I like Ubuntu for it&#x27;s packaging system and ease of
installation of various software. However using Netbeans from the
default repo could cause you a headache when developing Rails 3 apps.
These just won&#x27;t run. Let us start with installing the newest version of
the IDE&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; apt-get install netbeans&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;then go to the Tools-&amp;gt;Plugins-&amp;gt;Available and install all regarding Ruby&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now go ahead and try running some Rails app.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;&#x2F;var&#x2F;lib&#x2F;gems&#x2F;1.9.1&#x2F;gems&#x2F;activesupport-3.0.3&#x2F;lib&#x2F;active_support&#x2F;dependencies.rb:239:in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-command z-backticks z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-group z-begin z-shell&quot;&gt;`&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;require&lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;: &#x2F;var&#x2F;lib&#x2F;gems&#x2F;1.9.1&#x2F;gems&#x2F;activesupport-3.0.3&#x2F;lib&#x2F;active_support&#x2F;cache&#x2F;mem_cache_store.rb:32: invalid multibyte escape: &#x2F;[x00-x20%x7F-xFF]&#x2F; (SyntaxError)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;you say ? Here&#x27;s a quick fix&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#edit &#x2F;usr&#x2F;share&#x2F;netbeans&#x2F;6.9&#x2F;etc&#x2F;netbeans.conf
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#=&amp;gt; append -J-Druby.no.kcode=true to the the netbeans_default_options and volia
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# the whole line im my case goes like that:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;netbeans_default_options=&amp;quot;-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.pmoffscreen=false -J-Druby.no.kcode=true&amp;quot;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Long term solution ? Wait for Netbeans 7.0 as the devs promised it to be fixed there&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Hello Sharpdevelop</title>
		<published>2010-11-14T13:38:02+00:00</published>
		<updated>2010-11-14T13:38:02+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2010/11/14/sharpdevelop/"/>
		<id>https://blog.cyplo.dev/posts/2010/11/14/sharpdevelop/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2010/11/14/sharpdevelop/">&lt;p&gt;For years I&#x27;ve been involved in the open source community. I encouraged
company managers to use open source solutions, I reported bugs, I did
tests. Since this Monday I am officially a part of
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.icsharpcode.net&#x2F;opensource&#x2F;sd&#x2F;&quot;&gt;Sharpdevelop&lt;&#x2F;a&gt; team,
pursuing the goal of better
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;F_Sharp_(programming_language)&quot;&gt;F#&lt;&#x2F;a&gt;
support within the IDE. The project itself made has made a impressive
progress last years, had &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;monodevelop.com&#x2F;&quot;&gt;MonoDevelop&lt;&#x2F;a&gt;
forked from it and has some pretty good people working on it right now.
What more can I say.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>VPS Adventures part two</title>
		<published>2010-11-01T14:23:18+00:00</published>
		<updated>2010-11-01T14:23:18+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2010/11/01/vps-adventures-part-two/"/>
		<id>https://blog.cyplo.dev/posts/2010/11/01/vps-adventures-part-two/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2010/11/01/vps-adventures-part-two/">&lt;blockquote&gt;
&lt;p&gt;Update 2023: the landscape has changed considerably over the last 13 years, a lot of the companies mentioned in this post have died, I&#x27;ve removed dead links&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;After some not so pleasurable experiences with the previous VPS hosting
provider I started my search for some other one. This time not only
google was involved but also &lt;a href=&quot;#&quot;&gt;aardvark&lt;&#x2F;a&gt; and some of
the &quot;top XX best hosting providers&quot; sites. Two results kept showing up.
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.server4you.com&#x2F;&quot;&gt;server4you&lt;&#x2F;a&gt; and
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.tilaa.nl&#x2F;&quot;&gt;tilaa&lt;&#x2F;a&gt;. Which one to choose then ? I wanted
to give both of them a chance.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.server4you.com&#x2F;&quot;&gt;server4you&lt;&#x2F;a&gt;. I really tried to buy a VPS
there and I failed. Lots of forms to fill and no instant money
transfer available. I entered my credit card details only to receive the
email after a day or so stating that they were unable to process my
payment.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.tilaa.nl&#x2F;&quot;&gt;tilaa&lt;&#x2F;a&gt;. What caught my attention there was
that clean website of them. I like such a design style, as you can also
see it here. Not so cheap, I must admit, but definitely easy to buy.
Payment transfered and after about a minute I had a full access to the
VPS. That&#x27;s how I like things to work. I am using tilaa&#x27;s the most
simple VPS plan since then and I am pretty happy with it. Here gathered
are some things I like or don&#x27;t about its services.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;friendly, responsive staff&lt;&#x2F;li&gt;
&lt;li&gt;2x RAM amount of swap space - seems great compared to no swap on other VPSes&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.linux-kvm.org&#x2F;page&#x2F;Main_Page&quot;&gt;KVM&lt;&#x2F;a&gt;- and &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;QEMU&quot;&gt;qemu&lt;&#x2F;a&gt;-based, you get full control of your system&lt;&#x2F;li&gt;
&lt;li&gt;good overall system responsiveness - I experienced occasional lags when using &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;wiki.openvz.org&#x2F;Main_Page&quot;&gt;OpenVZ&lt;&#x2F;a&gt; virtualization before, there&#x27;s no such thing here&lt;&#x2F;li&gt;
&lt;li&gt;they work fast - the day the new Ubuntu 10.10 was released, they had the VPS image ready !&lt;&#x2F;li&gt;
&lt;li&gt;their motto &quot;We try to be good open source citizens&quot; just convinces me&lt;&#x2F;li&gt;
&lt;li&gt;the only disadvantage is the price, it&#x27;s 8.95 euro net montly, it&#x27;s also easy to miss that info on the site&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;As I already have a safe place to tinker with my system the real work on
the server configuration begins. Stay tuned for the next episode.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>VPS adventures part one</title>
		<published>2010-10-24T23:40:32+00:00</published>
		<updated>2010-10-24T23:40:32+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2010/10/24/vps-adventures-part-one/"/>
		<id>https://blog.cyplo.dev/posts/2010/10/24/vps-adventures-part-one/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2010/10/24/vps-adventures-part-one/">&lt;p&gt;As every person in the software industry I need ways to promote my humble
self. A decent web page and online resume plus a blog maybe are a must
these days. The question remains where to put them.&lt;&#x2F;p&gt;
&lt;p&gt;Previously I had my site published within one of the polish hosting
companies for free, as my friend was involved in its operations. Thanks
&lt;a href=&quot;#&quot;&gt;Kajetan&lt;&#x2F;a&gt; for 5 years of support !
And maybe it&#x27;d stay that way if not of that desire of mine to tinker and
have control of every aspect of the technology power. Some platform with
ability to boot the system I want up would be appreciated.&lt;&#x2F;p&gt;
&lt;p&gt;Real servers are good when you have a place to put them. And want to pay
electricity bills, provide UPS, KVM, BGP and other three-letter
abbreviations. And oh, I simply don&#x27;t like the fan noise
anymore. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Virtual_private_server&quot;&gt;VPS&lt;&#x2F;a&gt;
then it is.&lt;&#x2F;p&gt;
&lt;p&gt;Since I recently made contact with Ubuntu Server edition and liked it
for its simplicity, I started searching for a cheap VPS which supports
the newest Ubuntu. Two googles later I found
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.dmehosting.com&#x2F;&quot;&gt;dmehosting.com&lt;&#x2F;a&gt;. 6$ for 25Gigs of space
and 256MB RAM seemed ok, so I bougth the VPS1 plan. Payment went without
problems, they support PayPal. With 6$ less on my account I was waiting
for them to give me the IP + login &amp;amp; password. I didn&#x27;t expect that I
would take the whole day long.&lt;&#x2F;p&gt;
&lt;p&gt;My first contact with the machine was that of apt-get update, which
failed. Because of lack of network connectivity. I was logged by ssh to
that machine, so definitely some sort of connectivity had to be in
place. I dug into and found not working DNS servers, so I made VPS
connect to the other ones and everything started working. I jumped into
their &#x27;live&#x27; tech support line just to hear that it was really bad of me
to change the resolv.conf and I just shouldn&#x27;t do that. In the meanwhile
their DNSes went back so I in fact did revert the resolv.conf after all.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;wiki.openvz.org&#x2F;Main_Page&quot;&gt;OpenVZ&lt;&#x2F;a&gt;-based hosting, so
policy of &quot;no-no&#x27;s&quot; is pretty much embedded in the very system. No
kernel reinstallation. No swap space. No system clock write access. No
clicking too fast in the administration panel. Back to google then my search for VPS
is. Stay tuned for the next part.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>It&#x27;s raining bullets</title>
		<published>2010-10-15T13:12:13+00:00</published>
		<updated>2010-10-15T13:12:13+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2010/10/15/bulletstorm/"/>
		<id>https://blog.cyplo.dev/posts/2010/10/15/bulletstorm/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2010/10/15/bulletstorm/">&lt;p&gt;I have always been fascinated by works of Adrian Chmielarz, from the
times of Metropolis Software on. Naturally then, I am following really
closely on the development of
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.bulletstorm.com&#x2F;&quot;&gt;Bulletstorm&lt;&#x2F;a&gt;. Damn, I even hoped to
talk to The Guy or Mieszko Zielinski at the
&lt;a href=&quot;#&quot;&gt;gameaiconf&lt;&#x2F;a&gt; in Paris, but
&lt;a href=&quot;#&quot;&gt;Alex&lt;&#x2F;a&gt; told me that &quot;whoa,
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.peoplecanfly.com&#x2F;&quot;&gt;PCF&lt;&#x2F;a&gt; are so busy with the new IP that
they didn&#x27;t have time to come this year, next year they&#x27;ll be here,
hopefully&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Having something so deeply embedded in your mind that you&#x27;re always
thinking of it. While you eat, while you talk, in your sleep. That&#x27;s the
way I do like to work. Reading about making of Bulletstorm gives me
creeps as I do feel their hyperenthusiasm about the thing, I do feel
that they take this game everywhere with them. To dinner, breakfast,
party. That&#x27;s the way I do like to work.&lt;&#x2F;p&gt;
&lt;p&gt;Now back on track, an interview which triggered this urge to flush my
thoughts here. &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;techland.com&#x2F;2010&#x2F;10&#x2F;14&#x2F;origins-tanya-jessen-lead-producer-on-bulletstorm&#x2F;&quot;&gt;Interview with Tanya Jessen&lt;&#x2F;a&gt;,
producer at Epic.&lt;&#x2F;p&gt;
&lt;p&gt;People make games so other people can have fun. How selfless.&lt;&#x2F;p&gt;
</content>
	</entry>
	<entry xml:lang="en">
		<title>Google AI Challenge</title>
		<published>2010-10-10T20:37:09+00:00</published>
		<updated>2010-10-10T20:37:09+00:00</updated>
		<link rel="alternate" type="text/html" href="https://blog.cyplo.dev/posts/2010/10/10/google-ai-challenge/"/>
		<id>https://blog.cyplo.dev/posts/2010/10/10/google-ai-challenge/</id>
    
		<content type="html" xml:base="https://blog.cyplo.dev/posts/2010/10/10/google-ai-challenge/">&lt;blockquote&gt;
&lt;p&gt;Update 2023: things fall off the face of the internet after a while; removed dead links&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;It seems that being so much into other programming things I missed the
&lt;a href=&quot;#&quot;&gt;Google AI Contest&lt;&#x2F;a&gt; announcement. It&#x27;s
supercool that they sponsor such challenges but also it&#x27;s really uncool
(so like warm?) that apparently I won&#x27;t have time to participate.&lt;&#x2F;p&gt;
&lt;p&gt;About the challenge itself - it involves working with
&lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;http:&#x2F;&#x2F;www.galcon.com&#x2F;fusion&#x2F;&quot;&gt;GalconFusion&lt;&#x2F;a&gt;-like game. Easy to
learn, difficult to master type. As they provide starter packs with a
sample bot it&#x27;s easy to start. However, getting some decent place would
involve some really long time of good old hard work.&lt;&#x2F;p&gt;
&lt;p&gt;As a side note on .NET being spread around the unix world,  there&#x27;s a C#
starter pack. Good. After few secs I realised that the code will be run
under antique &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;www.mono-project.com&#x2F;docs&#x2F;about-mono&#x2F;releases&#x2F;1.2.6&#x2F;&quot;&gt;Mono 1.2.6&lt;&#x2F;a&gt;,
therefore none of my young C# friends would be there. No type inference,
no linq, no other fancy stuff.  Not good.&lt;&#x2F;p&gt;
</content>
	</entry>
</feed>
