<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on My mostly tech blog</title>
    <link>https://blog.benoitj.ca/posts/</link>
    <description>Recent content in Posts on My mostly tech blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 15 Apr 2025 00:00:00 -0400</lastBuildDate><atom:link href="https://blog.benoitj.ca/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Are all mouses defective by design?</title>
      <link>https://blog.benoitj.ca/2025-04-15-are-all-mices-defect-by-design/</link>
      <pubDate>Tue, 15 Apr 2025 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2025-04-15-are-all-mices-defect-by-design/</guid>
    <description>&lt;h2 id=&#34;how-it-all-started&#34;&gt;How it all started&lt;/h2&gt;
&lt;p&gt;It all started 2 years ago when I had to replace a broken 10yo mouse I had been using extensively.&lt;/p&gt;
&lt;p&gt;I bought another Logitech mouse, but it started having weird double click issues at random time. It would be less of an issue if I pressed the button harder and at the center.&lt;/p&gt;
&lt;p&gt;I thought this was a fluke and ordered another mouse, to get the same issue shortly after. The problem seems to appear between 6 months to 1 year with my current daily use of the mouse.&lt;/p&gt;
&lt;p&gt;One could claim I abuse the mouse too much with 9 hours of work and more browsing / gaming after work, but I had another mouse for 10 years without a single issue.&lt;/p&gt;
&lt;h2 id=&#34;what-to-do-next&#34;&gt;What to do next?&lt;/h2&gt;
&lt;p&gt;I started searching the internet for people with similar issue and solutions.&lt;/p&gt;
&lt;p&gt;I found plenty (&amp;gt;20 posts with similar information) of problem with the exact issue.&lt;/p&gt;
&lt;h2 id=&#34;what-is-the-actual-problem&#34;&gt;What is the actual problem&lt;/h2&gt;
&lt;p&gt;The root cause is coming from the two facts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;micro switches in mouse were always operated our of their electrical spec. you must call it within certain volts or it will not have the listed longevity&lt;/li&gt;
&lt;li&gt;with the breakthrough of wireless mouse, circuits were re-designed to optimize operating in much lower voltage than when we only had wired mouse&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With older wired mouse, it looks like even though the voltage is lower than expected, it&amp;rsquo;s still not bad and will operate relatively close to spec. So the longevity is not altered significantly.&lt;/p&gt;
&lt;p&gt;With wireless mouse, this is way too under voltage (1.3 ish volt vs 5 ish volts), and creates oxidation  on the micro switch contacts.&lt;/p&gt;
&lt;p&gt;You can watch a Alex Denis (a geek) analyzing this for hours here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=v5BhECVlKJA&#34;&gt;Failing switch problem: Omron vs the modern mouse circuit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=NhhRTUrz0R8&#34;&gt;Failing mouse switch part 2: teardown and testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;solutions&#34;&gt;Solutions&lt;/h2&gt;
&lt;h3 id=&#34;solution-1-blowing-warm-humid-air-into-the-mouse&#34;&gt;Solution 1 - Blowing warm humid air into the mouse&lt;/h3&gt;
&lt;p&gt;Many &amp;ldquo;fixed&amp;rdquo; their issue by regularly blowing into the mouse buttons with their warm breath.&lt;/p&gt;
&lt;p&gt;I tried that, and oh yeah, it fixed it.&lt;/p&gt;
&lt;p&gt;The problem is it keeps coming back, after couple of minutes up to 1-2 hours.&lt;/p&gt;
&lt;h3 id=&#34;solution-2-switch-to-a-wired-mouse&#34;&gt;Solution 2 - Switch to a wired mouse&lt;/h3&gt;
&lt;p&gt;Does not work, circuits within modern wired mouse operate like wireless mouse for cost optimization.&lt;/p&gt;
&lt;h3 id=&#34;solution-3-open-the-mouse-the-switches-and-bend-the-actuator&#34;&gt;Solution 3 - Open the mouse, the switches and bend the actuator&lt;/h3&gt;
&lt;p&gt;Does not work permanently, this only fixes the issue for a bit of time&lt;/p&gt;
&lt;h3 id=&#34;solution-4-open-the-mouse-and-replace-all-switches&#34;&gt;Solution 4 - Open the mouse and replace all switches&lt;/h3&gt;
&lt;p&gt;I tried that, but it worked only for a time.&lt;/p&gt;
&lt;h3 id=&#34;solution-5-find-better-mouse-that-use-switches-less-prone-to-this-issue&#34;&gt;Solution 5 - Find better mouse that use switches less prone to this issue&lt;/h3&gt;
&lt;p&gt;Plausible solution, but finding the right mouse is a bit challenging.&lt;/p&gt;
&lt;h3 id=&#34;solution-6-use-a-mouse-with-optical-switches&#34;&gt;Solution 6 - Use a mouse with optical switches&lt;/h3&gt;
&lt;p&gt;I ended up picking this solution. I found myself a mouse that uses optical switches that is not subject to the double click bug.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Back to Doom Emacs</title>
      <link>https://blog.benoitj.ca/2025-04-13-2025-04-13-back-to-doom-emacs/</link>
      <pubDate>Sun, 13 Apr 2025 18:19:59 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2025-04-13-2025-04-13-back-to-doom-emacs/</guid>
    <description>&lt;h2 id=&#34;in-the-beginning&#34;&gt;In the beginning&lt;/h2&gt;
&lt;p&gt;It all started last year (was it before last year?) where I decided to simplify my overall tech setup, and put more Clojure (Joy) in my tech life.&lt;/p&gt;
&lt;p&gt;Some steps to simplify my life:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Migrate my personal laptop from Guix &lt;a href=&#34;https://blog.benoitj.ca/2024-04-02-back-on-nix/&#34;&gt;back to Nix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2024-08-27-time-for-some-changes-to-my-primary-server/&#34;&gt;Rebuild my servers&lt;/a&gt; from my half baked docker swarm.&lt;/li&gt;
&lt;li&gt;Going back to &lt;a href=&#34;https://blog.benoitj.ca/2024-08-04-native_emacs_bindings/&#34;&gt;Emacs native bindings&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now is time for a 2nd round of Emacs changes.&lt;/p&gt;
&lt;h2 id=&#34;my-current-emacs-usage&#34;&gt;My current Emacs usage&lt;/h2&gt;
&lt;p&gt;In recent time, my use of Emacs is as followed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IRC with ERC, to chat with my Geek friends&lt;/li&gt;
&lt;li&gt;Email with Notmuch&lt;/li&gt;
&lt;li&gt;Notes with Denote&lt;/li&gt;
&lt;li&gt;Clojure coding with Cider&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;my-current-challenges-with-this-my-from-scratch-setup&#34;&gt;My current challenges with this my from scratch setup&lt;/h2&gt;
&lt;p&gt;Here are some of the challenges I have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Taking notes
&lt;ul&gt;
&lt;li&gt;Completion does not always work in my notes&lt;/li&gt;
&lt;li&gt;I would like to link to sub sections of org mode, which it works, completion does not and I would have to code something for it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IRC
&lt;ul&gt;
&lt;li&gt;I always have issues connecting with ERC, the support for authinfo kind of work, but on restart, I always have to connect, disconnect, and connect again, and C-g to abort the password prompt.&lt;/li&gt;
&lt;li&gt;lots of connect/disconnect, which I want to track, but not for people that don&amp;rsquo;t talk.&lt;/li&gt;
&lt;li&gt;my custom layout is kind of broken, not aligning properly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Email
&lt;ul&gt;
&lt;li&gt;While I like the Notmuch approach, I found out I don&amp;rsquo;t really use labels and the overall setup to delete or move elements in actual folders is complex and only partially working&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m thinking of trying again mu4e, which has a more traditional approach to email, but I don&amp;rsquo;t have a setup yet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Clojure
&lt;ul&gt;
&lt;li&gt;I broke my LSP setup and I used LSP to get better completion&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;d like to get better Java integration in my IDE since Clojure integrates with Java&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Completion
&lt;ul&gt;
&lt;li&gt;I want to try Corfu, but doing so I broke my completion in couple of places.&lt;/li&gt;
&lt;li&gt;I tried putting back company, but ended up with an incomplete setup&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;why-not-my-from-scratch-setup&#34;&gt;Why not my from scratch setup?&lt;/h2&gt;
&lt;p&gt;Some of the key reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Even though my from scratch setup is nice, I still have some integration issues with completion at point in some scenarios, and sometimes completion stop working and I don&amp;rsquo;t know why&lt;/li&gt;
&lt;li&gt;I always get it close to right, but not exactly right.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m tired of setting up the basics on Emacs&lt;/li&gt;
&lt;li&gt;My setup is getting slower&lt;/li&gt;
&lt;li&gt;I broke my LSP setup and I&amp;rsquo;m tired of fixing it&lt;/li&gt;
&lt;li&gt;It was a good learning, but want to move on and do other things&lt;/li&gt;
&lt;li&gt;Simplify my tech life, I realized I prefer to code rather than configure my IDE&lt;/li&gt;
&lt;li&gt;There are more Emacs packages I want to use to simplify my tech life, and I don&amp;rsquo;t want to duplicate effort if another Emacs distribution has it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;why-doom&#34;&gt;Why Doom?&lt;/h2&gt;
&lt;p&gt;Doom ticks all the boxes of what I need, what I want to improve on my setup, while keeping my life simple.&lt;/p&gt;
&lt;p&gt;Yes it&amp;rsquo;s not fully under my control, and it&amp;rsquo;s someone else&amp;rsquo;s setup, but:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;why should that be different than using a Linux distro, and the fact that it&amp;rsquo;s someone else&amp;rsquo;s Linux? No one plan to roll their own Linux (well almost no one :D)&lt;/li&gt;
&lt;li&gt;it&amp;rsquo;s that or I will stop using Emacs gradually&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s core is solid and maintained by many people&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s core works the way I need it&lt;/li&gt;
&lt;li&gt;The Doom configuration modules cover 80% of what I use with no to minimal configuration&lt;/li&gt;
&lt;li&gt;Even though it favors vim bindings, It supports Emacs native bindings well&lt;/li&gt;
&lt;li&gt;I can easily extend it, and I already have, with the advantage of potentially contributing to the community&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s fast to load&lt;/li&gt;
&lt;li&gt;Issues are fixed by the community which I also can contribute to&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-next&#34;&gt;What is next&lt;/h2&gt;
&lt;p&gt;Some of my next Emacs objectives are to improve my note taking, and Email setup.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Vacation Affects My Blogging</title>
      <link>https://blog.benoitj.ca/2024-09-08-vacation-affects-my-blogging/</link>
      <pubDate>Sun, 08 Sep 2024 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-09-08-vacation-affects-my-blogging/</guid>
    <description>&lt;p&gt;Today I realized I did not think about posting since I&amp;rsquo;m back from vacation. Whenever I&amp;rsquo;m on vacation, I think about this blog. When I work, well I forget about it.&lt;/p&gt;
&lt;p&gt;My &lt;em&gt;resolution&lt;/em&gt; is to post every week, no matter the length or the topic.&lt;/p&gt;
&lt;p&gt;And looks like I skipped one!&lt;/p&gt;
&lt;p&gt;Lets try to fix that.&lt;/p&gt;
&lt;h2 id=&#34;what-happened-since-my-last-post&#34;&gt;what happened since my last post?&lt;/h2&gt;
&lt;h3 id=&#34;back-to-work&#34;&gt;back to work&lt;/h3&gt;
&lt;p&gt;Lots of things to deal with, but nothing really interesting. like most back to work, it&amp;rsquo;s busy.&lt;/p&gt;
&lt;h3 id=&#34;parents-house-getting-flooded-and-having-to-deal-with-that-dot&#34;&gt;Parents house getting flooded and having to deal with that.&lt;/h3&gt;
&lt;p&gt;Work is typical, flooding not so much.&lt;/p&gt;
&lt;p&gt;The whole area got lot more rain than usual, and lot more than drain systems could handle.&lt;/p&gt;
&lt;p&gt;Paired with water, power outage that made the pumps stop.&lt;/p&gt;
&lt;p&gt;We have another month or two to deal with all of this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;insurance, they are busy, and super hard to reach&lt;/li&gt;
&lt;li&gt;some shady but popular disaster management company abusing (we fired them)&lt;/li&gt;
&lt;li&gt;we finally had really good contractors to remove drywall, floors, and kill mold that was forming already.&lt;/li&gt;
&lt;li&gt;we still have to finalize the total cost of the loss, reconstruction and submit claims to the insurance.&lt;/li&gt;
&lt;li&gt;and get the job done&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;installing-a-new-car-radio&#34;&gt;installing a new car radio&lt;/h3&gt;
&lt;p&gt;A eonon X3 Linux based car radio.&lt;/p&gt;
&lt;p&gt;Got to learn how to install backup cam, and remove lots of inside trims of a Toyota corolla.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not done yet, I should post later about that project when it&amp;rsquo;s completed.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Rebuilding My Server - Proxmox Cloud Init Image template</title>
      <link>https://blog.benoitj.ca/2024-08-28-rebuild-my-server-proxmox-cloud-init-image/</link>
      <pubDate>Wed, 28 Aug 2024 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-08-28-rebuild-my-server-proxmox-cloud-init-image/</guid>
    <description>&lt;h2 id=&#34;cloud-init&#34;&gt;Cloud init&lt;/h2&gt;
&lt;p&gt;According to &lt;a href=&#34;https://cloud-init.io&#34;&gt;cloud-init.io&lt;/a&gt;, Cloud init is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cloud images are operating system templates and every instance starts out as an identical clone of every other instance. It is the user data that gives every cloud instance its personality and cloud-init is the tool that applies user data to your instances automatically.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Okay&amp;hellip;&lt;/p&gt;
&lt;p&gt;Maybe if I explain how I create a VM from a cloud-init image:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone the cloud-init Ubuntu server template&lt;/li&gt;
&lt;li&gt;In Proxmox UI, supply key information like name, IP/network&lt;/li&gt;
&lt;li&gt;Enlarge the main disk and tweak resources allocated&lt;/li&gt;
&lt;li&gt;Start the VM&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No lengthy installation from ISO, no additional OS specific GUI. All cloud-init capable OS are configured the same way.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Time for Some Changes to My Primary Server</title>
      <link>https://blog.benoitj.ca/2024-08-27-time-for-some-changes-to-my-primary-server/</link>
      <pubDate>Tue, 27 Aug 2024 18:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-08-27-time-for-some-changes-to-my-primary-server/</guid>
    <description>&lt;h2 id=&#34;my-selfhosting-journey&#34;&gt;My selfhosting Journey&lt;/h2&gt;
&lt;p&gt;My journey to self hosting started in the 90s and evolved (good and bad) over the past 25 or so years:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Created a Linux router using a 486, some ISA BNC network cards, and a dialup connection with a remote dialup controller.&lt;/li&gt;
&lt;li&gt;Self hosting email&lt;/li&gt;
&lt;li&gt;HTPC&lt;/li&gt;
&lt;li&gt;Self hosting &lt;a href=&#34;https://plex.tv&#34;&gt;Plex&lt;/a&gt;, &lt;a href=&#34;https://kodi.tv&#34;&gt;Kodi&lt;/a&gt;, RSS, Music collection, pictures, books, &lt;a href=&#34;https://nextcloud.com&#34;&gt;Nextcloud&lt;/a&gt; and more&lt;/li&gt;
&lt;li&gt;home made NAS&lt;/li&gt;
&lt;li&gt;Freenas (The old TrueNAS)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.openmediavault.org&#34;&gt;Openmediavault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.truenas.com/truenas-core/&#34;&gt;Truenas Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.truenas.com/truenas-scale/&#34;&gt;Truenas Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Docker servers&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.docker.com/engine/swarm/&#34;&gt;Docker swarm&lt;/a&gt; orchestration&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.proxmox.com/en/proxmox-virtual-environment/overview&#34;&gt;Proxmox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://xcp-ng.org/&#34;&gt;XCP-NG&lt;/a&gt; / &lt;a href=&#34;https://xen-orchestra.com/#!/xo-home&#34;&gt;Xen Orchestra&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My current setup is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;TrueNAS Scale&lt;/li&gt;
&lt;li&gt;XCP-NG / Xen Orchestra&lt;/li&gt;
&lt;li&gt;3 Docker swarm clusters (private, public, infra)&lt;/li&gt;
&lt;li&gt;48 ports layer 3 swich, 2 access points&lt;/li&gt;
&lt;li&gt;VLAN to separate my networks (dmz, private, infra, untrusted)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;vm-platform&#34;&gt;VM platform&lt;/h2&gt;
&lt;p&gt;User of both &lt;a href=&#34;https://www.proxmox.com/en/proxmox-virtual-environment/overview&#34;&gt;Proxmox&lt;/a&gt; and &lt;a href=&#34;https://xcp-ng.org/&#34;&gt;XCP-NG&lt;/a&gt; / &lt;a href=&#34;https://xen-orchestra.com/#!/xo-home&#34;&gt;Xen Orchestra&lt;/a&gt; for couple of years.&lt;/p&gt;
&lt;p&gt;Running XCP-NG / Xen orchestra (XOA) at home means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XCP-NG is rock solid&lt;/li&gt;
&lt;li&gt;XCP-NG does not come with a web management console and the TUI console is quite limited&lt;/li&gt;
&lt;li&gt;you have two separate components to manage (XCP-NG nodes and XOA), but you can re-use XOA for multiple XCP-NG nodes.&lt;/li&gt;
&lt;li&gt;You can migrate VMs from one node to another without downtime. I tried this once, but never used since.&lt;/li&gt;
&lt;li&gt;The community edition of XOA has some limitations&lt;/li&gt;
&lt;li&gt;You can get Complete edition of XOA by spawning a VM and compiling it using the awesome &lt;a href=&#34;https://github.com/ronivay/XenOrchestraInstallerUpdater&#34;&gt;XenOrchestraInstallerUpdater&lt;/a&gt; script&lt;/li&gt;
&lt;li&gt;You need to manually upgrade Complete edition of  XOA&lt;/li&gt;
&lt;li&gt;You get a bit more complex cloud init config, but at the benefit of allowing to supply any of the user, meta, provider cloud init files directly in the web UI&lt;/li&gt;
&lt;li&gt;Dashboard is minimal.&lt;/li&gt;
&lt;li&gt;KVM hypervisor&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Running Proxmox at home means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One component to manage&lt;/li&gt;
&lt;li&gt;automated updates&lt;/li&gt;
&lt;li&gt;LXC containers&lt;/li&gt;
&lt;li&gt;Nicer default Dashboard&lt;/li&gt;
&lt;li&gt;Simple cloud init configuration, but more limited. You need to do some CLI do extend some of the files.&lt;/li&gt;
&lt;li&gt;Simpler to manage&lt;/li&gt;
&lt;li&gt;As far as I remember, seamless migration from one node to another is not supported&lt;/li&gt;
&lt;li&gt;Has more complete off the shelf features&lt;/li&gt;
&lt;li&gt;KVM hypervisor&lt;/li&gt;
&lt;li&gt;A lot more YouTube tutorials for Proxmox&lt;/li&gt;
&lt;li&gt;quite good CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My main decider for going back to Proxmox: automated updates, a better web console and I don&amp;rsquo;t need seamless VM migration.&lt;/p&gt;
&lt;p&gt;Otherwise they are quite similar.&lt;/p&gt;
&lt;h2 id=&#34;container-orchestration-platform&#34;&gt;Container orchestration platform&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m running two docker swarm clusters to distribute my apps. It&amp;rsquo;s working OK, but Docker swarm seems to be quite dead (or stable).&lt;/p&gt;
&lt;p&gt;The other main Container Orchestration platform is Kubernetes.&lt;/p&gt;
&lt;p&gt;Why I&amp;rsquo;m switching to Kubernetes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Active community&lt;/li&gt;
&lt;li&gt;Many lightweight Kubernetes platform, like K0S, K3S, Minikube and more.&lt;/li&gt;
&lt;li&gt;I use it at work as a developer&lt;/li&gt;
&lt;li&gt;I want to learn more of it&amp;rsquo;s components and administration&lt;/li&gt;
&lt;li&gt;I also want to learn Helm, the Kubernetes &amp;ldquo;package manager&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Rebuilding My Server Getting Unsupported Sfp&#43; Working on Linux</title>
      <link>https://blog.benoitj.ca/2024-08-27-rebuild-my-server-getting-unsupported-sfp-working-on-linux/</link>
      <pubDate>Tue, 27 Aug 2024 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-08-27-rebuild-my-server-getting-unsupported-sfp-working-on-linux/</guid>
    <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;
&lt;p&gt;I have been running VMs on &lt;a href=&#34;https://xcp-ng.org/&#34;&gt;XCP-NG&lt;/a&gt; for a while now. &lt;a href=&#34;https://xcp-ng.org/&#34;&gt;XCP-NG&lt;/a&gt; does not come with a console by default, but &lt;a href=&#34;https://xen-orchestra.com/#!/&#34;&gt;Xen Orchestra&lt;/a&gt; (XOA) gets you covered. The only issue with XOA is the complete version requires you to compile and install it manually.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been lagging on this setup and remembered a time where I ran &lt;a href=&#34;https://www.proxmox.com/en/&#34;&gt;Proxmox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So 2 days ago, I installed a HD in one of my kid&amp;rsquo;s desktop (don&amp;rsquo;t tell them), and moved my most critical services: plex and miniflux.&lt;/p&gt;
&lt;p&gt;Today, I installed Proxmox.&lt;/p&gt;
&lt;h2 id=&#34;network-challenges&#34;&gt;Network Challenges&lt;/h2&gt;
&lt;p&gt;My server has 7 network ports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;one IPMI admin port locked on a restricted network&lt;/li&gt;
&lt;li&gt;4 onboard gigabit ports&lt;/li&gt;
&lt;li&gt;2 SFP+ 10GB modules installed in a X520 PCIe network card&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With that many ports, it could be challenge to find the proper port to setup in the network bridge.&lt;/p&gt;
&lt;p&gt;My first issue? I got lost with so many ports and picked the wrong port.&lt;/p&gt;
&lt;p&gt;My second issue? I did not notice my X520 card was not being detected properly.&lt;/p&gt;
&lt;p&gt;The ixgbe kernel module needed for the X520 card reports the SPF+ modules as &amp;ldquo;Unsupported&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;there-is-a-trick&#34;&gt;There is a trick&lt;/h2&gt;
&lt;p&gt;You can tell ixgbe module to support the &amp;ldquo;unsupported&amp;rdquo; SPF+ modules.&lt;/p&gt;
&lt;p&gt;With grub in /etc/default/grub&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GRUB_CMDLINE_LINUX=”ixgbe.allow_unsupported_sfp=1″&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;For two modules:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GRUB_CMDLINE_LINUX=”ixgbe.allow_unsupported_sfp=1,1″&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;run &lt;code&gt;update-grub&lt;/code&gt; and &lt;code&gt;reboot&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When typing &lt;code&gt;dmesg | grep ixgbe&lt;/code&gt; I now see the modules being detected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note to future self&lt;/strong&gt;: type sfp instead spf to save some time.&lt;/p&gt;
&lt;h2 id=&#34;alternative&#34;&gt;Alternative&lt;/h2&gt;
&lt;p&gt;The same can be achieved by setting a module configuration:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;options ixgbe allow_unsupported_sfp=1,1&amp;#34;&lt;/span&gt; &amp;gt; /etc/modprobe.d/ixgbe.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Owning Your Own Domain(s)</title>
      <link>https://blog.benoitj.ca/2024-08-18-renewing-your-own-domains/</link>
      <pubDate>Sun, 18 Aug 2024 16:59:12 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-08-18-renewing-your-own-domains/</guid>
    <description>&lt;h2 id=&#34;here-is-how-i-use-my-domains-dot&#34;&gt;Here is how I use my domains.&lt;/h2&gt;
&lt;p&gt;I have two domains:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;One for my email addresses&lt;/li&gt;
&lt;li&gt;One for my own network and servers&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I use two different ones to separate usage, and to keep one semi private.&lt;/p&gt;
&lt;h2 id=&#34;benefits&#34;&gt;Benefits&lt;/h2&gt;
&lt;p&gt;Some benefits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I&amp;rsquo;m not locked in a particular service provider
For example, I used many email providers, yet, kept the same email address. Been with mailbox.org, mxroute.com, migadu, and now I&amp;rsquo;m on fastmail.&lt;/li&gt;
&lt;li&gt;My own personalized email address&lt;/li&gt;
&lt;li&gt;People make me confirm my email address constantly :-D&lt;/li&gt;
&lt;li&gt;Able to do dynamic DNS with your own domain to simplify remote connections&lt;/li&gt;
&lt;li&gt;I use a real domain for my local network, so things works regardless if I&amp;rsquo;m on WiFi or remote.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;dns-providers&#34;&gt;DNS Providers&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m using namecheap, but heard good things from gandi.&lt;/p&gt;
&lt;h2 id=&#34;should-you-get-your-own&#34;&gt;Should you get your own?&lt;/h2&gt;
&lt;p&gt;Yes if you want your own email domain and move away from gmail / hotmail services.
Yes if you want ddns
Yes if you have servers and want to use real domains&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Need to Extend My GnuPG Keys Again</title>
      <link>https://blog.benoitj.ca/2024-08-11-need-to-extend-my-gpg-keys-again/</link>
      <pubDate>Sun, 11 Aug 2024 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-08-11-need-to-extend-my-gpg-keys-again/</guid>
    <description>&lt;blockquote&gt;
&lt;p&gt;I did not know what to post next.&lt;/p&gt;
&lt;p&gt;What to do in this case?&lt;/p&gt;
&lt;p&gt;Delegate and I ask a friend to pick up the next post ;-).&lt;/p&gt;
&lt;p&gt;Thanks &lt;a href=&#34;https://shom.dev/&#34;&gt;@shom&lt;/a&gt; for this pick!&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;the-context&#34;&gt;The Context&lt;/h2&gt;
&lt;h3 id=&#34;my-gnupg-usage&#34;&gt;My GNUPG Usage&lt;/h3&gt;
&lt;p&gt;I use GnuPG for many things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;encryption:&lt;/strong&gt; I use passwordstore to encrypt some of my &amp;ldquo;system&amp;rdquo; passwords, for example my imap or smtp passwords.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;signature:&lt;/strong&gt; I sign all my commits, got that habit a while ago.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticate:&lt;/strong&gt; I use gpg ssh-agent to authenticate everywhere, from regular ssh connection, to git write access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;decentralized proof of identity:&lt;/strong&gt; After keybase&amp;rsquo;s purchase, I switched to &lt;a href=&#34;https://keyoxide.org&#34;&gt;keyoxide&lt;/a&gt; decentralized identity proof.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;hardwark-keys-yubikey&#34;&gt;hardwark keys / yubikey &lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;ATTACH&#34;&gt;ATTACH&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Before I get into how I created my keys, I need to describe an important part of my GnuPG setup.&lt;/p&gt;
&lt;p&gt;Since I dont fully trust my systems, I use Yubikeys as &lt;a href=&#34;https://en.wikipedia.org/wiki/Hardware_security_module&#34;&gt;HSM&lt;/a&gt;s instead of storing my keys on my systems.&lt;/p&gt;
&lt;p&gt;For people not familiar with HSM or yubikey, they are small computers packed in a usb stick or even smaller.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got two Yubikeys:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Yubikey 5 nano: The nano is always plugged in my laptop. It&amp;rsquo;s so small, it&amp;rsquo;s only protruding a small 1-2mm (or 1/8&amp;quot;).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/shot-20240811T221358.png&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yubikey 5 NFC: The intent for the YK 5 NFC is to use with my phone. It&amp;rsquo;s still a work in progress.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/shot-20240811T221522.png&#34;&gt;
    &lt;/figure&gt;

&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The idea is even if my systems are compromized, they can never read the keys. And worst case, I can change them with the locked down certify key.&lt;/p&gt;
&lt;p&gt;There are cheaper alternatives to the YK5 NFC, but I haven&amp;rsquo;t found any for the nano form factor.&lt;/p&gt;
&lt;p&gt;Couple of particularities with Yubikeys and similar HSM:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;they require a user pin to be unlocked&lt;/li&gt;
&lt;li&gt;if the wrong pin is entered n times (default 3), the keys stored are no longer usable unless unlocked by the admin pin.&lt;/li&gt;
&lt;li&gt;If you enter the wrong admin pin n times (default 3), the keys stored are no longer usable at all. You must reset the yubikey and start again, or restore a backup.&lt;/li&gt;
&lt;li&gt;You can enable touch confirmation when using the key. For example, to use the key, you enter the pin, and must touch the device for it to allow the operation.&lt;/li&gt;
&lt;li&gt;They support more than just GPG keys, but I dont use any other features myself (like FIDO).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;how-i-created-my-keys&#34;&gt;How I created my keys&lt;/h3&gt;
&lt;p&gt;My key workflow is quite similar to the one described in this debian &lt;a href=&#34;https://wiki.debian.org/Subkeys&#34;&gt;post&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;one never expiring certify key, locked down, never used except for managing keys.&lt;/li&gt;
&lt;li&gt;sub keys created from the certify key, with a limited time validity.&lt;/li&gt;
&lt;li&gt;extend or create new sub keys when they expire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is the high level process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I boot into a live distro&lt;/li&gt;
&lt;li&gt;I created a main certify key in a locked down box (live usb distro), without internet. that key is assumed to be valid until I dont trust it anymore.&lt;/li&gt;
&lt;li&gt;I then created a encrypt, authenticate, and signing sub2 keys from that certify key
The sub keys are only valid for 2 years.&lt;/li&gt;
&lt;li&gt;I backup all my keys to encrypted flash drives, which I store both in my house, and my parent&amp;rsquo;s house.&lt;/li&gt;
&lt;li&gt;I copy the public keys on a readable flash drive.&lt;/li&gt;
&lt;li&gt;I only transfer the subkeys to the yubikeys. The certify key only resides on encrypted flash which I never mount in my regular systems.
And I extend them when they exif I still trust them.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;With all that said, my sub keys expired on August 8th&amp;hellip; I discovered the issue when I tried to push my dotfiles changes to git.sr.ht over ssh.&lt;/p&gt;
&lt;p&gt;I have reminders, but somehow I did not notice :).&lt;/p&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;The solution?&lt;/h2&gt;
&lt;p&gt;The process is not super simple, as there are so many ways to do this.&lt;/p&gt;
&lt;p&gt;When I started using my Yubikeys, I discovered this amazing guide: &lt;a href=&#34;https://github.com/drduh/YubiKey-Guide&#34;&gt;DrDuh YubiKey Guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yes, there is a lot of reading, but the process is quite well described there.&lt;/p&gt;
&lt;p&gt;In the case of a renewal, it&amp;rsquo;s much simpler though:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Boot a live distro: I used the live image using DrDuh nixos live flake this time&lt;/li&gt;
&lt;li&gt;Mount the encrypted backup of my keys (including the certify key)&lt;/li&gt;
&lt;li&gt;Load the keys in GPG&lt;/li&gt;
&lt;li&gt;Edit each sub keys and set a new expiration date&lt;/li&gt;
&lt;li&gt;Create a new encrypted backup of the keys&lt;/li&gt;
&lt;li&gt;Backup the updated public keys&lt;/li&gt;
&lt;li&gt;Update the keys on the Yubikey (not necessary for extending)&lt;/li&gt;
&lt;li&gt;Boot on my regular system&lt;/li&gt;
&lt;li&gt;Import my updated public key&lt;/li&gt;
&lt;li&gt;Send my updated public key on my Web Dir, and on the default key server.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;You can discuss this post on mastodon:&lt;/em&gt; &lt;a href=&#34;https://fosstodon.org/@benoitj/112947067988523554&#34;&gt;https://fosstodon.org/@benoitj/112947067988523554&lt;/a&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Emacs as My IDE - Part2: The Setup</title>
      <link>https://blog.benoitj.ca/2024-08-08-emacs-as-my-ide-part2-the-setup/</link>
      <pubDate>Thu, 08 Aug 2024 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-08-08-emacs-as-my-ide-part2-the-setup/</guid>
    <description>&lt;blockquote&gt;
&lt;p&gt;You can read part1  &lt;a href=&#34;https://blog.benoitj.ca/2021-12-10-intellij-to-emacs-part1-the-plan/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Elisp configuration can be found &lt;a href=&#34;https://git.sr.ht/~benoit/emacs-as-ide&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In part2, I&amp;rsquo;ll go over the setup to be able to experiment, and capture my findings.&lt;/p&gt;
&lt;h2 id=&#34;lsp-or-not&#34;&gt;LSP or not?&lt;/h2&gt;
&lt;p&gt;The objective is to try to use Emacs for real professional development including for languages like Java, go, or Python. My field of work requires me to quickly switch to other languages, now or known.&lt;/p&gt;
&lt;p&gt;Emacs is great for some languages, especially LISP, or c and c++. For other type of languages, Emacs basic language modes can&amp;rsquo;t offer the same level of support as Language specific IDEs from JetBrains or Eclipse.&lt;/p&gt;
&lt;p&gt;Only with &lt;code&gt;LSP&lt;/code&gt; does Emacs can offer better language support.&lt;/p&gt;
&lt;p&gt;So &lt;code&gt;LSP&lt;/code&gt; it is.&lt;/p&gt;
&lt;h2 id=&#34;eglot-or-lsp-mode&#34;&gt;Eglot or lsp-mode?&lt;/h2&gt;
&lt;p&gt;There are two mature LSP client implementation for Emacs: Eglot and lsp-mode.&lt;/p&gt;
&lt;p&gt;lsp-mode is the oldest of the two, has a lot of features, for a lot of languages. It is extended by lsp-treemacs, lsp-java, dap-mode, and consult-lsp. It&amp;rsquo;s UI is quite IDE like, and diverge a bit from Emacs native practices.&lt;/p&gt;
&lt;p&gt;Eglot, is the newer kid on the block, simpler. It is extended by eglot-java, dape-mode and consult-eglot. I know it less, so maybe there are features that I get with lsp-mode that are missing.&lt;/p&gt;
&lt;p&gt;Before dape-mode, the choice between Eglot and lsp-mode was much simpler (lsp-mode), now Eglot is a plausible choice.&lt;/p&gt;
&lt;p&gt;I would like to use Eglot for a more natural UI, but at the same time, if an important feature is missing, I will use lsp-mode.&lt;/p&gt;
&lt;p&gt;At this point, I cant chose one over the other, so I will evaluate both.&lt;/p&gt;
&lt;h2 id=&#34;one-realistic-project&#34;&gt;One realistic project&lt;/h2&gt;
&lt;p&gt;To try and demonstrate features from the various I need a realistic project.&lt;/p&gt;
&lt;p&gt;Here are some of the criteria to pick a project:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;complex enough code base with many modules&lt;/li&gt;
&lt;li&gt;contains automated tests&lt;/li&gt;
&lt;li&gt;enough dependencies to test navigation and definitions&lt;/li&gt;
&lt;li&gt;back-end application, this is what I see the most&lt;/li&gt;
&lt;li&gt;Language I often see with enough complexity (Java)&lt;/li&gt;
&lt;li&gt;Using frameworks I often see&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In my work, I often see back-end Java projects based on spring boot.&lt;/p&gt;
&lt;p&gt;Spring project has the &lt;a href=&#34;https://github.com/spring-projects/spring-petclinic&#34;&gt;spring-petclinic&lt;/a&gt;, a spring boot example project. It contains both a web front-end and an API back-end. This should have plenty of code, tests, and dependencies I can use in a realistic way.&lt;/p&gt;
&lt;h2 id=&#34;configuration-setup&#34;&gt;Configuration Setup&lt;/h2&gt;
&lt;p&gt;I will build two new configuration, one based on Eglot, one based on lsp-mode. You can find the code &lt;a href=&#34;https://git.sr.ht/~benoit/emacs-as-ide&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Shared configuration, like completion framework, will go in &lt;code&gt;shared.el&lt;/code&gt; which is loaded by both configuration.&lt;/p&gt;
&lt;p&gt;The share configuration will be minimal, yet, complete enough to enable my regular coding workflows.&lt;/p&gt;
&lt;p&gt;Shared configuration that will be included:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;navigation and editing helpers&lt;/li&gt;
&lt;li&gt;completion at point&lt;/li&gt;
&lt;li&gt;minibuffer completion&lt;/li&gt;
&lt;li&gt;Database and REST client&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What it will not contains:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;org-mode configuration&lt;/li&gt;
&lt;li&gt;email configuration&lt;/li&gt;
&lt;li&gt;irc and other social network&lt;/li&gt;
&lt;li&gt;any other modules unrelated to my workflow in IntelliJ&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I will build the shared configuration when needed.&lt;/p&gt;
&lt;h3 id=&#34;loading-bookmark-list-on-startup&#34;&gt;Loading bookmark list on startup&lt;/h3&gt;
&lt;p&gt;Loading a dynamic UI at startup is not that trivial. It works as expected for file, static or generated buffers, but not so much for dynamic UI.&lt;/p&gt;
&lt;p&gt;Here what works:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#0aa&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;inhibit-splash-screen&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;t&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#a00&#34;&gt;add-hook&lt;/span&gt; &lt;span style=&#34;color:#00a&#34;&gt;&amp;#39;after-init-hook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#0a0&#34;&gt;#&amp;#39;&lt;/span&gt;(&lt;span style=&#34;color:#0aa&#34;&gt;lambda&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#0aa&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#00a&#34;&gt;&amp;#39;bookmark&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              (&lt;span style=&#34;color:#a00&#34;&gt;bookmark-bmenu-list&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#0aa&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;initial-buffer-choice&lt;/span&gt; (&lt;span style=&#34;color:#0aa&#34;&gt;lambda&lt;/span&gt; () (&lt;span style=&#34;color:#0a0&#34;&gt;get-buffer&lt;/span&gt; &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;*Bookmark List*&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;As you can see above, you must launch the command that generate buffer for initial-buffer-choice to work.&lt;/p&gt;
&lt;p&gt;The bookmark list itself is hard-coded in the shared configuration by setting the value of the &lt;code&gt;bookmark-alist&lt;/code&gt; variable.&lt;/p&gt;
&lt;h3 id=&#34;how-to-distinguish-both-configuration&#34;&gt;How to distinguish both configuration?&lt;/h3&gt;
&lt;p&gt;I decided to simply use the provided modus dark theme in the eglot configuration, and modus light theme in the lsp-mode.&lt;/p&gt;
&lt;p&gt;Also, the bookmark list is altered to only show the relevant configuration.&lt;/p&gt;
&lt;h3 id=&#34;other-minimal-ui-tweaks&#34;&gt;Other minimal UI tweaks&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m only planning to prompting, and audible bell.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elisp&#34; data-lang=&#34;elisp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#0aa&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;use-dialog-box&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;nil&lt;/span&gt;)   &lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;; use message prompt instead of popup dialogs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#0aa&#34;&gt;defalias&lt;/span&gt; &lt;span style=&#34;color:#00a&#34;&gt;&amp;#39;yes-or-no-p&lt;/span&gt; &lt;span style=&#34;color:#00a&#34;&gt;&amp;#39;y-or-n-p&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;color:#0aa&#34;&gt;setq&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;visible-bell&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;t&lt;/span&gt;)       &lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;; flashes instead of beeping&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;what-s-next&#34;&gt;What&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m quite excited to continue this series.&lt;/p&gt;
&lt;p&gt;Here is some planned content to expect in future posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Editing and navigation&lt;/li&gt;
&lt;li&gt;Documentation, linting&lt;/li&gt;
&lt;li&gt;Refactoring and code actions&lt;/li&gt;
&lt;li&gt;Runners: building, tests, application, and Debugging&lt;/li&gt;
&lt;li&gt;Supporting tools&lt;/li&gt;
&lt;li&gt;Framework support&lt;/li&gt;
&lt;/ol&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Learning to Learn</title>
      <link>https://blog.benoitj.ca/2024-08-06-learning-to-learn/</link>
      <pubDate>Tue, 06 Aug 2024 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-08-06-learning-to-learn/</guid>
    <description>&lt;p&gt;Here is a simplified version of  how I learn:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The sponge phase
I document myself about a specific subject (documentation, blogs, books, YouTube, people. This phase is intense, kind of obsessive.
At that phase, it&amp;rsquo;s about absorbing as much and as various information without thinking too much. I try to not make an opinion, I just absorb.&lt;/li&gt;
&lt;li&gt;The experiment phase
At this phase, I try stuff. If it&amp;rsquo;s coding back-end, then I try to build couple of simple APIs, simple tests, simple integrations. If it&amp;rsquo;s home improvement, I may create mock-ups, try with scrap wood.
I try to define small and specific learning objectives. I don&amp;rsquo;t create complete working POCs, but just small snippet of things. This phase starts before the end of the sponge phase, when I have enough information.&lt;/li&gt;
&lt;li&gt;The critics phase
I look back at what I have learned, look back at my sources, and form my own opinion of what is good, bad. This is when I start to be critic of my sources, I trust no one. Lots of people forget this phase, and trust what they read, see, hear.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I apply this in most of my learning in my life, tech or not.&lt;/p&gt;
&lt;p&gt;How do you learn?&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Native Emacs Bindings</title>
      <link>https://blog.benoitj.ca/2024-08-04-native_emacs_bindings/</link>
      <pubDate>Sun, 04 Aug 2024 21:03:42 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-08-04-native_emacs_bindings/</guid>
    <description>&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;
&lt;p&gt;My journey with Emacs starting around 1996, while working on a cross platform portfolio management application, especially working on cross platform Windows / Linux GUI based on &lt;a href=&#34;https://www.wxwidgets.org/&#34;&gt;WxWidgets&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Emacs was great for C++ projects, even at the time. My configuration was minimal and I was using native bindings.&lt;/p&gt;
&lt;p&gt;Then around 2000, I started coding in Java, and also discovered vim. Modal editing really clicked for me, and Vim became my editor for couple of years. I was still using Emacs on and off when I was coding in C or C++.&lt;/p&gt;
&lt;p&gt;My journey with Emacs took a turn in 2016, while changing job, I rediscovered Emacs, this time with Spacemacs, and then with DoomEmacs. Both of these configuration makes extensive use of Evil, a better vim layout for Emacs :).&lt;/p&gt;
&lt;p&gt;I continued using Evil, even with my &amp;ldquo;from scratch&amp;rdquo; configuration.&lt;/p&gt;
&lt;p&gt;Except for couple of months sometimes in 2022, I&amp;rsquo;ve been using vim bindings even in Emacs.&lt;/p&gt;
&lt;h2 id=&#34;the-plan&#34;&gt;The plan&lt;/h2&gt;
&lt;p&gt;Now is time to try something new, try to use Emacs native bindings and solve problems / inefficiencies that can be with the Emacs bindings.&lt;/p&gt;
&lt;p&gt;Some of the discovery:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;my use of &lt;code&gt;&amp;lt;space&amp;gt;&lt;/code&gt; prefix can easily be replaced by &lt;code&gt;C-c&lt;/code&gt; prefix. This became my &amp;ldquo;global&amp;rdquo; prefix for a while, and &lt;code&gt;&amp;lt;space&amp;gt;&lt;/code&gt; when in normal mode.&lt;/li&gt;
&lt;li&gt;I can use the &lt;code&gt;C-c&lt;/code&gt; prefix for many of the annoying bindings for useful commands.&lt;/li&gt;
&lt;li&gt;Avy, Embark, Ace Window can be used in combination to help me move around and improve navigation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So I&amp;rsquo;ve been working:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;first to replace general and all my global bindings, including &lt;code&gt;use-package&lt;/code&gt; &lt;code&gt;:general&lt;/code&gt; configuration with &lt;code&gt;C-c&lt;/code&gt; prefix and the &lt;code&gt;use-package&lt;/code&gt; &lt;code&gt;:bind&lt;/code&gt; clause.&lt;/li&gt;
&lt;li&gt;turn off evil and any evil related packages.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So since a week, I&amp;rsquo;m back on native bindings.&lt;/p&gt;
&lt;h2 id=&#34;how-it-s-going-so-far&#34;&gt;How it&amp;rsquo;s  going so far?&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m not too lost, but I need to develop navigation reflexes with avy and isearch.&lt;/p&gt;
&lt;p&gt;Oh, and I need to go back to isearch, consult-line is not a valid replacement for isearch without the vim &lt;code&gt;/&lt;/code&gt; search key available in evil.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Fixing Paving Mistakes</title>
      <link>https://blog.benoitj.ca/2024-07-28-fixing-paving-mistakes/</link>
      <pubDate>Sun, 28 Jul 2024 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-07-28-fixing-paving-mistakes/</guid>
    <description>&lt;p&gt;Story and some info about how I fixed some pavers installation miscalculations.&lt;/p&gt;
&lt;p&gt;This post has nothing to do with computers, but everything to do with learning, and building things, skills quite related to coding and computers.&lt;/p&gt;
&lt;h2 id=&#34;the-context&#34;&gt;The Context:&lt;/h2&gt;
&lt;p&gt;Some time ago, I built a large pavers patio to put a dining table and gazebo.&lt;/p&gt;
&lt;p&gt;Here is the initial work:&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;figure--paver-pation-overview&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/679cc321-7755-4adf-816a-aed2ff7e07c7.jpg&#34;
    alt=&#34;Figure 1: Picture of my backyard, with a gazebo sitting on a pavers patio&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 1: &lt;/span&gt;Picture of my backyard, with a gazebo sitting on a pavers patio&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;At the far back of the picture, we can see a sidewalk. That sidewalk connects the pool deck, the patio, and stairs that goes in the house.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/95913134-1811-432c-8a4c-dac7b8308eca.jpg&#34;
    alt=&#34;Figure 2: another angle of the backyard&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 2: &lt;/span&gt;another angle of the backyard&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;the-problem&#34;&gt;The Problem:&lt;/h2&gt;
&lt;p&gt;So what is the problem?&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/11011d74-492f-44a2-aff9-5976140dcb48.jpg&#34;
    alt=&#34;Figure 3: picture showing the sidewalk, and the stairs with visil&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 3: &lt;/span&gt;picture showing the sidewalk, and the stairs with visil&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/8b466191-0b05-4fa4-bb56-2f008c4d0826.jpg&#34;
    alt=&#34;Figure 4: another picture showing the sidewalk, and the stairs with visible miscalculations&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 4: &lt;/span&gt;another picture showing the sidewalk, and the stairs with visible miscalculations&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Two miscalculations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When I calculated the width of the sidewalk, I totally forgot to account for the wood step that would sit on the sidewalk. That made the L shaped sidewalk much narrower on one side by roughly 1 foot or two rows of pavers.&lt;/li&gt;
&lt;li&gt;I had to change the wood platform dimensions, so the sidewalk was also too short by about 1.5 foot.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;the-solution&#34;&gt;The solution:&lt;/h2&gt;
&lt;p&gt;So last Sunday, was searching for something to do, I remembered another incomplete house crafting project: fixing that pavers sidewalk.&lt;/p&gt;
&lt;p&gt;Armed with my shovel, a rake, my rototiller, a manual tamper, gravel, extra pavers, and some sand, I just fixed that problem.&lt;/p&gt;
&lt;p&gt;Like many things, the base is the most important part. Usually you dig for a base of 6 to 12 inches, put some geo-textile material to prevent weeds to establish, build the base with gravel  in layers tampering it regularly, build a much finer top 1/2 inch layer to put the pavers on, install the pavers, then tamper them again to lay them solid, put sand in the voids between the pavers, wash, and voila.&lt;/p&gt;
&lt;p&gt;In this particular project, the challenge is to line the older part with the new part. also, because the older part was tampered with a mechanical vibration plate, it is much more solid, so the new part will sink a bit.&lt;/p&gt;
&lt;p&gt;Here is the final result after 3 hours of work, you can see in the picture now there are always 7 rows of pavers visible, and the stairs sit on pavers for the full length:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/2246ae94-4f9d-4503-b15f-c9bd3e76a0cc.jpg&#34;
    alt=&#34;Figure 5: picture of the final result, showing pavers sidewalk and the stairs sitting on it properly.&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 5: &lt;/span&gt;picture of the final result, showing pavers sidewalk and the stairs sitting on it properly.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;other-thoughts&#34;&gt;Other thoughts&lt;/h2&gt;
&lt;p&gt;This was one of many small projects / improvements I had on my list.&lt;/p&gt;
&lt;p&gt;Often we think the main ingredient to do home crafting projects is time, in my case it&amp;rsquo;s usually focusing on something that we stopped seeing.&lt;/p&gt;
&lt;p&gt;Last year, my partner and I made a list of things around the house that needed refresh, fixing, or completion, and I&amp;rsquo;m kind of refusing to start new cool stuff before the list is done.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>RSS, the best way to publish posts, and give control to your readers</title>
      <link>https://blog.benoitj.ca/2024-04-09-rss-as-a-way-to-notify-others-about-your-posts/</link>
      <pubDate>Tue, 09 Apr 2024 00:05:08 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-04-09-rss-as-a-way-to-notify-others-about-your-posts/</guid>
    <description>&lt;p&gt;So you&amp;rsquo;ve got a new shiny blog, or an old one, here is what I find important about RSS.&lt;/p&gt;
&lt;h2 id=&#34;here-is-my-take-on-rss&#34;&gt;Here is my take on RSS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;it&amp;rsquo;s the simplest way to automate notifications to regular readers&lt;/li&gt;
&lt;li&gt;You give control to your readers, they choose how they read, when they read and in the format they read.&lt;/li&gt;
&lt;li&gt;Some users use RSS not just for blogs, but for watching Youtube, peertube, reading Reddit, Slashdot, and more. They build a one stop shop for reading and watching medias.&lt;/li&gt;
&lt;li&gt;It does not help discoverability, there are other options for that:
&lt;ul&gt;
&lt;li&gt;Other people&amp;rsquo;s recommendations (this is one of my favorite way)&lt;/li&gt;
&lt;li&gt;blog rolls, blog rings (see &lt;a href=&#34;https://craftering.systemcrafters.net&#34;&gt;craftering&lt;/a&gt; for an example)&lt;/li&gt;
&lt;li&gt;RSS aggregator (planet emacs, planet clojure, etc&amp;hellip;)&lt;/li&gt;
&lt;li&gt;(In)frequent message on fedi about your new shiny posts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;some-important-things-to-consider-when-creating-a-rss-feed&#34;&gt;Some important things to consider when creating a RSS feed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use a RSS web validator to confirm your feed is valid.&lt;/li&gt;
&lt;li&gt;Include your complete post in your feed instead of just the title. It&amp;rsquo;s way better for your reader not to have to go to your website to read your post. There are some workarounds for web based readers, but it&amp;rsquo;s not accessible, not portable for text readers and not always compatible.&lt;/li&gt;
&lt;li&gt;Enable discoverability of your feed from your website. You can do so by adding a &lt;code&gt;&amp;lt;link rel=&amp;quot;alternate&amp;quot; type=&amp;quot;application/rss+xml&amp;quot; title=&amp;quot;Example Feed&amp;quot; href=&amp;quot;http://example.com/feed/&amp;quot; /&amp;gt;&lt;/code&gt; to your &lt;code&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;...&amp;lt;/head&amp;gt;&lt;/code&gt; tag. This will allow RSS readers to find your feed automatically by just looking at the index page of your site. You can have multiple &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; if you have multiple feeds.&lt;/li&gt;
&lt;li&gt;Subscribe to your own feed, this way you will find out if it&amp;rsquo;s working as expected. This has the added benefit to get you used to RSS if you&amp;rsquo;re not already using it.&lt;/li&gt;
&lt;li&gt;Make sure you do not move your posts / change URLs all the time. Use HTTP redirect if you want to move things. That is even more important with RSS feeds.&lt;/li&gt;
&lt;li&gt;Make sure your RSS feed url is the same, use HTTP redirect if you want to move things.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-next&#34;&gt;What is next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Consider creating a RSS feed for your blog&lt;/li&gt;
&lt;li&gt;Or if you already have one, maybe it&amp;rsquo;s a good time to see if you can improve it&lt;/li&gt;
&lt;li&gt;And you may want to subscribe to my blog using RSS :-)&lt;/li&gt;
&lt;/ul&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>RSS Exclusive - Reminder on the RSS Club</title>
      <link>https://blog.benoitj.ca/2024-04-08-reminder-on-the-rss-club/</link>
      <pubDate>Mon, 08 Apr 2024 23:39:29 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-04-08-reminder-on-the-rss-club/</guid>
    <description>&lt;p&gt;Pssst - this is a RSS only post. Please keep it secret.&lt;br/&gt;Read more about RSS Club: https://daverupert.com/rss-club/&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;I won&amp;rsquo;t give names, but during a public chat, one of my readers mentioned my &amp;ldquo;RSS Club&amp;rdquo; posts.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think anyone really noticed, it was a really close one.&lt;/p&gt;
&lt;p&gt;Reminder to read the club rules again, especially you who I won&amp;rsquo;t mention your name :-D.&lt;/p&gt;
&lt;p&gt;Joke aside, pretty cool to see people still using RSS. I use it more than ever. Going to try to have more RSS only posts in the future.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Back on Nix</title>
      <link>https://blog.benoitj.ca/2024-04-02-back-on-nix/</link>
      <pubDate>Tue, 02 Apr 2024 12:39:02 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-04-02-back-on-nix/</guid>
    <description>&lt;h2 id=&#34;back-on-nix&#34;&gt;Back on Nix&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m back on nix. Guix / guile felt nice, here is why i&amp;rsquo;m back:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;m really missing a practical &lt;strong&gt;reproducible OS&lt;/strong&gt;, kept having issues with dependencies of my personal channel. This is something trivial when using Nix flakes. With Guix channels being a local configuration, and having to hack it to get it to work the way I would want to, this process of &amp;ldquo;dependencies of my dependencies&amp;rdquo; is much harder to fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Packaging hell&lt;/strong&gt;: I wanted to package one of the rust tool I use, I cant easily point to a specific version without packaging every dependencies of that rust package. Guix is missing a way to easily package different versions of libraries, and we are always at one commit away from breaking a package.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I was still using nix&lt;/strong&gt; for everything Guix does not fix or cover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spending time on my config&lt;/strong&gt; instead of coding real stuff.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Need a different setup for work&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For all these reasons, I got tired of Guix, even if I want to like it, it&amp;rsquo;s not meant for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note to my future self&lt;/strong&gt;: Before going back to Guix (next year?), remember this series.&lt;/p&gt;
&lt;p&gt;Nix makes things work for me today, Nix flake keeps it working forever.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Guix After a while</title>
      <link>https://blog.benoitj.ca/2024-01-04-guix-after-a-while/</link>
      <pubDate>Thu, 04 Jan 2024 01:53:26 -0500</pubDate>
      
      <guid>https://blog.benoitj.ca/2024-01-04-guix-after-a-while/</guid>
    <description>&lt;p&gt;It&amp;rsquo;s been couple of months after I migrated back to Guix.&lt;/p&gt;
&lt;p&gt;Overall, the basic experience is good, comfortable. At the same time, some of the pain points, are
quite painful:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Guix does not handle well dependencies between software from different channels&lt;/li&gt;
&lt;li&gt;Some useful packages are still missing&lt;/li&gt;
&lt;li&gt;For clear reasons, packaging anything golang, rust, java, javascript, and similar is pretty much
unrealistic&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;guix-does-not-handle-well-dependencies-between-software-from-different-channels&#34;&gt;Guix does not handle well dependencies between software from different channels&lt;/h2&gt;
&lt;p&gt;Guix aim to be fully reproducible, but that is one big missing part. 3 Times I could not build my
config due to incompatibilities between Guix, NonGuix, and my channel. Due to my time-machine
&amp;ldquo;hack&amp;rdquo;, I was able to recover an broke config relatively quickly, but this is a pain. One more
reminder that I miss flakes.&lt;/p&gt;
&lt;p&gt;Possible solution would be to code something like flakes is Guix, but I dont have the time to
contribute to that level.&lt;/p&gt;
&lt;h2 id=&#34;some-useful-packages-are-still-missing&#34;&gt;Some useful packages are still missing&lt;/h2&gt;
&lt;p&gt;Hugo, mopidy w/ many plugins are missing. restic is outdated. NerdFonts are missing (license).&lt;/p&gt;
&lt;p&gt;Many lsp servers are missing.&lt;/p&gt;
&lt;p&gt;I use nix a lot on top of my basic Guix setup.&lt;/p&gt;
&lt;h2 id=&#34;packaging-golan-rust-python-java-javascript-and-similar-apps-is-unrealistic&#34;&gt;Packaging golan, rust, python, java, javascript and similar apps is unrealistic&lt;/h2&gt;
&lt;p&gt;Primarily for these reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;amount of dependencies they have&lt;/li&gt;
&lt;li&gt;dependencies and version specification in native language build files ignored&lt;/li&gt;
&lt;li&gt;most libraries are:
&lt;ol&gt;
&lt;li&gt;in one version only&lt;/li&gt;
&lt;li&gt;or missing&lt;/li&gt;
&lt;li&gt;or one step away to be updated and break the software&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I tried &amp;ldquo;hacking&amp;rdquo; it by using the gnu build system, and calling the build tool to fetch
dependencies, but the &amp;ldquo;home&amp;rdquo; under build is read only.&lt;/p&gt;
&lt;p&gt;I understand why it&amp;rsquo;s done this way, but it creates unecessary fatigue for something as self
contained as a golang or rust app.&lt;/p&gt;
&lt;p&gt;It would be possible to do it, but would require symbols to always contain a version, and we are not
there at all. I needs everyone to do it, which means it wont happen.&lt;/p&gt;
&lt;p&gt;Another example, I used chezmoi in the past, it was working until it did not due to one of it&amp;rsquo;s
dependencies got upgraded.&lt;/p&gt;
&lt;p&gt;For applications it makes sense, for core stuff it make sense, for apps dependencies, makes a lot
less sense if they have a strong dependency management system.&lt;/p&gt;
&lt;p&gt;In some ways, both will tend to break over time, but leveraging the work of upstream dev reduces the
workload on packagers.&lt;/p&gt;
&lt;h2 id=&#34;final-notes&#34;&gt;Final notes&lt;/h2&gt;
&lt;p&gt;Some observations of my current migration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Always fun to go back to Guix&lt;/li&gt;
&lt;li&gt;Guix still feels much less mature&lt;/li&gt;
&lt;li&gt;Some of the core ideas in Guix make me use nix quite a bit&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m missing flakes&lt;/li&gt;
&lt;li&gt;guile scheme is much nicer than nix lang&lt;/li&gt;
&lt;li&gt;I realize that I prefer to code apps than to code OS&lt;/li&gt;
&lt;li&gt;I also realized even if scheme is great, Guix is not the right fit for my needs at this point&lt;/li&gt;
&lt;li&gt;got to plan my next migration, I split my config to enable easier switch between nix and guix&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You might have guessed, when the time is right, i&amp;rsquo;m back on nix.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>RSS Exclusive - App Defaults (2023 Edition)</title>
      <link>https://blog.benoitj.ca/2023-12-07-app-defaults--2023-edition/</link>
      <pubDate>Thu, 07 Dec 2023 18:20:05 -0500</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-12-07-app-defaults--2023-edition/</guid>
    <description>&lt;p&gt;Pssst - this is a RSS only post. Please keep it secret.&lt;br/&gt;Read more about RSS Club: https://daverupert.com/rss-club/&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;I&amp;rsquo;m a fan of RSS and on my feed recently, I&amp;rsquo;ve seen &amp;ldquo;App Defaults&amp;rdquo; seven times.&lt;/p&gt;
&lt;p&gt;Here is my take on it.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Operating system:&lt;/th&gt;
          &lt;th&gt;&lt;strong&gt;Desktop&lt;/strong&gt;: nix, guix; &lt;strong&gt;Server:&lt;/strong&gt; ubuntu&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Window manager:&lt;/td&gt;
          &lt;td&gt;dwm&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Web browser:&lt;/td&gt;
          &lt;td&gt;firefox, qutebrowser&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Web feed client:&lt;/td&gt;
          &lt;td&gt;elfeed, miniflux&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Search engine:&lt;/td&gt;
          &lt;td&gt;duck duck go&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Bookmark manager:&lt;/td&gt;
          &lt;td&gt;links in org-mode notes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Email client:&lt;/td&gt;
          &lt;td&gt;notmuch&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Email provider:&lt;/td&gt;
          &lt;td&gt;mxroute w/ my own domains&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Calendar:&lt;/td&gt;
          &lt;td&gt;google agenda&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Contact book:&lt;/td&gt;
          &lt;td&gt;google contacts&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;CalDAV/CardDAV provider:&lt;/td&gt;
          &lt;td&gt;don&amp;rsquo;t use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Instant messaging:&lt;/td&gt;
          &lt;td&gt;Desktop: ERC, Emacs/Ement; Mobile: Revolution IRC, Conversation; IRC Bouncer: soju&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Audio and video calls:&lt;/td&gt;
          &lt;td&gt;Matrix, jitsi.meet, SIP phone&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Cloud storage:&lt;/td&gt;
          &lt;td&gt;self hosted Truenas&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Password manager:&lt;/td&gt;
          &lt;td&gt;bitwarden, passwordstore&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Terminal emulator:&lt;/td&gt;
          &lt;td&gt;st&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Shell:&lt;/td&gt;
          &lt;td&gt;bash&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Text editor:&lt;/td&gt;
          &lt;td&gt;Emacs&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Word processing:&lt;/td&gt;
          &lt;td&gt;Emacs, Libreoffice&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Code editing/IDE:&lt;/td&gt;
          &lt;td&gt;Emacs, IntelliJ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Notes:&lt;/td&gt;
          &lt;td&gt;Emacs denote&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;To-do application:&lt;/td&gt;
          &lt;td&gt;Emacs org-mode&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Music player:&lt;/td&gt;
          &lt;td&gt;mopidy&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Video player:&lt;/td&gt;
          &lt;td&gt;mpv&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Audioblog client:&lt;/td&gt;
          &lt;td&gt;same as my web feed clients&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;File manager:&lt;/td&gt;
          &lt;td&gt;Emacs dired&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Photo management:&lt;/td&gt;
          &lt;td&gt;seeking for one. files and folders&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Camera gear:&lt;/td&gt;
          &lt;td&gt;My phone&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Budgeting/finances:&lt;/td&gt;
          &lt;td&gt;ynab, transitioning to beancount&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Shopping list:&lt;/td&gt;
          &lt;td&gt;Emacs org-mode&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Meal planning:&lt;/td&gt;
          &lt;td&gt;Low tech paper&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;app-defaults-from-others&#34;&gt;App Defaults from others&lt;/h2&gt;
&lt;p&gt;Here are some people with RSS feeds I subscribed to which posted App Defaults recently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://hunden.linuxkompis.se/2023/01/12/my-desktop-january-2023.html&#34;&gt;Hund&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kevquirk.com/my-default-apps-at-the-end-of-2023&#34;&gt;Kev Quirk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://baty.net/2023/11/app-defaults&#34;&gt;Jack Baty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://manuelmoreale.com/app-defaults&#34;&gt;Manual Moreale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://garrit.xyz/posts/2023-11-07-app-defaults?utm_source=rss&#34;&gt;Garrit Franke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gregoryhammond.ca/blog/my-app-defaults-for-november-2023/&#34;&gt;Gregory Hammond&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://jlelse.blog/posts/default-apps-late-2023&#34;&gt;Jan-Lukas Else&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Progress on my Guix yearly migration</title>
      <link>https://blog.benoitj.ca/2023-11-01-progress-on-my-guix-yearly-migration/</link>
      <pubDate>Wed, 01 Nov 2023 18:30:29 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-11-01-progress-on-my-guix-yearly-migration/</guid>
    <description>&lt;p&gt;This is my first post since I started my Nix -&amp;gt; Guix migration.&lt;/p&gt;
&lt;p&gt;TLDR: I had a basic system and home setup in 3 hours using my older configuration, but due to a kernel or
grub bug, I lost 3 days. I found a workaround and now have a working system and home configuration for most things.&lt;/p&gt;
&lt;h2 id=&#34;some-issues-and-discovery&#34;&gt;Some Issues and discovery&lt;/h2&gt;
&lt;p&gt;The first issue I had was a confusing one. And made me lost 3 days. In version 5.6 of both libre
Linux and the Linux kernel, during boot, grub overlay no longer shows the password prompt to unlock
the /boot partition. This issue is not found when using both kernels at version 5.0.&lt;/p&gt;
&lt;p&gt;It took me 3 days to realize it was waiting for my input, but not showing the prompt. I believe I
was running 5.6 on nix with the same kind of setup without any issues. Looks like a Guix specific
issue at this point, or a problem found in Guix&amp;rsquo;s version of some software (Grub?). Something to
follow-up on later.&lt;/p&gt;
&lt;p&gt;Another issue happened while restoring my restic backup, I found out Guix&amp;rsquo;s version was really behind and
incompatible with the backup created on nix. I ended up enabling nix-service-type and get restic
with &lt;code&gt;nix-shell -p restic&lt;/code&gt;. Also something to follow-up on.&lt;/p&gt;
&lt;p&gt;Couple of interesting findings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;guix search&lt;/code&gt; command is much better and simpler to use than nix search&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://git.sr.ht/~whereiseveryone/guixrus&#34;&gt;Guix &amp;lsquo;R us&lt;/a&gt; &lt;a href=&#34;https://toys.whereis.%E3%81%BF%E3%82%93%E3%81%AA/&#34;&gt;toy&lt;/a&gt; search engine is really good, much better than Guix&amp;rsquo;s web package search. It&amp;rsquo;s much
faster, and allowed me to find a many 3rd party &amp;ldquo;home&amp;rdquo; services I was missing in Guix&lt;/li&gt;
&lt;li&gt;I found out I created custom service-types and packages last year, I forgot. Less work.&lt;/li&gt;
&lt;li&gt;I could use &lt;a href=&#34;https://trop.in/rde/&#34;&gt;RDE&lt;/a&gt;&amp;rsquo;s service types for my email setup and for other needs when not found in Guix&lt;/li&gt;
&lt;li&gt;As soon as I had nix-service-type working, my software anxiety went away.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;my-current-state&#34;&gt;My current state&lt;/h2&gt;
&lt;p&gt;I have a working system for many of the core things. I have a working desktop environment with slim,
my custom dwm and related packages, and most of my core tools.&lt;/p&gt;
&lt;p&gt;Hardware wise, I&amp;rsquo;ve got a &amp;ldquo;real&amp;rdquo; Linux kernel to get my WiFi working and recent ucode CPU
patches. Also my bluetooth setup is functional, and the cups print server working.&lt;/p&gt;
&lt;p&gt;My software safety net is setup with &lt;code&gt;nix-service-type&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I have a flake like pinned channel setup pulled from &lt;a href=&#34;https://trop.in/rde/&#34;&gt;RDE&lt;/a&gt;&amp;rsquo;s setup.&lt;/p&gt;
&lt;p&gt;My system configuration and home configuration are setup right, and many software are configured by
service types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Emacs&lt;/li&gt;
&lt;li&gt;email (goimapnotify, msmtp, isync, notmuch)&lt;/li&gt;
&lt;li&gt;bash configuration&lt;/li&gt;
&lt;li&gt;direnv&lt;/li&gt;
&lt;li&gt;nix channels and nix-shell configuration&lt;/li&gt;
&lt;li&gt;gpg, and ssh agents setup&lt;/li&gt;
&lt;li&gt;git configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With nix&amp;rsquo;s restic, I was able to restore my &lt;code&gt;home&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;And finally, with nix again, I loaded Hugo and was able to write this post as Guix does not have Hugo.&lt;/p&gt;
&lt;p&gt;You can look at my &lt;a href=&#34;https://git.sr.ht/~benoit/dotfiles&#34;&gt;dotfiles&lt;/a&gt; and &lt;a href=&#34;https://git.sr.ht/~benoit/my-guix-channel&#34;&gt;channel&lt;/a&gt; repos.&lt;/p&gt;
&lt;h2 id=&#34;next-steps&#34;&gt;Next steps&lt;/h2&gt;
&lt;p&gt;My current main focus is to stabilize my system. I did a lot, but this left a big pile of messy
code.&lt;/p&gt;
&lt;p&gt;Couple of things to fix, cleanup and complete:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cleanup and fix my notmuch tagging. Something is wrong and emails do not reach my tag:inbox.&lt;/li&gt;
&lt;li&gt;Review the list of tools and adjust based on my previous research (see previous posts)&lt;/li&gt;
&lt;li&gt;cleanup my config&lt;/li&gt;
&lt;li&gt;update my channel with packages and services I have in my dotfiles repo&lt;/li&gt;
&lt;li&gt;update my channel software versions (it&amp;rsquo;s 1 year old)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This should not take me more than 1 week. Need to time box this. I don&amp;rsquo;t need perfect, I need better.&lt;/p&gt;
&lt;p&gt;Once I&amp;rsquo;m done with stabilization (and only then), I&amp;rsquo;ll improve my setup.&lt;/p&gt;
&lt;p&gt;My first improvement will be related to my coding setup. Guile scheme, Clojure, Java, Node/JS,
diagram tools.&lt;/p&gt;
&lt;p&gt;Then a second improvement is to update my setup for contributing to Guix, especially test the email
patch setup, a local clone of guix, the REPL.&lt;/p&gt;
&lt;p&gt;Then it&amp;rsquo;ll be time to take another look at what 3rd party channel offers and improve my configuration.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Guix Home Configuration - Part 2 - Services</title>
      <link>https://blog.benoitj.ca/2023-10-24-guix-home-configuration-part2-services/</link>
      <pubDate>Tue, 24 Oct 2023 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-10-24-guix-home-configuration-part2-services/</guid>
    <description>&lt;h2 id=&#34;nix-home-manager&#34;&gt;Nix home-manager&lt;/h2&gt;
&lt;p&gt;Nix home-manager has a lot of services. In fact, I don&amp;rsquo;t think I manage any configuration files
myself except for my Emacs configuration. From daemon, to email, to bash, it&amp;rsquo;s covered.&lt;/p&gt;
&lt;p&gt;In nix term, a &lt;code&gt;program&lt;/code&gt; is a package + configuration, while a &lt;code&gt;service&lt;/code&gt; is a &lt;code&gt;program&lt;/code&gt; with an autorun.&lt;/p&gt;
&lt;h2 id=&#34;email-configuration&#34;&gt;email configuration&lt;/h2&gt;
&lt;p&gt;Configure account specific information. From email addresses to imap or smtp server details. This
information is reused by many mail related tools.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;accounts.email.accounts.*&lt;/td&gt;
          &lt;td&gt;manual&lt;/td&gt;
          &lt;td&gt;configure email accounts w/ user/pass, email addresses, etc&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;accounts.email.accounts.*.imap&lt;/td&gt;
          &lt;td&gt;manual&lt;/td&gt;
          &lt;td&gt;imap conf for account&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;accounts.email.accounts.*.smtp&lt;/td&gt;
          &lt;td&gt;manual&lt;/td&gt;
          &lt;td&gt;smtp conf for account&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;accounts.email.accounts.*.msmtp.enable&lt;/td&gt;
          &lt;td&gt;manual&lt;/td&gt;
          &lt;td&gt;send email with msmtp&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;accounts.email.accounts.*.imapnotify&lt;/td&gt;
          &lt;td&gt;manual&lt;/td&gt;
          &lt;td&gt;enable goimapnotify support&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;accounts.email.accounts.*.notmuch.enable&lt;/td&gt;
          &lt;td&gt;manual&lt;/td&gt;
          &lt;td&gt;enable notmuch for account&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;accounts.email.accounts.*.mbsync&lt;/td&gt;
          &lt;td&gt;manual&lt;/td&gt;
          &lt;td&gt;enable mbsync for account&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;x11-specific-config&#34;&gt;X11 specific config&lt;/h2&gt;
&lt;p&gt;These elements configure X and how to load X with Xsession.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;fonts.fontconfig.enable&lt;/td&gt;
          &lt;td&gt;unclear if I need this-command&lt;/td&gt;
          &lt;td&gt;enable font config&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xresources.properties&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;configure xresources and load it with k/v&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xsession.enable&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xsession.initExtra&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xsession.windowManager.command&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;command to run to start my window manager&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;programs&#34;&gt;programs&lt;/h2&gt;
&lt;p&gt;Programs in Nix are used to install and configure applications or tools.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.autorandr.enable&lt;/td&gt;
          &lt;td&gt;autorandr&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.autorandr.profiles&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;: install config&lt;/td&gt;
          &lt;td&gt;map of profiles and config&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.bash.enable&lt;/td&gt;
          &lt;td&gt;bash-service-type&lt;/td&gt;
          &lt;td&gt;enables bash.  &lt;code&gt;.bash_profile&lt;/code&gt; loads &lt;code&gt;.bashrc&lt;/code&gt;, default &lt;code&gt;.profile&lt;/code&gt; loading home managers session vars&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.bash.enableCompletion&lt;/td&gt;
          &lt;td&gt;home-bash-configuration bashrc (manual)&lt;/td&gt;
          &lt;td&gt;enables completion&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.bash.initExtra&lt;/td&gt;
          &lt;td&gt;home-bash-configuration bashrc&lt;/td&gt;
          &lt;td&gt;adds to &lt;code&gt;.bashrc&lt;/code&gt; for interactive shells (after check interactive)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.bash.profileExtra&lt;/td&gt;
          &lt;td&gt;home-shell-profile-configuration&lt;/td&gt;
          &lt;td&gt;adds extra at the end of &lt;code&gt;.profile&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.bash.sessionVariables&lt;/td&gt;
          &lt;td&gt;home-environment-variables-service-type&lt;/td&gt;
          &lt;td&gt;adds extra exports to &lt;code&gt;.profile&lt;/code&gt; using k/v map&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.bash.shellOptions&lt;/td&gt;
          &lt;td&gt;home-bash-configuration bashrc (manual)&lt;/td&gt;
          &lt;td&gt;adds shopts to interactive &lt;code&gt;.bashrc&lt;/code&gt; using k/v map&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.bash.shellAliases&lt;/td&gt;
          &lt;td&gt;home-bash-configuration aliases&lt;/td&gt;
          &lt;td&gt;adds aliases to &lt;code&gt;.bashrc&lt;/code&gt; using k/v map&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.bash.logoutExtra&lt;/td&gt;
          &lt;td&gt;home-bash-configuration bash-logout&lt;/td&gt;
          &lt;td&gt;adds extra to &lt;code&gt;.bash_logout&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;home.sessionPath&lt;/td&gt;
          &lt;td&gt;home-environment-variables-service-type (manual)&lt;/td&gt;
          &lt;td&gt;add dir to &lt;code&gt;PATH&lt;/code&gt; in &lt;code&gt;.profile&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.direnv.enable&lt;/td&gt;
          &lt;td&gt;direnv w/ home-bash-configuration bashrc (manual)&lt;/td&gt;
          &lt;td&gt;enables direnv in &lt;code&gt;.bashrc&lt;/code&gt; interactive&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.direnv.nix-direnv.enable&lt;/td&gt;
          &lt;td&gt;home-file-service-type for &lt;code&gt;use guix&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;from guix &lt;a href=&#34;https://guix.gnu.org/cookbook/fr/html_node/Environnement-Guix-avec-direnv.html&#34;&gt;cookbook&lt;/a&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.emacs.enable&lt;/td&gt;
          &lt;td&gt;I will install my config with home-files-service-type&lt;/td&gt;
          &lt;td&gt;enable configuration of emacs&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.emacs.package&lt;/td&gt;
          &lt;td&gt;pick the right emacs 29 + nativecomp&lt;/td&gt;
          &lt;td&gt;which emacs package to use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.emacs.extraPackages&lt;/td&gt;
          &lt;td&gt;extend the package if needed&lt;/td&gt;
          &lt;td&gt;which extra nix packages is added to the dependencies / visible to emacs. the rest I pull with straight&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.enable&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;configure git&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.package&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;package to use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.userEmail&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;email&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.userName&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;user name&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.aliases&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;aliases k/v map&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.attributes&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;attributes k/v map&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.difftastic.enable&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;enable difftastic&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.signing&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;set signing key&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.git.extraConfig&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;extra config k/v&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.mbsync.enable=true;&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;configures mbsync&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.msmtp.enable&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.notmuch.enable&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.notmuch.new.tags&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.notmuch.search.excludeTags&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.notmuch.maildir.synchronizeFlags&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.notmuch.hooks&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.ncspot.enable&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nix for now&lt;/td&gt;
          &lt;td&gt;configure ncspot&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.ncspot.settings&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;k/v of settings.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.password-store.enable&lt;/td&gt;
          &lt;td&gt;password-store&lt;/td&gt;
          &lt;td&gt;enables&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.password-store.settings&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;k/v&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.qutebrowser.enable&lt;/td&gt;
          &lt;td&gt;nixpkgs&lt;/td&gt;
          &lt;td&gt;since qute on guix does not work for all that I use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.qutebrowser.loadAutoconfig&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.qutebrowser.extraConfig&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.qutebrowser.keyBindings&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.rofi.enable&lt;/td&gt;
          &lt;td&gt;rofi&lt;/td&gt;
          &lt;td&gt;configure rofi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.rofi.font&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;font to use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.rofi.theme&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;theme to use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.rofi.terminal&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;terminal to use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.rofi.extraConfig&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;extra config to add&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.starship.enable&lt;/td&gt;
          &lt;td&gt;found in 3rd party channel&lt;/td&gt;
          &lt;td&gt;adds starship setup to &lt;code&gt;.bashrc&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;programs.starship.settings&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;i disable stuff&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;services&#34;&gt;services&lt;/h2&gt;
&lt;p&gt;Services are &lt;code&gt;programs&lt;/code&gt; which are autolaunched in various ways: shepherd, from Xsession, from a
startup script.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;services.syncthing.enable&lt;/td&gt;
          &lt;td&gt;home-syncthing-service-type&lt;/td&gt;
          &lt;td&gt;start syncthing user daemon&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.gpg-agent.enable&lt;/td&gt;
          &lt;td&gt;home-gpg-service-type&lt;/td&gt;
          &lt;td&gt;enable agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.gpg-agent.enableScDaemon&lt;/td&gt;
          &lt;td&gt;there is a system service, unclear what else&lt;/td&gt;
          &lt;td&gt;enable support for yubikey&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.gpg-agent.enableSshSupport&lt;/td&gt;
          &lt;td&gt;home-gpg-agent-configuration ssh-support?&lt;/td&gt;
          &lt;td&gt;enable gpg agent as ssh agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.gpg-agent.sshKeys&lt;/td&gt;
          &lt;td&gt;home-openssh-configuration&lt;/td&gt;
          &lt;td&gt;specify keys to load&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;services.spotifyd.enable&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;abandon&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;services.spotifyd.settings&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;abandon&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;k/v&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.imapnotify.enable&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type (manual) w/ shepherd&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.mbsync.enable=false;&lt;/td&gt;
          &lt;td&gt;home-files-service-type (manual)&lt;/td&gt;
          &lt;td&gt;since I start mbsync with imapnotify&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.dunst.enable&lt;/td&gt;
          &lt;td&gt;home-files-service-type w/ xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.picom.enable&lt;/td&gt;
          &lt;td&gt;home-files-service-type w/ xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.sxhkd.enable&lt;/td&gt;
          &lt;td&gt;xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.sxhkd.keybindings&lt;/td&gt;
          &lt;td&gt;home-files-service-type w/ xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;k/v&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.dwm-status.enable&lt;/td&gt;
          &lt;td&gt;xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.dwm-status.order&lt;/td&gt;
          &lt;td&gt;home-files-service-type w/ xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;array of info to see&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.dwm-status.extraConfig&lt;/td&gt;
          &lt;td&gt;home-files-service-type w/ xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;k/v&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.screen-locker.enable&lt;/td&gt;
          &lt;td&gt;xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;enables auto locking&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.screen-locker.lockCmd&lt;/td&gt;
          &lt;td&gt;home-files-service-type w/ xsession.initExtra (manual)&lt;/td&gt;
          &lt;td&gt;process to start when locking&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.poweralertd.enable&lt;/td&gt;
          &lt;td&gt;home-batsignal-service-type&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.unclutter.enable&lt;/td&gt;
          &lt;td&gt;home-unclutter-service-type&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;other-configuration&#34;&gt;Other configuration&lt;/h2&gt;
&lt;p&gt;Where I want to supply my own complete dotfile, I use home.file to install it. In nix, it&amp;rsquo;s really
just for few.&lt;/p&gt;
&lt;p&gt;My strategy for getting Guix running ASAP for missing &lt;code&gt;services&lt;/code&gt; or &lt;code&gt;programs&lt;/code&gt; is to capture my current
configuration files and install them with a similar guix home service.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;home.file.abcde&lt;/td&gt;
          &lt;td&gt;home-files-service-type&lt;/td&gt;
          &lt;td&gt;copy dotfile&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;home.file.emacs-init&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type&lt;/td&gt;
          &lt;td&gt;basic home file copy of my emacs init file to &lt;code&gt;~/.config/emacs&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;home.file.local-bin&lt;/td&gt;
          &lt;td&gt;home-files-service-type&lt;/td&gt;
          &lt;td&gt;copy my small shell scripts to &lt;code&gt;~./local/bin&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;home.file.lynx&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type&lt;/td&gt;
          &lt;td&gt;copy dotfile&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;home.file.surfraw&lt;/td&gt;
          &lt;td&gt;home-xdg-configuration-files-service-type&lt;/td&gt;
          &lt;td&gt;copy dotfile&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;3rd-party-services&#34;&gt;3rd party services&lt;/h2&gt;
&lt;p&gt;I found couple of services like dunst in 3rd party channels. Once I have a working setup, I should
be looking at them + RDE which has a lot of good home services, on top of writing my own.&lt;/p&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;I know this works and can work.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got solutions for everything, the next steps are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; backup config files generated by nix that I need to now manually handle&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; backup files for reference: bash config files + xsession&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; backup my laptop&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; install!&lt;/li&gt;
&lt;/ul&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Guix home configuration - part 1 - Packages</title>
      <link>https://blog.benoitj.ca/2023-10-23-guix-home-configuration-part1-packages/</link>
      <pubDate>Mon, 23 Oct 2023 18:00:27 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-10-23-guix-home-configuration-part1-packages/</guid>
    <description>&lt;p&gt;The most important part of my Nix configuration: nix home manager.&lt;/p&gt;
&lt;p&gt;From packages installed, services enabled, configuration copied or generated, home manager is where
the Linux &amp;ldquo;customization&amp;rdquo; happens.&lt;/p&gt;
&lt;h2 id=&#34;nix-flakes-alternative&#34;&gt;Nix flakes alternative&lt;/h2&gt;
&lt;p&gt;Lets make this simple, my primary flake is my dotfile configuration.&lt;/p&gt;
&lt;p&gt;No matter the setup, both Nix and Guix rely on the source control to make sure the packages are
reproducible. When you pull on sync your channels, Guix (or Nix) &amp;ldquo;pull&amp;rdquo; changes to a local copy of
the repository.&lt;/p&gt;
&lt;p&gt;In functional expression, a flake derivation would look like this:
&lt;code&gt;f(pinnedInputs, configuration) = configDerivation&lt;/code&gt; where pinnedInputs are the channel + commit hash
for each flake (channel) specified and stored in git.&lt;/p&gt;
&lt;p&gt;This makes the configuration flake, a function of it&amp;rsquo;s input. It&amp;rsquo;s reproducible, there
are no external dependencies.&lt;/p&gt;
&lt;p&gt;In Guix, the pinnedInputs exists, but are external and kind of invisible to the user. They represent
your last &amp;ldquo;pull&amp;rdquo; command, nothing more. It&amp;rsquo;s place sensitive and not captured anywhere but on your local machine.&lt;/p&gt;
&lt;h3 id=&#34;what-it-means-in-practice&#34;&gt;What it means in practice?&lt;/h3&gt;
&lt;p&gt;Without this critical information, re-installing the configuration will produce different results,
unless Guix (or Nix) did not change since last time you did it.&lt;/p&gt;
&lt;p&gt;For example, last time I migrated to Guix, using my previous migration&amp;rsquo;s configuration, I could not
get chezmoi dotfile manager to work. It failed to build between the time I left Guix and the time I
re-installed Guix. I had spend time figuring out when the build started to fail, and wasted time
getting my system up to date.&lt;/p&gt;
&lt;p&gt;The solution for this is to store both the channels used by the configuration as well as the git
hash versions of each channels. When they are in your repository, you have a lot more chance to get a
working system, especially after some time. It also make it super easy to upgrade one channel while
keeping an older version of another one by just undoing your changes using git.&lt;/p&gt;
&lt;p&gt;When you are a coder, this is super natural to do. Many of the development tools actually have
similar mechanism (like npm&amp;rsquo;s package.lock).&lt;/p&gt;
&lt;h3 id=&#34;how-do-we-achieve-that-with-guix&#34;&gt;how do we achieve that with Guix?&lt;/h3&gt;
&lt;p&gt;Guix does not have an off the shelf pinning system, but has some commands to support similar
workflow: &lt;code&gt;describe&lt;/code&gt; and &lt;code&gt;time-machine&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On any Guix system, if you run &lt;code&gt;guix describe --format channels&lt;/code&gt;, you get the same info as your
channel file, but with the specific git hash from the latest guix pull. We could store this output
into a file in our configuration git repo for later reference.&lt;/p&gt;
&lt;p&gt;The 2nd useful command is &lt;code&gt;guix time-machine&lt;/code&gt;. It allows you to run a Guix command for a specific
version. There are many ways to specify the version, one of which is a channels file. We can use the
output of guix describe to run guix pull at a specific version using guix time-machine.&lt;/p&gt;
&lt;p&gt;The is the closest we can get from Nix flakes.&lt;/p&gt;
&lt;p&gt;The main limitation is that Nix flakes tracks inputs of inputs, while guix describe/time-machine
will only track your immediate channels specifications.&lt;/p&gt;
&lt;p&gt;This is the same mechanism that RDE uses (look at their setup &lt;a href=&#34;https://git.sr.ht/~abcdw/rde/tree/master/item/examples/profiles.mk&#34;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&#34;software-packages&#34;&gt;Software packages&lt;/h2&gt;
&lt;p&gt;Here is an inventory of all the software I use, except for anything related to nix home-manager
(programs and services).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m been using whereiseveryone&amp;rsquo;s toy search engine. It index Guix main channel, but also many other
3rd party channels. The search engine is not just more complete, it&amp;rsquo;s also much faster than Guix
packages web search engine.&lt;/p&gt;
&lt;p&gt;In my case, most will come from Guix&amp;rsquo;s channel, some from NonGuix, and the rest from my &lt;a href=&#34;https://git.sr.ht/~benoit/my-guix-channel&#34;&gt;own channel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; before installing any software from 3rd party channels, it&amp;rsquo;s always advised to inspect the
Guix package code, and even better, inspect and replicate some of them into your own channel. You
should not leave security to luck. Since I only have couple of packages in unknown 3rd party
channels, I&amp;rsquo;ll inspire myself and update my own channel.&lt;/p&gt;
&lt;h3 id=&#34;tools&#34;&gt;Tools&lt;/h3&gt;
&lt;h4 id=&#34;shell-and-core-tools&#34;&gt;Shell and core tools&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix ([channel#]&amp;lt;package&amp;gt;[:output])&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;babashka&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/ieugen/bin-guix/blob/main/bin-guix/packages/babashka.scm&#34;&gt;bin-guix#babashka&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;issue is graalvm not in Guix due to reproducibility&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bat&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bash-completion&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;coreutils&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dosfstools&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;dos partitioning/formatting tools&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lesspipe&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;nix-bash-completions&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;missing, abandon&lt;/td&gt;
          &lt;td&gt;I dont really need it&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;starship&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/TinHead/th-guix-channel/blob/main/th/packages/starship.scm#L11&#34;&gt;th#starship-bin&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;This could go in Guix, but really a lot of dependencies&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;network&#34;&gt;network&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix ([channel#]&amp;lt;package&amp;gt;[:output])&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;bluez&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bluez-alsa&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bind&lt;/td&gt;
          &lt;td&gt;bind:utils&lt;/td&gt;
          &lt;td&gt;I use the lookup tools&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;curl&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;openssl&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rsync&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sshfs&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;surfraw&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;tig&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;abandon&lt;/td&gt;
          &lt;td&gt;I dont use this anymore&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;wget&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;file-management-and-processing&#34;&gt;File management and processing&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix ([channel#]&amp;lt;package&amp;gt;[:output])&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;(aspellWithDicts (dicts: with dicts; [ en en-computers en-science fr]))&lt;/td&gt;
          &lt;td&gt;aspell, aspell-dict-en, aspell-dict-fr&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Note&lt;/strong&gt; en-computers and en-science in kbg&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://git.sr.ht/~kennyballou/guix-channel.git/tree/master/item/kbg/packages/aspell.scm&#34;&gt;kbg#aspell-dict-en-computers, kbg#aspell-dict-en-science&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;Note2: aspellWithDicts equivalent?&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;atool&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;abandon&lt;/td&gt;
          &lt;td&gt;file archive manager I dont use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;beancount&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;bsdgames&lt;/td&gt;
          &lt;td&gt;bsd-games&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cowsay&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;dateutils&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;abandon&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;I dont use this&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dos2unix&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;diffutils&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;diff, cmp, diff3&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fd&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;find replacement&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;figlet&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;banner tools-extra&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;findutils&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;find, locate commands&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fzf&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gawk&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gnuplot&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gzip&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;highlight&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jet&lt;/td&gt;
          &lt;td&gt;missing, nixpkgs&lt;/td&gt;
          &lt;td&gt;like jq, but include transit and edn&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jq&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ledger&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mediainfo&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;p7zip&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pandoc&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pbzip2&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;# multi core replacement for bzip2/bunzip2&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;recutils&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ripgrep&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tree&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;texlive.combined.scheme-full&lt;/td&gt;
          &lt;td&gt;texlive&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;unrar&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;-&amp;gt; p7zip&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;unzip&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;wordnet&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;zip&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;process-management-and-monitoring&#34;&gt;Process management and monitoring&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;acpi&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;htop&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lsof&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;progress&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pv&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;pipe progress monitor&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;strace&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sysstat&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;media-tools&#34;&gt;Media tools&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;alsa-plugins&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;alsa-tools&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, abandon&lt;/td&gt;
          &lt;td&gt;I&amp;rsquo;m not sure I actually use this&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;alsa-utils&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;apulse&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;missing, &lt;strong&gt;abandon&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;not found but don&amp;rsquo;t use&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ffmpeg&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gst_all_1.gst-plugins-base&lt;/td&gt;
          &lt;td&gt;gst-plugins-base&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gst_all_1.gst-plugins-good&lt;/td&gt;
          &lt;td&gt;gst-plugins-good&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gst_all_1.gst-plugins-bad&lt;/td&gt;
          &lt;td&gt;gst-plugins-bad&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gst_all_1.gst-plugins-ugly&lt;/td&gt;
          &lt;td&gt;gst-plugins-ugly&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gst_all_1.gstreamer&lt;/td&gt;
          &lt;td&gt;gstreamer&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;imagemagick&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mpv&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pulsemixer&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pamixer&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sox&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;vorbis-tools&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;security&#34;&gt;Security&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;keychain&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;great tool to share ssh/gpg agents within a session&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gnupg&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pass&lt;/td&gt;
          &lt;td&gt;password-store&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pinentry&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;containers-images-and-virtualization-and-deployment&#34;&gt;Containers, images and virtualization, and deployment&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;deploy-rs&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;missing, &lt;strong&gt;abandon&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;I used this for some of my servers. I have a diff solution now&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;docker-compose&lt;/td&gt;
          &lt;td&gt;docker, docker-cli, docker-compose&lt;/td&gt;
          &lt;td&gt;Unclear if compose is needed as it&amp;rsquo;s supported in cli on new versions&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;vagrant&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;I would want to use that to provision my work VMs&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;programming-tools&#34;&gt;Programming tools&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;ansible&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;autoconf&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;automake&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;binutils&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;ld and similar tools&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;black&lt;/td&gt;
          &lt;td&gt;python-black&lt;/td&gt;
          &lt;td&gt;python code formatter&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cargo&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;clj-kondo&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://gitlab.com/nonguix/nonguix/-/blob/master/nongnu/packages/clojure.scm#L86&#34;&gt;nonguix#clj-kondo&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;clojure linter&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;clojure&lt;/td&gt;
          &lt;td&gt;clojure, clojure-tools&lt;/td&gt;
          &lt;td&gt;this is new. was not in Guix if I recall&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;clojure-lsp&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;could not find. self package?&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cmake&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;editorconfig-core-c&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gcc&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gh&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://git.sr.ht/~hellseher/ffab/tree/main/item/ffab/packages/version-control.scm#L39&#34;&gt;ffab#github-cli&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ghc&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gitFull&lt;/td&gt;
          &lt;td&gt;git:out,send-email,gui&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;git-annex&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;git-doc&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;N/A&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;git-extras&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/tj/git-extras&#34;&gt;lots of cool features&lt;/a&gt;. Maybe there is an emacs similar package. some are covered by magit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;git-hub&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;-&amp;gt; github-cli&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;git-stree&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;abandon&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;I use magit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;gitstats&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;magit-stats&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gnumake&lt;/td&gt;
          &lt;td&gt;make&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;go&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gopls&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;go language server&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;graphviz&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;html-tidy&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jdk17&lt;/td&gt;
          &lt;td&gt;openjdk&lt;/td&gt;
          &lt;td&gt;21 is also available&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;jetbrains.idea-ultimate&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://gitlab.com/orang3/small-guix/-/blob/master/small-guix/packages/jetbrains.scm#L182&#34;&gt;small-guix#idea-ultimate&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;leiningen&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://gitlab.com/nonguix/nonguix/-/blob/master/nongnu/packages/clojure.scm#L49&#34;&gt;nonguix#leiningen&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;libtool&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;maven&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;google-java-format&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;cli java formatter&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mdl&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;markdown linter&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mr&lt;/td&gt;
          &lt;td&gt;myrepos&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nodejs&lt;/td&gt;
          &lt;td&gt;node&lt;/td&gt;
          &lt;td&gt;latest lts available (18)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nodePackages.stylelint&lt;/td&gt;
          &lt;td&gt;-&amp;gt; node-eslint&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nodePackages.js-beautify&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, -&amp;gt; npm prettier&lt;/td&gt;
          &lt;td&gt;replace with prettier from npm?&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nixfmt&lt;/td&gt;
          &lt;td&gt;from nix package mgr&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;plantuml&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pipenv&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pyenv&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python3&lt;/td&gt;
          &lt;td&gt;python&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python-lsp-server&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python beautifulsoup4&lt;/td&gt;
          &lt;td&gt;python-beautifulsoup4&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python flake8&lt;/td&gt;
          &lt;td&gt;python-flake8&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python isort&lt;/td&gt;
          &lt;td&gt;python-isort&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python lxml&lt;/td&gt;
          &lt;td&gt;python-lxml&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python mypy&lt;/td&gt;
          &lt;td&gt;python-mypy&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python nose&lt;/td&gt;
          &lt;td&gt;python-nose&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python pillow&lt;/td&gt;
          &lt;td&gt;python-pillow&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python pyflakes&lt;/td&gt;
          &lt;td&gt;python-pyflakes&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python pylint&lt;/td&gt;
          &lt;td&gt;python-pylint&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python pynacl&lt;/td&gt;
          &lt;td&gt;python-pynacl&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python pytest&lt;/td&gt;
          &lt;td&gt;python-pytest&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python pyright&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, abandon&lt;/td&gt;
          &lt;td&gt;some extra linting, not critical&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python pypdf2&lt;/td&gt;
          &lt;td&gt;python-pypdf2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python terraform&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python tldextract&lt;/td&gt;
          &lt;td&gt;python-tldextract&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;proselint&lt;/td&gt;
          &lt;td&gt;python-proselint&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ruby&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rustc&lt;/td&gt;
          &lt;td&gt;rust&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sbcl&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;shellcheck&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;shfmt&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sqlite&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;vscode-fhs&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;it&amp;rsquo;s a wrapper that allows to install vscode plugin normally&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;is vscodium doing the same?&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;tools-perso&#34;&gt;Tools perso&lt;/h3&gt;
&lt;p&gt;Tools I use only on my personal laptop&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix ([channel#]&amp;lt;package&amp;gt;[:output])&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;borgbackup&lt;/td&gt;
          &lt;td&gt;borg&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;borgmatic&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;bitwarden&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;-&amp;gt; rbw&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;bitwarden-cli&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;-&amp;gt; rbw&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hugo&lt;/td&gt;
          &lt;td&gt;&lt;a href=&#34;https://github.com/rakino/rosenthal/blob/trunk/rosenthal/packages/binaries.scm#L112&#34;&gt;rosental#hugo-bin&lt;/a&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rbw&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;bitwarden client&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rofi-rbw&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;rofi frontend. easy to package&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;syncthing&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;transmission&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;yt-dlp&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;yubikey-manager&lt;/td&gt;
          &lt;td&gt;python-yubikey-manager&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;beancount&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;beancount-language-server&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fava&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hledger&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;chezmoi&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;abandon&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;profanity&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kicad&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;qmk&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, git clone&lt;/td&gt;
          &lt;td&gt;I may be able to clone qmk instead&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;abcde&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;beets&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cdrdao&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cdparanoia&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cddiscid&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;chromaprint&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dr14_tmeter&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;flac&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fluidsynth&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mopidy&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mopidy-local&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;#mopidy-spotify&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mopidy-somafm&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mopidy-mpd&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mopidy-iris&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;#mopidy-internetarchive&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mpc_cli&lt;/td&gt;
          &lt;td&gt;mpd-mpc&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mpd&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ncmpcpp&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ncspot&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;opusTools&lt;/td&gt;
          &lt;td&gt;opus-tools&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python39Packages.pyacoustid&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;python39Packages.requests&lt;/td&gt;
          &lt;td&gt;python-requests&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rubberband&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sox&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;spotifyd&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;spotify-tui&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;twolame&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;wavegain&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, wait&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;When missing, i&amp;rsquo;ll just use the nix package instead until I do something else about it.&lt;/p&gt;
&lt;h3 id=&#34;tools-work&#34;&gt;Tools work&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix ([channel#]&amp;lt;package&amp;gt;[:output])&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;awscli2&lt;/td&gt;
          &lt;td&gt;awscli&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;azure-cli&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;desktop&#34;&gt;Desktop&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix ([channel#]&amp;lt;package&amp;gt;[:output])&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;alacritty&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;arandr&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;autorandr&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;brightnessctl&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cantarell-fonts&lt;/td&gt;
          &lt;td&gt;font-abattis-cantarell&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dunst&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;fontconfig&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dejavu_fonts&lt;/td&gt;
          &lt;td&gt;font-dejavu&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;dwm&lt;/td&gt;
          &lt;td&gt;mychannel#bmj-dwm&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;feh&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;firefox&lt;/td&gt;
          &lt;td&gt;nonguix#firefox&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gimp&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;libnotify&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;libreoffice&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;light&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;kdiff3&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, abandon&lt;/td&gt;
          &lt;td&gt;use emerge, or other diff tools&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;maim&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mate.mate-polkit&lt;/td&gt;
          &lt;td&gt;mate-polkit&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;mpv&lt;/td&gt;
          &lt;td&gt;mpv&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;mupdf&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;-&amp;gt; zathura&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nerdfonts CascadiaCode&lt;/td&gt;
          &lt;td&gt;mychannel&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nerdfonts FiraCode&lt;/td&gt;
          &lt;td&gt;mychannel&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nerdfonts Hack&lt;/td&gt;
          &lt;td&gt;mychannel&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;picom&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;projectm&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, abandon&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;qutebrowser&lt;/td&gt;
          &lt;td&gt;nixpkgs&lt;/td&gt;
          &lt;td&gt;guix has a build that don&amp;rsquo;t work for me&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;rofi&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;scrot&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;-&amp;gt; maim&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;st&lt;/td&gt;
          &lt;td&gt;mychannel#bmj-st&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sxiv&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;tesseract4&lt;/td&gt;
          &lt;td&gt;tesseract, tesseract-*&lt;/td&gt;
          &lt;td&gt;I dont need this now&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;widevine-cdm&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;, nixpkgs&lt;/td&gt;
          &lt;td&gt;needed for qute&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;wmctrl&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xclip&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xdg-utils&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xdg-user-dirs&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xdotool&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xdragon&lt;/td&gt;
          &lt;td&gt;dragon-drop&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xlockmore&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xorg.setxkbmap&lt;/td&gt;
          &lt;td&gt;xkbset?&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xorg.xev&lt;/td&gt;
          &lt;td&gt;xev&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xorg.xinput&lt;/td&gt;
          &lt;td&gt;xinput&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xorg.xrandr&lt;/td&gt;
          &lt;td&gt;xrandr&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xorg.xrdb&lt;/td&gt;
          &lt;td&gt;xrdb&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xorg.xset&lt;/td&gt;
          &lt;td&gt;xset&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xsel&lt;/td&gt;
          &lt;td&gt;xsel&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;zathura&lt;/td&gt;
          &lt;td&gt;zathura, zathura-*&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;what&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;My &lt;code&gt;program.*&lt;/code&gt; and &lt;code&gt;services.*&lt;/code&gt; nix configuration -&amp;gt; &lt;code&gt;service-types&lt;/code&gt; mapping.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Guix VM System Configuration</title>
      <link>https://blog.benoitj.ca/2023-10-21-guix-vm-system-configuration/</link>
      <pubDate>Sat, 21 Oct 2023 11:49:47 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-10-21-guix-vm-system-configuration/</guid>
    <description>&lt;p&gt;Something I forgot on my last Guix system configuration post, my work VM setup.&lt;/p&gt;
&lt;p&gt;Obviously it&amp;rsquo;s built on top of my regular setup, but it has some specifics.&lt;/p&gt;
&lt;h2 id=&#34;virtualbox&#34;&gt;VirtualBox&lt;/h2&gt;
&lt;p&gt;The main difference between running on bare metal and running in VirtualBox is that I do need the
virtualbox-guest-additions. This allows to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;have a seamless mouse / keyboard integration with the host OS&lt;/li&gt;
&lt;li&gt;it also resize the desktop &amp;ldquo;screen&amp;rdquo; to the size of the window&lt;/li&gt;
&lt;li&gt;It allows me to mount local host folders as drives on the VM&lt;/li&gt;
&lt;li&gt;Has shared clipboard&lt;/li&gt;
&lt;li&gt;allows to share USB devices (USB sticks and more) with the guest OS&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It does require to install and load a kernel module. You might know where this is going. Guix by
default does not support that.&lt;/p&gt;
&lt;p&gt;The solution is simple though, since I use the Linux kernel, and &lt;code&gt;nonguix build system&lt;/code&gt;, I just need
to modify my kernel and create a package (or find one) for guest additions.&lt;/p&gt;
&lt;p&gt;I found here a &lt;a href=&#34;https://git.sr.ht/~bosco/guix/tree/2312dd82e4e35436e038ab0db68fdd559f7ba859/item/nongnu/packages/linux-vbox.scm&#34;&gt;guix config&lt;/a&gt; that does what I need to the kernel and package guest additions.&lt;/p&gt;
&lt;h2 id=&#34;building-the-image&#34;&gt;Building the image&lt;/h2&gt;
&lt;p&gt;On nix, I used packer to build the nix image so I don&amp;rsquo;t have to go through the installation process.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m planning to build the image using &lt;a href=&#34;https://guix.gnu.org/manual/en/html_node/Invoking-guix-system.html#index-image_002c-creating-disk-images&#34;&gt;guix system image&lt;/a&gt; command with my vm system
configuration. This actually is a better situation than Nix, but I never tried it.&lt;/p&gt;
&lt;h2 id=&#34;what-else&#34;&gt;What else?&lt;/h2&gt;
&lt;p&gt;The only thing else special is auto-resizing the ext4 partition. It&amp;rsquo;s not infrequent that I have to
enlarge the VM disk, having auto Resize set, enable me to just reboot the machine to benefit from the
full space.&lt;/p&gt;
&lt;p&gt;I think that&amp;rsquo;s it on the &amp;ldquo;system&amp;rdquo; front.&lt;/p&gt;
&lt;h2 id=&#34;what-s-next&#34;&gt;What&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;You might notice I&amp;rsquo;m trying to post everyday. Like I mentioned on my first post, I won&amp;rsquo;t install
Guix until I have a plan for everything. Tomorrow hopefully I have done the research needed for Guix
home setup, and be ready to install Guix, who knows. Ah, I also need to do a backup&amp;hellip;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>How Guix Compare to Nix and Vice Versa</title>
      <link>https://blog.benoitj.ca/2023-10-20-how-guix-compare-to-nix-and-vice-versa/</link>
      <pubDate>Fri, 20 Oct 2023 21:36:52 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-10-20-how-guix-compare-to-nix-and-vice-versa/</guid>
    <description>&lt;p&gt;This started as a question from Mr. X on System Crafters general room on matrix: &lt;code&gt;maybe I was offtopic here, but nobody who can compare Guix and NixOS?&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is my opinion, based on me running nix and Guix (and RDE) as my primary OS for the past 3-4
years now.&lt;/p&gt;
&lt;p&gt;People who know me on the System Crafters community know I&amp;rsquo;ve switched between both almost as often as @acdw
has re-started his Emacs configuration 🤣.&lt;/p&gt;
&lt;p&gt;Take this with a grain of salt with regards to current state of Guix, I&amp;rsquo;m about to jump in the Guix
wagon again but I don&amp;rsquo;t know what happened in the last 6-12 months.&lt;/p&gt;
&lt;p&gt;Note that I use interchangeably the Guix and Nix package manager and OS, in this post, it does not matter.&lt;/p&gt;
&lt;p&gt;Below, is re-worded version of the messages I posted at that time.&lt;/p&gt;
&lt;h2 id=&#34;what-do-they-have-in-common&#34;&gt;What do they have in common&lt;/h2&gt;
&lt;p&gt;Guix and Nix share a lot in common&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They are functional package managers and OS. you can reproduce their build (some caveat), and roll
back when you need to.&lt;/li&gt;
&lt;li&gt;The concepts are the same, with derivations, a build daemon, packages that user can
install, and where multiple versions can coexist. From what I know, Guix build daemon started as a
fork of nix build daemon&lt;/li&gt;
&lt;li&gt;Installation are typically descriptive with a file, instead of ad-hoc commands&lt;/li&gt;
&lt;li&gt;They are both addictive&lt;/li&gt;
&lt;li&gt;They both have opinionated, technically savvy communities&lt;/li&gt;
&lt;/ul&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Guix system configuration</title>
      <link>https://blog.benoitj.ca/2023-10-17-guix-system-configuration/</link>
      <pubDate>Tue, 17 Oct 2023 08:51:23 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-10-17-guix-system-configuration/</guid>
    <description>&lt;p&gt;In this post, I&amp;rsquo;m starting the analysis phase of migrating to Guix.&lt;/p&gt;
&lt;p&gt;The first step is analyzing my current nix system configuration, and what I would need to do to port
it to Guix.&lt;/p&gt;
&lt;h2 id=&#34;my-use-cases&#34;&gt;My use cases&lt;/h2&gt;
&lt;p&gt;I run Nix, and soon Guix, on two types of desktops:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;At least one work laptop running Linux in a VM where I:
&lt;ul&gt;
&lt;li&gt;code, primarily in java, Node, JavaScript, Typescript, HTML/CSS, Python, Golang, and any other
language that I encounter&lt;/li&gt;
&lt;li&gt;Review code from others&lt;/li&gt;
&lt;li&gt;run server applications for development and testing purpose&lt;/li&gt;
&lt;li&gt;access cloud accounts (AWS, Azure, GCP)&lt;/li&gt;
&lt;li&gt;Write technical documentation, in asciidoc, or markdown with various diagrams&lt;/li&gt;
&lt;li&gt;Browse documentation&lt;/li&gt;
&lt;li&gt;Capture notes and TODOs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;My personal laptop, which has pretty much all of the above, with additional &amp;ldquo;fun&amp;rdquo; features:
&lt;ul&gt;
&lt;li&gt;matrix, IRC, mastodon&lt;/li&gt;
&lt;li&gt;video and music streaming&lt;/li&gt;
&lt;li&gt;edit media files&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;software-from-my-system-configuration&#34;&gt;software from my system configuration&lt;/h2&gt;
&lt;p&gt;The following is software part of my system configuration. They are really minimal, and required to get
the system up. Some of these are needed on boot or requires special privileges.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;Guix&lt;/th&gt;
          &lt;th&gt;comments&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;((emacsPackagesFor emacsNativeComp).emacsWithPackages (epkgs: [epkgs.nix-mode]))&lt;/td&gt;
          &lt;td&gt;default emacs + scheme mode&lt;/td&gt;
          &lt;td&gt;this is not my full setup, but a minimal system configuration to be able to edit configuration files. I dont need native comp at the system config&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;libvterm-neovim&lt;/td&gt;
          &lt;td&gt;emacs-vterm&lt;/td&gt;
          &lt;td&gt;in nix, this neovim is the way to get the &amp;ldquo;so&amp;rdquo; for libvterm. useful for emacs vterm&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;nfs-utils&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;mounting nfs&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;git&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;this allows me to access my dotfiles repo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gnumake&lt;/td&gt;
          &lt;td&gt;make&lt;/td&gt;
          &lt;td&gt;my dotfiles need make to launch commands&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;gnupg&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;for smartcard setup&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;pinentry&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;for gpg setup. do I need additional pinentry-* packages?&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lynx&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;decent text web browser&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;surfraw&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;quickly search the web&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;st&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;abandon&lt;/td&gt;
          &lt;td&gt;i&amp;rsquo;ll move this to my home config&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;vim&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;abandon&lt;/td&gt;
          &lt;td&gt;havent opened vim in ages. emacs is my vim&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;wget&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;simple way to download files&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;openvpn&lt;/td&gt;
          &lt;td&gt;=&lt;/td&gt;
          &lt;td&gt;system app&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;networkmanager-openvpn&lt;/td&gt;
          &lt;td&gt;network-manager-openvpn&lt;/td&gt;
          &lt;td&gt;integrates openvpn in network-manager&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;lxqt.lxqt-policykit&lt;/td&gt;
          &lt;td&gt;lxqt-policykit&lt;/td&gt;
          &lt;td&gt;polkit interface. I believe I need it for yk + gpg, but unsure&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;glxinfo&lt;/td&gt;
          &lt;td&gt;mesa-utils&lt;/td&gt;
          &lt;td&gt;describe video 3d capabilities&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;qmk-udev-rules&lt;/td&gt;
          &lt;td&gt;N/A, create config&lt;/td&gt;
          &lt;td&gt;I need to set thes udev rules myself. wondering if this could be a Guix package&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;system-services-enabled&#34;&gt;system services enabled&lt;/h2&gt;
&lt;p&gt;I tend to take a similar approach to software for my services. I usually only have services that are
not good fit for my home configuration.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;hardware.sane w/ airscan backends&lt;/td&gt;
          &lt;td&gt;sane-service-type&lt;/td&gt;
          &lt;td&gt;I use this to setup my scanner with airscan configuration&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.avahi w/ nssmdns&lt;/td&gt;
          &lt;td&gt;avahi-service-type&lt;/td&gt;
          &lt;td&gt;seems doing the same as nix&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.pcscd&lt;/td&gt;
          &lt;td&gt;pcscd-service-type&lt;/td&gt;
          &lt;td&gt;smartcard support (yubikey)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;networking.networkmanager&lt;/td&gt;
          &lt;td&gt;network-manager-service-type&lt;/td&gt;
          &lt;td&gt;this is my go to network configurator&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.gvfs&lt;/td&gt;
          &lt;td&gt;package gvfs&lt;/td&gt;
          &lt;td&gt;usermounts for usb keys. could not find a service. &lt;strong&gt;unclear if i&amp;rsquo;m missing something&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hardware.bluetooth&lt;/td&gt;
          &lt;td&gt;bluetooth-service-type&lt;/td&gt;
          &lt;td&gt;bluetooth service and tools&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.printing&lt;/td&gt;
          &lt;td&gt;cups-service-type&lt;/td&gt;
          &lt;td&gt;cups daemon redirecting to my network printer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.fwupd&lt;/td&gt;
          &lt;td&gt;iptables-service-type&lt;/td&gt;
          &lt;td&gt;not exactly a match, but does the same result&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;virtualisation.docker&lt;/td&gt;
          &lt;td&gt;docker-service-type&lt;/td&gt;
          &lt;td&gt;container daemon&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;sound and hardware.pulseaudio&lt;/td&gt;
          &lt;td&gt;pulseaudio-service-type&lt;/td&gt;
          &lt;td&gt;sound daemon&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;services.xserver display manager&lt;/td&gt;
          &lt;td&gt;sddm-service-type or slim-service-type&lt;/td&gt;
          &lt;td&gt;I may need to modify my dwm package to install an Xsession file&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;other-system-configuration&#34;&gt;Other system configuration&lt;/h2&gt;
&lt;p&gt;Additional configuration found in my nix system configuration.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;nix&lt;/th&gt;
          &lt;th&gt;guix&lt;/th&gt;
          &lt;th&gt;comment&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;hardware.opengl&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;unknown&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;this enable opengl and dri with mesa. not critical early on, but speed up the UI&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;backlight control&lt;/td&gt;
          &lt;td&gt;udev configuration&lt;/td&gt;
          &lt;td&gt;udev rules to enable backlight control for the &lt;code&gt;video&lt;/code&gt; group. maybe I can package this.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;console.useXkbConfig&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;use my X configuration for console too. I dont really use this.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;xkbOptions = &amp;ldquo;ctrl:nocaps&amp;rdquo;&lt;/td&gt;
          &lt;td&gt;set-org-configuration&lt;/td&gt;
          &lt;td&gt;should be able to set this on X11 system config&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;del&gt;synaptics.enable=false&lt;/del&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;disable my touch pad. I do have another way to do this in my home config&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hardware.cpu.intel.updateMicrocode&lt;/td&gt;
          &lt;td&gt;microcode-initrd from nonguix&lt;/td&gt;
          &lt;td&gt;cpu specific microcode updates. even if this is a blob, it contains important fixes and security patches&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;kvm-intel&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;unknown&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;enable kvm kernel for intel&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Some of these config are specific to my intel laptop. may need to be split once I setup for both
work VM and personal desktop.&lt;/p&gt;
&lt;h2 id=&#34;compare-with-my-old-guix-config-for-any-missing-bits&#34;&gt;Compare with my old Guix config for any missing bits&lt;/h2&gt;
&lt;p&gt;Here is my older Guix system &lt;a href=&#34;https://git.sr.ht/~benoit/dotfiles/tree/ff7279069876c1db0d11b2ec08a5ba4020a0b4ca/item/system&#34;&gt;configuration files&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The only thing I&amp;rsquo;ve got in my Guix configurations and not in my Nix setup: openssh server.&lt;/p&gt;
&lt;h2 id=&#34;coming-next&#34;&gt;Coming next&lt;/h2&gt;
&lt;p&gt;I need to do the exact same analysis for my home configuration. I told myself I would not install
Guix before i&amp;rsquo;m done with the preparation.&lt;/p&gt;
&lt;p&gt;Stay tuned!&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Going Back Series - Guix Is Back</title>
      <link>https://blog.benoitj.ca/2023-10-16-going-back-series-guix-is-back/</link>
      <pubDate>Mon, 16 Oct 2023 20:37:07 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-10-16-going-back-series-guix-is-back/</guid>
    <description>&lt;p&gt;It&amp;rsquo;s Guix season again this year, I&amp;rsquo;m going back to Guix Linux.&lt;/p&gt;
&lt;h2 id=&#34;my-current-setup-with-nixos&#34;&gt;My current setup with NixOS&lt;/h2&gt;
&lt;p&gt;Let me start by describing my current NixOS setup:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Configuration for my personal and work use cases&lt;/li&gt;
&lt;li&gt;System configuration for my laptop and a work VM&lt;/li&gt;
&lt;li&gt;Heavy use of home manager to configure and enable tools I need (desktop, coding, terminal, tools,
and more)&lt;/li&gt;
&lt;li&gt;Desktop setup with dwm, st, and many other tools&lt;/li&gt;
&lt;li&gt;Enabled docker and qemu setup&lt;/li&gt;
&lt;li&gt;YubiKey enabled&lt;/li&gt;
&lt;li&gt;frequent use of direnv and nix-shell&lt;/li&gt;
&lt;li&gt;Minimal custom code, beyond my config&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;why-not-go-back-to-guix&#34;&gt;Why not go back to Guix?&lt;/h2&gt;
&lt;p&gt;Ok this time, i&amp;rsquo;m starting with cons.&lt;/p&gt;
&lt;p&gt;Obviously there are two sides to the Guix coin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;m can&amp;rsquo;t get all my work tools from Guix main channel (commercial)&lt;/li&gt;
&lt;li&gt;sometimes versions lag or are missing due to packaging complexity. For example NodeJS was older for some time. Another example is Kondo and Babashka, both tools depend on GraalVM which is almost
impossible to build from source at this point. Guix requires to build from source.&lt;/li&gt;
&lt;li&gt;Smaller user base than Nix, means less packages, less home services&lt;/li&gt;
&lt;li&gt;Default kernel does not support my hardware.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;why-go-back-to-guix-then&#34;&gt;Why go back to Guix then?&lt;/h2&gt;
&lt;p&gt;Some of the key reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I love LISP. What I learn is reusable. Not the same for Nix, the Nix language is only useful for
Nix packages and configuration.&lt;/li&gt;
&lt;li&gt;Many of it&amp;rsquo;s shortcoming are addressed
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gitlab.com/nonguix/nonguix&#34;&gt;Nonguix&lt;/a&gt; has many of my missing software&lt;/li&gt;
&lt;li&gt;Many other missing software are found in the whereiseveryone &lt;a href=&#34;https://toys.whereis.%E3%81%BF%E3%82%93%E3%81%AA/&#34;&gt;toy&lt;/a&gt;&amp;rsquo;s search engine&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m able to create new packages when needed. Got my own &lt;a href=&#34;https://git.sr.ht/~benoit/my-guix-channel&#34;&gt;channel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If I have a urgent need, I still can install them using Guix&amp;rsquo;s &lt;a href=&#34;https://guix.gnu.org/manual/en/html_node/Miscellaneous-Services.html&#34;&gt;nix-service-type&lt;/a&gt; or docker.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://systemcrafters.net/&#34;&gt;System Crafters&lt;/a&gt; great community. I&amp;rsquo;ve been part of this community&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve got to install Guix for a while each year&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-plan&#34;&gt;The plan&lt;/h2&gt;
&lt;p&gt;Ok, what is the plan?&lt;/p&gt;
&lt;h3 id=&#34;objectives&#34;&gt;Objectives&lt;/h3&gt;
&lt;p&gt;First I need to make sure I have the least amount of downtime. I need to get my core desktop (dwm) and Emacs setup within 1 day.&lt;/p&gt;
&lt;p&gt;Get my other missing software from Nonguix or other channels. Anything else provided by nix if possible.&lt;/p&gt;
&lt;p&gt;I also want to document the process with short blog post ofter each day I work on this.&lt;/p&gt;
&lt;h3 id=&#34;steps&#34;&gt;Steps&lt;/h3&gt;
&lt;p&gt;To minimize downtime and work, I will reuse my old Vanily Guix setup. My most recent Guix experience was with RDE, but I&amp;rsquo;m going to skip it for now.&lt;/p&gt;
&lt;p&gt;One of the key first step will be to make an inventory of all the software I use in Nix, and compare
with my Guix setup. I&amp;rsquo;m not too worried by software.&lt;/p&gt;
&lt;p&gt;What will be more challenging is covering all my nix services. Guix does not come with many home
services compared to Nix, I will either have to find missing services somewhere else, write my
own, or just use a plain config to start with.&lt;/p&gt;
&lt;p&gt;No time to waste, the Re-Guix journey begins (again).&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Going Back to Basis</title>
      <link>https://blog.benoitj.ca/2023-10-16-going-back-to-basis/</link>
      <pubDate>Mon, 16 Oct 2023 19:26:46 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2023-10-16-going-back-to-basis/</guid>
    <description>&lt;h2 id=&#34;trying-clojure-blog-generator&#34;&gt;Trying clojure blog generator&lt;/h2&gt;
&lt;p&gt;On my last post, I mentioned I changed my blog setup to cryogen and clojure.&lt;/p&gt;
&lt;p&gt;While it was a mostly successful experiment, I&amp;rsquo;m going to keep it at that, an experiment. Going back
to my hugo / ox-hugo setup.&lt;/p&gt;
&lt;p&gt;My cryogen setup is still available &lt;a href=&#34;https://git.sr.ht/~benoit/blog.benoitj.ca/tree/cljification&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>New blogging setup</title>
      <link>https://blog.benoitj.ca/2022-12-29-new-blogging-setup/</link>
      <pubDate>Thu, 29 Dec 2022 00:02:13 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2022-12-29-new-blogging-setup/</guid>
    <description>&lt;p&gt;If you read this, it means I&amp;rsquo;ve moved away from hugo, to a fully custom clojure blogging setup.&lt;/p&gt;
&lt;p&gt;The whole setup achieves pretty much the same features I had with hugo, with barely more than 100 lines of code.&lt;/p&gt;
&lt;p&gt;You can read the code &lt;a href=&#34;https://git.sr.ht/~benoit/blog.benoitj.ca/tree/cljification&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The setup is roughly 100 lines of code that use asciidoctorj, selmer templates, and clojure maps.&lt;/p&gt;
&lt;p&gt;I tried to maintain the similar features as before:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;simple markup (asciidoc)&lt;/li&gt;
&lt;li&gt;CSS support&lt;/li&gt;
&lt;li&gt;able to generate diagrams out of plantuml or other diagram markup language&lt;/li&gt;
&lt;li&gt;keep my older page location working while building a new structure&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you see any issues, let me know, this is freshly brewed :)&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Seeking a Hugo Blog Replacement</title>
      <link>https://blog.benoitj.ca/2022-12-15-seeking-a-hugo-blog-replacement/</link>
      <pubDate>Thu, 15 Dec 2022 06:07:25 -0500</pubDate>
      
      <guid>https://blog.benoitj.ca/2022-12-15-seeking-a-hugo-blog-replacement/</guid>
    <description>&lt;h2 id=&#34;the-path-to-replace-hugo-dot&#34;&gt;The path to replace Hugo.&lt;/h2&gt;
&lt;p&gt;My current blog setup always worried me a bit due to the complexity it has.&lt;/p&gt;
&lt;p&gt;I write org-mode files, that are then exported to Hugo markdown file with the help of the great package ox-hugo, and these markdown are then converted by hugo to HTML and RSS.&lt;/p&gt;
&lt;p&gt;That process works and is quite stable, yet, introduce complexity to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;understand how ox-hugo works&lt;/li&gt;
&lt;li&gt;understand how Hugo generates it&amp;rsquo;s files&lt;/li&gt;
&lt;li&gt;understand how to extend Hugo for my theme&lt;/li&gt;
&lt;li&gt;understand the mapping between org-mode and the generated files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is stable so I had little incentive to fix this complexity until now.&lt;/p&gt;
&lt;h2 id=&#34;clojure-is-my-new-hammer&#34;&gt;Clojure is my new hammer&lt;/h2&gt;
&lt;p&gt;Some &amp;ldquo;events&amp;rdquo; happened that made me consider replacing Hugo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;With all the fun I&amp;rsquo;ve been having using Clojure, I decided Clojure to be my hammer until I understand what it&amp;rsquo;s bad for.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;ve completed 10ish days of AdventOfCode using Clojure and babashka (Clojure scripting)&lt;/li&gt;
&lt;li&gt;Then I stumble upon (well I searched for it) some post mentioning &lt;a href=&#34;https://cryogenweb.org/index.html&#34;&gt;cryogen&lt;/a&gt;, and then I found borkdude&amp;rsquo;s quickblog related posts (&lt;a href=&#34;https://blog.michielborkent.nl/migrating-octopress-to-babashka.html&#34;&gt;post1&lt;/a&gt;, &lt;a href=&#34;https://blog.michielborkent.nl/markdown-clj-babashka-compatible.html&#34;&gt;post2&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of this made me think that replacing Hugo with babashka is a brilliant idea.&lt;/p&gt;
&lt;p&gt;After all, an org file is &lt;strong&gt;DATA&lt;/strong&gt; :D&lt;/p&gt;
&lt;h2 id=&#34;the-plan&#34;&gt;The plan&lt;/h2&gt;
&lt;p&gt;I write this hopefully using Hugo for the last time.&lt;/p&gt;
&lt;p&gt;Here are some of the objectives:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;keep things simple&lt;/li&gt;
&lt;li&gt;either keep org-mode, or use asciidoc
&lt;ol&gt;
&lt;li&gt;org-mode is more and outliner than a markup language. Rendering/export requires emacs org export modules.&lt;/li&gt;
&lt;li&gt;asciidoc is standard, has all the documentation features of org-mode, has good clojure/java integration with asciidoctorj, has a lesser editing mode than org-mode.&lt;/li&gt;
&lt;li&gt;avoid markdown at all cost due to the need for extensions, but yet, no good standard.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;reduce steps and necessity of having an intermediate step to generate my site. I want to get rid of the middle component in: org-mode -&amp;gt; markdown (or some markup) -&amp;gt; HTML/RSS&lt;/li&gt;
&lt;li&gt;leverage babashka so I can build my blog using CI tool without needing to install Emacs. My blog is built by sourcehut&amp;rsquo;s build engine.&lt;/li&gt;
&lt;li&gt;learn more about solving practical problems with Clojure&lt;/li&gt;
&lt;li&gt;gain full control on the generation of the HTML and CSS&lt;/li&gt;
&lt;li&gt;keep my clean semantic HTML5 generation and my current CSS&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Non-goal:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;write another minor mode like &amp;ldquo;ox-hugo&amp;rdquo;&lt;/li&gt;
&lt;li&gt;modify my Emacs configuration&lt;/li&gt;
&lt;li&gt;keep org-mode at all cost&lt;/li&gt;
&lt;/ol&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>RSS Exclusive - 2022w50 What Kept Me Busy This Year</title>
      <link>https://blog.benoitj.ca/2022-12-14-2022w50-what-kept-me-busy-this-year/</link>
      <pubDate>Wed, 14 Dec 2022 21:59:24 -0500</pubDate>
      
      <guid>https://blog.benoitj.ca/2022-12-14-2022w50-what-kept-me-busy-this-year/</guid>
    <description>&lt;p&gt;Pssst - this is a RSS only post. Please keep it secret.&lt;br/&gt;Read more about RSS Club: https://daverupert.com/rss-club/&lt;/p&gt;&lt;hr/&gt;&lt;h2 id=&#34;got-busy-this-year&#34;&gt;Got busy this year&lt;/h2&gt;
&lt;p&gt;This will be a short post, but I&amp;rsquo;ve been busy this year.&lt;/p&gt;
&lt;p&gt;The main reasons i&amp;rsquo;ve not posted in a while are due to personal events and all the efforts I spent with home improvement (also known as house crafting).&lt;/p&gt;
&lt;p&gt;Will focus on &amp;ldquo;crafter&amp;rdquo; stuff.&lt;/p&gt;
&lt;h2 id=&#34;technology-and-work&#34;&gt;Technology and Work&lt;/h2&gt;
&lt;p&gt;This year has been quite interesting in terms of technology, and coaching:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I started 2 projects&lt;/li&gt;
&lt;li&gt;I kept an internal project alive&lt;/li&gt;
&lt;li&gt;I now mentor 7 software architects (the kind that code)&lt;/li&gt;
&lt;li&gt;couple of pre-sales&lt;/li&gt;
&lt;li&gt;couple of practice activities, RACI with our PMO office, some security stuff&lt;/li&gt;
&lt;li&gt;and a lot more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next year should be a transition year for me, with more coaching. lets see.&lt;/p&gt;
&lt;h3 id=&#34;learning&#34;&gt;Learning&lt;/h3&gt;
&lt;p&gt;Couple of the things I learned this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kafka (I know many of the patterns, but used it for the first time)&lt;/li&gt;
&lt;li&gt;Lot of integration work done with Spring Integration&lt;/li&gt;
&lt;li&gt;A lot more of Clojure
This is now drastically affecting the way I code in any language, FP or OO.&lt;/li&gt;
&lt;li&gt;New business area (Natural and organic food distribution)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;coming-next&#34;&gt;coming next&lt;/h3&gt;
&lt;p&gt;Few things on my plate next year:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A lot more clojure, I may actually create my next post using clojure.&lt;/li&gt;
&lt;li&gt;A lot more coaching at work.&lt;/li&gt;
&lt;li&gt;New projects i&amp;rsquo;m not aware of at this moment&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;house-crafting&#34;&gt;House crafting&lt;/h2&gt;
&lt;p&gt;A lot has been going on this year in this area.&lt;/p&gt;
&lt;p&gt;One of our main objective is to complete most of the house repair and improvement ASAP.&lt;/p&gt;
&lt;p&gt;My own personal objective is to get it done sometime in 2023.&lt;/p&gt;
&lt;h3 id=&#34;the-office&#34;&gt;The Office&lt;/h3&gt;
&lt;p&gt;This year, and due to the pandemic and the &amp;ldquo;work from home&amp;rdquo; challenges, 8 months was spent building a new office from the ground up. A lot of challenges was also included&lt;/p&gt;
&lt;p&gt;Here are some of the key criteria for my new Office:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;use space in our house we do not use well, yet, not use any of the rooms we currently have (they are all occupied).&lt;/li&gt;
&lt;li&gt;must be closed with a door&lt;/li&gt;
&lt;li&gt;more important than a door, must be soundproofed, not so much for me, but for other occupants that are living in this house and suffer from me speaking all day on voice chat.&lt;/li&gt;
&lt;li&gt;needs to be fully finished so that I can move my work and personal computers&lt;/li&gt;
&lt;li&gt;can&amp;rsquo;t start a new house crafting project before this one is done&lt;/li&gt;
&lt;li&gt;fix all the stuff that needs to be fixed where I build this office&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We settled to a space in the middle of the house, which we dont use beside to go from one living room to a bedroom.&lt;/p&gt;
&lt;p&gt;Here are some things that had to be fixed or completed prior to raising news walls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fix a leak I thought was coming from a foundation crack. This happened to be my drain pipe cracked over 8 feet long.&lt;/li&gt;
&lt;li&gt;fix a foundation crack&lt;/li&gt;
&lt;li&gt;insulate a exterior wall&lt;/li&gt;
&lt;li&gt;move water supply pipes to a reachable area&lt;/li&gt;
&lt;li&gt;install a 30 amp power cable to the pool heatpump&lt;/li&gt;
&lt;li&gt;replace the dangerous electric panel&lt;/li&gt;
&lt;li&gt;move a lot of power outlets, switches, light fixtures to accomodate the new room I&amp;rsquo;m building&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The office itself is just the right size, 8&amp;rsquo; by 12&amp;rsquo;. It&amp;rsquo;s made of 2x6 walls with 2x4 studs staggered, insulation, sonopan, and multiple layers of 5/8 drywall, a solid wood door, and acoustic ceiling, and more.&lt;/p&gt;
&lt;h3 id=&#34;fixing-stuff-in-my-kids-rooms&#34;&gt;Fixing stuff in my kids rooms&lt;/h3&gt;
&lt;p&gt;This one was simple, yet took me more than 1 month to complete. I had to repair one wall in each room due to previous unfinished repairs / project started years ago (contradicting our high level objectives :D). So mudding, replacing defecting convection heaters, painting, installing trims (another incomplete past improvement).&lt;/p&gt;
&lt;p&gt;As of today, we&amp;rsquo;re only left to paint the trims (next weekend).&lt;/p&gt;
&lt;h3 id=&#34;what-is-coming-next&#34;&gt;What is coming next&lt;/h3&gt;
&lt;p&gt;Few things on my plate next year:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Creating a bathroom in a place you cant call a bathroom anymore, and where everything is leaking, and is unusable for few years.&lt;/li&gt;
&lt;li&gt;Fixing a concrete balcony&lt;/li&gt;
&lt;li&gt;Fixing a paver pathway&lt;/li&gt;
&lt;li&gt;More paint&lt;/li&gt;
&lt;li&gt;Continue learning and crafting anything and everything.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;closing-thoughts&#34;&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;I really like the fact that this post is only for anyone using RSS. I dont see this as quality content, but more about a slice of my life.&lt;/p&gt;
&lt;p&gt;Some of the post ideas I have on my list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;clojure posts&lt;/li&gt;
&lt;li&gt;coding posts&lt;/li&gt;
&lt;li&gt;house crafting past projects, and current projects&lt;/li&gt;
&lt;li&gt;more of this RSS only posts&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Not sure if I&amp;rsquo;ll be able to post again this year, If not, have a happy New Year and see you next year!&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>RSS Exclusive - 2021w50 - Weekly Summary</title>
      <link>https://blog.benoitj.ca/2021-12-17-2021w50-weekly-summary/</link>
      <pubDate>Fri, 17 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>https://blog.benoitj.ca/2021-12-17-2021w50-weekly-summary/</guid>
    <description>&lt;p&gt;Pssst - this is a RSS only post. Please keep it secret.&lt;br/&gt;Read more about RSS Club: https://daverupert.com/rss-club/&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;For a while I&amp;rsquo;ve been thinking of capturing thoughts / experiences regularly.&lt;/p&gt;
&lt;p&gt;You will find thoughts related to my work, my passions, and my life.&lt;/p&gt;
&lt;h2 id=&#34;work-great-managers-are-good-partners-with-their-employees&#34;&gt;Work - Great managers are good partners with their employees&lt;/h2&gt;
&lt;p&gt;Having a great manager is important. One that will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;create winning conditions&lt;/li&gt;
&lt;li&gt;help you grow&lt;/li&gt;
&lt;li&gt;support you when needed&lt;/li&gt;
&lt;li&gt;let you alone when you dont need anything&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I will never work again with (not for) a bad manager.&lt;/p&gt;
&lt;h2 id=&#34;it&#34;&gt;IT&lt;/h2&gt;
&lt;h3 id=&#34;learning-oauth2-w-rsa-certificate-authentication&#34;&gt;Learning - OAUTH2 w/ RSA certificate authentication&lt;/h3&gt;
&lt;p&gt;Been experimenting with RSA based OAUTH token generation.&lt;/p&gt;
&lt;p&gt;The process is done this way:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;you encode headers with RS256 type&lt;/li&gt;
&lt;li&gt;you create json data containing a really short experiration, the necessary audience&lt;/li&gt;
&lt;li&gt;base64 url encode both the header and data&lt;/li&gt;
&lt;li&gt;your token is the encoded header.data&lt;/li&gt;
&lt;li&gt;RSA sign the token and base64 url encode the hash&lt;/li&gt;
&lt;li&gt;the signedJwtToken is comprised of base65 url encoded headers.data.signature&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;During testing, this process is relatively simple, but is tedious.&lt;/p&gt;
&lt;p&gt;This can be achieved by implementing pre-scripts in postman, or shell scripts&lt;/p&gt;
&lt;p&gt;Some findings:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://joolfe.github.io/postman-util-lib/&#34;&gt;https://joolfe.github.io/postman-util-lib/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/questions/49371771/postman-rsa-encryption/59338473#59338473&#34;&gt;https://stackoverflow.com/questions/49371771/postman-rsa-encryption/59338473#59338473&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://stackoverflow.com/questions/53965446/how-to-sign-a-jwt-with-a-private-key-pem-in-cryptojs&#34;&gt;https://stackoverflow.com/questions/53965446/how-to-sign-a-jwt-with-a-private-key-pem-in-cryptojs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using jsrsasign-js&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; navigator = {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#0aa&#34;&gt;window&lt;/span&gt; = {};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;eval&lt;/span&gt;(pm.globals.get(&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;jsrsasign-js&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;function&lt;/span&gt; addIAT(request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; iat = &lt;span style=&#34;color:#0aa&#34;&gt;Math&lt;/span&gt;.floor(&lt;span style=&#34;color:#0aa&#34;&gt;Date&lt;/span&gt;.now() / &lt;span style=&#34;color:#099&#34;&gt;1000&lt;/span&gt;) + &lt;span style=&#34;color:#099&#34;&gt;257&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data.iat = iat;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#00a&#34;&gt;return&lt;/span&gt; data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; header = {&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;alg&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;RS256&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;typ&amp;#34;&lt;/span&gt; : &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;JWT&amp;#34;&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; data = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;fname&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;lname&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;email&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;email@domain.com&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;password&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;abc123$&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;data = addIAT(data);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; privateKey = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;-----BEGIN RSA PRIVATE KEY----- \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;MIIBOQIBAAJAcrqH0L91/j8sglOeroGyuKr1ABvTkZj0ATLBcvsA91/C7fipAsOn\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;RqRPZr4Ja+MCx0Qvdc6JKXa5tSb51bNwxwIDAQABAkBPzI5LE+DuRuKeg6sLlgrJ\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;h5+Bw9kUnF6btsH3R78UUANOk0gGlu9yUkYKUkT0SC9c6HDEKpSqILAUsXdx6SOB\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;AiEA1FbR++FJ56CEw1BiP7l1drM9Mr1UVvUp8W71IsoZb1MCIQCKUafDLg+vPj1s\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;HiEdrPZ3pvzvteXLSuniH15AKHEuPQIhAIsgB519UysMpXBDbtxJ64jGj8Z6/pOr\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;NrwV80/EEz45AiBlgTLZ2w2LjuNIWnv26R0eBZ+M0jHGlD06wcZK0uLsCQIgT1kC\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;uNcDTERjwEbFKJpXC8zTLSPcaEOlbiriIKMnpNw=\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;-----END RSA PRIVATE KEY-----&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; sHeader = JSON.stringify(header);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; sPayload = JSON.stringify(data);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;var&lt;/span&gt; sJWT = KJUR.jws.JWS.sign(header.alg, sHeader, sPayload, privateKey);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pm.variables.set(&lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;token&amp;#39;&lt;/span&gt;, sJWT);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;emacs-towards-stability&#34;&gt;Emacs - towards stability&lt;/h3&gt;
&lt;h4 id=&#34;project-dot-el&#34;&gt;project.el&lt;/h4&gt;
&lt;p&gt;my project.el setup broke. still trying to fix it.&lt;/p&gt;
&lt;h4 id=&#34;intellij-emacs&#34;&gt;IntelliJ -&amp;gt; Emacs&lt;/h4&gt;
&lt;p&gt;Continue the IntelliJ -&amp;gt; Emacs research. More details soon.&lt;/p&gt;
&lt;h3 id=&#34;nixos-home-manager-goimapnotify&#34;&gt;nixos - home-manager - goimapnotify&lt;/h3&gt;
&lt;p&gt;My main work involve fixing goimapnotify setup with nix and home-manager.&lt;/p&gt;
&lt;p&gt;So far, something is wrong with the config it generates. It seems to be related to single quoting and the password command parameter. When removing the single quotes, my script works.&lt;/p&gt;
&lt;h3 id=&#34;pictures-share&#34;&gt;Pictures - share&lt;/h3&gt;
&lt;p&gt;Configured a network share for our pictures. This will allow us to sort, and organize pictures we&amp;rsquo;ve been collected for the last 20 years.&lt;/p&gt;
&lt;p&gt;The setup involve:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;TrueNAS&lt;/li&gt;
&lt;li&gt;Samba share&lt;/li&gt;
&lt;li&gt;New accounts setup on the NAS&lt;/li&gt;
&lt;li&gt;Moving all to that share&lt;/li&gt;
&lt;li&gt;Create a 00_inbox folder for things to process&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;home-improvements&#34;&gt;home improvements&lt;/h2&gt;
&lt;p&gt;This week&amp;rsquo;s plan is the same as last week. I needed to procrastinate :)&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;m still going to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;finish some plastering / painting touch-ups.&lt;/li&gt;
&lt;li&gt;start planning the construction of my new office.&lt;/li&gt;
&lt;/ol&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>RSS Exclusive - 2021w49 - Weekly Summary</title>
      <link>https://blog.benoitj.ca/2021-12-10-2021w49-weekly-summary/</link>
      <pubDate>Fri, 10 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>https://blog.benoitj.ca/2021-12-10-2021w49-weekly-summary/</guid>
    <description>&lt;p&gt;Pssst - this is a RSS only post. Please keep it secret.&lt;br/&gt;Read more about RSS Club: https://daverupert.com/rss-club/&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;For a while I&amp;rsquo;ve been thinking of capturing thoughts / experiences regularly.&lt;/p&gt;
&lt;p&gt;You will find thoughts related to my work, my passions, and my life.&lt;/p&gt;
&lt;h2 id=&#34;work-new-project&#34;&gt;work - new project&lt;/h2&gt;
&lt;p&gt;Last week I joined a long running project.&lt;/p&gt;
&lt;p&gt;Couple of thoughts from this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Most of challenges are related to organization, and processes&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s really hard to get in context when no having access to code, tools, information.
&lt;ul&gt;
&lt;li&gt;it&amp;rsquo;s like watching a twitch stream for 8-9 hours per day&lt;/li&gt;
&lt;li&gt;it&amp;rsquo;s like coding by looking at the key hole&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;This team is awesome. They are skilled, and easy to work with.&lt;/li&gt;
&lt;li&gt;The tools&amp;hellip; Locked down, super limited. Not ideal.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;work-lots-of-industries-impose-tools-to-their-developers&#34;&gt;work - Lots of industries impose tools to their developers&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m getting tired of getting all my tools imposed on me. There is a context to it, but it does not make it much easier to digest.&lt;/p&gt;
&lt;p&gt;Here I&amp;rsquo;m talking primarily about my hope to use Linux, and Emacs at work.&lt;/p&gt;
&lt;p&gt;This is harder when working for a consulting firm, where there are many layers of decision makers, and it&amp;rsquo;s a constant beginning every x months.&lt;/p&gt;
&lt;h2 id=&#34;object-mother-test-design-pattern-using-a-factory&#34;&gt;Object Mother test design pattern using a factory&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://martinfowler.com/bliki/ObjectMother.html&#34;&gt;Object Mother&lt;/a&gt; pattern is great as a way to create your test fixture. Especially for complex domain objects.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve successfully implemented it in the past by combining it with the builder pattern. It made it really nice and fluent.&lt;/p&gt;
&lt;p&gt;This week, I&amp;rsquo;ve seen it implemented as an abstract factory. I think the builder approach works better.&lt;/p&gt;
&lt;h2 id=&#34;lombok-is-over-appreciated&#34;&gt;lombok is over appreciated&lt;/h2&gt;
&lt;p&gt;This library manipulates byte code and inject changes in your Java classes. Some features it brings are related to created accessors, builders, etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;Couple of things overlooked when including lombok in a tech stack:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;# of active contributors (roughly 4)&lt;/li&gt;
&lt;li&gt;# of bugs (732 open bugs)&lt;/li&gt;
&lt;li&gt;risk of breaking in the future
manipulating byte-code is and will break in many major revisions&lt;/li&gt;
&lt;li&gt;conflict with other libraries and the JVM runtime
in some scenarios, manipulating byte-code can impact dynamic proxies, transactions, AOP matchers, etc..
I experienced some issues in the past between Lombok and H2 DB.&lt;/li&gt;
&lt;li&gt;troubleshooting
since lombok is byte-code without actual source code, it&amp;rsquo;s harder to troubleshoot issues.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is quite a long list of risks for a simple set of features.&lt;/p&gt;
&lt;p&gt;There are other alternatives to lombok:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;for getters / setters: just use the IDE to generate your accessors&lt;/li&gt;
&lt;li&gt;builder: snippets to generate actual builders. some IDEs does it. or get a builder generator that creates java code in target/generated-sources&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At this point, you may have guessed I never use lombok unless it&amp;rsquo;s already in our client&amp;rsquo;s code.&lt;/p&gt;
&lt;h2 id=&#34;changes-to-my-career-plan&#34;&gt;Changes to my career plan&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m tired of OO, statically typed languages and tools I need to use at work. (reasons may be explained in later posts)&lt;/p&gt;
&lt;p&gt;My career goals are to continue building awesome piece of software using the tools and language I like.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to focus my learning on Clojure and Javascript/NodeJS to be ready when the time is right.&lt;/p&gt;
&lt;h2 id=&#34;benlab&#34;&gt;benlab&lt;/h2&gt;
&lt;p&gt;This week has been quite active in this area:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;setting up mail / gpg with nix home-manager&lt;/li&gt;
&lt;li&gt;started to plan how to setup Emacs as a replacement for IntelliJ for Java dev
started playing with lsp-mode&lt;/li&gt;
&lt;li&gt;Refactoring of the way I deal with my git repositories
setup group of repos: private, public, contrib, and others.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;my-public-repos&#34;&gt;my public repos&lt;/h3&gt;
&lt;p&gt;These are all my public repositories where I&amp;rsquo;m the only contributor.&lt;/p&gt;
&lt;p&gt;New strategy is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;origin will be pointing to sr.ht&lt;/li&gt;
&lt;li&gt;mirror will be pointing to github&lt;/li&gt;
&lt;li&gt;setup myrepo to push to both remotes&lt;/li&gt;
&lt;li&gt;no additional remotes (no upstream)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;my-private-repos&#34;&gt;my private repos&lt;/h3&gt;
&lt;p&gt;These contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;project details&lt;/li&gt;
&lt;li&gt;stuff not ready to share&lt;/li&gt;
&lt;li&gt;private information&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;New strategy is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;origin points to my own private git server on my nas&lt;/li&gt;
&lt;li&gt;no other remotes&lt;/li&gt;
&lt;li&gt;checks to make sure remotes dont change or point to public repositories&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;home-improvements&#34;&gt;home improvements&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been renovating my old house for many years. I usually do everything myself.&lt;/p&gt;
&lt;p&gt;This week, I&amp;rsquo;m planning:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;finish some plastering / painting touch-ups.&lt;/li&gt;
&lt;li&gt;start planning the construction of my new office.&lt;/li&gt;
&lt;/ol&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>IntelliJ to Emacs - part 1 - The Plan</title>
      <link>https://blog.benoitj.ca/2021-12-10-intellij-to-emacs-part1-the-plan/</link>
      <pubDate>Fri, 10 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>https://blog.benoitj.ca/2021-12-10-intellij-to-emacs-part1-the-plan/</guid>
    <description>&lt;h2 id=&#34;a-bit-of-my-history-with-editors-and-ides&#34;&gt;A bit of my history with editors and IDEs&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been using Emacs and vim since the mid 90s. First for C/C++, then Java. Java has been my primary language since then.&lt;/p&gt;
&lt;p&gt;At that time, I really used Emacs as an unmodified editor, not as a custom tool. Using Makefiles, and search/replace to do most of my work.&lt;/p&gt;
&lt;h3 id=&#34;eclipse&#34;&gt;Eclipse&lt;/h3&gt;
&lt;p&gt;Around 2005, I made the switch to Eclipse IDE for my Java coding. Main advantages at the time was navigation, runners, debugger, refactoring and code actions.
Eclipse was (and still is) a good IDE for Java coding, but a bad editor.&lt;/p&gt;
&lt;p&gt;Some issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lots of modal behavior when doing many operations&lt;/li&gt;
&lt;li&gt;freezes constantly on such modal operations. You think Emacs freezes, you havent seen Eclipse&lt;/li&gt;
&lt;li&gt;Made for the mouse. It has many shortcuts to trigger actions, but any actions that needs user input will require the mouse.&lt;/li&gt;
&lt;li&gt;Somewhat hard to extend. Requires to create a whole project, including a build script, generate an jar. All this to do simple things.&lt;/li&gt;
&lt;li&gt;configuration hard to maintain&lt;/li&gt;
&lt;li&gt;mostly prepackaged solution, that support plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;intellij&#34;&gt;IntelliJ&lt;/h3&gt;
&lt;p&gt;In the past 5-6 years, I&amp;rsquo;ve been using IntelliJ. Main advantages over Eclipse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;locks less. operations are not modal&lt;/li&gt;
&lt;li&gt;a bit more reactive when editing code than Eclipse&lt;/li&gt;
&lt;li&gt;better snippets&lt;/li&gt;
&lt;li&gt;configuration can be synched on the cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some issues I&amp;rsquo;ve seen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2020-2021 was really bad. they made couple of releases that just made things really slow, hanging, or out of sync.&lt;/li&gt;
&lt;li&gt;not easier to extend&lt;/li&gt;
&lt;li&gt;mostly prepackaged solution, that support plugins&lt;/li&gt;
&lt;li&gt;paid solution, while it&amp;rsquo;s not really a big deal, it makes it more difficult when changing clients, or for new coders on the team. Here it&amp;rsquo;s more about delays.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;eclim-and-other-similar-modes&#34;&gt;eclim, and other similar modes&lt;/h3&gt;
&lt;p&gt;I tried couple of modes that tried to bring Java to Emacs. Most of the time, basic features were missing, are not supporting new Java versions, or are unstable.&lt;/p&gt;
&lt;h2 id=&#34;the-ultimate-goal-code-java-in-emacs&#34;&gt;The Ultimate goal: Code Java in Emacs&lt;/h2&gt;
&lt;p&gt;With lsp-mode, my dream come true: doing all my coding in Emacs.&lt;/p&gt;
&lt;p&gt;As mentionned earlier, Eclipse is a good IDE, but not a good editor. With the development made by lsp-mode, I can now hope to bring the IDE features of Eclipse within Emacs.&lt;/p&gt;
&lt;h2 id=&#34;the-plan&#34;&gt;The Plan&lt;/h2&gt;
&lt;p&gt;Over the course of next year, I will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;document all the features I use daily in IntelliJ&lt;/li&gt;
&lt;li&gt;categorize them&lt;/li&gt;
&lt;li&gt;find how to do something similar in Emacs, lsp-mode, or other modes&lt;/li&gt;
&lt;li&gt;post regularly my progress&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;editing-features-i-m-looking-for&#34;&gt;Editing features I&amp;rsquo;m looking for&lt;/h2&gt;
&lt;p&gt;Here are the categories I have in mind at this point:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Basic editing features
&lt;ol&gt;
&lt;li&gt;import management&lt;/li&gt;
&lt;li&gt;code formatting&lt;/li&gt;
&lt;li&gt;Search/Replace&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;li&gt;Linting&lt;/li&gt;
&lt;li&gt;code actions&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Builds
&lt;ol&gt;
&lt;li&gt;Managing dependencies&lt;/li&gt;
&lt;li&gt;Open dependencies documentation and sources&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Runners &amp;amp;&amp;amp; Debugger&lt;/li&gt;
&lt;li&gt;Integration with frameworks
&lt;ol&gt;
&lt;li&gt;Spring beans&lt;/li&gt;
&lt;li&gt;spring integration&lt;/li&gt;
&lt;li&gt;spring data&lt;/li&gt;
&lt;li&gt;spring initializer&lt;/li&gt;
&lt;li&gt;Hibernate / JPA&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Other supporting tools
&lt;ol&gt;
&lt;li&gt;REST Client&lt;/li&gt;
&lt;li&gt;Database client&lt;/li&gt;
&lt;li&gt;JSON/XML editing&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>The last 12 months</title>
      <link>https://blog.benoitj.ca/2021-11-10-the-last-12-months/</link>
      <pubDate>Wed, 10 Nov 2021 01:08:08 -0500</pubDate>
      
      <guid>https://blog.benoitj.ca/2021-11-10-the-last-12-months/</guid>
    <description>&lt;h2 id=&#34;blog-silent&#34;&gt;Blog silent&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been blog silent for almost a year now.&lt;/p&gt;
&lt;p&gt;This blog post is my attempt to capture what I&amp;rsquo;ve been doing,
currently doing and will be doing.&lt;/p&gt;
&lt;p&gt;TLDR: most of the last 12 months spent working on my house, working on many
client&amp;rsquo;s projects, coaching, and learning.&lt;/p&gt;
&lt;h2 id=&#34;personal&#34;&gt;Personal&lt;/h2&gt;
&lt;p&gt;The last 3 years has been a bumpy road in my family. Covid and the
restrictions that came with it did not make things simpler.&lt;/p&gt;
&lt;p&gt;It made me realize how important my family is to me and that life is
not a straight line, we need to adjust constantly.&lt;/p&gt;
&lt;p&gt;We all had to adjust to being all together in the house, all
day. Kids, wife and me.&lt;/p&gt;
&lt;p&gt;Another adjustment, we started home schooling one of my kid mid
year. I also started teaching one of my kid how to code.&lt;/p&gt;
&lt;p&gt;We found new ways to have fun in family. We&amp;rsquo;re now enjoying every bit of somewhat normality.&lt;/p&gt;
&lt;h2 id=&#34;work-and-it&#34;&gt;Work and IT&lt;/h2&gt;
&lt;h3 id=&#34;work-from-home&#34;&gt;work from home&lt;/h3&gt;
&lt;p&gt;I work in IT, and obviously worked from home since February 2020. At
least I have a job.&lt;/p&gt;
&lt;p&gt;The worst of all was during last winter, it was cold, dark, isolated
and confined to a repurposed utility room in an office.&lt;/p&gt;
&lt;p&gt;I work, and lead teams, meaning I&amp;rsquo;m often on the phone, helping,
coaching. The whole family realized that too due to poor sound proof
of the room. I tried many things, but this room is far from ideal.&lt;/p&gt;
&lt;p&gt;Due to this reason, I setup a temporary office at my parents place (my
old room), upgraded the internet. This actually worked quite well,
bringing peace back in the house.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been adjusting to working remote full time now, and do not look
back. I realized how much energy get lost in 15 hours of weekly
commute. My employer has announced hybrid work even before Covid
restrictions are dropped. They will leave it to the employees to
decide if they want to come. They also downsized the office to a big
extend already, so it&amp;rsquo;s there to stay.&lt;/p&gt;
&lt;h3 id=&#34;what-s-coming-sustainability-coaching-and-helping-others&#34;&gt;what&amp;rsquo;s coming: sustainability, coaching and helping others&lt;/h3&gt;
&lt;p&gt;the IT world has been in unsustainable expansion in 2020-2021. So much
demand, that &amp;ldquo;experienced&amp;rdquo; coders are less experienced than ever. Just
recently, I got a proposal to move away from client projects, and
help, coach less experienced coders using a mix of discussions,
internal projects that brings value to the organization. This is not a
&amp;ldquo;no tech&amp;rdquo; title, I code more than ever. This is still quite new,
possibly more to come in future blog posts.&lt;/p&gt;
&lt;h2 id=&#34;it-community&#34;&gt;IT / community&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve meet a great team of different/like minded community built by
David Wilson at System Crafters. Made me learn stuff, help others, and
rediscover IRC. I also discovered awesome people like David, Kartinks,
Acdw, Fade, AlphaPapa, TitanOfOld, and many more.&lt;/p&gt;
&lt;h2 id=&#34;home&#34;&gt;Home&lt;/h2&gt;
&lt;p&gt;As earlier introduced, a lot of my (free) time has been spent around
the house, so what else can I do other than starting/finishing house
projects I planned to do, but never had the time or energy to start or
complete them.&lt;/p&gt;
&lt;p&gt;Here is a list of projects I&amp;rsquo;ve done over the last 8 months:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;sanding / refinishing oak floors&lt;/li&gt;
&lt;li&gt;plastering, painting walls&lt;/li&gt;
&lt;li&gt;new trims and baseboards&lt;/li&gt;
&lt;li&gt;installed new doors&lt;/li&gt;
&lt;li&gt;new tiles in the house entrance&lt;/li&gt;
&lt;li&gt;pool deck&lt;/li&gt;
&lt;li&gt;stairs and rails in the backyard exit&lt;/li&gt;
&lt;li&gt;concrete repair&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My next project is to build a small office, soundproofed
obviously. Construction started last week.&lt;/p&gt;
&lt;h2 id=&#34;future-posts&#34;&gt;Future posts?&lt;/h2&gt;
&lt;p&gt;here are some of the subjects I have plans for future blog posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Moving from IntelliJ to Emacs/LSP for java development&lt;/li&gt;
&lt;li&gt;Various coding posts&lt;/li&gt;
&lt;li&gt;Home Crafter&amp;rsquo;s version of: The Office&lt;/li&gt;
&lt;li&gt;New posts around my evolving work setup&lt;/li&gt;
&lt;li&gt;What ever else happens in my life that I want to talk about&lt;/li&gt;
&lt;/ol&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>RSS Exclusive - Proof it&#39;s Always a Good Time to Take Vacation</title>
      <link>https://blog.benoitj.ca/2020-12-24-proof-its-always-a-good-time-to-take-vacation/</link>
      <pubDate>Thu, 24 Dec 2020 10:18:14 -0500</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-12-24-proof-its-always-a-good-time-to-take-vacation/</guid>
    <description>&lt;p&gt;Pssst - this is a RSS only post. Please keep it secret.&lt;br/&gt;Read more about RSS Club: https://daverupert.com/rss-club/&lt;/p&gt;&lt;hr/&gt;&lt;h2 id=&#34;no-matter-what-managers-or-you-think&#34;&gt;No matter what managers or you think&lt;/h2&gt;
&lt;p&gt;No matter what managers or you think, work is never a good reason to wait for your vacation!&lt;/p&gt;
&lt;p&gt;And I can prove it!&lt;/p&gt;
&lt;h2 id=&#34;the-proof&#34;&gt;The proof&lt;/h2&gt;
&lt;p&gt;Lets start with some facts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;vacation is good for you, for your mental health&lt;/li&gt;
&lt;li&gt;vacation is good for your employer, a well rested person is more likely to be motivated, and more productive&lt;/li&gt;
&lt;li&gt;we are smart and can plan some time ahead&lt;/li&gt;
&lt;li&gt;In many places, you loose rights to vacation each year, sometimes above a threshold. Yeah, they may pay you instead. But at one point, money has less benefit than facts 1 and 2&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Impediments to take your vacation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;you. sometimes we are our own impediment to take vacation&lt;/li&gt;
&lt;li&gt;in some jobs, it&amp;rsquo;s seems like it&amp;rsquo;s never a good time to take vacation. There is always something coming up&lt;/li&gt;
&lt;li&gt;Some managers constantly ask you to move your vacation, or skip it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now the proof:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;managers that ask you to constantly make compromise only think about short term $$, has poor planning ability, and does not think about long term sustainability. I certainly would not trust that manager.&lt;/li&gt;
&lt;li&gt;If it&amp;rsquo;s never a good time to take vacation, therefore it&amp;rsquo;s always a good time to take your vacation&lt;/li&gt;
&lt;li&gt;if you always think of staying because &amp;ldquo;what will they do without me&amp;rdquo;, see vacation as an investment in you and your family. If you work can&amp;rsquo;t survive without you, maybe this is a hint around planning or too low bus factor.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For all these reasons, if you plan a bit ahead of time, vacation is &amp;ldquo;FYI&amp;rdquo;, not &amp;ldquo;can I&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I would not trust a company or manager that ask me to make unreasonable compromise to my vacation, or ask my colleagues the same. It would be enough for me to seek for a new job.&lt;/p&gt;
&lt;p&gt;I obviously apply this based on my own experience in IT and R&amp;amp;D jobs, but I strongly believe it applies to all fields with some tweaks (on some jobs, you cant all go on vacation at the same time, union jobs have special rules).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve seen friends suffering from this situation.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m in no way in this situation, actually quite the opposite, he&amp;rsquo;s asking us to take time off.&lt;/p&gt;
&lt;p&gt;I thought about making this post on my first day of vacation, thinking maybe others may make unreasonable compromise.&lt;/p&gt;
&lt;p&gt;Happy and safe Holidays!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is day 18 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Lets see if I can make it to 20 before year end :D&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Lean UX, large code</title>
      <link>https://blog.benoitj.ca/2020-12-23-lean-ux-fat-code/</link>
      <pubDate>Wed, 23 Dec 2020 20:49:46 -0500</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-12-23-lean-ux-fat-code/</guid>
    <description>&lt;h2 id=&#34;it-all-started-that-day&#34;&gt;It all started that day&lt;/h2&gt;
&lt;p&gt;Two weekends ago, bored, I was looking for something to do.&lt;/p&gt;
&lt;p&gt;I remembered posts on fosstodon about some website size ranking called &amp;ldquo;&lt;a href=&#34;https://512kb.club&#34;&gt;The 512kb club&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Last time I worked on my blog setup, I tried porting it to Emacs org publish.&lt;/p&gt;
&lt;p&gt;Following the instructions on 512KB site, I ran my site through GTMetrix.&lt;/p&gt;
&lt;p&gt;To my surprise, I discovered my simple blog index page was roughly 600KB.&lt;/p&gt;
&lt;p&gt;What!!! 600KB, that is 600000 characters, just for an index page that has a listing of my 15 or so blog posts. 600KB for 15 posts, this is an average of 40KB per titles. Even more insane!&lt;/p&gt;
&lt;p&gt;The whole point of the 512KB is the fight bloat, promote real lean website. My blog was far from being lean.&lt;/p&gt;
&lt;p&gt;I was motivated, I had a plan: &lt;strong&gt;&lt;strong&gt;make my blog leaner&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-is-the-root-cause&#34;&gt;What is the root cause&lt;/h2&gt;
&lt;p&gt;I never optimize without data, so a quick look at GTMetrix told me the problem: the CSS, and fonts were the majority of that 600KB.&lt;/p&gt;
&lt;p&gt;I got these from the theme I imported during my initial setup (on my 1st post). It was based of a Hugo theme posted on GitHub made to look like motherfuckingwebsite, but I had to admit, like many site with lean UX, under the hood it was not lean.&lt;/p&gt;
&lt;h2 id=&#34;in-search-of-a-real-lean-css&#34;&gt;In search of a real lean CSS&lt;/h2&gt;
&lt;p&gt;I could have just modified the CSS, but with that much dead code, there is just no point of doing so.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m also a practical coder, I&amp;rsquo;m not the only one with the idea of a lean CSS. After couple of searches, I found &lt;a href=&#34;https://newcss.net&#34;&gt;new.css&lt;/a&gt;, a CSS that brings lean UX in a relatively small package (4.5KB).&lt;/p&gt;
&lt;p&gt;The best way to succeed would be to generate this site with plain semantic HTML, trying to avoid DIVs and other general container. Possibly sticking to HTML5.&lt;/p&gt;
&lt;h2 id=&#34;the-wrong-approach&#34;&gt;The wrong approach&lt;/h2&gt;
&lt;p&gt;I decided to continue porting my blog to Emacs org publish. The idea being it would remove Hugo from the equation since I already use Emacs org-mode for this blog.&lt;/p&gt;
&lt;p&gt;After couple of hours of work, I finally succeeded: my blog was rendering like before, with the same CSS as before, and I even got the RSS properly rendered.&lt;/p&gt;
&lt;p&gt;Next would be the CSS, so I decided to open up the produced HTML to get ready for some CSS work. The result? I was way further from my original goal. The generated page was just full of divs, almost unreadable.&lt;/p&gt;
&lt;p&gt;I tried to fix this, but the more I fixed issues in the generator (I had to customize many Emacs functions in lisp), the further I was to keep things simple.&lt;/p&gt;
&lt;p&gt;I just had to admit, that the only thing productive about this effort was the learning I gained :P&lt;/p&gt;
&lt;h2 id=&#34;second-try&#34;&gt;Second try&lt;/h2&gt;
&lt;p&gt;I had to find a simpler solution. Could I make this work with my Hugo setup? I discovered my CSS was bloat, but the generated HTML was actually really good and lean.&lt;/p&gt;
&lt;p&gt;30 minutes is all it took to replace the existing theme with a simpler one that imports new.css + the font suggested in the new.css site.&lt;/p&gt;
&lt;p&gt;Satisfied with the look, the simpler CSS, I decided to push it to my server.&lt;/p&gt;
&lt;h2 id=&#34;new-data-point&#34;&gt;New data point&lt;/h2&gt;
&lt;p&gt;Time for a new size check. Result: 8.5KB&lt;/p&gt;
&lt;p&gt;Success!!!&lt;/p&gt;
&lt;h2 id=&#34;time-to-submit-my-site-to-512kb-dot-club&#34;&gt;Time to submit my site to 512kb.club&lt;/h2&gt;
&lt;p&gt;Satisfied with this new improvement, I submitted my site to 512kb club, happy to be somewhere between 13 and 15 position (many people are submitting sites).&lt;/p&gt;
&lt;h2 id=&#34;can-i-do-better&#34;&gt;Can I do better?&lt;/h2&gt;
&lt;p&gt;What can I do to improve?&lt;/p&gt;
&lt;p&gt;I could always try to reduce that 4.5KB CSS, but this would mean spending time learning this code, or writing my own. Not enough time for that yet.&lt;/p&gt;
&lt;p&gt;What else can I learn from the GTMetrix site? ohh, a 404 on favicon.ico cost roughly 1KB&lt;/p&gt;
&lt;p&gt;What If I could create the smallest possible file, to prevent my 404 page to render. This could work.&lt;/p&gt;
&lt;p&gt;I did not know that you can create a favicon inlined in the HEAD section of a page.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#1e90ff;font-weight:bold&#34;&gt;link&lt;/span&gt; &lt;span style=&#34;color:#1e90ff&#34;&gt;href&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAF0lEQVRIx2NgGAWjYBSMglEwCkbBSAcACBAAAeaR9cIAAAAASUVORK5CYII=&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#1e90ff&#34;&gt;rel&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;icon&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#1e90ff&#34;&gt;type&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;image/x-icon&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;his is all you need to generate a small blank favicon.&lt;/p&gt;
&lt;p&gt;Metrics after this improvement? 8KB.&lt;/p&gt;
&lt;p&gt;his is 75 times smaller than the original size. This is 0.53 KB per post instead of ~40 KB per post.&lt;/p&gt;
&lt;p&gt;At the time of writing this post, this puts me at the top 12 smallest sites on the 512kb club.&lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;figure--512kb green team&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://512kb.club/assets/images/green-team.svg&#34;
    alt=&#34;green banner from 512kb club for sites &amp;lt; 100kb&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;before-after&#34;&gt;Before / After&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/lean-ux-fat-code-before.png&#34;
    alt=&#34;picture showing the original version with large CSS&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 1: &lt;/span&gt;Before&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/lean-ux-fat-code-after.png&#34;
    alt=&#34;picture showing after new css. minimal changes visible compared to before&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 2: &lt;/span&gt;After&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;Creating simple solutions is not necessarily easy, but is fun and rewarding.&lt;/p&gt;
&lt;p&gt;At the same time, you can do a lot with not much time.&lt;/p&gt;
&lt;p&gt;I wish to inspire peers (especially in the IT industry). The web is bloat, but it&amp;rsquo;s not better in backend code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/strong&gt;: as a side note, I still motivate myself with 100DaysToOffload. It will take some time to reach my goal (17 posts so far), but I will get there sometime in the next few months, or years.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is day 17 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Chezmoi Merging</title>
      <link>https://blog.benoitj.ca/2020-10-03-chezmoi-merging/</link>
      <pubDate>Sat, 03 Oct 2020 13:13:12 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-10-03-chezmoi-merging/</guid>
    <description>&lt;h2 id=&#34;adjusting-chezmoi-to-my-workflow&#34;&gt;Adjusting chezmoi to my workflow&lt;/h2&gt;
&lt;p&gt;Today, I&amp;rsquo;ve been adjusting &lt;a href=&#34;https://chezmoi.io&#34;&gt;chezmoi&lt;/a&gt; to match my workflow for editing dotfiles.&lt;/p&gt;
&lt;p&gt;You may be interested to read my previous post where I go over how to setup and use chezmoi: &lt;a href=&#34;https://blog.benoitj.ca/2020-06-15-how-i-use-linux-desktop-at-work-part5-dotfiles/&#34;&gt;Dotfiles management using chezmoi - How I Use Linux Desktop at Work Part5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The workflow I&amp;rsquo;m seeking:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;edit the files in place the same way I edit any files. I don&amp;rsquo;t want to use &lt;em&gt;chezmoi edit&lt;/em&gt; on some files, and open files directly in vim or Emacs for other files.&lt;/li&gt;
&lt;li&gt;run &lt;em&gt;chezmoi merge&lt;/em&gt; on all files changed&lt;/li&gt;
&lt;li&gt;configure chezmoi to automatically commit and push&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Right now, I need to remember not to run &lt;em&gt;chezmoi apply&lt;/em&gt; to prevent loosing changes.&lt;/p&gt;
&lt;h2 id=&#34;issues-with-default-chezmoi-behavior&#34;&gt;Issues with default chezmoi behavior&lt;/h2&gt;
&lt;p&gt;Implementing my workflow is not easily supported by &lt;em&gt;chezmoi&lt;/em&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;chezmoi&lt;/em&gt; does not support changing the order of files specified when calling the mergetool. kdiff3 merge tool requires a different order to setup base, local, and remote files.&lt;/li&gt;
&lt;li&gt;there are no &lt;em&gt;chezmoi merge &amp;ndash;all&lt;/em&gt; commands to merge all files that changed&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;implementing-the-workflow&#34;&gt;implementing the workflow&lt;/h2&gt;
&lt;h3 id=&#34;setting-up-kdiff3-as-my-mergetool&#34;&gt;setting up kdiff3 as my mergetool&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;chezmoi&lt;/em&gt; has an option to specify the mergetool:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;[merge]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#1e90ff&#34;&gt;command&lt;/span&gt; = &lt;span style=&#34;color:#a50&#34;&gt;kdiff3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;  args = [ &amp;#34;-m&amp;#34; ]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This has the first issue listed above: kdiff3 is called with files in the wrong order&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20201004_0146262020-10-03_14-08.png&#34; width=&#34;130%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Here is my step process to solve this problem&lt;/p&gt;
&lt;h4 id=&#34;step-1-lets-create-our-own-kdiff-wrapper-script&#34;&gt;step 1: lets create our own kdiff wrapper script&lt;/h4&gt;
&lt;p&gt;I could have contributed a change to chezmoi to get this working (and I may will), but I need a solution now.&lt;/p&gt;
&lt;p&gt;So I choose to create a script in ~/.local/bin/ called kdiff3merge:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4c8317&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4c8317&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;local&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;chezmoi&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$2&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;base&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$3&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kdiff3 -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$base&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$chezmoi&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$local&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt; -o &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$chezmoi&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;and modify my ~/.config/chezomi/chezmoi.toml:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;[merge]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#1e90ff&#34;&gt;command&lt;/span&gt; = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;kdiff3merge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;note&lt;/strong&gt;: ~/.local/bin is in my path&lt;/p&gt;
&lt;p&gt;Now, when calling chezmoi merge ~/.zshenv I get a good result:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20201004_0147112020-10-04_00-40.png&#34; width=&#34;130%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Now I just accept the automatically merged changes by saving the changes and closing kdiff3.&lt;/p&gt;
&lt;p&gt;One issue I&amp;rsquo;ve found with this is it creates a dot_zshenv.orig file corresponding to the chezmoi controlled file before the change was applied. I don&amp;rsquo;t need these since I use version control.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4c8317&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#4c8317&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;local&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;chezmoi&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$2&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;base&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$3&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kdiff3 -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$base&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$chezmoi&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$local&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt; -o &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$chezmoi&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;test&lt;/span&gt; -f &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$chezmoi&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;.orig&amp;#34;&lt;/span&gt; &amp;amp;&amp;amp; rm -f &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#a00&#34;&gt;$chezmoi&lt;/span&gt;&lt;span style=&#34;color:#a50&#34;&gt;.orig&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now orig files are gone.&lt;/p&gt;
&lt;p&gt;This is what I needed to fix the first chezmoi limitation I found.&lt;/p&gt;
&lt;h3 id=&#34;run-chezmoi-merge-on-all-files-changed&#34;&gt;Run &lt;em&gt;chezmoi merge&lt;/em&gt; on all files changed&lt;/h3&gt;
&lt;p&gt;Chezmoi has couple of commands that gives information about changes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;chezmoi diff&lt;/li&gt;
&lt;li&gt;chezmoi apply -n -v&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both commands are actually too verbose. I could not find a way to just print the list of files to bring in.&lt;/p&gt;
&lt;p&gt;Obviously, I ended up creating an alias that does this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;alias&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;cmm&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;chezmoi diff -f git | grep -- ^--- | sed -e &amp;#39;s/^--- a\///&amp;#39; | xargs -r chezmoi merge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If we deconstruct this command:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;chezmoi diff -f git: prints all changed files, with their changes&lt;/li&gt;
&lt;li&gt;grep &amp;ndash; ^&amp;mdash;: this one filter in lines which starts with &lt;em&gt;&amp;mdash;&lt;/em&gt;. the &amp;ndash; prefix is to tell grep the &amp;mdash; are not part of the &amp;ldquo;-&amp;rdquo; options (like -V)&lt;/li&gt;
&lt;li&gt;sed -e &amp;rsquo;s/^&amp;mdash; a\///&amp;rsquo;: this command remove from lines found on step 2, the &amp;ldquo;&amp;mdash; a/&amp;rdquo; prefix found. at this point, we end up with file path/names only&lt;/li&gt;
&lt;li&gt;xargs -r chezmoi merge: runs chezmoi merge on all files found, or run nothing if no files found&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Problem solved. I regularly run the &lt;em&gt;cmm&lt;/em&gt; alias to bring my changes in chezmoi.&lt;/p&gt;
&lt;h3 id=&#34;commit-and-push-my-changes&#34;&gt;Commit and push my changes&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;chezmoi&lt;/em&gt; supports that off the shelf and can be enabled with the chezmoi.toml:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;[sourceVCS]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#1e90ff&#34;&gt;autoCommit&lt;/span&gt; = &lt;span style=&#34;color:#a50&#34;&gt;true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;  autoPush = true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;[merge]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#1e90ff&#34;&gt;command&lt;/span&gt; = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;kdiff3merge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;conclusion-and-thoughts&#34;&gt;Conclusion and thoughts&lt;/h2&gt;
&lt;p&gt;CLI tools offer quick ways to extend or customize to fit your habits.&lt;/p&gt;
&lt;p&gt;That being said, my scripts may break at any chezmoi release update.&lt;/p&gt;
&lt;p&gt;I just cloned the chezmoi repo, and looking to contribute more permanent changes to chezmoi diff and chezmoi merge commands. This will be a good opportunity to learn go.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is day 16 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Home data storage</title>
      <link>https://blog.benoitj.ca/2020-09-05-nas/</link>
      <pubDate>Sat, 05 Sep 2020 20:26:48 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-09-05-nas/</guid>
    <description>&lt;h2 id=&#34;a-need-to-own-your-data&#34;&gt;A need to own your data&lt;/h2&gt;
&lt;p&gt;The workday today ended with my friend and work buddy telling me it&amp;rsquo;s about time he own and centralize his data (for him, wife and kids).&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had servers since the 90s, so obviously I had solutions for him :P&lt;/p&gt;
&lt;p&gt;Like mine, he and his family use a variety of devices at home, phones, laptop, desktop.&lt;/p&gt;
&lt;p&gt;The two obvious choice to self host your data are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;a Network-Attached Storage (NAS) server&lt;/li&gt;
&lt;li&gt;a decentralized network of computers replicating your data (aka: Syncthing)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While Syncthing is great for smaller data sets, it requires to share the same data set at least on 2 machines. When you have terabytes of data, it becomes not practical.&lt;/p&gt;
&lt;p&gt;So this post is about running your NAS. A NAS offers multiple ways to access your data like NFS, Samba, SSH/SFTP, WebDav and more. How to setup your NAS is beyond this post, and will possibly be the topic of a future post.&lt;/p&gt;
&lt;h2 id=&#34;made-for-you-or-home-made&#34;&gt;Made for you or home made?&lt;/h2&gt;
&lt;p&gt;There are two main track for running your own NAS at home:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Getting a store bought NAS appliance (synology, Qnap, Netgear, and others)&lt;/li&gt;
&lt;li&gt;Building your own&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;store-bought-nas&#34;&gt;Store bought NAS&lt;/h3&gt;
&lt;p&gt;Here are some reasons to choose a store bought NAS appliance:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Simplicity, beside disks, you get the box, motherboard, CPU, ram, SATA controller, and software sorted for you. Just pick a brand and the number of drives supported, and you&amp;rsquo;re done with choices&lt;/li&gt;
&lt;li&gt;Fast to get started, put drives in, boot and setup&lt;/li&gt;
&lt;li&gt;Usually small footprint&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some minuses:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Usually expensive, especially if you want to put more than 2 drives&lt;/li&gt;
&lt;li&gt;Not flexible, software is usually proprietary and the computer is lower power unless you pay big $$$&lt;/li&gt;
&lt;li&gt;Data at risk when the hardware dies. You may want to setup redundancy which on these NAS is implemented by proprietary setup. If the NAS dies, you may have to find the same branch, possibly the same model/family to recover your data.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;build-your-own&#34;&gt;Build your own&lt;/h3&gt;
&lt;p&gt;Some pros:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make your own, you make all the choices&lt;/li&gt;
&lt;li&gt;Usually cheaper for higher capacity NAS than a store bought appliance&lt;/li&gt;
&lt;li&gt;easier to put back online if one of the key components dies since it will be based on software RAID&lt;/li&gt;
&lt;li&gt;more software options including software RAID&lt;/li&gt;
&lt;li&gt;For Geeks, more fun :D&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Obvious cons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;more decisions to make&lt;/li&gt;
&lt;li&gt;more complex&lt;/li&gt;
&lt;li&gt;Willing to learn, read, research, break things, especially if you have limited knowledge of running servers. If you want stuff done for you, building your own may not be the right fit.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My family would find it obvious that I suggested my friend to build his own :D&lt;/p&gt;
&lt;p&gt;Some things you should plan for:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;a big box, with enough room for your drives and at least 1/2 more space to add drives as your needs change.&lt;/li&gt;
&lt;li&gt;OS Drive. You usually want to store the OS on a separate disk. I really small SSD is a good choice.&lt;/li&gt;
&lt;li&gt;disk controller
&lt;ol&gt;
&lt;li&gt;onboard: already included. slower, less quality, and usually more limited in number of ports. rarely more than 4/6 SATA ports&lt;/li&gt;
&lt;li&gt;SAS/SATA card: much faster, robust. you can find cards used in server cheap on eBay. A 8 ports LSI SAS 2008 card cost less than 100$.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Storage Drives. Two paths SAS or SATA. You may want to vary brand or batch to reduce the risk for multiple disk to fail
&lt;ol&gt;
&lt;li&gt;SAS, robust, but expensive. you can buy used drives though&lt;/li&gt;
&lt;li&gt;SATA: easily obtainable used&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;a decent CPU/MB/Memory, possibly with ECC Ram. You don&amp;rsquo;t need to buy new, but decent hardware. Some people run out of raspberry pi, but this limits performance due to requiring USB drives which are slower (USB) than SATA/SAS drives on a SAS or SATA bus. Make sure you have PCIe expansion to host&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My setup:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cheap Rosewill 4U server box&lt;/li&gt;
&lt;li&gt;i3 / supermicro / 16 gig ECC&lt;/li&gt;
&lt;li&gt;many 3T WD RED drives bought at different time&lt;/li&gt;
&lt;li&gt;a small 128 gig SSD&lt;/li&gt;
&lt;li&gt;a controller LSi 9210-8i running a P20 IT pass-through firmware needed to run FreeNAS / ZFS and bypass the hardware RAID on the LSI card.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;redundant-array-of-inexpensive-drives--raid&#34;&gt;Redundant array of inexpensive drives (RAID)&lt;/h2&gt;
&lt;p&gt;Lets start with some definitions.&lt;/p&gt;
&lt;p&gt;RAID is a way to describes different arrays of drives to achieve increased capacity, or redundancy, or both.&lt;/p&gt;
&lt;p&gt;Here are some important ones:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;RAID 0&lt;/dt&gt;
&lt;dd&gt;a stripe of 1 or more drives. You basically have multiple drives acting as one big drive (the sum of all drives). This adds capacity to make a bigger &amp;ldquo;logical&amp;rdquo; drive&lt;/dd&gt;
&lt;dt&gt;RAID 1&lt;/dt&gt;
&lt;dd&gt;2 disk or more setup as mirrors. 2 drives is the minimum, but some systems allow to add more drives to the mirror. The obvious advantage is redundancy, a lesser known is faster read (you have more disks to read from); The main disadvantages, cost and write has to be done on multiple drives.&lt;/dd&gt;
&lt;dt&gt;RAID 5 or RAIDZ (ZFS)&lt;/dt&gt;
&lt;dd&gt;Act as a stripe, but address redundancy by adding one drive to allow a parity bit. Don&amp;rsquo;t be mistaken, the additional parity bits are not stored on one single drive, but spread on all drives. ZFS support additional parity bits for added redundancy. Some pros: capacity, lower cost than a mirror. Cons: Slower read than a RAID 1.&lt;/dd&gt;
&lt;dt&gt;RAID 10&lt;/dt&gt;
&lt;dd&gt;combine RAID 1 (mirror) to RAID 0 (stripe). In this configuration, mirrors are concatenated into a stripe for added capacity. This combines both redundancy, capacity and read performance, but increase cost.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;My favorite RAID, RAID 10. Cost / Gig is so low these days that it&amp;rsquo;s less of a problem these days.&lt;/p&gt;
&lt;h2 id=&#34;volume-manager-plus-file-systems&#34;&gt;Volume Manager + File systems&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been playing with two main setup:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux Volume Manager (LVM) to give me software RAID, and EXT3/4 for file system&lt;/li&gt;
&lt;li&gt;ZFS for both volume manager and file system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I won&amp;rsquo;t into the details of each, both are great and my favorite is ZFS. It&amp;rsquo;s not more complex than LVM / EXT3/4 and it gives additional features like snapshots, and easy replication.&lt;/p&gt;
&lt;h2 id=&#34;software&#34;&gt;Software&lt;/h2&gt;
&lt;p&gt;Here you have plenty of options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;your own custom Linux + other software&lt;/li&gt;
&lt;li&gt;OpenMediaVault (OMV), a linux based NAS OS&lt;/li&gt;
&lt;li&gt;FreeNAS, a FreeBSD based NAS OS&lt;/li&gt;
&lt;li&gt;Other proprietary NAS software&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;rsquo;ve tried my own, OMV and FreeNAS. With ZFS support, solid feature set, and stability, FreeNAS is my go to OS for my NAS.&lt;/p&gt;
&lt;p&gt;To install it, you have to boot the installation image, install the OS on your OS drive, then configure your ZFS pool and data volumes.&lt;/p&gt;
&lt;h2 id=&#34;backup&#34;&gt;Backup&lt;/h2&gt;
&lt;p&gt;When you plan for a NAS you must also consider backup:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;local&lt;/li&gt;
&lt;li&gt;remote&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You need both local and remote backups to be resilient to lightning, flood, someone stealing, or just your own mistakes.&lt;/p&gt;
&lt;h3 id=&#34;local-backup&#34;&gt;Local backup&lt;/h3&gt;
&lt;p&gt;For local backup, you can setup ZFS snapshots. ZFS snapshots are taking a &amp;ldquo;picture&amp;rdquo; of your files at a given time. Some of my ZFS volumes have daily snapshots, some have hourly snapshots and I usually keep them for one month.&lt;/p&gt;
&lt;p&gt;ZFS Snapshot + RAID 10 gives me a relatively fast recovery time in case of issues or failures.&lt;/p&gt;
&lt;h3 id=&#34;remote-backup&#34;&gt;Remote backup&lt;/h3&gt;
&lt;p&gt;You can either buy hosting for your backup, which is relatively slow, could be costly, and could have transfer limits. If you have of data to backup, both speed and possibly cost will become an issue.&lt;/p&gt;
&lt;p&gt;The other option is to host a low power machine with enough drives to get your data. I currently have an old core 2 duo running at my parents place. I run daily ZFS snapshot replication which copies my snapshots to the remote server every day. The worst I can loose is one day of data.&lt;/p&gt;
&lt;p&gt;Now my friend needs a remote backup solution, so we both agreed to host each other&amp;rsquo;s backup. For this, he&amp;rsquo;ll send me a large drive, and I&amp;rsquo;ll send him one too (and decommission my old server at my parents place). Since I want to keep my data to myself, I will most probably use Borg backup to backup and encrypt my latest ZFS snapshot, and send this over to my friend&amp;rsquo;s NAS.&lt;/p&gt;
&lt;p&gt;You also may have a friend or family member who can host an old server, and maybe share the cost.&lt;/p&gt;
&lt;h2 id=&#34;other-services&#34;&gt;Other services&lt;/h2&gt;
&lt;p&gt;Once your NAS is setup, you can add other distribution services, like NextCloud, plex/emby, airsonic (music), or calibre (books). You can run all of these on FreeNAS if you have enough RAM/CPU.&lt;/p&gt;
&lt;h2 id=&#34;thought&#34;&gt;Thought&lt;/h2&gt;
&lt;p&gt;Your NAS does not have to be that powerful, if all you have is documents and some pictures, a raspberry pi or similar is enough. If your NAS has multiple users and server lots of (large) files, it may require a bigger setup like the one describes in this post.&lt;/p&gt;
&lt;p&gt;Setting up your own NAS is possibly the first step to own your data.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is day 15 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Netboot Pxe</title>
      <link>https://blog.benoitj.ca/2020-09-03-netboot-pxe/</link>
      <pubDate>Thu, 03 Sep 2020 20:46:47 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-09-03-netboot-pxe/</guid>
    <description>&lt;h2 id=&#34;where-are-my-usb-drives&#34;&gt;Where are my USB drives?&lt;/h2&gt;
&lt;p&gt;Have you been there too?&lt;/p&gt;
&lt;p&gt;I seems to never find my spare USB drives when I need them. This week, I wanted to re-install my laptop but could not find an unused USB drive to put the ISO on.&lt;/p&gt;
&lt;p&gt;This is when I found PXE and NetBoot.xyz image.&lt;/p&gt;
&lt;h2 id=&#34;what-is-pxe&#34;&gt;What is PXE?&lt;/h2&gt;
&lt;p&gt;PXE stands for Preboot eXecution Environment. It&amp;rsquo;s a way to distribute boot images over network.&lt;/p&gt;
&lt;p&gt;It uses a combination of TFTP (Tiny File Transfer Protocol) for transferring images and DHCP for discovery.&lt;/p&gt;
&lt;p&gt;It enables to boot most machines over network.&lt;/p&gt;
&lt;h2 id=&#34;netboot-dot-xyz&#34;&gt;netboot.xyz&lt;/h2&gt;
&lt;p&gt;While searching how to setup PXE, I&amp;rsquo;ve discovered &lt;a href=&#34;#netboot-dot-xyz&#34;&gt;netboot.xyz&lt;/a&gt;. If you boot one of their images, you will get a menu which allows you to select live images, install images, rescue images.&lt;/p&gt;
&lt;p&gt;Here is what it looks like:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/menu.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;And selecting network installs shows this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/install-images.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Select an image, it will download and boot it.&lt;/p&gt;
&lt;h2 id=&#34;tftp-server&#34;&gt;TFTP server&lt;/h2&gt;
&lt;p&gt;Self hosting TFTP is relatively easy if you have a WRT router, PfSense/OpenSense, FreeNAS. It&amp;rsquo;s not much more difficult to install on any Linux server.&lt;/p&gt;
&lt;p&gt;In my case, I have the choice between:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DD-WRT :: not the best since it&amp;rsquo;s hiding behind my network in a NAT network.&lt;/li&gt;
&lt;li&gt;OpnSense firewall :: Would work but has limited space&lt;/li&gt;
&lt;li&gt;other servers :: more complex than other solutions&lt;/li&gt;
&lt;li&gt;FreeNAS :: ended up choosing my NAS, where it&amp;rsquo;s primary role is to serve files.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The setup is straight forward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;create a folder where you can store the netboot images&lt;/li&gt;
&lt;li&gt;Enable the TFTP service&lt;/li&gt;
&lt;li&gt;configure TFTP to use the folder created as it&amp;rsquo;s main directory&lt;/li&gt;
&lt;li&gt;store the netboot.xyz images: netboot.xyz.kpxe for regular boot, and netboot.xyz.efi for EFI booting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you want to verify your setup, just download a TFTP client (for example, atftp), connect to the TFTP server and &lt;em&gt;get netboot.xyz.kpxe&lt;/em&gt;. This should download the images served by your TFTP server.&lt;/p&gt;
&lt;h2 id=&#34;dhcp&#34;&gt;DHCP&lt;/h2&gt;
&lt;p&gt;Once you have TFTP working, the last piece missing is the DHCP configuration.&lt;/p&gt;
&lt;p&gt;What happens is your DHCP server, which most PC get an IP from, can give additional information, like the TFTP / images to use during PXE network booting.&lt;/p&gt;
&lt;p&gt;This seems to be limited to some routers, but most FOSS firewall or routers allow you to configure PXE.&lt;/p&gt;
&lt;p&gt;On my OpnSense Firewall, I need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;enable network booting&lt;/li&gt;
&lt;li&gt;set the TFTP server to my FreeNAS server IP&lt;/li&gt;
&lt;li&gt;define the default image with netboot.xyz.kpxe and the EFI 32/64 with netboot.xyz.efi&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;booting-up&#34;&gt;Booting up&lt;/h2&gt;
&lt;p&gt;Now, to boot using PXE on any PC or even in VirtualBox, you need to select network in the boot menu. After getting an IP address, you should boot the netboot.xyz image.&lt;/p&gt;
&lt;h2 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve missed writing on my blog&amp;hellip; Life, vacation, making major backyard refactor put me away from the keyboard for some time.&lt;/p&gt;
&lt;p&gt;Special congrats to folks who made it to the 100 posts. This is quite an achievement.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think I&amp;rsquo;ll get this anytime soon, but I plan to continue posting regularly.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is day 14 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Working From Home</title>
      <link>https://blog.benoitj.ca/2020-09-02-working-from-home/</link>
      <pubDate>Wed, 02 Sep 2020 00:17:14 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-09-02-working-from-home/</guid>
    <description>&lt;h2 id=&#34;a-curse-and-or-a-blessing&#34;&gt;A curse and/or a blessing?&lt;/h2&gt;
&lt;p&gt;Like many of us, I&amp;rsquo;ve been exclusively working from home since March.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve read couple of post on fosstodon mentioning how much people want to go back to the office. I have a totally different experience.&lt;/p&gt;
&lt;h2 id=&#34;adjustments&#34;&gt;Adjustments&lt;/h2&gt;
&lt;p&gt;Lets start with the obstacles I&amp;rsquo;ve experienced and some solutions that works for me:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Doing long hours&lt;/dt&gt;
&lt;dd&gt;I start later in the morning so that I&amp;rsquo;m done by 5 without too much overtime.&lt;/dd&gt;
&lt;dt&gt;Work is always around, in your mind&lt;/dt&gt;
&lt;dd&gt;I hide my work gear / laptop after work so that I don&amp;rsquo;t see it&lt;/dd&gt;
&lt;dt&gt;Feel alone, disconnected from colleagues&lt;/dt&gt;
&lt;dd&gt;We hang out regularly on a audio/video team chat, people come and go at will&lt;/dd&gt;
&lt;dt&gt;Distracting my family, I was working in our family room. Not so great idea when I spend a good time of the day on calls.&lt;/dt&gt;
&lt;dd&gt;I repurposed a room into an office&lt;/dd&gt;
&lt;dt&gt;Motivation&lt;/dt&gt;
&lt;dd&gt;This one was adjusted a while ago, have some routine in the morning, breakfast, dress up, go outside for couple of minutes, then go in my office. This prepare my mind to start working.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Some people also have to take care of young kids, that could definitively be problematic. I&amp;rsquo;m not in this situation, my kids are teenagers.&lt;/p&gt;
&lt;h2 id=&#34;what-makes-it-so-great-for-me&#34;&gt;What makes it so great for me&lt;/h2&gt;
&lt;p&gt;Here are some benefits from working from home:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Overall, my stress is lower since I started.&lt;/li&gt;
&lt;li&gt;My commute went from 15 hours a week down to nothing.&lt;/li&gt;
&lt;li&gt;I spend more time with my family&lt;/li&gt;
&lt;li&gt;I have a better setup at home (screen, chair, desk)&lt;/li&gt;
&lt;li&gt;I take my lunches outside in my backyard&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m not stressed of missing my train if a meeting last 5 minutes longer than it should&lt;/li&gt;
&lt;li&gt;I can listen to music without my headphones&lt;/li&gt;
&lt;li&gt;Less unnecessary distractions from colleagues&lt;/li&gt;
&lt;li&gt;Not an open space. I do like team rooms, but I hate rooms that can sit 100 people&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;Your experience could be totally different, this is really a personal thing.&lt;/p&gt;
&lt;p&gt;Once Covid restrictions are lifted, I would gladly meet my teammates at the office once in a while, but regular attendance to the office is no longer part of my life.&lt;/p&gt;
&lt;p&gt;Working from home is a perfect fit for me :D&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is day 13 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Ditch WYSIWYG apps and switch to plaintext tools</title>
      <link>https://blog.benoitj.ca/2020-07-31-wysiwyg/</link>
      <pubDate>Fri, 31 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-07-31-wysiwyg/</guid>
    <description>&lt;p&gt;On this post, I&amp;rsquo;ll go over WYSIWYG apps, and effective alternatives.&lt;/p&gt;
&lt;p&gt;Like it or not, in tech jobs, we have to write documentation and create diagrams to share our ideas and solutions.&lt;/p&gt;
&lt;p&gt;The traditional approach is to use WYSIWYG (what you see is what you get) apps. The approach with WYSIWYG apps is to allow you to edit the graphical representation of your document. This is now mainstream in spreadsheet apps, word processors, presentation apps, and diagram tools. Using MS tools, it&amp;rsquo;s word, excel, PowerPoint, vision, or the equivalent LibreOffice writer, calc, impress. These apps use more or less open formats, at the same time have you ever tried to understand one? These formats are made for software, not for humans.&lt;/p&gt;
&lt;p&gt;The older of us may remember at a time, WYSIWYG views were non existent and then became an addon feature (Anyone remembers Lotus 1-2-3?). We had the sense of progress!!! We still had stuff like sgml documents around, but for a while, plaintext documents almost disappeared.&lt;/p&gt;
&lt;h2 id=&#34;anti-productivity&#34;&gt;Anti-productivity&lt;/h2&gt;
&lt;h3 id=&#34;portability&#34;&gt;Portability&lt;/h3&gt;
&lt;p&gt;Going from one format to another is kind of difficult.&lt;/p&gt;
&lt;h3 id=&#34;collaboration&#34;&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;Collaborating on one ppt or docx document is kind of a nightmare. Same goes with LibreOffice equivalent.&lt;/p&gt;
&lt;p&gt;This one evolved over time, we now have web applications to do this. Even if this is working, we end up with centralized services that cannot work offline.&lt;/p&gt;
&lt;h3 id=&#34;version-control&#34;&gt;Version control&lt;/h3&gt;
&lt;p&gt;Difficult to implement of a complex file format with graphical tools.&lt;/p&gt;
&lt;h3 id=&#34;structure-and-data-mixed-with-presentation&#34;&gt;Structure and data mixed with presentation&lt;/h3&gt;
&lt;p&gt;Reason why we have CSS and HTML, separation of concerns. For diagram tools, you also have physical position to handle as well.&lt;/p&gt;
&lt;p&gt;Have you ever tried to build a diagram live during a session with a client? This may prove to be quite stressful and unproductive. The &amp;ldquo;oh, can you add a box there, shift this lower, can you make all the boxes red, etc&amp;hellip;&amp;rdquo; are becoming quite complex to perform.&lt;/p&gt;
&lt;p&gt;There is also maintenance of these documents, not too difficult when we just created them, but quite painful.&lt;/p&gt;
&lt;h2 id=&#34;alternatives&#34;&gt;Alternatives&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Plaintext&lt;/strong&gt; is one of the best alternative to what we are used to. We can share, read, modify with our text editor, version control in git, collaborate, easily write/modify them during live sessions.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been transitioning to plaintext format for couple of years now, use git to share and control changes.&lt;/p&gt;
&lt;p&gt;Here are some known and less known alternatives to WYSIWYG apps:&lt;/p&gt;
&lt;h3 id=&#34;work-processors&#34;&gt;work processors&lt;/h3&gt;
&lt;p&gt;This is the easiest of the bunch, many of us probably use an alternative to word or writer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://daringfireball.net/projects/markdown/&#34;&gt;markdown&lt;/a&gt; :: possibly the most popular of the gang. quite good for simple stuff. No specifications means 100 variants. Good for READMEs, short docs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://commonmark.org/&#34;&gt;commonmark&lt;/a&gt; :: a tentative to create a markdown specification. Not sure how successful this is. Use in same context as markdown&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://asciidoctor.org/&#34;&gt;asciidoc&lt;/a&gt; :: a simpler markup facade to docbook, a full fledged document standard created by oasis. This one is quite good for writing more complex documents. It both replaces word/writer and is an alternative to LaTex.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://orgmode.org/&#34;&gt;org-mode&lt;/a&gt; :: mostly Emacs specific, can be used as both a markdown replacement, as well as an outliner / task list / note taking app.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Honorable mentions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://www.latex-project.org/&#34;&gt;LaTex&lt;/a&gt; :: I never really used it, but some love it and it has similar properties than other plaintext formats. The showstopper for me is the higher barrier of entry / learning curve.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docutils.sourceforge.io/rst.html&#34;&gt;reStructuredText&lt;/a&gt; :: seems similar than others. Haven&amp;rsquo;t tried because it is similar to other more popular formats.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;spreadsheet&#34;&gt;Spreadsheet&lt;/h3&gt;
&lt;p&gt;This area is still dominated by Excel and Calc. I usually take CVS data feeds which address part of the issues with Excel / Calc. This is an areas I haven&amp;rsquo;t experimented too much.&lt;/p&gt;
&lt;p&gt;Honorable mentions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://orgmode.org/&#34;&gt;org-mode&lt;/a&gt; :: offers simple aggregation functions for simple spreadsheet in org tables.&lt;/li&gt;
&lt;li&gt;gnuplot :: can be used to replace graphs&lt;/li&gt;
&lt;li&gt;sc :: ncurses TUI spreadsheet. This one feels like Lotus 1-2-3 :). It is now discontinued. I barely used it, but it seemed fined.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;presentation&#34;&gt;Presentation&lt;/h3&gt;
&lt;p&gt;Like word processors, many of us use plaintext alternatives.&lt;/p&gt;
&lt;p&gt;The one I&amp;rsquo;ve used&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/yjwen/org-reveal&#34;&gt;org-reveal&lt;/a&gt; :: org-mode + reveal.js. my today&amp;rsquo;s favorite setup&lt;/li&gt;
&lt;li&gt;org-mode w/ &lt;a href=&#34;https://github.com/josephwright/beamer&#34;&gt;LaTex Beamer&lt;/a&gt; :: when I need to share my org-mode presentations&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Honorable mentions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/josephwright/beamer&#34;&gt;LaTex Beamer&lt;/a&gt; :: often seen in scholar&amp;rsquo;s presentations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tools.suckless.org/sent/&#34;&gt;Sent&lt;/a&gt; :: extra minimalist presentation software inspired by the Takahashi technique&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;diagrams&#34;&gt;Diagrams&lt;/h3&gt;
&lt;p&gt;These tools are ones I use almost daily. I work with relatively large teams, and have to share ideas with coders, business analyst, clients, and many more.&lt;/p&gt;
&lt;p&gt;Some people are listeners, some are visual. I then to create diagrams that has both text and visual elements.&lt;/p&gt;
&lt;p&gt;How does it work for diagrams?&lt;/p&gt;
&lt;p&gt;You &amp;ldquo;code&amp;rdquo; your diagram like here in this flowchart:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-plantuml&#34; data-lang=&#34;plantuml&#34;&gt;@startuml
Alice -&amp;gt; Bob: Authentication Request
Bob --&amp;gt; Alice: Authentication Response

Alice -&amp;gt; Bob: Another authentication Request
Alice &amp;lt;-- Bob: Another authentication Response
@enduml
&lt;/code&gt;&lt;/pre&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/wysiwig-sequence.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Here are some of the tools I use:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://plantuml.com/&#34;&gt;plantuml&lt;/a&gt; :: my goto tool for diagrams, don&amp;rsquo;t be fooled by the UML in it&amp;rsquo;s name, it&amp;rsquo;s not like most UML tools that enforce strict UML rules. In many ways, it&amp;rsquo;s main role is to put boxes with text/icons in a graph and link them when related. In follow-up posts, I will cover some of the diagrams you can create.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mermaid-js.github.io/mermaid/#/&#34;&gt;mermaid&lt;/a&gt; :: Similar to plantuml, but in JavaScript. I&amp;rsquo;ve used mermaid-cli to create git branching diagrams&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://graphviz.org/&#34;&gt;graphviz&lt;/a&gt; :: when the other 2 tools don&amp;rsquo;t give want I want. Really flexible. Plantuml uses graphviz as a backend.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blockdiag.com/en/nwdiag/index.html&#34;&gt;nwdiag&lt;/a&gt; :: build network diagrams&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Honorable mentions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;http://ditaa.sourceforge.net/&#34;&gt;Ditaa&lt;/a&gt; :: draw ASCII boxes and it renders them in an image&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blockdiag.com/en/nwdiag/index.html&#34;&gt;rackdiag/nwdiag&lt;/a&gt; :: build a server rack diagram&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/BurntSushi/erd&#34;&gt;erd&lt;/a&gt; :: entity relation diagrams&lt;/li&gt;
&lt;li&gt;imagemagik convert / identify :: add text to images&lt;/li&gt;
&lt;li&gt;banner / cowsay :: generate plain text art and banners&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/christiangoltz/shaape&#34;&gt;shaape&lt;/a&gt; :: ascii art to image converter&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://kevinpt.github.io/syntrax/&#34;&gt;syntrax&lt;/a&gt; :: railroad diagrams. could be used for branching diagrams. next one on my list&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Most of these diagrams can be embedded in markdown, asciidoc and org-mode files including presentations.&lt;/p&gt;
&lt;p&gt;Some references for diagram tools:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/blackcater/1701e845a963216541591106c1bb9d3b&#34;&gt;diagram.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://asciidoctor.org/docs/asciidoctor-diagram/&#34;&gt;asciidoctor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://orgmode.org/worg/org-contrib/babel/languages.html&#34;&gt;org-babel languages&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;I just could barely touch the subject but this is already too long. I hope I could give you some ideas and alternatives to tools most people use.&lt;/p&gt;
&lt;p&gt;While doing this post, I discovered some cool tools I did not know. This may be useful for some of my work related documents. You may see more post around this in the future.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is day 12 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Learning Gentoo</title>
      <link>https://blog.benoitj.ca/2020-07-25-learning-gentoo/</link>
      <pubDate>Sat, 25 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-07-25-learning-gentoo/</guid>
    <description>&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200725_230602gentoo-logo.png&#34; width=&#34;30%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Been quite busy in the last couple of weeks. What kept me busy? Family being on vacation, my backyard landscaping project, and wiping Arch from my laptop with Gentoo&amp;hellip;.&lt;/p&gt;
&lt;p&gt;I had no clue what was really Gentoo before wiping my laptop clean. Like with any major learning, the easiest way to learn is to just dive in and practice until you understand enough.&lt;/p&gt;
&lt;p&gt;This is a learning experiment, so I&amp;rsquo;m not sure if I will keep using Gentoo after this.&lt;/p&gt;
&lt;p&gt;I can tell that so far, I&amp;rsquo;ve achieved want I wanted: Being productive on my laptop again. Since I&amp;rsquo;m using this laptop to write this blog, you can imagine that this put a pause to my posts :-).&lt;/p&gt;
&lt;p&gt;This post will be about what I learned, and also about the learning journey. There are plenty of quality guides, references, videos on Gentoo, I&amp;rsquo;m not going to repeat too much there.&lt;/p&gt;
&lt;h2 id=&#34;my-os-experience&#34;&gt;My OS experience&lt;/h2&gt;
&lt;p&gt;On the OS front, I started with dos, win 3, win95, then switched to Slackware, Debian, Ubuntu and Arch. I still actively use Debian (server), Ubuntu at work, and Arch on my home desktop/laptop.&lt;/p&gt;
&lt;p&gt;I sysadmin my lab, also code and deploy to Linux and Unix since I started using Linux.&lt;/p&gt;
&lt;p&gt;In the recent years, I&amp;rsquo;ve been transitioning my desktop to Arch to get more recent software, and I run Debian on my servers.&lt;/p&gt;
&lt;h2 id=&#34;why-gentoo&#34;&gt;Why Gentoo?&lt;/h2&gt;
&lt;p&gt;Lets start with my background: I started coding when I was 8yo and I&amp;rsquo;m now 44. I&amp;rsquo;ve worked on so many things, languages, OSes. I experimented, broke many things, fixed and learned so many things and I still keep learning. I do think that anyone successful in this field should have curiosity, courage to try new things, and constant habit to self improve things. If you stopped learning, you probably don&amp;rsquo;t do enough.&lt;/p&gt;
&lt;p&gt;Gentoo has a lot to give for someone who likes to understand and thinker with things. So I think it may be the perfect match for me.&lt;/p&gt;
&lt;p&gt;In a nutshell, I want to learn something different that I can shape to my liking.&lt;/p&gt;
&lt;h2 id=&#34;gentoo-the-beginning&#34;&gt;Gentoo, the beginning&lt;/h2&gt;
&lt;p&gt;About 1 month ago, I tried to learn Gentoo without much success. In this case, I just installed it in a VM. What was wrong? commitment! I was doing nothing useful on the VM, so I lost track and beside the installation, I did not learn much.&lt;/p&gt;
&lt;p&gt;How to fix commitment?&lt;/p&gt;
&lt;p&gt;Lets wipe my current working setup, and get started with Gentoo!!!&lt;/p&gt;
&lt;h2 id=&#34;booting-3-takes&#34;&gt;Booting, 3 takes&lt;/h2&gt;
&lt;p&gt;I believe booting was the most difficult part of the whole installation. Some reasons of failures:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Was following the non-uefi boot setup while my MB was setup for UEFI&lt;/li&gt;
&lt;li&gt;This is a laptop, so needed LVM with dm-crypt. This required some boot options.
Could not find info about this in the handbook, but I then found this really good guide on setting up LVM, dm-crypt on Gentoo: &lt;a href=&#34;https://wiki.gentoo.org/wiki/Full%5FDisk%5FEncryption%5FFrom%5FScratch%5FSimplified&#34;&gt;https://wiki.gentoo.org/wiki/Full%5FDisk%5FEncryption%5FFrom%5FScratch%5FSimplified&lt;/a&gt;. Things worked after that.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The good thing about it, I practiced base install 3 times :P&lt;/p&gt;
&lt;h2 id=&#34;some-random-learning&#34;&gt;Some random learning&lt;/h2&gt;
&lt;p&gt;Here are some random learning on Gentoo&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The Gentoo handbook is quite great. The wiki too, just a tiny bit behind the ArchWiki.&lt;/li&gt;
&lt;li&gt;Large software or ones with many dependencies increase compile time. This forced me to re-question the software I use&lt;/li&gt;
&lt;li&gt;You may not want to compile Firefox yourself&lt;/li&gt;
&lt;li&gt;Start with no to minimal number of USE flags. Set use flags to specific packages unless it does cover a large set of packages. For example, X, NetworkManager, PulseAudio could be set system wide, but JPEG could be set to ffmpeg only.&lt;/li&gt;
&lt;li&gt;after getting used to portage configuration files, flaggie is a quite nice tool to simplify this process&lt;/li&gt;
&lt;li&gt;List of use flags with description that a package support can be listed using &lt;em&gt;equery u ​&amp;lt;package name​&amp;gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;some packages have an insane amount of dependencies. Try to find alternatives before&lt;/li&gt;
&lt;li&gt;doas is simple and nice, but sudo handles better password request&lt;/li&gt;
&lt;li&gt;openrc is working well, except for networking. Could not get network to be properly switching between LAN and WiFi. I ended up using NetworkManager with nmcli/nmtui&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t forget to &lt;em&gt;emerge &amp;ndash;change-use @world&lt;/em&gt; after changes to global USE flags.&lt;/li&gt;
&lt;li&gt;Browsers are not that fun to compile. One night for Qutebrowser and it&amp;rsquo;s dependencies on a 4 thread basic CPU.&lt;/li&gt;
&lt;li&gt;Always use the &amp;ndash;ask when emerging packages.&lt;/li&gt;
&lt;li&gt;Config files temp files are called ._cfgsomething, I usually do a diff between this new file and the original file to spot changes, and just overwrite the original file with the new one.&lt;/li&gt;
&lt;li&gt;Most of the tools / software I use are fast to compile except:
&lt;ol&gt;
&lt;li&gt;the kernel. I need to configure my own instead of using genkernel.&lt;/li&gt;
&lt;li&gt;ripgrep, took ages due to compiling rust.&lt;/li&gt;
&lt;li&gt;kdiff3, I actually C-c the process since it depends on the world. I plan on using ediff instead.&lt;/li&gt;
&lt;li&gt;mpv is complex to compile, it depends on ffmpeg that has pages long of use flags and other dependencies&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s easy to just set the use flags I understand and update them later if needed. Much better than trying to get everything perfect the first time.&lt;/li&gt;
&lt;li&gt;Gentoo is not that difficult when you dive in and have prior Linux experience. I started the process last Friday, and I took 5 days to get back a functional setup.&lt;/li&gt;
&lt;li&gt;Unclear if this is just real or not, but my laptop feels faster&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;Was it worth it? Hell yeah!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will I keep using this on my personal laptop?&lt;/strong&gt; Most probably, unless it comes to a point of always breaking (which is totally not the case). Also, I cannot justify spending another couple of days yet to go back to Arch when I can do everything on Gentoo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will I use this at work?&lt;/strong&gt; Most probably not, hard to justify the compile time, but at home, it does not really matter. Ubuntu or Arch are better options.&lt;/p&gt;
&lt;p&gt;Now I&amp;rsquo;m back with a working blogging setup, you can expect more posts in the next few days.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is day 11 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Patching Tools - St</title>
      <link>https://blog.benoitj.ca/2020-07-12-patching-tools-st/</link>
      <pubDate>Sun, 12 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-07-12-patching-tools-st/</guid>
    <description>&lt;p&gt;As part of my renewed dotfiles setup and dev box setup, I&amp;rsquo;m taking the opportunity to update my core suckless.org tools: st, dwm, dmenu.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using these for some time, and it&amp;rsquo;s great for me to be able to customize tools I use.&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;ll re-create a new ST fork using up to date code base, and new patches that will work for me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The focus will be on branching strategy and resolving merge conflicts. The aim is to show an effective way to leverage git and merge tools to integrate patches. You may want to read my &lt;a href=&#34;https://blog.benoitj.ca/2020-06-28-git-merge-conflicts/&#34;&gt;previous post&lt;/a&gt; describing how merge conflicts can be resolved using tools.&lt;/p&gt;
&lt;h2 id=&#34;initial-setup&#34;&gt;initial setup&lt;/h2&gt;
&lt;p&gt;As you may know, git is a distributed version control system that can sync with multiple remotes.&lt;/p&gt;
&lt;p&gt;To get started, I usually:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;create my own git repository&lt;/li&gt;
&lt;li&gt;clone this repository locally (origin)&lt;/li&gt;
&lt;li&gt;define an &lt;em&gt;upstream&lt;/em&gt; remote&lt;/li&gt;
&lt;li&gt;merge the upstream/master branch into my local master branch&lt;/li&gt;
&lt;li&gt;update my remote origin&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Lets do this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone git@github.com:benoitj/st.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt; st
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote add upstream https://git.suckless.org/st
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git fetch upstream
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge upstream/master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The resulting remote setup is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;and my current branch setup:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git branch -a -vv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can see that my local master branch tracks my github&amp;rsquo;s origin/master branch.&lt;/p&gt;
&lt;h2 id=&#34;patching-strategy&#34;&gt;Patching strategy&lt;/h2&gt;
&lt;p&gt;For each patch, I will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;create a branch from the commit the patch was created from.&lt;/li&gt;
&lt;li&gt;apply the patch. We should not get conflicts here.&lt;/li&gt;
&lt;li&gt;merge the patch to master branch (may need conflict resolution. Read my &lt;a href=&#34;https://blog.benoitj.ca/2020-06-28-git-merge-conflicts/&#34;&gt;previous post&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;How do we know how to create the branch?&lt;/p&gt;
&lt;p&gt;In the case of most patches, the filename indicate some context. In the following example, we will apply the patch &lt;em&gt;st-xresources-20200604-9ba7ecf.diff&lt;/em&gt;. From  the file name, we understand the patch was created June 4th from the commit hash 9ba7ecf.&lt;/p&gt;
&lt;p&gt;Now the trick is to create our branch from that commit. Reading the git documentation, you can learn this is done with the syntax: git branch &lt;branch name&gt; [commit hash]&lt;/p&gt;
&lt;p&gt;Sometimes the commit hash does not match the history, in this case, use git log and find a commit hash close to the patch creation date.&lt;/p&gt;
&lt;h2 id=&#34;patching-st&#34;&gt;Patching ST&lt;/h2&gt;
&lt;p&gt;Lets do this and apply the patch:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir patches
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -P patches https://st.suckless.org/patches/xresources/st-xresources-20200604-9ba7ecf.diff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git branch patches/xresources 9ba7ecf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout patches/xresources
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git apply &amp;lt; patches/st-xresources-20200604-9ba7ecf.diff
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And we can see what has changed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git diff
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;and lets confirm it worked:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make clean all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./st
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Everything&amp;rsquo;s good, now is a good time to commit our changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add x.c config.def.h patches
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;applying patch st-xresources-20200604-9ba7ecf.diff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And push:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push --set-upstream origin patches/xresources
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;and merge the branch to master:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge patches/xresources
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;I will do the same for the following patches: externalpipe and scrollback:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -P patches https://st.suckless.org/patches/scrollback/st-scrollback-20200419-72e3f6c.diff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git branch patches/scrollback 72e3f6c
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout patches/scrollback
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git apply &amp;lt; patches/st-scrollback-20200419-72e3f6c.diff
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make clean all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add st.c st.h config.def.h patches
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;applying patch st-scrollback-20200419-72e3f6c.diff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git push --set-upstream origin patches/scrollback
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge patches/scrollback
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If I build master, I have both scrollback and xresources patches included:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm config.h
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make clean all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;merge-conflicts&#34;&gt;Merge conflicts&lt;/h2&gt;
&lt;p&gt;You may get couple of merge conflicts around keybindings, configuration, and similar.&lt;/p&gt;
&lt;p&gt;They are usually really simple to solve using a merge tool as described in this &lt;a href=&#34;https://blog.benoitj.ca/2020-06-28-git-merge-conflicts/&#34;&gt;previous post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I had no conflict patching st, but had some when patching dmenu. Here are some examples:&lt;/p&gt;
&lt;h3 id=&#34;example-of-applying-borderoption-patch-on-top-of-border-patch&#34;&gt;Example of applying borderoption patch on top of border patch&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge patches/border
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge patches/borderoption
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git mergetool
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Example of such conflict when merging border and borderoption on dmenu master branch:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200712_120511screenshot.png&#34; width=&#34;150%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;In this case, I will select the &lt;em&gt;remote&lt;/em&gt; (the borderoption branch) since it makes the attribute mutable.&lt;/p&gt;
&lt;h3 id=&#34;example-of-applying-the-dmenu-fuzzymatch-patch-on-top-of-center-patch&#34;&gt;Example of applying the dmenu fuzzymatch patch on top of center patch&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge patches/center
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge patches/fuzzymatch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git mergetool
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200712_120910screenshot.png&#34; width=&#34;150%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;In this case, we need to take both the &lt;em&gt;local&lt;/em&gt; (center patch) and the &lt;em&gt;remote&lt;/em&gt; (fuzzymatch patch), so I select C and B to get this result:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200712_121232screenshot.png&#34; width=&#34;150%&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;thoughts-and-what-s-next&#34;&gt;Thoughts and what&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;I hope I was able to show how simpler patching tools can be when using a branching strategy, branching from the right version, and using tools to resolve conflicts.&lt;/p&gt;
&lt;p&gt;Yes you can do all this manually on the same branch, but it&amp;rsquo;s takes more time and it is much more error prone. Tools are better than us to identify patterns and repeat tasks.&lt;/p&gt;
&lt;p&gt;Have fun patching! :)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is day 10 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Git Merge Conflicts - Git patching and resolving conflict (part 2)</title>
      <link>https://blog.benoitj.ca/2020-06-28-git-merge-conflicts/</link>
      <pubDate>Sun, 28 Jun 2020 00:00:00 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-06-28-git-merge-conflicts/</guid>
    <description>&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200628_190350screenshot.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;I&amp;rsquo;m creating this post after seeing many people suffering and manually addressing merge conflicts while integrating patches with dwm, st, or dmenu code base.&lt;/p&gt;
&lt;p&gt;The most common issues seen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;applying patches on latest from master&lt;/li&gt;
&lt;li&gt;using patch instead of git to patch&lt;/li&gt;
&lt;li&gt;resolving conflict manually&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In my previous &lt;a href=&#34;https://blog.benoitj.ca/2020-06-21-git-patching-merging-part1/&#34;&gt;git post&lt;/a&gt;, I went over how to create and apply patches to a git repository.&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;ll show how conflict can be solved using tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: I&amp;rsquo;m going to use git, but these techniques are not unique to git.&lt;/p&gt;
&lt;h2 id=&#34;basic-setup&#34;&gt;Basic setup&lt;/h2&gt;
&lt;h3 id=&#34;setup-git-merge-tool&#34;&gt;setup git merge tool&lt;/h3&gt;
&lt;p&gt;In this example, I&amp;rsquo;ll start by using meld diff tool. In a later section, I&amp;rsquo;ll also show different tools.&lt;/p&gt;
&lt;p&gt;You first need to install meld.&lt;/p&gt;
&lt;p&gt;It can be installed on Linux, windows, OS X. Most distribution package it, or head over to their &lt;a href=&#34;https://meldmerge.org&#34;&gt;website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After it&amp;rsquo;s installed, we need to tell git to use this tool as a mergetool:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global --replace-all merge.tool meld
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can then inspect the your ~/.gitconfig and you should see a section like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f00;background-color:#faa&#34;&gt;[merge]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#1e90ff&#34;&gt;tool&lt;/span&gt; = &lt;span style=&#34;color:#a50&#34;&gt;meld&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;create-a-local-repository-for-the-experiment&#34;&gt;create a local repository for the experiment&lt;/h3&gt;
&lt;p&gt;To do some experiment, I&amp;rsquo;m creating a local git repository, with 1 file with some text:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir merge-conflicts-test
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt; merge-conflicts-test
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat &amp;gt; file1 &lt;span style=&#34;color:#a50&#34;&gt;&amp;lt;&amp;lt;EOT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;original line 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;original line 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;original line 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;EOT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;initial commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;We have a new repository with file1 containing text:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Lets inspect the history by running the command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git log --oneline --decorate --relative-date --graph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* 8ca4176 (HEAD -&amp;gt; master) initial commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;trivial-conflicts&#34;&gt;Trivial conflicts&lt;/h2&gt;
&lt;p&gt;Now lets create a condition for a conflict that is trivial to merge.&lt;/p&gt;
&lt;h3 id=&#34;modify-file1-in-a-branch&#34;&gt;Modify file1 in a branch&lt;/h3&gt;
&lt;p&gt;We first create a branch and add a line:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout -b feature/adding-a-line
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;line 4 from feature branch&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;adding some changes at the end of the file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[feature/adding-a-line b24353e] adding some changes at the end of the file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1 file changed, 1 insertion(+)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And we can see what is in file1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat file1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;line 4 from feature branch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;modify-another-line-on-master-branch&#34;&gt;Modify another line on master branch&lt;/h3&gt;
&lt;p&gt;Now lets go back to master and add a change to the first line:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i -e &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;s/original line 1/new change on line 1/&amp;#39;&lt;/span&gt; file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;changes to line 1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;M	file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[master 177c8f3] changes to line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1 file changed, 1 insertion(+), 1 deletion(-)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And we can see what is in file1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat file1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new change on line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;As you can see, we have 2 commits with different changes to file1.&lt;/p&gt;
&lt;h3 id=&#34;merging&#34;&gt;Merging&lt;/h3&gt;
&lt;p&gt;We only have a conflict if we want to integrate changes from one branch to another.&lt;/p&gt;
&lt;p&gt;Lets do this by merging changes from our feature branch to master:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge feature/adding-a-line
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Auto-merging file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Merge made by the &amp;#39;recursive&amp;#39; strategy.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; file1 | 1 +
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1 file changed, 1 insertion(+)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And we can see what is in file1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat file1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new change on line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;line 4 from feature branch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;As you can see trivial conflicts are automatically merged.&lt;/p&gt;
&lt;p&gt;The history now looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git log --oneline --decorate --relative-date --graph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*   8061307 (HEAD -&amp;gt; master) Merge branch &amp;#39;feature/adding-a-line&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| * b24353e (feature/adding-a-line) adding some changes at the end of the file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* | 177c8f3 changes to line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* 8ca4176 initial commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;What you can read from this history:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HEAD points to the latest commit of our master branch, a merge commit&lt;/li&gt;
&lt;li&gt;the commit &amp;ldquo;changes to line 1 was done on master&amp;rdquo;&lt;/li&gt;
&lt;li&gt;the commit &amp;ldquo;adding some changes at the end of file&amp;rdquo; was done on our feature branch&lt;/li&gt;
&lt;li&gt;the common ancestor of both commits is the &amp;ldquo;initial commit&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;non-trivial-conflicts&#34;&gt;Non-trivial conflicts&lt;/h2&gt;
&lt;p&gt;Now lets create a conflicts that you will have to merge manually.&lt;/p&gt;
&lt;h3 id=&#34;modify-file1-on-a-branch&#34;&gt;Modify file1 on a branch&lt;/h3&gt;
&lt;p&gt;We will make changes to line 3 from both our feature branch and our master branch:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout -b feature/change-to-line3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i -e &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;s/original line 3/line 3 from branch/&amp;#39;&lt;/span&gt; file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;changing line 3 on our branch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[feature/change-to-line3 2e16635] changing line 3 on our branch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1 file changed, 1 insertion(+), 1 deletion(-)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The history now looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git log --oneline --decorate --relative-date --graph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* 2e16635 (HEAD -&amp;gt; feature/change-to-line3) changing line 3 on our branch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*   8061307 (master) Merge branch &amp;#39;feature/adding-a-line&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| * b24353e (feature/adding-a-line) adding some changes at the end of the file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* | 177c8f3 changes to line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* 8ca4176 initial commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The commit at the top is on our new feature branch.&lt;/p&gt;
&lt;h3 id=&#34;modify-the-same-line-on-master&#34;&gt;Modify the same line on master&lt;/h3&gt;
&lt;p&gt;Now lets change line 3 on master:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i -e &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;s/original line 3/another change to line 3/&amp;#39;&lt;/span&gt; file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;changing line 3 again&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[master fc9a98c] changing line 3 again
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 1 file changed, 1 insertion(+), 1 deletion(-)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The history now looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git log --oneline --decorate --relative-date --graph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* fc9a98c (HEAD -&amp;gt; master) changing line 3 again
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*   8061307 Merge branch &amp;#39;feature/adding-a-line&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|\
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| * b24353e (feature/adding-a-line) adding some changes at the end of the file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* | 177c8f3 changes to line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;* 8ca4176 initial commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;merging-our-feature-branch-into-master&#34;&gt;Merging our feature branch into master&lt;/h3&gt;
&lt;p&gt;What happens if we merge our feature branch? We have a conflict that cannot be resolved automatically:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git merge feature/change-to-line3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Auto-merging file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CONFLICT (content): Merge conflict in file1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Automatic merge failed; fix conflicts and then commit the result.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And we can see what is in file1:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat file1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;new change on line 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;original line 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;another change to line 3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;=======
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;line 3 from branch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature/change-to-line3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;line 4 from feature branch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In the file1, you can see changes from both branches.&lt;/p&gt;
&lt;p&gt;You could at this point, open your text editor and manually resolve the conflict by keeping the text we want, and removing the conflict markers (&amp;laquo;&amp;laquo;&amp;lt;, &amp;raquo;&amp;raquo;&amp;gt;, &lt;code&gt;===&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;This is what many people do on YouTube when applying patches and trying to resolve conflicts.
What you may not realize, is we have tools to do this, like meld, vimdiff, kdiff3.&lt;/p&gt;
&lt;p&gt;With our previous configuration, all we need is to run the command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git mergetool
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This screen should appear:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200625_2047372020-06-25-204447_1363x765_scrot.png&#34; width=&#34;150%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;What can you get from this screen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The middle section is our file1 populated with the common ancestor&amp;rsquo;s value (original line 3)&lt;/li&gt;
&lt;li&gt;The left section (called local) contains our change on our current checkout branch&lt;/li&gt;
&lt;li&gt;The right section (called remote) contains the change we made on the branch to merge (our feature branch)&lt;/li&gt;
&lt;li&gt;You bring the changes you want using the arrow icons.&lt;/li&gt;
&lt;li&gt;You can take changes from both local and remote (you can take more than once )&lt;/li&gt;
&lt;li&gt;You can edit the middle buffer&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I will take both changes, save and close meld.&lt;/p&gt;
&lt;p&gt;After all of this is done, you can commit the changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll be prompted to keep or change the default commit message.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to accept the default message.&lt;/p&gt;
&lt;p&gt;Voila! Now you know how to resolve conflicts using tools.&lt;/p&gt;
&lt;h2 id=&#34;what-if-you-re-lost&#34;&gt;What if you&amp;rsquo;re lost&lt;/h2&gt;
&lt;p&gt;You can use the merge &amp;ndash;abort option to abort an ongoing merge and then start again.&lt;/p&gt;
&lt;h2 id=&#34;various-merge-tools&#34;&gt;Various merge tools&lt;/h2&gt;
&lt;h3 id=&#34;kdiff3&#34;&gt;kdiff3&lt;/h3&gt;
&lt;p&gt;Similar tool than meld. GUI based.&lt;/p&gt;
&lt;p&gt;You just need to configure your merge.tool git configuration to kdiff3.&lt;/p&gt;
&lt;p&gt;Here is a screenshot of the same merge conflict above, but this time with kdiff3:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200625_2140312020-06-25-213935_1366x751_scrot.png&#34; width=&#34;150%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Kdiff3 adds a 4th pane, the editing pane.&lt;/p&gt;
&lt;p&gt;The base is the common ancestor, the local and remote are like for meld, the changes to the current branch and the branch we want to merge.&lt;/p&gt;
&lt;p&gt;Clicking on A/B/C allows you to select which change(s) you want to get. The bottom pane shows you these and also allows you to edit.&lt;/p&gt;
&lt;h3 id=&#34;vimdiff&#34;&gt;vimdiff&lt;/h3&gt;
&lt;p&gt;Vimdiff is similar to kdiff3 with the 4 panes, except it&amp;rsquo;s console base. You will find your way if your familiar with vim.&lt;/p&gt;
&lt;p&gt;Just set the merge.tool git configuration to vimdiff.&lt;/p&gt;
&lt;p&gt;Here is the merge conflict as seen with vimdiff:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200625_2151152020-06-25-214839_1362x758_scrot.png&#34; width=&#34;150%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Bindings:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;move between windows&lt;/dt&gt;
&lt;dd&gt;C-w C-w&lt;/dd&gt;
&lt;dt&gt;navigate to previous / next conflict&lt;/dt&gt;
&lt;dd&gt;[c and ]c&lt;/dd&gt;
&lt;dt&gt;find window numbers&lt;/dt&gt;
&lt;dd&gt;:ls&lt;/dd&gt;
&lt;dt&gt;put the content at point to the destination&lt;/dt&gt;
&lt;dd&gt;&lt;winnumber&gt;dp&lt;/dd&gt;
&lt;dt&gt;get the content from a buffer&lt;/dt&gt;
&lt;dd&gt;&lt;winnumber&gt;dg&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Window numbers:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;1&lt;/dt&gt;
&lt;dd&gt;local&lt;/dd&gt;
&lt;dt&gt;2&lt;/dt&gt;
&lt;dd&gt;base&lt;/dd&gt;
&lt;dt&gt;3&lt;/dt&gt;
&lt;dd&gt;remote&lt;/dd&gt;
&lt;dt&gt;4&lt;/dt&gt;
&lt;dd&gt;file to edit&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Again, the file window can be edited. This is vim, so you can use any vim commands.&lt;/p&gt;
&lt;h2 id=&#34;trivial-with-non-trivial-conflicts&#34;&gt;Trivial with non-trivial conflicts&lt;/h2&gt;
&lt;p&gt;In case where you have trivial and non-trivial conflicts, tools react differently:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;meld&lt;/dt&gt;
&lt;dd&gt;does not detect trivial from non-trivial&lt;/dd&gt;
&lt;dt&gt;kdiff3&lt;/dt&gt;
&lt;dd&gt;apply trivial changes automatically. Good most of the time, sometime breaks.&lt;/dd&gt;
&lt;dt&gt;vimdiff&lt;/dt&gt;
&lt;dd&gt;does not detect trivial from non-trivial&lt;/dd&gt;
&lt;/dl&gt;
&lt;h2 id=&#34;thoughts-and-what-s-next&#34;&gt;Thoughts and what&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;The problem of resolving conflicts may not appear to be that big for an example like above, but over many files and many changes, it&amp;rsquo;s the best way to resolve them with consistency and quality.&lt;/p&gt;
&lt;p&gt;What I&amp;rsquo;ve learned during this post? I still prefer kdiff3 over meld as a merge tool due to automatic trivial conflict resolution of kdiff3. I haven&amp;rsquo;t tried Emacs ediff too, will come when I try replacing IntelliJ with emacs lsp-mode in the future.&lt;/p&gt;
&lt;p&gt;In my next post, I&amp;rsquo;ll demo how I organize, apply and merge patches for st using: branches, git apply, and a merge tool.&lt;/p&gt;
&lt;p&gt;I hope you learned something :)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is day 9 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Git patching and resolving conflict (part 1)</title>
      <link>https://blog.benoitj.ca/2020-06-21-git-patching-merging-part1/</link>
      <pubDate>Sun, 21 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-06-21-git-patching-merging-part1/</guid>
    <description>&lt;p&gt;I&amp;rsquo;m creating this post after seeing numerous people suffering and manually addressing merge conflicts while integrating patches with dwm, st, or dmenu code base.&lt;/p&gt;
&lt;p&gt;The most common issues seen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;applying patches on latest from master&lt;/li&gt;
&lt;li&gt;using patch instead of git to patch&lt;/li&gt;
&lt;li&gt;resolving conflict manually&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Applying patches and resolving conflict is the land of version control system like git and we have many techniques and tools to make it easy.&lt;/p&gt;
&lt;p&gt;This is not specific to suckless.org tools, but I&amp;rsquo;ll use some example patches to show how to use tools to automate as much as we can.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: I&amp;rsquo;m going to use git, but these techniques are not unique to git.&lt;/p&gt;
&lt;h2 id=&#34;definitions&#34;&gt;Definitions&lt;/h2&gt;
&lt;p&gt;These terms may be oversimplified, but it&amp;rsquo;s done to keep things simple.&lt;/p&gt;
&lt;h3 id=&#34;a-commit&#34;&gt;A commit&lt;/h3&gt;
&lt;p&gt;A registered set of files that changed.&lt;/p&gt;
&lt;p&gt;In git, a commit has a unique identifier (a hash code).
Git only track changes made to files, so you can&amp;rsquo;t register a folder in a commit.&lt;/p&gt;
&lt;p&gt;A commit has a parent commit (except for the initial commit) and cumulative changes are actually a series of commits, each commits pointing to it&amp;rsquo;s parent.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/commits.png&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;branch&#34;&gt;branch&lt;/h3&gt;
&lt;p&gt;A way to parallelized software development. You make changes (commits) to a branch, and you create other branches to separate the work.&lt;/p&gt;
&lt;p&gt;In git, the primary development branch is by default called master.&lt;/p&gt;
&lt;p&gt;Git branches are actually pointers to the latest commit of the branch. Creating new commits on the branch moves the pointer to the new commit.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/master.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Now imagine we want to do some development work while keeping our primary branch stable, we would create another branch:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/feature.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Now development continues and we have diverging changes but it&amp;rsquo;s not a problem, we are on different branches.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/feature-diverge.png&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;fully-decentralized&#34;&gt;Fully decentralized&lt;/h3&gt;
&lt;p&gt;Something many people don&amp;rsquo;t realize is that git model is decentralized by design. We can have multiple equivalent copies of the same repository. It happens that most people use centralized systems to share code, but this is not mandatory. The whole central system could go and you can still share code and haven&amp;rsquo;t lost code.&lt;/p&gt;
&lt;h3 id=&#34;merge&#34;&gt;Merge&lt;/h3&gt;
&lt;p&gt;Now that we are done with our feature, we want to integrate it into master.&lt;/p&gt;
&lt;p&gt;We use git merge to merge our &lt;em&gt;myfeature&lt;/em&gt; branch to master:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/feature-merge.png&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;conflicts&#34;&gt;Conflicts&lt;/h3&gt;
&lt;p&gt;In the merge scenario, all is good if the diverging changes did not touch the same file. If we touched the same file, we end up in conflict. Git and merge tools would resolve trivial conflicts automatically (when we did not change the same lines).&lt;/p&gt;
&lt;p&gt;We do need to manually merge conflicts when changes occurs on the same lines.&lt;/p&gt;
&lt;h3 id=&#34;manual-conflict-resolution-with-3-panes-diff-tools&#34;&gt;Manual conflict resolution with 3 panes diff tools&lt;/h3&gt;
&lt;p&gt;Now, this is manual in the sense that we need to make a decision, but we do not need to copy paste lines, edit the files manually. We have tools for this folks!&lt;/p&gt;
&lt;p&gt;There are many tools that we can use to merge conflicts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;vimdiff&lt;/li&gt;
&lt;li&gt;emacs ediff&lt;/li&gt;
&lt;li&gt;kdiff3&lt;/li&gt;
&lt;li&gt;meld&lt;/li&gt;
&lt;li&gt;Your IDE might have one&lt;/li&gt;
&lt;li&gt;many more&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;a 3 panes diff tool usually look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|------+-------+--------|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| base | local | remote |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|------+-------+--------|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    editing buffer     |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|------+-------+--------|
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;a 3 panes diff tool usually look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|------+---------------------+--------|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| base | local / edit buffer | remote |
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|------+---------------------+--------|
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;patches&#34;&gt;Patches&lt;/h2&gt;
&lt;p&gt;A patch is a diff file (added lines/files, removed lines/files) taken at a point in time relative to a specific version.&lt;/p&gt;
&lt;p&gt;One way to share changes is by sending patches. git even has an email client to send patches.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/patch.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Now if i&amp;rsquo;m on the latest of myfeature, I can create a patch against master by typing the command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git format-patch master --stdout &amp;gt; myfeature.patch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now this patch what taken from the latest commit of master, so it is good practice to add the commit id to the patch. This way people know how to apply the patch.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/before-apply.png&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;applying-patches&#34;&gt;Applying patches&lt;/h2&gt;
&lt;p&gt;Now lets say, time has passed, and master has additional changes.&lt;/p&gt;
&lt;p&gt;The common mistakes is trying to apply the patch on the latest master branch.&lt;/p&gt;
&lt;p&gt;This may work, but as time pass, you may end up with issues.&lt;/p&gt;
&lt;p&gt;The right way to apply this patch is to create a new branch from the commit this patch was taken from, and then merge this branch to master.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/branch-apply.png&#34;&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;thoughts-and-what-s-next&#34;&gt;Thoughts and what&amp;rsquo;s next&lt;/h3&gt;
&lt;p&gt;Time to send this. I realize this problem needs to be split in couple of manageable pieces.&lt;/p&gt;
&lt;p&gt;This post was to set ground on git terminology, and patching techniques and address one of the problems often seen when patching: patching from the right place in the history.&lt;/p&gt;
&lt;p&gt;I see two possible follow-up posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;merge conflict resolution&lt;/li&gt;
&lt;li&gt;real life example using dwm, st, or dmenu&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is day 8 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Dotfiles management using chezmoi - How I Use Linux Desktop at Work Part5</title>
      <link>https://blog.benoitj.ca/2020-06-15-how-i-use-linux-desktop-at-work-part5-dotfiles/</link>
      <pubDate>Mon, 15 Jun 2020 10:30:17 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-06-15-how-i-use-linux-desktop-at-work-part5-dotfiles/</guid>
    <description>&lt;p&gt;Part 5 of the series &lt;em&gt;How I use Linux desktop at work&lt;/em&gt; where I describe how I&amp;rsquo;m building a new Vagrant configuration to use for coding on Windows Host systems.&lt;/p&gt;
&lt;p&gt;This post describes how to automate software installation and manage your dotfiles using &lt;a href=&#34;https://www.chezmoi.io/&#34;&gt;chezmoi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;ll also replace openbox with my favorite DM, dwm.&lt;/p&gt;
&lt;p&gt;Previous posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-05-29-how-i-use-linux-desktop-at-work-part1-basic-setup/&#34;&gt;part1&lt;/a&gt; - Basic setup&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-06-09-how-i-use-linux-desktop-at-work-part2-wm/&#34;&gt;part2&lt;/a&gt; - X, and WM&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-06-10-how-i-use-linux-desktop-at-work-part3-guest-additions/&#34;&gt;part3&lt;/a&gt; - VirtualBox guest additions&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-06-12-how-i-use-linux-desktop-at-work-part4-dm-with-autologin/&#34;&gt;part4&lt;/a&gt; - LightDM and autologin&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the post, I&amp;rsquo;ll cover:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Dotfiles, my dotfiles management history and why I now use &lt;a href=&#34;https://www.chezmoi.io/&#34;&gt;chezmoi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Installing &lt;a href=&#34;https://www.chezmoi.io/&#34;&gt;chezmoi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.chezmoi.io/&#34;&gt;chezmoi&lt;/a&gt; commands&lt;/li&gt;
&lt;li&gt;Install and configure core apps like: dwm, dmenu, st, sxhkd&lt;/li&gt;
&lt;li&gt;Integrate with my vagrant setup&lt;/li&gt;
&lt;li&gt;Thoughts and what&amp;rsquo;s next&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;dotfiles-my-dotfiles-management-history-and-why-i-now-use-chezmoi&#34;&gt;Dotfiles, my dotfiles management history and why I now use chezmoi&lt;/h2&gt;
&lt;h3 id=&#34;what-are-dotfiles&#34;&gt;What are dotfiles?&lt;/h3&gt;
&lt;p&gt;Lets start with some definitions and descriptions&lt;/p&gt;
&lt;p&gt;Dotfiles are files which contains application configuration, settings or preferences. Some dotfiles are edited with a text editor, while some are modified directly in the applications that they serve.&lt;/p&gt;
&lt;p&gt;Dotfiles usually starts with a period (.) or are with a folder starting with a period, this is where they take their name.&lt;/p&gt;
&lt;h3 id=&#34;dotfiles-location-conventions&#34;&gt;Dotfiles location conventions&lt;/h3&gt;
&lt;p&gt;The long time tradition is that dotfiles are stored directly in your home folder (~/). This was quite ok in the old days when you were running couple of apps, but nowadays, this is totally unrealistic. In my system only, I count several thousands of settings files. Most applications nowadays stores their dotfiles under ~/.config.&lt;/p&gt;
&lt;p&gt;Appears that the ~/.config is part of the freedesktop.org &lt;a href=&#34;https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html&#34;&gt;XDG Base Directory Specification&lt;/a&gt; under the $XDG_CONFIG_HOME variable. By default, the specs specifies ~/.config. This is rarely changed (never seen it different).&lt;/p&gt;
&lt;p&gt;In your own system, you&amp;rsquo;ll find core utilities dotfiles sitting directly under your home folder, while most applications dotfiles will be under a subfolder of ~/.config.&lt;/p&gt;
&lt;h3 id=&#34;my-dotfiles-management-history&#34;&gt;My dotfiles management history&lt;/h3&gt;
&lt;p&gt;If you are like me and customize/configure your apps and tools, you will end up with many useful customization you want to carry around with you.&lt;/p&gt;
&lt;p&gt;This is where dotfiles management is useful (there is an extensive &lt;a href=&#34;https://dotfiles.github.io/&#34;&gt;github page&lt;/a&gt; around dotfiles, management tools, and practices).&lt;/p&gt;
&lt;p&gt;Personally, I&amp;rsquo;ve been managing my dotfiles using various techniques and tools:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;started by just zipping them and emailing them around. it helped me for a while&lt;/li&gt;
&lt;li&gt;Then put them in a git repo. and manually creating symlinks&lt;/li&gt;
&lt;li&gt;Moved to yadm management tool with a bare repo, but did not stick with it. Bare git repos could be risky if you are not cautious. Also could not find out how to manage sensitive configuration files&lt;/li&gt;
&lt;li&gt;Back to basic git repo with stow using symlinks. This worked well, but still hard to manage sensitive files.&lt;/li&gt;
&lt;li&gt;Replaced stow with makefiles, and envsubst scripts to implement templating. This worked well, but tedious to maintain. Also, if I modified the destination, I would have to remember to integrate the changes also in my git repository.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As you can see, all these solutions are usable, but far from working for me. I was still on a search for a simple dotfiles until i discovered &lt;a href=&#34;https://www.chezmoi.io/&#34;&gt;chezmoi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some key features / benefits that works for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Like my latest workflow, it install files instead of creating symlink.&lt;/li&gt;
&lt;li&gt;It supports templates&lt;/li&gt;
&lt;li&gt;template values can be conditional on the system I install my dotfiles on&lt;/li&gt;
&lt;li&gt;supports injecting values from commands like password managers&lt;/li&gt;
&lt;li&gt;Can integrate changes on your target files using merge tools like vimdiff&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So now I am porting my dotfiles to &lt;a href=&#34;https://www.chezmoi.io/&#34;&gt;chezmoi&lt;/a&gt;. The remaining of this post will be on my learning journey.&lt;/p&gt;
&lt;p&gt;I will share my dotfiles on my &lt;a href=&#34;https://github.com/benoitj/dotfiles&#34;&gt;github dotfiles repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;installing-chezmoi&#34;&gt;Installing chezmoi&lt;/h2&gt;
&lt;p&gt;Head over to the &lt;a href=&#34;https://www.chezmoi.io/install/&#34;&gt;Install | chezmoi.io&lt;/a&gt; page for all options.&lt;/p&gt;
&lt;p&gt;In my case, I&amp;rsquo;m installing on arch so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pacman -S chezmoi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can see if chezmoi is properly installed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;39
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;40
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;41
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;42
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;43
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;44
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;45
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;46
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;47
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;48
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;49
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;50
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;51
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Manage your dotfiles across multiple machines, securely
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Usage:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  chezmoi [command]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Available Commands:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  add              Add an existing file, directory, or symlink to the source state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  apply            Update the destination directory to match the target state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  archive          Write a tar archive of the target state to stdout
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cat              Print the target contents of a file or symlink
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cd               Launch a shell in the source directory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  chattr           Change the attributes of a target in the source state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  completion       Generate shell completion code for the specified shell (bash, fish, or zsh)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  data             Print the template data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  diff             Print the diff between the target state and the destination state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  docs             Print documentation
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  doctor           Check your system for potential problems
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  dump             Write a dump of the target state to stdout
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  edit             Edit the source state of a target
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  edit-config      Edit the configuration file
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  execute-template Write the result of executing the given template(s) to stdout
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  forget           Remove a target from the source state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  git              Run git in the source directory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  help             Print help about a command
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hg               Run mercurial in the source directory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  import           Import a tar archive into the source state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  init             Setup the source directory and update the destination directory to match the target state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  managed          List the managed files in the destination directory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  merge            Perform a three-way merge between the destination state, the source state, and the target state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  purge            Purge all of chezmoi&amp;#39;s configuration and data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  remove           Remove a target from the source state and the destination directory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  secret           Interact with a secret manager
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  source           Run the source version control system command in the source directory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  source-path      Print the path of a target in the source state
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  unmanaged        List the unmanaged files in the destination directory
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  update           Pull changes from the source VCS and apply any changes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  verify           Exit with success if the destination state matches the target state, fail otherwise
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Flags:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --color string         colorize diffs (default &amp;#34;auto&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -c, --config string        config file (default &amp;#34;/home/benoit/.config/chezmoi/chezmoi.toml&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --debug                write debug logs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -D, --destination string   destination directory (default &amp;#34;/home/benoit&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -n, --dry-run              dry run
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --follow               follow symlinks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -h, --help                 help for chezmoi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --remove               remove targets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -S, --source string        source directory (default &amp;#34;/home/benoit/.local/share/chezmoi&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -v, --verbose              verbose
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --version              version for chezmoi
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Use &amp;#34;chezmoi [command] --help&amp;#34; for more information about a command.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;chezmoi-use-cases&#34;&gt;chezmoi use cases&lt;/h2&gt;
&lt;h3 id=&#34;getting-help&#34;&gt;Getting help&lt;/h3&gt;
&lt;p&gt;Chezmoi binary has a built in help. You can get help for any chezmoi commands using the &lt;em&gt;help&lt;/em&gt; command followed by the command you want to get help on.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi &lt;span style=&#34;color:#0aa&#34;&gt;help&lt;/span&gt; &lt;span style=&#34;color:#0aa&#34;&gt;help&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Print the help associated with *command*.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Usage:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  chezmoi help [command] [flags]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Flags:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -h, --help   help for help
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Global Flags:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --color string         colorize diffs (default &amp;#34;auto&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -c, --config string        config file (default &amp;#34;/home/benoit/.config/chezmoi/chezmoi.toml&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --debug                write debug logs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -D, --destination string   destination directory (default &amp;#34;/home/benoit&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -n, --dry-run              dry run
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --follow               follow symlinks
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      --remove               remove targets
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -S, --source string        source directory (default &amp;#34;/home/benoit/.local/share/chezmoi&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  -v, --verbose              verbose
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;get-started&#34;&gt;Get started&lt;/h3&gt;
&lt;p&gt;If you look at the &lt;a href=&#34;https://www.chezmoi.io/quick-start/&#34;&gt;quickstart&lt;/a&gt;, you&amp;rsquo;ll find that all you need to start is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;then you can add managed files using the &lt;em&gt;add&lt;/em&gt; command.&lt;/p&gt;
&lt;p&gt;Now lets take ~/.bashrc&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi add ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This will create a copy if this file under the chezmoi storage folder &lt;em&gt;~&lt;/em&gt;.local/share/chezmoi/&lt;/p&gt;
&lt;p&gt;You can also use the -r option to add files recursively:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi add -r ~/.config/newsboat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;storage-location&#34;&gt;storage location&lt;/h3&gt;
&lt;p&gt;You can &lt;em&gt;cd&lt;/em&gt; to the chezmoi storage folder&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi &lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here you can do any file operations you want.&lt;/p&gt;
&lt;p&gt;Note that file names contains encoding for permissions and have a specific meaning for chezmoi.&lt;/p&gt;
&lt;h3 id=&#34;managed-files&#34;&gt;Managed files&lt;/h3&gt;
&lt;p&gt;From the moment you add a file to chezmoi, it gets copied to the chezmoi local directory and it becomes &amp;ldquo;managed&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;You can find the list of managed files with the command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi managed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;version-control&#34;&gt;version control&lt;/h3&gt;
&lt;p&gt;Now that we have a file managed, the next thing you may want to do is to version control your dotfiles.&lt;/p&gt;
&lt;p&gt;All you need to do is to go to the chezmoi storage folder and initialize the repository.&lt;/p&gt;
&lt;p&gt;For git, it would be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi &lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;initial commit with my bash configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Chezmoi also has a git command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi git init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;initial commit with my bash configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;making-changes-to-managed-files&#34;&gt;Making changes to managed files&lt;/h3&gt;
&lt;p&gt;Any changes made outside of chezmoi&amp;rsquo;s folder will be lost by default.&lt;/p&gt;
&lt;p&gt;The best way to edit files is to edit files using chezmoi.&lt;/p&gt;
&lt;p&gt;There are really two ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;call the &lt;em&gt;edit&lt;/em&gt; command, like &lt;em&gt;chezmoi edit ~&lt;/em&gt;.bashrc/
This command use the EDITOR environment variable to launch your favorite text editor&lt;/li&gt;
&lt;li&gt;navigate to the chezmoi&amp;rsquo;s folder and edit them directly there&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;apply-changes-to-managed-files&#34;&gt;Apply changes to managed files&lt;/h3&gt;
&lt;p&gt;The apply command can install any changes made to managed files on their target (ie: where they are used).&lt;/p&gt;
&lt;p&gt;For example, if we changed the ~/.bashrc managed file using the &lt;em&gt;chezmoi edit ~&lt;/em&gt;.bashrc/ command, we can install the new version using the command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi -v apply
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: changes made to the targets are overwritten by the &lt;em&gt;apply&lt;/em&gt; command.&lt;/p&gt;
&lt;p&gt;If you are unclear what changes will be applied, ensure you use the &lt;em&gt;&amp;ndash;dry-run&lt;/em&gt; or &lt;em&gt;-n&lt;/em&gt; option:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi -v -n apply
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;What you can also do is call edit with the -a command to apply after editing. You may also like the -d and -p together with -a to diff and confirm apply.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi edit -a -d -p ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;updating-from-remote-changes&#34;&gt;Updating from remote changes&lt;/h3&gt;
&lt;p&gt;Here I usually just cd and run git commands.&lt;/p&gt;
&lt;p&gt;You can also use the chezmoi update commands which pull changes from git remote and optionally apply changes.&lt;/p&gt;
&lt;p&gt;You have choices here.&lt;/p&gt;
&lt;h3 id=&#34;integrate-changes-made-to-the-target-files-outside-of-chezmoi&#34;&gt;Integrate changes made to the target files outside of chezmoi &lt;span class=&#34;tag&#34;&gt;&lt;span class=&#34;ATTACH&#34;&gt;ATTACH&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;There are cases where the target file (ex: ~/.bashrc) is modified outside of the chezmoi repo. In this case, if you dont integrate changes in, you will loose them on the next &lt;em&gt;apply&lt;/em&gt; command.&lt;/p&gt;
&lt;p&gt;You have a couple of options to integrate these changes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;do it manually. edit both files and copy paste changes&lt;/li&gt;
&lt;li&gt;a better way is to merge your changes using diff tools.
chezmoi has the &amp;ldquo;merge&amp;rdquo; command to do this&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Upon calling &lt;em&gt;chezmoi merge&lt;/em&gt; on the specific files edited outside chezmoi, it will start a three-way merge on the file, showing the common ancestor, the value on chezmoi and the local changes. The default tool is vimdiff, but you can define your diff3 tool of choice like meld, or kdiff3.&lt;/p&gt;
&lt;p&gt;Here is an example of such diff tool.&lt;/p&gt;
&lt;p&gt;On the left, my local changes on ~/.bashrc. On the center, the changes within chezmoi.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://blog.benoitj.ca/ox-hugo/_20200616_2225202020-06-16-215937_1366x768_scrot.png&#34; width=&#34;150%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;If I want to integrate my local changes to chezmoi, I just need to click the arrow to bring changes from the left pane to the middle one.&lt;/p&gt;
&lt;h3 id=&#34;configuration-file&#34;&gt;Configuration file&lt;/h3&gt;
&lt;p&gt;The chezmoi configuration file is optional and located in the ~/.config/chezmoi/chezmoi.toml&lt;/p&gt;
&lt;p&gt;You can specify the merge tool used by the merge command like here for meld:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[merge]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  command = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;meld&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;templates&#34;&gt;Templates&lt;/h3&gt;
&lt;p&gt;Early on, I mentionned one reason I selected chezmoi is due to it&amp;rsquo;s templating support.&lt;/p&gt;
&lt;p&gt;The easiest way to create a template is by using the auto-templating.&lt;/p&gt;
&lt;p&gt;Lets say my ~/.bashrc file is like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;EMAIL&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;myemail@athome.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;and we want to have different values depending on the system.&lt;/p&gt;
&lt;p&gt;So before adding our file to chezmoi, we&amp;rsquo;ll just configure our local email in the chezmoi configuration file:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[data]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  email=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;myemail@athome.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And we add our bashrc file with the autotemplate feature:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# -T for template&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# -a for auto&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chezmoi add -T -a ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;the resulting template stored in chezmoi would be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#a00&#34;&gt;EMAIL&lt;/span&gt;=&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;{{ .email }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;em&gt;{{ .something }}&lt;/em&gt; gives you access to values within your configuration file that will be replaced during the &lt;em&gt;apply&lt;/em&gt; command execution.&lt;/p&gt;
&lt;p&gt;You can see a list of pre-defined variables &lt;a href=&#34;https://www.chezmoi.io/reference/templates/variables/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;secrets&#34;&gt;Secrets&lt;/h3&gt;
&lt;p&gt;Sources for templates can be the configuration file or secret storage tools like bitwarden, gpg, keypassXC, pass, and many more.&lt;/p&gt;
&lt;p&gt;See the page &lt;a href=&#34;https://www.chezmoi.io/why-use-chezmoi/#if-you-have-to-keep-your-dotfiles-repo-private&#34;&gt;keep data private&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h3 id=&#34;scripts&#34;&gt;Scripts&lt;/h3&gt;
&lt;p&gt;If you create scripts starting with &lt;em&gt;run_&lt;/em&gt; or &lt;em&gt;run_once&lt;/em&gt;_, chezmoi will run them at every &lt;em&gt;apply&lt;/em&gt; or &lt;em&gt;once&lt;/em&gt; unless changed.&lt;/p&gt;
&lt;p&gt;For install software, it&amp;rsquo;s better to create &lt;em&gt;run_once&lt;/em&gt;_ scripts.&lt;/p&gt;
&lt;h3 id=&#34;what-else&#34;&gt;What else&lt;/h3&gt;
&lt;p&gt;The items above are the ones I plan to use the most. But chezmoi has much more to offer and the &lt;a href=&#34;https://www.chezmoi.io/reference/&#34;&gt;documentation&lt;/a&gt; on it&amp;rsquo;s website is quite good.&lt;/p&gt;
&lt;h2 id=&#34;install-and-configure-core-apps-like-dwm-dmenu-st-sxhkd&#34;&gt;Install and configure core apps like: dwm, dmenu, st, sxhkd&lt;/h2&gt;
&lt;p&gt;I am using run_once_core.sh to install dwm, dmenu, st, sxdkd, dunst, status bar, and similar tools.&lt;/p&gt;
&lt;p&gt;If you want details, just head over to my dotfiles repository.&lt;/p&gt;
&lt;h2 id=&#34;integrate-with-my-vagrant-setup&#34;&gt;Integrate with my vagrant setup&lt;/h2&gt;
&lt;p&gt;To get this integrated with my vagrant setup, I need to add chezmoi to the vagrant provision script, and initialize chezmoi from my git repository.&lt;/p&gt;
&lt;h2 id=&#34;thoughts-and-what-s-next&#34;&gt;Thoughts and what&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;This is the last post of the VM development environment using vagrant (at least for now).
The main effort left for me is installing / configuring additional software, also moving some of the vagrant provision script into the chezmoi run_once script.&lt;/p&gt;
&lt;p&gt;Some topics for next posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;applying patches the git way - or how to patch dwm tools the coder&amp;rsquo;s way&lt;/li&gt;
&lt;li&gt;leveraging git history to find hot spot in your source code&lt;/li&gt;
&lt;li&gt;test coverage, only half of the answer to quality measure of our automated tests&lt;/li&gt;
&lt;li&gt;a series around replacing IntelliJ with Emacs LSP for Java development&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;This is day 7 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Display Manager With Autologin - How I Use Linux Desktop at Work - Part4</title>
      <link>https://blog.benoitj.ca/2020-06-12-how-i-use-linux-desktop-at-work-part4-dm-with-autologin/</link>
      <pubDate>Fri, 12 Jun 2020 21:19:25 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-06-12-how-i-use-linux-desktop-at-work-part4-dm-with-autologin/</guid>
    <description>&lt;p&gt;Part 4 of the series &lt;em&gt;How I use Linux desktop at work&lt;/em&gt; where I describe how I&amp;rsquo;m building a new Vagrant configuration to use for coding on Windows Host systems.&lt;/p&gt;
&lt;p&gt;This post describes the learning process to setup LightDM with autologin.&lt;/p&gt;
&lt;p&gt;As with previous posts, I will go over the research and manual implementation first, then go over how to automate it.&lt;/p&gt;
&lt;p&gt;In part 3, I described how I automated the build of the VirtualBox guest additions using vagrant. Part 4 will improve our current box by swapping the display manager to LightDM and setup autologin.&lt;/p&gt;
&lt;p&gt;Previous posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-05-29-how-i-use-linux-desktop-at-work-part1-basic-setup/&#34;&gt;part1&lt;/a&gt; - Basic setup&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-06-09-how-i-use-linux-desktop-at-work-part2-wm/&#34;&gt;part2&lt;/a&gt; - X, and WM&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-06-10-how-i-use-linux-desktop-at-work-part3-guest-additions/&#34;&gt;part3&lt;/a&gt; - VirtualBox guest additions&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the post, I&amp;rsquo;ll cover:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rationale&lt;/li&gt;
&lt;li&gt;Installing lightDM, a greeter&lt;/li&gt;
&lt;li&gt;Configure autologin&lt;/li&gt;
&lt;li&gt;Automating the whole thing&lt;/li&gt;
&lt;li&gt;Thoughts and next steps&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Steps 1-4 are describing the manual process while step 5 describe how I automated this in the Vagrantfile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You can find the sources created during this post in my github &lt;a href=&#34;https://github.com/benoitj/devbox-arch/tree/part4&#34;&gt;devbox-arch&lt;/a&gt; repository.&lt;/p&gt;
&lt;h2 id=&#34;rationale&#34;&gt;Rationale&lt;/h2&gt;
&lt;p&gt;I want to setup autologin since I want to get in the guest linux box ASAP without unecessary login.&lt;/p&gt;
&lt;p&gt;I only want to do this on a vagrant box under certain conditions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This vagrant box has a virtual NAT network enabled and no port forwarded except ssh using ssh keys setup by vagrant&lt;/li&gt;
&lt;li&gt;This box is secured by my host OS credentials. I cannot get in this box without unlocking my Host desktop.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;installing-lightdm-a-greeter-and-xsession&#34;&gt;Installing lightDM, a greeter, and XSession&lt;/h2&gt;
&lt;p&gt;I really like the quality, somewhat simplicity and features that lightDM gives.&lt;/p&gt;
&lt;p&gt;The setup I usually put in place with lightDM:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;lightDM itself&lt;/li&gt;
&lt;li&gt;the gtk greeter. There are better greeter, but this one is simple, available everywhere&lt;/li&gt;
&lt;li&gt;a xsession that starts my ~/.xinitrc&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In arch, this means installing lightdm, lightdm-gtk-greeter, and xinit-xsession (AUR)&lt;/p&gt;
&lt;p&gt;For the first two, its simple:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pacman -S lightdm lightdm-gtk-greeter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;xinit-xsession is part of AUR, so it&amp;rsquo;s a bit more involved as you have to build it from source.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# some required tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pacman -S git fakeroot
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# now clone the AUR git repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git clone https://aur.archlinux.org/xinit-xsession.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt; xinit-xsession
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;makepkg -sic --noconfirm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now time to enable lightdm:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl &lt;span style=&#34;color:#0aa&#34;&gt;enable&lt;/span&gt; lightdm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start lightdm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll now see the lightdm greeter with the &lt;em&gt;vagrant&lt;/em&gt; user pre-selected.&lt;/p&gt;
&lt;p&gt;If you want to login, the password is &lt;em&gt;vagrant&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Note that you can select xinitrc as a session in the session selection at the top right of the screen.&lt;/p&gt;
&lt;h2 id=&#34;configure-autologin&#34;&gt;Configure autologin&lt;/h2&gt;
&lt;p&gt;Autoconfig is configured in lightDM main configuration &lt;em&gt;/etc/lightdm/lightdm.conf&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;You must set the following two properties to get autologin with xinit session enabled:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-configuration&#34; data-lang=&#34;configuration&#34;&gt;[seat:*]
autologin-user=vagrant
autologin-session=xinitrc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note: you have to uncomment the two properties under the existing seat configuration.&lt;/p&gt;
&lt;p&gt;You can restart lightdm to see it in action:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl restart lightdm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You also need to add the autologin group and add user vagrant to this group:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;groupadd -r autologin
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;usermod -a -G autologin vagrant
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;automating-the-whole-thing&#34;&gt;Automating the whole thing&lt;/h2&gt;
&lt;p&gt;All changes were made to the 2-core.sh script.&lt;/p&gt;
&lt;p&gt;The interesting part is how to install xinit-xsession and then setup lightdm for autologin.&lt;/p&gt;
&lt;p&gt;Installing xinit-xsession using AUR comes to one command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;amp;&amp;amp; sudo -u vagrant git clone https://aur.archlinux.org/xinit-xsession.git &amp;amp;&amp;amp; &lt;span style=&#34;color:#a50&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt; xinit-xsession &amp;amp;&amp;amp; &lt;span style=&#34;color:#a50&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&lt;/span&gt;    sudo -u vagrant git checkout 7cae213844b &amp;amp;&amp;amp; &lt;span style=&#34;color:#a50&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;&lt;/span&gt;    sudo -u vagrant makepkg -sic --noconfirm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Note: makepkg needs to run as a regular user, so you need to clone, and call makepkg using vagrant.&lt;/p&gt;
&lt;p&gt;Enabling autologin can be done using sed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i -e &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;s/# *autologin-user=.*/autologin-user=vagrant/&amp;#39;&lt;/span&gt; /etc/lightdm/lightdm.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i -e &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;s/# *autologin-session=.*/autologin-session=xinitrc/&amp;#39;&lt;/span&gt; /etc/lightdm/lightdm.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The sed&amp;rsquo;s -i option enables in-place editing which change the file specified.&lt;/p&gt;
&lt;p&gt;The last part, creating a .xinitrc that calls openbox:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat &lt;span style=&#34;color:#a50&#34;&gt;&amp;lt;&amp;lt;EOT &amp;gt; ~vagrant/.xinitrc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;exec /usr/bin/openbox
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a50&#34;&gt;EOT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chown vagrant:vagrant ~vagrant/.xinitrc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x ~vagrant/.xinitrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Here, the file is created as root, and then ownership is transferred to the vagrant user.&lt;/p&gt;
&lt;h2 id=&#34;thoughts-and-next-steps&#34;&gt;Thoughts and next steps&lt;/h2&gt;
&lt;p&gt;I hope I am able to demonstrate how easy it is to provision a Linux development VM using vagrant and some unix scripts.&lt;/p&gt;
&lt;p&gt;The hardest part is done, getting a foundation to install development tools and configuration.&lt;/p&gt;
&lt;p&gt;In next post, I&amp;rsquo;ll configure this VM using chezmoi. This will allow me to bring my dotfiles and installation scripts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;When I started this blog, I was hoping it would be useful to others. Now I see that it may be as useful to me. It makes me thinks of my goals, think about improving, it makes me learn.&lt;/p&gt;
&lt;p&gt;I hope this series inspires people to shape tools to meet their needs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is day 6 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>How I use Linux desktop at work - Part3 - Guest additions</title>
      <link>https://blog.benoitj.ca/2020-06-10-how-i-use-linux-desktop-at-work-part3-guest-additions/</link>
      <pubDate>Wed, 10 Jun 2020 22:00:24 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-06-10-how-i-use-linux-desktop-at-work-part3-guest-additions/</guid>
    <description>&lt;p&gt;Part 3 of the series &lt;em&gt;How I use Linux desktop at work&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Just to recap, this series is describing how I leverage vagrant and VirtualBox to provision development VM on my work PCs. I&amp;rsquo;m also taking the opportunity to build them from scratch with the tools I use at home.&lt;/p&gt;
&lt;p&gt;Previous posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-05-29-how-i-use-linux-desktop-at-work-part1-basic-setup/&#34;&gt;part1&lt;/a&gt; - Basic setup&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.benoitj.ca/2020-06-09-how-i-use-linux-desktop-at-work-part2-wm/&#34;&gt;part2&lt;/a&gt; - X, and WM&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the post, I&amp;rsquo;ll cover:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;reasons why I ended up compiling the guest additions&lt;/li&gt;
&lt;li&gt;installing required tools&lt;/li&gt;
&lt;li&gt;mounting drive&lt;/li&gt;
&lt;li&gt;building guest additions&lt;/li&gt;
&lt;li&gt;automating the whole thing&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The end result will make the X guest screen resize to the host window size.&lt;/p&gt;
&lt;p&gt;Steps 1-4 are describing the manual process while step 5 describe how I automated this in the Vagrantfile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You can find the sources created during this post in my github &lt;a href=&#34;https://github.com/benoitj/devbox-arch/tree/part3&#34;&gt;devbox-arch&lt;/a&gt; repository.&lt;/p&gt;
&lt;h2 id=&#34;reasons&#34;&gt;Reasons&lt;/h2&gt;
&lt;p&gt;During part 2, I spent most of my time trying to get X guest screen to resize automatically. I tried many things like, installing the dkms package, downgrading my virtualBox to the exact version of guest additions available in arch. All of this time without positive results.&lt;/p&gt;
&lt;p&gt;Let me know if you know how to solve it without building guest additions.&lt;/p&gt;
&lt;h2 id=&#34;installing-tools&#34;&gt;Installing tools&lt;/h2&gt;
&lt;p&gt;guest additions needs which, gcc, perl, linux-headers packages in order to be compiled.&lt;/p&gt;
&lt;p&gt;you can do so by running these commands.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pacman -S which perl gcc linux-headers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;mounting-drive&#34;&gt;Mounting drive&lt;/h2&gt;
&lt;p&gt;From the devices menu, select the &amp;ldquo;insert guest additions CD&amp;hellip;&amp;rdquo; which is the equivalent of inserting the CD in the virtualdrive&lt;/p&gt;
&lt;p&gt;Now mount this ISO to the /mnt mount point&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount /dev/sr0 /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;building-guest-additions&#34;&gt;Building guest additions&lt;/h2&gt;
&lt;p&gt;Now you just need to go to the /mnt path and run the installer:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt; /mnt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./VBoxLinuxAdditions.run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Accept the installation.&lt;/p&gt;
&lt;p&gt;Then reboot and voila!&lt;/p&gt;
&lt;h2 id=&#34;automating-the-whole-thing&#34;&gt;Automating the whole thing&lt;/h2&gt;
&lt;p&gt;Now, we do not want to do this manually every time, lets automate this.&lt;/p&gt;
&lt;p&gt;This comes in two parts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;binding the ISO to the DVD drive&lt;/li&gt;
&lt;li&gt;mounting and building&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;binding-the-iso-to-the-dvd-drive&#34;&gt;Binding the ISO to the DVD drive&lt;/h3&gt;
&lt;p&gt;Now automating binding of the ISO is fairly easy with vagrant. You just have to use the modifyvm to create a CD drive and tell to &amp;ldquo;put&amp;rdquo; the ISO file in the drive:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;storageattach&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;--storagectl&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;IDE Controller&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;--device&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;--port&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#099&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;--type&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;dvddrive&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;--medium&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;C:\Program Files\Oracle\Virtualbox\VBoxGuestAdditions.iso&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;mounting-and-building&#34;&gt;Mounting and building&lt;/h3&gt;
&lt;p&gt;Like I described in part 2, we will update the &amp;ldquo;2-core.sh&amp;rdquo; script to build the guest additions.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mount /dev/sr0 /mnt &amp;amp;&amp;amp; &lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt; /mnt &amp;amp;&amp;amp; ./VBoxLinuxAdditions.run -- --force
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;umount -f /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;rebooting&#34;&gt;Rebooting&lt;/h3&gt;
&lt;p&gt;I use the vagrant-reload plugin to reboot while provisioning.&lt;/p&gt;
&lt;p&gt;Once installed, you can reboot the VM with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config.vm.provision &lt;span style=&#34;color:#00a&#34;&gt;:reload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;value-of-all-this&#34;&gt;Value of all this&lt;/h2&gt;
&lt;p&gt;At this stage, with just a single vagrant up command, I can automatically provision a Linux VM with X configured and a basic window manager.&lt;/p&gt;
&lt;p&gt;This will serve as a foundation to my work/home dev boxes.&lt;/p&gt;
&lt;h2 id=&#34;what-is-coming-next&#34;&gt;What is coming next&lt;/h2&gt;
&lt;p&gt;Some topics for the near future:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Swap the X session manager to an auto-logger&lt;/li&gt;
&lt;li&gt;Configure dwm/st/sxhkd/dmenu using chezmoi dotfiles management to provision everything&lt;/li&gt;
&lt;li&gt;Coding tools installation&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This may just be one post, we&amp;rsquo;ll see.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I hope this series is of some use to others and inspire people to use tools that suits their needs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is day 5 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>How I use Linux desktop at work - Part2 - Window manager and GUI</title>
      <link>https://blog.benoitj.ca/2020-06-09-how-i-use-linux-desktop-at-work-part2-wm/</link>
      <pubDate>Tue, 09 Jun 2020 16:31:24 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-06-09-how-i-use-linux-desktop-at-work-part2-wm/</guid>
    <description>&lt;p&gt;Part 2 of the series &lt;em&gt;How I use Linux desktop at work&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Just to recap, this series is describing how I leverage vagrant and VirtualBox to provision development VM on my work PCs. I&amp;rsquo;m also taking the opportunity to build them from scratch with the tools I use at home.&lt;/p&gt;
&lt;p&gt;In the post, we go over:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;creating a basic arch VM&lt;/li&gt;
&lt;li&gt;configure VM&lt;/li&gt;
&lt;li&gt;install X related packages&lt;/li&gt;
&lt;li&gt;Install one Window Manager (lxde)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The end result is a versioned configuration that can provision a basic arch VM with X and a window manager.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You can find the sources created during this post in my github &lt;a href=&#34;https://github.com/benoitj/devbox-arch/tree/part2&#34;&gt;devbox-arch&lt;/a&gt; repository.&lt;/p&gt;
&lt;h2 id=&#34;pre-requisite&#34;&gt;Pre-requisite&lt;/h2&gt;
&lt;p&gt;Stuff assumed to be configured before starting and already covered in &lt;a href=&#34;https://blog.benoitj.ca/2020-05-29-how-i-use-linux-desktop-at-work-part1-basic-setup/&#34;&gt;part1&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;VirtualBox&lt;/li&gt;
&lt;li&gt;vagrant&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Also I make use of &lt;a href=&#34;https://gitforwindows.org/&#34;&gt;git bash&lt;/a&gt; to version control my configuration and also to run vagrant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Many commands below will run fine on git bash, but not on powershell. Just take this into consideration.&lt;/p&gt;
&lt;h2 id=&#34;creating-the-basic-arch-vm&#34;&gt;Creating the basic arch VM&lt;/h2&gt;
&lt;p&gt;At this stage, we&amp;rsquo;ll create a bare minimum vagrant file that creates VM based on arch.&lt;/p&gt;
&lt;p&gt;I use the official arch vagrant box called archlinux/archlinux.&lt;/p&gt;
&lt;p&gt;In my git bash, I type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir devbox-arch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;cd&lt;/span&gt; devbox-arch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant init archlinux/archlinux
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. Lets boot it up and connect to it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant up
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant ssh
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uname -a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;setup-a-git-repository&#34;&gt;setup a git repository&lt;/h2&gt;
&lt;p&gt;Might as well create a git repository right away. This will create a safe environment to break things and revert if needed.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;.vagrant/&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add Vagrantfile .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;basic arch console config&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;configure-vm&#34;&gt;configure VM&lt;/h2&gt;
&lt;p&gt;The VM we just created is good enough for console tools, but if we are going to use this for a development VM running X, we need to allocate more resources, setup graphic properties, setup host/guest integration.&lt;/p&gt;
&lt;p&gt;Here is my vagrant file, it includes variables to define various properties like memory, CPUs, monitors. My objective is to be able to quickly adapt to the resources available on the host computer I use.&lt;/p&gt;
&lt;p&gt;Couple of things to note about the vagrant file below:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ensure that you don&amp;rsquo;t over allocate resources. Don&amp;rsquo;t assign all your CPUs and ram to the VM. If you launch VirtualBox UI, can you see safe limits in the settings menu.&lt;/li&gt;
&lt;li&gt;VM customization below starting with vb. are specific to VirtualBox, if you use a different vagrant provider, these options won&amp;rsquo;t work.&lt;/li&gt;
&lt;li&gt;Clipboard is setup bidirectional between host and guest&lt;/li&gt;
&lt;li&gt;The host folder &lt;em&gt;C:\Users\&lt;userid&gt;\src&lt;/em&gt; (~/src in git bash) is mapped to the guest folder ~/src.
This is usually the source folder I use to share sources.&lt;/li&gt;
&lt;/ol&gt;
&lt;!--listend--&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# -*- mode: ruby -*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# vi: set ft=ruby :&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;NB_MONITORS&lt;/span&gt; = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;NB_CPUS&lt;/span&gt; = &lt;span style=&#34;color:#099&#34;&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;MEMORY&lt;/span&gt; = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;8192&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;VRAM&lt;/span&gt; = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;Vagrant&lt;/span&gt;.configure(&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#00a&#34;&gt;do&lt;/span&gt; |config|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  config.vm.box = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;archlinux/archlinux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  config.vm.provider &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;virtualbox&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#00a&#34;&gt;do&lt;/span&gt; |vb|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# Display the VirtualBox GUI when booting the machine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.gui = &lt;span style=&#34;color:#00a&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.name = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;devbox-arch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# resources&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.memory = &lt;span style=&#34;color:#a00&#34;&gt;MEMORY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;modifyvm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;--cpus&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a00&#34;&gt;NB_CPUS&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# graphics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;modifyvm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;--monitorcount&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a00&#34;&gt;NB_MONITORS&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;modifyvm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;--vram&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a00&#34;&gt;VRAM&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;modifyvm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;--graphicscontroller&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;vmsvga&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;modifyvm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;--accelerate3d&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# Customise audio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;modifyvm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;--audioout&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;on&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;modifyvm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;--audio&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;dsound&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;modifyvm&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;--audiocontroller&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;hda&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vb.customize [&lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;modifyvm&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;:id&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;--clipboard-mode&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;bidirectional&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#00a&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#aaa;font-style:italic&#34;&gt;# mount my Users\&amp;lt;&amp;gt;\src folder on host to /home/vagrant/src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  config.vm.synced_folder &lt;span style=&#34;color:#a00&#34;&gt;ENV&lt;/span&gt;[&lt;span style=&#34;color:#a50&#34;&gt;&amp;#39;USERPROFILE&amp;#39;&lt;/span&gt;] + &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;/src&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;/home/vagrant/src&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You may want to destroy your VM (vagrant destroy) and recreate it (vagrant up).&lt;/p&gt;
&lt;h3 id=&#34;setting-up-additional-vm-options&#34;&gt;Setting up additional VM options&lt;/h3&gt;
&lt;p&gt;You may want to add / change the configuration described above. The vb.customize configurations above use the VBoxManage.exe command from the &lt;em&gt;C:\Program Files\oracle\virtualbox&lt;/em&gt; folder.&lt;/p&gt;
&lt;p&gt;Call VBoxManage to get more details or you can head over to the &lt;a href=&#34;https://www.virtualbox.org/manual/ch08.html#vboxmanage-modifyvm&#34;&gt;VBoxManage&lt;/a&gt; documentation.&lt;/p&gt;
&lt;h2 id=&#34;configure-arch&#34;&gt;configure arch&lt;/h2&gt;
&lt;p&gt;My strategy to provision the configure the OS is to keep the configuration out of the VagrantFile and create a series of shell scripts called by the VagrantFile.&lt;/p&gt;
&lt;p&gt;This is done by the provisioner options.&lt;/p&gt;
&lt;p&gt;Here is an example calling a specific script as root (by default).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config.vm.provision &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;shell&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;path&lt;/span&gt;: &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;1-setup-arch.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Followed by a vagrant command to run the provision script:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant provision
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The config.vm.provision instruction supports inline scripting as well as normal user provisioning.&lt;/p&gt;
&lt;p&gt;The setup arch contains instructions to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;setup timezone and locale&lt;/li&gt;
&lt;li&gt;configure pacman to use a regional mirror&lt;/li&gt;
&lt;li&gt;update the package list and update with any new package versions&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;getting-x-environment-working&#34;&gt;Getting X environment working&lt;/h2&gt;
&lt;p&gt;Same as with arch config, I&amp;rsquo;m using a script to setup X and related software.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config.vm.provision &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;shell&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#00a&#34;&gt;path&lt;/span&gt;: &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;2-core.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Again followed by:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant provision
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Some objectives for the core provisioning script is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;install X, it&amp;rsquo;s drivers, a window manager&lt;/li&gt;
&lt;li&gt;setup audio&lt;/li&gt;
&lt;li&gt;install virtualbox guest additions with X support&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now you should see a GUI login prompt with the vagrant user selected. You can enter the super secret password (ie: vagrant).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;: The vagrant account is safe as long as you don&amp;rsquo;t weaken the existing setup (like: enable services using password authentication).&lt;/p&gt;
&lt;h3 id=&#34;time-to-speed-up&#34;&gt;Time to speed up&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m running out of time, and as I previously posted, I prefer something working to something perfect.&lt;/p&gt;
&lt;p&gt;Here are the things I&amp;rsquo;ll be improving and describing in future posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;setup an auto logger to get in the vagrant account instead of a session manager&lt;/li&gt;
&lt;li&gt;add additional core apps like vim.&lt;/li&gt;
&lt;li&gt;replace lxde with WM of choice (dwm) with related tools/configuration&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So in a nutshell, the 2-core.sh script will evolve.&lt;/p&gt;
&lt;h2 id=&#34;things-that-could-go-wrong&#34;&gt;Things that could go wrong&lt;/h2&gt;
&lt;p&gt;Got two issues while building this configuration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;pacman update fails due to bad mirror.&lt;/p&gt;
&lt;p&gt;This is why I&amp;rsquo;ve been selecting the first mirror that works for me&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;guest OS resolution does not adjust with the VM window size. I wasted quite some time trying to find why.&lt;/p&gt;
&lt;p&gt;This issue is due to incompatibility with your VirtualBox and the install guest additions.
you have two choices here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;install the exact same version as the virtualbox-guest-utils package. Does not always work.&lt;/li&gt;
&lt;li&gt;build the guest additions from the VM iso by selecting &amp;ldquo;insert guest addition&amp;rdquo; in the VirtualBox menus. I will create a new post how I&amp;rsquo;ve done this.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;where-to-find-sources&#34;&gt;where to find sources&lt;/h2&gt;
&lt;p&gt;This is becoming my default setup for both home and work.&lt;/p&gt;
&lt;p&gt;You will find this particular configuration in my git repository: &lt;a href=&#34;https://github.com/benoitj/devbox-arch/tree/part2&#34;&gt;devbox-arch.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you look at the master branch, you&amp;rsquo;ll most definitively find something different as this configuration will evolve over time.&lt;/p&gt;
&lt;h2 id=&#34;what-is-coming-next&#34;&gt;What is coming next&lt;/h2&gt;
&lt;p&gt;Some topics for the near future:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;New post to cover how to get window resizing by installing/compiling the guest additions&lt;/li&gt;
&lt;li&gt;Using chezmoi to manage dotfiles and tools installation&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;I hope this series is of some use to others and inspire people to use tools that suits their needs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is day 4 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>How I Use Linux Desktop at Work - Part 1 - Basic setup</title>
      <link>https://blog.benoitj.ca/2020-05-29-how-i-use-linux-desktop-at-work-part1-basic-setup/</link>
      <pubDate>Fri, 29 May 2020 11:31:24 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-05-29-how-i-use-linux-desktop-at-work-part1-basic-setup/</guid>
    <description>&lt;p&gt;Most coders is large companies are facing the same situation: We develop for Linux servers, but we are running on Windows or MacOS boxes.&lt;/p&gt;
&lt;p&gt;Things are working &lt;em&gt;mostly&lt;/em&gt; the same at best, at worst, it&amp;rsquo;s broken.&lt;/p&gt;
&lt;p&gt;We need a solution and &lt;a href=&#34;https://www.vagrantup.com&#34;&gt;Vagrant&lt;/a&gt; is a quick way to provision a Linux VM on your local desktop.&lt;/p&gt;
&lt;p&gt;This will be a series of posts starting with these 4 topics:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Basic setup&lt;/li&gt;
&lt;li&gt;Getting basic X setup&lt;/li&gt;
&lt;li&gt;Make it your own. Dotfiles and development environments&lt;/li&gt;
&lt;li&gt;Variants using boxes from Linux OS&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;why-vagrant&#34;&gt;Why Vagrant&lt;/h2&gt;
&lt;p&gt;For those who don&amp;rsquo;t know, &lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant by HashiCorp&lt;/a&gt; is a VM provisioning tool targeted at spawning software development boxes. I&amp;rsquo;ve used Vagrant for the last 3-4 years to quickly get a Linux development VM running on my Windows Desktop.&lt;/p&gt;
&lt;p&gt;Vagrant support various VM/Hypervisor platforms like libvirt/KVM (Linux), MS HyperV (Win), &lt;a href=&#34;https://www.virtualbox.org&#34;&gt;Oracle VM VirtualBox&lt;/a&gt; (both), VMWare&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.vagrantup.com&#34;&gt;Vagrant&lt;/a&gt; primary file is a VagrantFile which describes how the VM must be configured. It goes from which OS to use, how many memory/cpu to use, disk size, shared drive between Host and Guest, and much more.&lt;/p&gt;
&lt;p&gt;There are couple of reasons to use this setup to configure a Linux development environment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Quick and reproducible&lt;/li&gt;
&lt;li&gt;Can be shared with colleagues and friends&lt;/li&gt;
&lt;li&gt;Isolate the environment from your host OS. Can become project specific setup.&lt;/li&gt;
&lt;li&gt;Develop on the same OS as your target OS&lt;/li&gt;
&lt;li&gt;You can use vagrant to setup a set of VMs that works together (things like a Kubernetes cluster)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;virtualization&#34;&gt;Virtualization&lt;/h2&gt;
&lt;p&gt;There are couple of &lt;a href=&#34;https://www.vagrantup.com/docs/providers&#34;&gt;choices&lt;/a&gt; of virtualization platform:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Virtualbox&lt;/li&gt;
&lt;li&gt;VMWare&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;HyperV&lt;/li&gt;
&lt;li&gt;WSL (beta)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In most cases, Virtualbox is the best solution due to it&amp;rsquo;s Guest Additions integration and USB2.0/3.0 support.&lt;/p&gt;
&lt;p&gt;In short, why others are lesser capable IMHO:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VMWare: cost something. You can get away by running only the player, but it&amp;rsquo;s not as capable than the regular product or Virtualbox&lt;/li&gt;
&lt;li&gt;Docker: on Windows, docker runs on a HyperViser, I find this adds a layer of complexity to the VM approach. I also use docker daily, and running docker in docker can work, but it needs special configuration&lt;/li&gt;
&lt;li&gt;HyperV: The configuration is quite similar to Virtualbox. Capable configuration UI, and quick fast execution. Where it fall short compared to VirtualBox is it uses &lt;a href=&#34;https://en.wikipedia.org/wiki/Remote%5FDesktop%5FProtocol&#34;&gt;RDP&lt;/a&gt; instead of a seamless integration with the Host we get with Virtualbox. If it does not bother you, then HyperV is a valid option, and maybe a faster one.&lt;/li&gt;
&lt;li&gt;WSL: First, support for WSL in Vagrant is beta. It&amp;rsquo;s also only text based (I know you can go around it). Not really giving what you need compared to the alternatives&lt;/li&gt;
&lt;li&gt;WSL2: There are some tickets open to support WSL2. This may be a viable option in the future. Maybe this will bridge the gap between HyperV and Virtualbox with regards to seamless integration with the host OS. Too early to tell.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;basic-setup&#34;&gt;Basic setup&lt;/h2&gt;
&lt;p&gt;The aim of this first part is to get a prompt on the Guest OS of choice, in this case Arch, but it could be any other Linuxes.&lt;/p&gt;
&lt;h3 id=&#34;enable-virtualization&#34;&gt;Enable virtualization&lt;/h3&gt;
&lt;p&gt;To make things fast, we need to use Virtualization implemented using Hardware virtualization capabilities of your PC. In theory, software based virtualization could work, but it&amp;rsquo;s far from being usable if you want to run X and a window manager (ie: way too slow).&lt;/p&gt;
&lt;p&gt;Most PC these days support Hardware virtualization (even my old x220 from 2012), but it may not be enabled.&lt;/p&gt;
&lt;p&gt;You can enable virtualization by going to your BIOS and enabling hardware virtualization. It can have various names, VT-x, Virtualization, or something similar. If not enabled, Virtualbox wont be able to give you hardware virtualization. If this is on your work PC, you may need your IT department to enable this if they password protected your BIOS.&lt;/p&gt;
&lt;h3 id=&#34;install-virtualbox&#34;&gt;Install Virtualbox&lt;/h3&gt;
&lt;p&gt;Install &lt;a href=&#34;https://www.virtualbox.org/wiki/Downloads&#34;&gt;Oracle VM VirtualBox&lt;/a&gt;. In my case, I install the VirtualBox for Windows Host.&lt;/p&gt;
&lt;p&gt;You can optionally install the Oracle VM VirtualBox Extension Pack which gives you host bridging with USB 2.0/3.0 devices. This is required if you want to pass-through a USB 2.0 or 3.0 device connected to your host directly to your VM.&lt;/p&gt;
&lt;h3 id=&#34;vagrant&#34;&gt;Vagrant&lt;/h3&gt;
&lt;p&gt;Vagrant requires newer version of Powershell to be able to install. Windows 10 has the right version and I&amp;rsquo;ll assume you are on Windows 10 since other versions are EOL.&lt;/p&gt;
&lt;p&gt;Head over &lt;a href=&#34;https://www.vagrantup.com/&#34;&gt;Vagrant by HashiCorp&lt;/a&gt; and download vagrant.&lt;/p&gt;
&lt;p&gt;Installation should be trivial.&lt;/p&gt;
&lt;h3 id=&#34;vagrant-box-selection&#34;&gt;Vagrant Box selection&lt;/h3&gt;
&lt;p&gt;Time for box selection. A vagrant box is a pre-configured bare VM that you can download and start. It&amp;rsquo;s the VM equivalent to a docker image.&lt;/p&gt;
&lt;p&gt;Head over to &lt;a href=&#34;https://app.vagrantup.com/boxes/search&#34;&gt;Discover Vagrant Boxes - Vagrant Cloud&lt;/a&gt; page to search for boxes.&lt;/p&gt;
&lt;p&gt;Like any community contributed software, take special care to select a box you can trust.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: The box I&amp;rsquo;m going to select here is based on my own evaluation. I&amp;rsquo;m not flawless, and also things could change over time (ie: what is safe today may not be in the future). You should do your own assessment. You&amp;rsquo;ve been warned, don&amp;rsquo;t blame me if this breaks your system.&lt;/p&gt;
&lt;p&gt;I would recommend to take boxes from reputable sources, or build you own (which is way beyond the scope of this series).&lt;/p&gt;
&lt;p&gt;To test the setup, I&amp;rsquo;ll just select a small VM for alpine: &lt;em&gt;generic/alpine38&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;vagrantfile&#34;&gt;VagrantFile&lt;/h3&gt;
&lt;p&gt;Vagrant is configured in a similar way to docker, with a VagrantFile used to &amp;ldquo;build&amp;rdquo; your VM.&lt;/p&gt;
&lt;p&gt;To create the simplest VagrantFile for a new setup, open a cmd prompt or powershell and type:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir &lt;span style=&#34;color:#0aa&#34;&gt;test-vm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0aa&#34;&gt;cd test-vm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant init generic/alpine38
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;BTW, Vagrant is written in ruby and the VagrantFile is a ruby file.&lt;/p&gt;
&lt;p&gt;Here is the equivalent of your Vagrantfile:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ruby&#34; data-lang=&#34;ruby&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a00&#34;&gt;Vagrant&lt;/span&gt;.configure(&lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#00a&#34;&gt;do&lt;/span&gt; |config|
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  config.vm.box = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;generic/alpine38&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;booting-the-box&#34;&gt;Booting the box&lt;/h3&gt;
&lt;p&gt;Now that your configuration file is created, run the following command in a powershell in the created directory:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In the end of the process, you should have a VM provisioned and started.&lt;/p&gt;
&lt;h3 id=&#34;connect-to-your-box&#34;&gt;Connect to your box&lt;/h3&gt;
&lt;p&gt;From the same vagrant folder, you can connect to your box using ssh with keys generated for your:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant ssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You are now connected to your box using SSH.&lt;/p&gt;
&lt;p&gt;You can now disconnect from SSH (ie: exit or ^d)&lt;/p&gt;
&lt;h3 id=&#34;sharing-files-using-default-vagrant-folder&#34;&gt;Sharing files using default /vagrant folder&lt;/h3&gt;
&lt;p&gt;You may have noted that vagrant mounted &lt;em&gt;/vagrant&lt;/em&gt; to your local vagrant folder. In your box, you can share files from that folder. There are ways to mount additional folders and we&amp;rsquo;ll go over this in a later post.&lt;/p&gt;
&lt;h3 id=&#34;shutting-down&#34;&gt;Shutting down&lt;/h3&gt;
&lt;p&gt;Another useful command, is you can tell vagrant to shutdown the VM using:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant halt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;destroying-your-box&#34;&gt;Destroying your box&lt;/h3&gt;
&lt;p&gt;Since this is just a test box, you may want to delete the VM:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vagrant destroy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;what-i-get-out-of-this&#34;&gt;What I get out of this&lt;/h2&gt;
&lt;p&gt;As you can see, Vagrant helps you setup a minimal Linux OS running in a VM in just a few steps.&lt;/p&gt;
&lt;p&gt;This is way more efficient than installing from ISO and going through the installation.&lt;/p&gt;
&lt;p&gt;Coming next will be part 2, addressing basic X setup as well as tweaking the VM configuration using the same VagrantFile.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is day 3 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>Blogging Setup</title>
      <link>https://blog.benoitj.ca/2020-05-24-blogging-setup/</link>
      <pubDate>Sun, 24 May 2020 21:25:51 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-05-24-blogging-setup/</guid>
    <description>&lt;p&gt;In this second post, I&amp;rsquo;ll go over my thought process to create / publish a blog using markup languages and couple of tools.&lt;/p&gt;
&lt;p&gt;The objective of my setup was to be done quickly so I can write something else than software configuration :)&lt;/p&gt;
&lt;p&gt;My hopes for my blogging setup:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;something I can use from day one, get out of the way, and allow me to improve at a later time&lt;/li&gt;
&lt;li&gt;automated build and deploy&lt;/li&gt;
&lt;li&gt;use a markup language like commonmark/markdown, org-mode, or Asciidoc. Preferably org-mode since I want to use org babel with code blocs.&lt;/li&gt;
&lt;li&gt;simple
&lt;ol&gt;
&lt;li&gt;presentation in a super simple CSS&lt;/li&gt;
&lt;li&gt;use HTML5&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;learn something I haven&amp;rsquo;t done before&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Spoiler alert&lt;/strong&gt;: it&amp;rsquo;s possible to get up and running in one day, if you accept some compromise and don&amp;rsquo;t get stuck on trying to make everything perfect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: There are much easier way to get started using platforms like Wordpress or write.as. This solution is tailored to what I&amp;rsquo;m comfortable doing, it may not be the right solution for you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer2&lt;/strong&gt;: This is not a howto guide, but hopefully source of inspiration.&lt;/p&gt;
&lt;h2 id=&#34;build-the-site&#34;&gt;Build the site&lt;/h2&gt;
&lt;p&gt;Couple of options I&amp;rsquo;ve looked at:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;use something like pandoc with couple of shell scripts or Makefiles
Great to convert single files. Could have worked for a 1 day setup, but not necessarily easy to get going on a free CI platform. Also a I bit too custom to my liking if I want to create templates, archetypes. All possible, but I suspect too needy.&lt;/li&gt;
&lt;li&gt;use org publish with plain org files
Not too convinced with this one. It feels like pandoc, but in Emacs :). Easy to start, but would not be great to integrate with a CI platform.&lt;/li&gt;
&lt;li&gt;use the great export plugin &lt;a href=&#34;https://ox-hugo.scripter.co/&#34;&gt;ox-hugo - Org to Hugo exporter&lt;/a&gt; from Kaushal Modi
Would work better for me since this is a bridge between Emacs/org-mode and a static site generator.
The main downside to me is that I did not used Hugo before, and this creates abstraction on top of Hugo. Would Be a good addition once I know Hugo.&lt;/li&gt;
&lt;li&gt;use a static site generator like Jekyll or Hugo
Since I have some hope to use ox-hugo in the future, I did try to get Hugo working for my blog.
Hugo also support org-mode in addition to markdown.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;prototyping&#34;&gt;Prototyping&lt;/h2&gt;
&lt;p&gt;Followed the Hugo getting started and got a two dummy post created.&lt;/p&gt;
&lt;p&gt;This is really easy to get &lt;a href=&#34;https://gohugo.io/getting-started/quick-start/&#34;&gt;started&lt;/a&gt;. Here are the main steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;create a site&lt;/li&gt;
&lt;li&gt;associate a theme&lt;/li&gt;
&lt;li&gt;create some posts&lt;/li&gt;
&lt;li&gt;run Hugo in server mode and open up your browser to &lt;a href=&#34;http://localhost:1313&#34;&gt;http://localhost:1313&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s all you need to get started.&lt;/p&gt;
&lt;h2 id=&#34;the-hardest-part-is-yet-to-come-dot-teeming-and-rendering-dot&#34;&gt;The hardest part is yet to come. Teeming and Rendering.&lt;/h2&gt;
&lt;p&gt;I really like clean and simple. Now there are many nice clean/simple theme on Hugo site, but the ones I liked had big CSS and many even made use of JavaScript. Also, none made use of simpler elements defined in HTML5.&lt;/p&gt;
&lt;p&gt;What I was looking for was in the spirit the opinionated &lt;a href=&#34;https://thebestmotherfucking.website/&#34;&gt;thebestmotherfuckingwebsite&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Found this now unmaintained Hugo theme: &lt;a href=&#34;https://github.com/mpcsh/hugo-theme-motherfuckingwebsite&#34;&gt;https://github.com/mpcsh/hugo-theme-motherfuckingwebsite&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Made my own &lt;a href=&#34;https://github.com/benoitj/my-hugo-motherfuckingwebsite&#34;&gt;version&lt;/a&gt; to be able to make it work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;change the navigation menu: add a link to the post RSS feed, merge about and contact together&lt;/li&gt;
&lt;li&gt;issues with generating the index list. looks like it is sensitive to folder name&lt;/li&gt;
&lt;li&gt;index template is using description front matter data instead of summary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The templates and CSS are quite simple but not HTML5.&lt;/p&gt;
&lt;p&gt;At this point, it&amp;rsquo;s good enough visually, on my laptop&amp;hellip; No time to waste, next step!&lt;/p&gt;
&lt;h2 id=&#34;deployment&#34;&gt;Deployment&lt;/h2&gt;
&lt;p&gt;Some hope for deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;integrates with either GitHub or Bitbucket (hosted accounts I have)&lt;/li&gt;
&lt;li&gt;build my Hugo site from sources on some my public repositories.&lt;/li&gt;
&lt;li&gt;support custom domain&lt;/li&gt;
&lt;li&gt;something I would not have to read much about&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Couple of options comes to mind:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;github pages&lt;/li&gt;
&lt;li&gt;gitlab pages&lt;/li&gt;
&lt;li&gt;netlify&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here, my objective is to get it done ASAP. so no A/B comparison of which on is best. The first hit that seems to work is king :).&lt;/p&gt;
&lt;p&gt;Search string from the first thing that comes to my mind: &lt;em&gt;hugo publish netlify github&lt;/em&gt;
First hit: &lt;a href=&#34;https://gohugo.io/hosting-and-deployment/hosting-on-netlify/&#34;&gt;Host on Netlify | Hugo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it, I have my solution :)&lt;/p&gt;
&lt;p&gt;Followed the guide, starting with the dummy site above. I ended up swapping it with this a new github repository &lt;a href=&#34;https://git.sr.ht/~benoit/blog.benoitj.ca&#34;&gt;benoitj/blog.benoitj.ca: my blog sources&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now each time I push new changes, I can see it on the generated netlify domain.&lt;/p&gt;
&lt;h2 id=&#34;domain-name&#34;&gt;domain name&lt;/h2&gt;
&lt;p&gt;Now, lets get a custom domain setup.&lt;/p&gt;
&lt;p&gt;I already own one, so after a bit of research found the Netlify guide to &lt;a href=&#34;https://docs.netlify.com/domains-https/custom-domains/configure-external-dns/#configure-a-subdomain&#34;&gt;Configure external DNS for a custom domain | Netlify Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finding the doc was the hardest part, Netlify appears to sell domains in addition to website hosting. So the first few guides are over setting up Netlify DNS.&lt;/p&gt;
&lt;p&gt;If you are in the same situation, you will have to setup a CNAME pointing to the Netlify domain name assigned to you. Don&amp;rsquo;t forget this will take time for the DNS entry to propagate over the Internet and work (from minutes to hours).&lt;/p&gt;
&lt;h2 id=&#34;improvements-since-the-first-post&#34;&gt;Improvements since the first post&lt;/h2&gt;
&lt;h3 id=&#34;broken-links&#34;&gt;Broken links&lt;/h3&gt;
&lt;p&gt;Someone spotted a broken link in my &lt;em&gt;about&lt;/em&gt; page. Turns out the default version of Hugo used on Netlify does not properly support org-mode.&lt;/p&gt;
&lt;p&gt;I updated with success the ENVIRONMENT variable HUGO_VERSION to 0.71.1 and it did fix the issue.&lt;/p&gt;
&lt;p&gt;I ended up creating a netlify.toml in my site root to control the Netlify build.&lt;/p&gt;
&lt;p&gt;Here is the minimum setup in netlify.toml:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[build]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;publish = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;public&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;command = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;hugo --gc --minify&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[context.production.environment]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HUGO_VERSION = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;0.71.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HUGO_ENV = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;production&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HUGO_ENABLEGITINFO = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;enable-broken-link-detection-on-netlify&#34;&gt;Enable broken link detection on netlify&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s now possible to enable &lt;a href=&#34;https://github.com/munter/netlify-plugin-checklinks/blob/master/README.md&#34;&gt;checklinks&lt;/a&gt; plugin on netlify.&lt;/p&gt;
&lt;p&gt;Since I already have a netlify.toml config to control the build, it&amp;rsquo;s just a matter of adding this to it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[[plugins]]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;package = &lt;span style=&#34;color:#a50&#34;&gt;&amp;#34;netlify-plugin-checklinks&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;site-improvements-todo&#34;&gt;Site improvements TODO&lt;/h3&gt;
&lt;p&gt;Here is my unsorted list of things I may improve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Broken link detection. Try to enable the link check plugin (beta) on netlify.&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Create taxonomy pages or list. I&amp;rsquo;m tagging my posts, but nothing visible yet.&lt;/li&gt;
&lt;li&gt;improve how code is displayed. probably need to play with the template / CSS&lt;/li&gt;
&lt;li&gt;Will try HTML5 templates and make changes to the presentation in the CSS. I&amp;rsquo;ve got a theme to get me started, but not sure I&amp;rsquo;ll keep it. Possibly try new.CSS&lt;/li&gt;
&lt;li&gt;enable some sort of spellcheck approval on my posts.&lt;/li&gt;
&lt;li&gt;not satisfied with the auto summary formatting. I ended up marking the summary to get formatting right.&lt;/li&gt;
&lt;li&gt;relationship between summary, RSS and index page. Maybe RSS should have Content instead of summary but keep index with shorter summary.&lt;/li&gt;
&lt;li&gt;see if ox-Hugo helps once I really understand how Hugo works.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;some-reflection&#34;&gt;Some reflection&lt;/h2&gt;
&lt;p&gt;I did managed to get out of the software / technology faster than I thought.&lt;/p&gt;
&lt;p&gt;The danger for me was to spend all my time customizing tools and not writing a single post. I would have learned something for sure, but missed other learning opportunities.&lt;/p&gt;
&lt;p&gt;I hope others can find this helpful.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m thinking, if I reach 10 posts in the next 2 months, I&amp;rsquo;ll be on the right track :)&lt;/p&gt;
&lt;h2 id=&#34;coming-next&#34;&gt;Coming next&lt;/h2&gt;
&lt;h2 id=&#34;some-topics-i-may-write-about&#34;&gt;Some topics I may write about&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Detecting possible broken &lt;a href=&#34;https://en.wikipedia.org/wiki/Single-responsibility_principle&#34;&gt;SRP&lt;/a&gt; using your git history&lt;/li&gt;
&lt;li&gt;Automated testing quality. Why coverage is not enough.&lt;/li&gt;
&lt;li&gt;how to resolve git conflicts. One possible example: merge conflicting patches on a suckless tool like st or dwm.&lt;/li&gt;
&lt;li&gt;note taking setup I use (org-mode, org-roam, deft)&lt;/li&gt;
&lt;li&gt;Replacing IntelliJ as my daily driver IDE with Emacs LSP Java&lt;/li&gt;
&lt;li&gt;plain text diagrams
&lt;ul&gt;
&lt;li&gt;plantuml / graphviz&lt;/li&gt;
&lt;li&gt;C4 models macros for plantuml&lt;/li&gt;
&lt;li&gt;branching models&lt;/li&gt;
&lt;li&gt;network diagrams&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;homelab&lt;/li&gt;
&lt;li&gt;linux at work&lt;/li&gt;
&lt;li&gt;possibly some backyard work I&amp;rsquo;m currently working on.&lt;/li&gt;
&lt;li&gt;maybe some electronics projects I have in my queue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;This is day 2 of my #100DaysToOffload. You can read more about the challenge here: &lt;a href=&#34;https://100daystooffload.com&#34;&gt;https://100daystooffload.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
    <item>
      <title>I should try blogging</title>
      <link>https://blog.benoitj.ca/2020-05-24-i-should-try-blogging/</link>
      <pubDate>Sun, 24 May 2020 00:02:13 -0400</pubDate>
      
      <guid>https://blog.benoitj.ca/2020-05-24-i-should-try-blogging/</guid>
    <description>&lt;p&gt;Like many, I&amp;rsquo;ve been thinking about sharing using a personal blog. Like many, I&amp;rsquo;ve been procrastinating about it :).&lt;/p&gt;
&lt;p&gt;I can thank the movement #100DaysToOffload initiated by Kev Quirk on fosstodon to get me out of my lazyness.&lt;/p&gt;
&lt;p&gt;Im hoping to share whatever interest me, but mostly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;coding&lt;/li&gt;
&lt;li&gt;linux, apps I use&lt;/li&gt;
&lt;li&gt;electronics and games&lt;/li&gt;
&lt;li&gt;anything I am learning right now, from food, to building house stuff&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I intent to post twice a week. We&amp;rsquo;ll see how long I can keep the blogging procrastination beast away :)&lt;/p&gt;
&lt;p&gt;As a constant learner, constructive feedbacks are always welcomed. See my &lt;a href=&#34;https://blog.benoitj.ca/about/index.html&#34;&gt;about&lt;/a&gt; page for contact info.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This is Day 1 of my #100DaysToOffload&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;
  &lt;style&gt;
    .craftering {
  	  margin: auto;
  	  width: 50%;
  	  text-align: center;}
  &lt;/style&gt;
  &lt;div class=&#34;craftering&#34;&gt;
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/previous&#34;&gt;←&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/&#34;&gt;craftering&lt;/a&gt;  
    &lt;a href=&#34;https://craftering.systemcrafters.net/@benoitj/next&#34;&gt;→&lt;/a&gt;
  &lt;/div&gt;

  &lt;p&gt;For comments, use &lt;a href=&#34;mailto:benoit@benoitj.ca&#34;&gt;email&lt;/a&gt; or
    &lt;a rel=&#34;me&#34; href=&#34;https://fosstodon.org/@benoitj&#34;&gt;Mastodon&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt; Don&#39;t forget to subscribe to my &lt;a href=&#34;https://blog.benoitj.ca/posts/index.xml&#34;&gt;RSS feed&lt;/a&gt;!
</description>
    </item>
    
  </channel>
</rss>
