<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Zaphod Dev</title>
    <description>The latest articles on DEV Community by Zaphod Dev (@zaphoddev).</description>
    <link>https://dev.to/zaphoddev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3789088%2Fb8d042b1-def1-472b-879c-4309a1f686b7.png</url>
      <title>DEV Community: Zaphod Dev</title>
      <link>https://dev.to/zaphoddev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zaphoddev"/>
    <language>en</language>
    <item>
      <title>You probably don't need git filter-branch OR git-filter-repo</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Wed, 09 Sep 2026 10:15:00 +0000</pubDate>
      <link>https://dev.to/zaphoddev/you-probably-dont-need-git-filter-branch-or-git-filter-repo-1pi4</link>
      <guid>https://dev.to/zaphoddev/you-probably-dont-need-git-filter-branch-or-git-filter-repo-1pi4</guid>
      <description>&lt;p&gt;You want to change the author/committer for a range of commits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not recommended&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;git filter-branch&lt;/code&gt; results in a dire warning about a &lt;em&gt;glut of gotchas generating mangled history&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most powerful&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Downloading and using &lt;a href="https://github.com/newren/git-filter-repo" rel="noopener noreferrer"&gt;&lt;code&gt;git-filter-repo&lt;/code&gt;&lt;/a&gt; takes some time, but it does the job.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ORIGINAL_CLONE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git remote get-url origin&lt;span class="si"&gt;)&lt;/span&gt;

git-filter-repo &lt;span class="nt"&gt;--name-callback&lt;/span&gt; &lt;span class="s1"&gt;'return name.replace(b\"Wrong Name\", b\"New Name\")'&lt;/span&gt; &lt;span class="nt"&gt;--force&lt;/span&gt;
git-filter-repo &lt;span class="nt"&gt;--email-callback&lt;/span&gt; &lt;span class="s1"&gt;'return email.replace(b\"wrong@example.com\", b\"new@example.com\")'&lt;/span&gt; &lt;span class="nt"&gt;--partial&lt;/span&gt; &lt;span class="nt"&gt;--refs&lt;/span&gt; A..B &lt;span class="nt"&gt;--force&lt;/span&gt;

git remote add origin &lt;span class="nv"&gt;$ORIGINAL_CLONE_URL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Easiest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By far the easiest way is using regular rebase together with &lt;code&gt;--exec&lt;/code&gt; command to run automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;--root&lt;/span&gt; &lt;span class="nt"&gt;--exec&lt;/span&gt; &lt;span class="s1"&gt;'git commit --amend --reset-author --no-edit'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--root&lt;/code&gt; means the beginning of the repo. You can replace it with &lt;code&gt;HEAD~5&lt;/code&gt; for the most recent 5 commits, or a range &lt;code&gt;A^..B&lt;/code&gt; (check range with &lt;code&gt;git log A^..B&lt;/code&gt; first)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--reset-author&lt;/code&gt; uses whatever is configured in git. You can also use:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--author="New Name &amp;lt;new@example.com&amp;gt;"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;or &lt;code&gt;-c user.name="New Name"&lt;/code&gt; and &lt;code&gt;-c user.email="new@example.com"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Check your work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To make both author and committer visible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;FORMAT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"    Commit: %h %d %n &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
   Author: %an &amp;lt;%ae&amp;gt; %n &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
Committer: %cn &amp;lt;%ce&amp;gt; %n &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  Subject: %s %n"&lt;/span&gt;

git log &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FORMAT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>repo</category>
      <category>author</category>
      <category>productivity</category>
    </item>
    <item>
      <title>LLM prompt for writing documents</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Tue, 08 Sep 2026 12:26:04 +0000</pubDate>
      <link>https://dev.to/zaphoddev/llm-prompt-for-writing-documents-157f</link>
      <guid>https://dev.to/zaphoddev/llm-prompt-for-writing-documents-157f</guid>
      <description>&lt;p&gt;There is more to AI-assisted writing than removing em-dashes and excessive hedging. AI is unusually good at generating information and unusually bad at deciding how much information a human actually needs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Prompting for readability explicitly is one of the highest-value things you can do with an LLM.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't just say "make it concise". You want to give it a different optimisation target: &lt;strong&gt;optimise for the reader's ability to understand the document&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example prompt
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Completely rewrite this to be 20% of the length / at most 2 pages.

The single aim of the document is:
- &amp;lt;FILL THIS IN YOURSELF&amp;gt;

Write for a busy human reader, not as a comprehensive knowledge dump.

Prioritise clarity and comprehension over completeness.
Include only information that the reader needs to understand the subject,
make a decision, or take action.

Before writing, decide:

- What is the single most important message?
- What does the reader actually need to know?
- What can safely be omitted?

Writing rules:

- Put the main conclusion first.
- Keep paragraphs short and focused on one idea.
- Prefer simple sentences and familiar words.
- Remove information that does not materially help the reader.
- Do not include every caveat, alternative, or fact unless it matters.
- Use headings sparingly and only when they genuinely help navigation.
- Give important information more prominence than minor details.
- Avoid repeating information in different forms.
- Do not explain obvious implications.
- Do not add a section merely for convention's sake

Aim for a document that can be understood by someone who is skimming it.

When deciding between two versions, prefer the one that conveys the same
useful information with less reading effort.

After drafting, critically edit your own output:

1. Identify anything the reader probably does not need.
2. Remove it.
3. Look for paragraphs containing multiple ideas and split or simplify them.
4. Check that the most important information is visually and structurally prominent.
5. Remove unnecessary headings, caveats, repetition and explanation.

Do not try to demonstrate how much you know.
Your job is to make the reader understand what matters.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last part is particularly relevant: &lt;code&gt;Do not try to demonstrate how much you know.&lt;/code&gt; That's almost the opposite of the default behaviour of an LLM.&lt;/p&gt;

&lt;p&gt;Remember, a good human-written document often does something AI struggles with: &lt;strong&gt;it deliberately leaves information out.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>promptengineering</category>
      <category>writing</category>
      <category>documentation</category>
    </item>
    <item>
      <title>How to change Chrome to bright, bold colours, not pastels</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Fri, 04 Sep 2026 19:06:21 +0000</pubDate>
      <link>https://dev.to/zaphoddev/how-to-change-chrome-to-bright-bold-colours-not-pastels-5598</link>
      <guid>https://dev.to/zaphoddev/how-to-change-chrome-to-bright-bold-colours-not-pastels-5598</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If you have more than one google profile for any reason, such as personal, work, projects, etc. and want to operate them all from the same computer, then you might find it difficult. Every chrome window looks the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Naive solution
&lt;/h2&gt;

&lt;p&gt;Chrome has a "Customise profile" feature, it mainly changes the title bar and tab colour to a variety of pale, pastel shades which all look very similar to each other. Why doesn't it let the user choose strong, striking colours?&lt;/p&gt;

&lt;h2&gt;
  
  
  How to make Chrome different colours
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Easiest way&lt;/strong&gt;&lt;br&gt;
Select a pre-built theme from...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome Web Store: &lt;a href="https://chromewebstore.google.com/category/themes/colors" rel="noopener noreferrer"&gt;Themes section&lt;/a&gt;. Examples: &lt;a href="https://chromewebstore.google.com/detail/just-black/aghfnjkcakhmadgdomlmlhhaocbkloab" rel="noopener noreferrer"&gt;Black&lt;/a&gt;, &lt;a href="https://chromewebstore.google.com/detail/ron-burgundy/nbfljnhhapmncknfofaopfafophhojok" rel="noopener noreferrer"&gt;Red&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.chromethemer.com/chrome-themes/minimal/" rel="noopener noreferrer"&gt;chromethemer.com&lt;/a&gt;. Examples: &lt;a href="https://www.chromethemer.com/google-chrome/chrome-themes/agent-orange-google-chrome-theme.html" rel="noopener noreferrer"&gt;Orange&lt;/a&gt;, &lt;a href="https://www.chromethemer.com/google-chrome/chrome-themes/blue-bloo-google-chrome-theme.html" rel="noopener noreferrer"&gt;Blue&lt;/a&gt;, &lt;a href="https://www.chromethemer.com/google-chrome/chrome-themes/greener-green-google-chrome-theme.html" rel="noopener noreferrer"&gt;Green&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Most flexible way&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build custom themes, site 1: &lt;a href="https://chrometheme.studio/" rel="noopener noreferrer"&gt;chrometheme.studio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Custom themes, site 2: &lt;a href="https://themebeta.com/chrome-theme-creator-online.html" rel="noopener noreferrer"&gt;themebeta.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: Many of the themes include background images. These can be ignored, they only appear on the new tab page. Other extensions exist to change the new tab page separately, as well.&lt;/p&gt;

</description>
      <category>annoying</category>
      <category>themes</category>
      <category>chrome</category>
    </item>
    <item>
      <title>How to disable touchscreen on Dell Precision 5690 without admin rights</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Mon, 24 Aug 2026 12:46:33 +0000</pubDate>
      <link>https://dev.to/zaphoddev/how-to-disable-touchscreen-on-dell-precision-5690-without-admin-rights-b8o</link>
      <guid>https://dev.to/zaphoddev/how-to-disable-touchscreen-on-dell-precision-5690-without-admin-rights-b8o</guid>
      <description>&lt;p&gt;Open the registry, navigate to: &lt;code&gt;HKEY_CURRENT_USER\Software\Microsoft\Wisp\Touch&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Under that, create a new DWORD Value: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name &lt;code&gt;TouchGate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Value &lt;code&gt;0&lt;/code&gt; (default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reboot.&lt;/p&gt;

</description>
      <category>touchscreen</category>
      <category>dell</category>
      <category>registry</category>
      <category>hack</category>
    </item>
    <item>
      <title>How to make `git pull` work via mobile hotspot</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Mon, 24 Aug 2026 11:14:29 +0000</pubDate>
      <link>https://dev.to/zaphoddev/how-to-make-git-pull-work-via-mobile-hotspot-4abd</link>
      <guid>https://dev.to/zaphoddev/how-to-make-git-pull-work-via-mobile-hotspot-4abd</guid>
      <description>&lt;p&gt;&lt;strong&gt;The fix&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GIT_SSH_COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ssh -v -o KexAlgorithms=curve25519-sha256"&lt;/span&gt; git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to debug&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GIT_SSH_COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ssh -v"&lt;/span&gt; git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A hang at &lt;code&gt;expecting SSH2_MSG_KEX_ECDH_REPLY&lt;/code&gt; during key exchange points to a MTU/packet fragmentation issue, which is extremely common with mobile hotspots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's happening&lt;/strong&gt;&lt;br&gt;
The SSH key exchange uses large packets (especially with post-quantum algorithms like sntrup761x25519-sha512). Mobile networks often have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lower MTU than typical networks (1500 bytes on wifi vs ~1400 on cellular)&lt;/li&gt;
&lt;li&gt;Aggressive packet filtering or mangling&lt;/li&gt;
&lt;li&gt;Issues with large UDP/TCP packets that need fragmentation
The connection establishes fine (small packets), but hangs when the first large crypto packet is sent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Alternative fix&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find your hotspot interface (probably wlan0 or similar)&lt;/span&gt;
ip &lt;span class="nb"&gt;link &lt;/span&gt;show

&lt;span class="c"&gt;# Temporarily reduce MTU&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ip &lt;span class="nb"&gt;link set &lt;/span&gt;dev &amp;lt;interface&amp;gt; mtu 1400
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Permanent SSH config fix&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add to ~/.ssh/config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;Host&lt;/span&gt; github.com
    &lt;span class="k"&gt;KexAlgorithms&lt;/span&gt; curve25519-sha256,curve25519-sha256@libssh.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This disables the post-quantum sntrup761 algorithm which generates the largest packets.&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>git</category>
      <category>networking</category>
      <category>terminal</category>
    </item>
    <item>
      <title>How to disable smart quotes in Jira and Confluence</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Tue, 11 Aug 2026 12:46:33 +0000</pubDate>
      <link>https://dev.to/zaphoddev/how-to-disable-smart-quotes-in-jira-and-confluence-5dpp</link>
      <guid>https://dev.to/zaphoddev/how-to-disable-smart-quotes-in-jira-and-confluence-5dpp</guid>
      <description>&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you type a single or double quote in Atlassian Jira or Confluence wiki, it's automatically converted to a smart quote. As a detail-oriented software engineer, this disturbs me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“double”&lt;br&gt;
‘single’&lt;br&gt;
I don’t like it&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even if you delete the quote and re-type it, it becomes smart again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is no option to disable smart quotes permanently.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can get rid of them&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;Ctrl-Z&lt;/code&gt; immediately after they appear.&lt;/p&gt;

&lt;p&gt;It also works for the word &lt;code&gt;don't&lt;/code&gt;: When you type apostrophe &lt;code&gt;'&lt;/code&gt; it looks normal, then when you type &lt;code&gt;t&lt;/code&gt;, the apostrophe changes. Type Ctrl-Z and it reverts back to normal again.&lt;/p&gt;

</description>
      <category>wiki</category>
      <category>annoying</category>
    </item>
    <item>
      <title>Python virtual env cheat sheet</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Thu, 16 Apr 2026 11:05:41 +0000</pubDate>
      <link>https://dev.to/zaphoddev/python-virtual-env-cheat-sheet-4cnh</link>
      <guid>https://dev.to/zaphoddev/python-virtual-env-cheat-sheet-4cnh</guid>
      <description>&lt;h2&gt;
  
  
  Update: Use &lt;code&gt;uv&lt;/code&gt; instead
&lt;/h2&gt;

&lt;p&gt;This is another way to do it, probably sub-optimal:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3.6 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source&lt;/span&gt; ./venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Common&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;venv&lt;span class="o"&gt;)&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Standard&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;venv&lt;span class="o"&gt;)&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Optional for poetry&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;venv&lt;span class="o"&gt;)&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;poetry pip &lt;span class="nt"&gt;-U&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;venv&lt;span class="o"&gt;)&lt;/span&gt; poetry update
&lt;span class="o"&gt;(&lt;/span&gt;venv&lt;span class="o"&gt;)&lt;/span&gt; poetry &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="o"&gt;(&lt;/span&gt;venv&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Teardown&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>cheatsheet</category>
      <category>pip</category>
      <category>beginners</category>
    </item>
    <item>
      <title>sed tricks</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Thu, 16 Apr 2026 11:03:48 +0000</pubDate>
      <link>https://dev.to/zaphoddev/sed-tricks-hkk</link>
      <guid>https://dev.to/zaphoddev/sed-tricks-hkk</guid>
      <description>&lt;p&gt;Search and replace over multiple lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sed"&gt;&lt;code&gt;&lt;span class="k"&gt;s&lt;/span&gt;&lt;span class="p"&gt;e&lt;/span&gt;&lt;span class="sr"&gt;d -i -&lt;/span&gt;&lt;span class="p"&gt;e&lt;/span&gt; ':a' -&lt;span class="p"&gt;e&lt;/span&gt; &lt;span class="err"&gt;'N'&lt;/span&gt; &lt;span class="err"&gt;-e&lt;/span&gt; &lt;span class="err"&gt;'$!b&lt;/span&gt;&lt;span class="k"&gt;a&lt;/span&gt;&lt;span class="s"&gt;' -e 's/)\n(/),\n(/g' file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Simple toast notification</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Thu, 16 Apr 2026 11:02:57 +0000</pubDate>
      <link>https://dev.to/zaphoddev/simple-toast-notification-3jo7</link>
      <guid>https://dev.to/zaphoddev/simple-toast-notification-3jo7</guid>
      <description>&lt;p&gt;Easy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"toast('foo')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Show Toast&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;toast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;snackbar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;snackbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;snackbar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;snackbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snackbar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;snackbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cssText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
    visibility: visible;
    text-align: center;
    border: 2px solid black;
    padding: 16px;
    position: fixed;
    z-index: 1;
    left: 50%;
    bottom: 30px;
    transform: translateX(-50%);
    opacity: 1;
  `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;snackbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;visibility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hidden&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;snackbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snackbar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;a href="https://www.w3schools.com/HOWTO/howto_js_snackbar.asp" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>toast</category>
      <category>notification</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Docker desktop exit code 139 on WSL2</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Thu, 16 Apr 2026 10:27:32 +0000</pubDate>
      <link>https://dev.to/zaphoddev/docker-desktop-exit-code-139-on-wsl2-56n2</link>
      <guid>https://dev.to/zaphoddev/docker-desktop-exit-code-139-on-wsl2-56n2</guid>
      <description>&lt;h2&gt;
  
  
  Noah's tip
&lt;/h2&gt;

&lt;p&gt;Out of the box new windows - wsl2 is unusable - need to be able to do &lt;code&gt;sudo apt update&lt;/code&gt;. Make /etc/resolv.conf changes permanent in WSL 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo rm&lt;/span&gt; /etc/resolv.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo "nameserver 8.8.8.8" &amp;gt; /etc/resolv.conf'&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo "[network]" &amp;gt; /etc/wsl.conf'&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo "generateResolvConf = false" &amp;gt;&amp;gt; /etc/wsl.conf'&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;chattr +i /etc/resolv.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;a href="https://www.townsy.io/wsl2-how-to-fix-download-speed/" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Will's tip
&lt;/h2&gt;

&lt;p&gt;Problem: Docker containers immediately stop on Docker desktop (Windows) with exit code 139.&lt;/p&gt;

&lt;p&gt;Fix: Create a file named .wslconfig in your user directory, e.g. C:/Users/[your user name]/.wslconfig, with contents:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[wsl2]&lt;/span&gt;
&lt;span class="py"&gt;kernelCommandLine&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;vsyscall=emulate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then reboot&lt;/p&gt;

&lt;p&gt;(&lt;a href="https://dev.to/damith/docker-desktop-container-crash-with-exit-code-139-on-windows-wsl-fix-438"&gt;source&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>linux</category>
      <category>wsl</category>
      <category>windows</category>
      <category>docker</category>
    </item>
    <item>
      <title>Tools I use in software engineering</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Thu, 16 Apr 2026 09:34:59 +0000</pubDate>
      <link>https://dev.to/zaphoddev/tools-i-use-in-software-engineering-233p</link>
      <guid>https://dev.to/zaphoddev/tools-i-use-in-software-engineering-233p</guid>
      <description>&lt;p&gt;These are not traditional tools, but modern methods of assimilating new information and concepts, and automating common tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://notegpt.io/youtube-video-summarizer" rel="noopener noreferrer"&gt;https://notegpt.io/youtube-video-summarizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mymap.ai/video-summarizer" rel="noopener noreferrer"&gt;https://www.mymap.ai/video-summarizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Your favourite AI can also summarise any transcript you give it&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tooling</category>
      <category>llm</category>
      <category>ai</category>
      <category>ide</category>
    </item>
    <item>
      <title>Escape quotes correctly when using psql via docker in bash</title>
      <dc:creator>Zaphod Dev</dc:creator>
      <pubDate>Tue, 14 Apr 2026 16:07:26 +0000</pubDate>
      <link>https://dev.to/zaphoddev/escape-quotes-correctly-when-using-psql-via-docker-in-bash-19l4</link>
      <guid>https://dev.to/zaphoddev/escape-quotes-correctly-when-using-psql-via-docker-in-bash-19l4</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;site bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'PGPASSWORD=***** psql -Ufoo -d bar \
  -h example.com -x -c "select qux, date(xyzzy) from tabley          \
  where field in(1, 2, 3) and that_time &amp;gt; '&lt;/span&gt;&lt;span class="s2"&gt;"'"&lt;/span&gt;&lt;span class="s1"&gt;'2024-11-18'&lt;/span&gt;&lt;span class="s2"&gt;"'"&lt;/span&gt;&lt;span class="s1"&gt;'       \
  order by that_time;"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quoteception
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;'"'"'&lt;/code&gt; is the &lt;em&gt;Quoteception&lt;/em&gt; operator.&lt;/p&gt;

&lt;p&gt;When used in the middle of a single quoted string, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;'&lt;/code&gt; Ends the current single quoted string&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"&lt;/code&gt; Starts a new double quoted string&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;'&lt;/code&gt; That contains one single quote&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"&lt;/code&gt; Ends the double quoted string&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;'&lt;/code&gt; Re-starts the next single quoted string&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Embedded single quote is here: '&lt;/span&gt;&lt;span class="s2"&gt;"'"&lt;/span&gt;&lt;span class="s1"&gt;' did you see it?'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Embedded single quote is here:  '  did you see it?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>bash</category>
      <category>quote</category>
      <category>escape</category>
      <category>shell</category>
    </item>
  </channel>
</rss>
