<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5085828936695353728</id><updated>2026-07-19T20:40:52.835-04:00</updated><category term="ubuntu"/><category term="Atlassian"/><category term="linux"/><category term="bash"/><category term="cmdline"/><category term="filesystem"/><category term="mac"/><category term="macosx"/><category term="security"/><category term="JIRA"/><category term="code"/><category term="image"/><category term="script"/><category term="shell"/><category term="web"/><category term="ansible"/><category term="firefox"/><category term="monitoring"/><category term="android"/><category term="latex"/><category term="phone"/><category term="bluetooth"/><category term="command"/><category term="docker"/><category term="eee"/><category term="macos"/><category term="package"/><category term="pdf"/><category term="shell bash"/><category term="ssh"/><category term="JSON"/><category term="commandline"/><category term="ksh"/><category term="operating system"/><category term="plugin"/><category term="terraform"/><category term="video"/><category term="app"/><category term="automation"/><category term="emacs"/><category term="git"/><category term="github"/><category term="gitlab"/><category term="groovy"/><category term="iso"/><category term="jpeg"/><category term="js"/><category term="media"/><category term="mount"/><category term="network"/><category term="prometheus"/><category term="python"/><category term="quantum computing"/><category term="ref"/><category term="statistiques"/><category term="svn"/><category term="3Dprinting"/><category term="AWS"/><category term="CICD"/><category term="Canada"/><category term="SRE"/><category term="analyze"/><category term="art"/><category term="backup"/><category term="boot"/><category term="commit"/><category term="container"/><category term="database"/><category term="deb"/><category term="debian"/><category term="devops"/><category term="email"/><category term="ext3"/><category term="france"/><category term="gallaxy s"/><category term="gcp"/><category term="grafana"/><category term="health"/><category term="infrastructure"/><category term="javascript"/><category term="language"/><category term="netbsd"/><category term="os"/><category term="osx"/><category term="perl"/><category term="qiskit"/><category term="regexp"/><category term="size"/><category term="tools"/><category term="usb"/><category term="version"/><category term="workflow"/><category term="3Dmodeling"/><category term="APIs"/><category term="QC"/><category term="SQL"/><category term="SSM-Document"/><category term="X"/><category term="alerts"/><category term="apt"/><category term="asus"/><category term="avi"/><category term="awk"/><category term="best-practices"/><category term="bugs"/><category term="clean"/><category term="cloud"/><category term="confluence"/><category term="converting"/><category term="cours"/><category term="cron"/><category term="date"/><category term="debug"/><category term="dev"/><category term="dns"/><category term="docker-compose"/><category term="documentation"/><category term="ext2"/><category term="fdisk"/><category term="finder"/><category term="format"/><category term="gnome"/><category term="google"/><category term="hard-drive"/><category term="hashicorp"/><category term="iac"/><category term="ideas"/><category term="incident"/><category term="inkscape"/><category term="install"/><category term="jobs"/><category term="k8s"/><category term="kubernetes"/><category term="laptop"/><category term="list"/><category term="log"/><category term="login"/><category term="lpr"/><category term="mail"/><category term="meetup"/><category term="metrics"/><category term="mplayer"/><category term="nautilus"/><category term="observability"/><category term="openQASM"/><category term="opendata"/><category term="openscad"/><category term="opsgenie"/><category term="passwords"/><category term="photo"/><category term="proc"/><category term="ps"/><category term="qbit"/><category term="qubits"/><category term="repo"/><category term="rsync"/><category term="s3"/><category term="script runner"/><category term="service"/><category term="shortcuts"/><category term="sketchup"/><category term="spy"/><category term="ssm-agent"/><category term="status"/><category term="stl"/><category term="streaming"/><category term="supply chain"/><category term="support"/><category term="sync"/><category term="systemd"/><category term="tableur"/><category term="team"/><category term="terminal"/><category term="tests"/><category term="texteditor"/><category term="thunderbird"/><category term="travel"/><category term="vcs"/><category term="wammu"/><category term="wifi"/><category term="wiki"/><category term="$?"/><category term="/proc"/><category term="1000H"/><category term="3D"/><category term="9wm"/><category term="BLS"/><category term="CAD"/><category term="CNP"/><category term="CRS"/><category term="CV"/><category term="Control-M"/><category term="DNSSEC"/><category term="Disk util"/><category term="ECMA"/><category term="Express Entry"/><category term="IBM"/><category term="IDE"/><category term="IntelliJ"/><category term="JDK"/><category term="JVM"/><category term="JetBrains"/><category term="MLA"/><category term="MSoffice"/><category term="NOC"/><category term="PR"/><category term="Paris"/><category term="PyCharm"/><category term="QML"/><category term="Quine"/><category term="RED"/><category term="RFC"/><category term="ROM"/><category term="RSA"/><category term="SGC"/><category term="SLA"/><category term="SLI"/><category term="SLO"/><category term="SNS"/><category term="SSM"/><category term="ScriptRunner"/><category term="TO-DO"/><category term="USE"/><category term="WPS"/><category term="Work Permit"/><category term="XML"/><category term="acsl"/><category term="adb"/><category term="addon"/><category term="administrative"/><category term="agave"/><category term="agile"/><category term="alertmanager"/><category term="amule"/><category term="animation"/><category term="anti-pattern"/><category term="apfs"/><category term="apple"/><category term="apt_info"/><category term="apt_info.py monitoring"/><category term="aptitude"/><category term="artocle"/><category term="ater"/><category term="audit"/><category term="authentication"/><category term="avchd"/><category term="bamboo"/><category term="bashrc"/><category term="battery"/><category term="beamer"/><category term="benchmark"/><category term="biblio"/><category term="bibliography"/><category term="binding"/><category term="bios"/><category term="bitbucket"/><category term="blender"/><category term="blockchain"/><category term="blogs"/><category term="breath"/><category term="burnout"/><category term="caddy"/><category term="calendar"/><category term="camera"/><category term="canadian"/><category term="canvas"/><category term="career"/><category term="cdrom"/><category term="cert"/><category term="certifications"/><category term="chainguard"/><category term="change"/><category term="change management"/><category term="changelog"/><category term="chattr"/><category term="check"/><category term="ci"/><category term="city"/><category term="classification"/><category term="cmnj"/><category term="cms"/><category term="cmyk"/><category term="codec"/><category term="color"/><category term="communication"/><category term="compress"/><category term="conference"/><category term="config file"/><category term="configuration"/><category term="configuration management"/><category term="confluence.cfg.xml"/><category term="console"/><category term="cookie"/><category term="copy"/><category term="couleurs"/><category term="courriel"/><category term="creative"/><category term="cryptography"/><category term="csrutil"/><category term="css"/><category term="cups"/><category term="curl"/><category term="cvss"/><category term="dbus"/><category term="deamon"/><category term="dell"/><category term="deployment"/><category term="design thinking"/><category term="detection"/><category term="divers"/><category term="doc"/><category term="door lock"/><category term="dossier"/><category term="dot file"/><category term="dpi"/><category term="drawing"/><category term="driver"/><category term="dualscreen"/><category term="dummynet"/><category term="dxf"/><category term="dynamic inventory"/><category term="e-mail"/><category term="e2label"/><category term="editor"/><category term="elearning"/><category term="em"/><category term="encoding"/><category term="endpoint"/><category term="energy"/><category term="engineer"/><category term="english"/><category term="error 77"/><category term="error codes"/><category term="eth"/><category term="exam"/><category term="excel"/><category term="exporter"/><category term="ext4"/><category term="extends"/><category term="extension"/><category term="file"/><category term="file descriptors"/><category term="find"/><category term="firewall"/><category term="font"/><category term="forensics"/><category term="fosdem"/><category term="fractal"/><category term="frama-c"/><category term="framebuffer"/><category term="fstab"/><category term="fuse"/><category term="fuse4x"/><category term="gcode"/><category term="ge"/><category term="general"/><category term="general electric"/><category term="ghostscript"/><category term="gimp"/><category term="gitbutler"/><category term="gkrellm"/><category term="gmail"/><category term="gnuplot"/><category term="google cloud"/><category term="google script"/><category term="graph"/><category term="green"/><category term="grep"/><category term="grub"/><category term="gs"/><category term="hackerspace"/><category term="har"/><category term="help"/><category term="hetzner"/><category term="hfs"/><category term="hidden file"/><category term="history"/><category term="home"/><category term="homeassistant"/><category term="hook"/><category term="hub"/><category term="human"/><category term="hwaddr"/><category term="ig"/><category term="imagemagick"/><category term="immigration"/><category term="industry standard"/><category term="informatique"/><category term="ingress controllers"/><category term="instagram"/><category term="instanced"/><category term="intel"/><category term="interface"/><category term="intrusion"/><category term="inventory"/><category term="jardin"/><category term="java"/><category term="jq"/><category term="json_exporter"/><category term="kb"/><category term="keyboard"/><category term="keychain"/><category term="kill"/><category term="kubeconfig"/><category term="kubectl"/><category term="kubectx"/><category term="land"/><category term="latin-1"/><category term="learning"/><category term="lexique"/><category term="light"/><category term="link"/><category term="links"/><category term="list-units"/><category term="load"/><category term="localtuya"/><category term="lsattr"/><category term="lua"/><category term="macro"/><category term="makefile"/><category term="mask"/><category term="math"/><category term="meme"/><category term="mencoder"/><category term="mixin"/><category term="mkfs.ext3"/><category term="moc"/><category term="monit"/><category term="monorepo"/><category term="mooc"/><category term="multi-cluster"/><category term="multiline"/><category term="multitasking"/><category term="music"/><category term="nagios"/><category term="net"/><category term="netbook"/><category term="new"/><category term="nft"/><category term="node-exporter"/><category term="noise"/><category term="note"/><category term="ntfs"/><category term="ntfs-3g"/><category term="o11y"/><category term="oauth2-proxy"/><category term="online"/><category term="oocalc"/><category term="open metrics"/><category term="open work permit"/><category term="openoffice"/><category term="openshot"/><category term="opensource"/><category term="orchestration"/><category term="os-login"/><category term="outlook"/><category term="p5js"/><category term="paste"/><category term="path"/><category term="pattern"/><category term="pdf4ps"/><category term="pegasus"/><category term="performances"/><category term="pgsql"/><category term="phpbb"/><category term="pipe"/><category term="pipestatus"/><category term="plateform"/><category term="plot"/><category term="poc"/><category term="port"/><category term="posix"/><category term="post-mortem"/><category term="postgre"/><category term="postgresql"/><category term="power"/><category term="print"/><category term="printer"/><category term="privacy"/><category term="process"/><category term="processing"/><category term="project management"/><category term="promql"/><category term="proof"/><category term="properties"/><category term="proxy"/><category term="psy"/><category term="qbits"/><category term="quines"/><category term="rancher"/><category term="random"/><category term="rating"/><category term="read"/><category term="recording"/><category term="recovery"/><category term="reduce"/><category term="replace"/><category term="replicatorg"/><category term="reverse-engineering"/><category term="rgb"/><category term="ropvacnic"/><category term="ropvacnic_S1"/><category term="rt2860"/><category term="s3_sync"/><category term="safe"/><category term="scad"/><category term="scanner"/><category term="scm"/><category term="scn"/><category term="scoring"/><category term="scp"/><category term="selection"/><category term="self reproducing"/><category term="service account"/><category term="services"/><category term="severity"/><category term="shapes"/><category term="sidebar"/><category term="sig"/><category term="sign"/><category term="signal"/><category term="signature"/><category term="sigquit"/><category term="slack"/><category term="smartd"/><category term="sms"/><category term="social"/><category term="software engineer"/><category term="space"/><category term="spreadsheet"/><category term="ssh-keygen"/><category term="sshfs"/><category term="staple"/><category term="start"/><category term="storage"/><category term="stress-ng"/><category term="stty"/><category term="style"/><category term="systemctl"/><category term="team-building"/><category term="tech"/><category term="tee"/><category term="telemetry"/><category term="template unit"/><category term="text"/><category term="tezos"/><category term="thingiverse.com"/><category term="thread dump"/><category term="timer"/><category term="tomboy"/><category term="toolbar"/><category term="tor"/><category term="traités"/><category term="transparents"/><category term="transports."/><category term="trello"/><category term="tuya"/><category term="twinview"/><category term="typo"/><category term="udev"/><category term="un"/><category term="undelete"/><category term="unfix"/><category term="unit"/><category term="unix"/><category term="unrm"/><category term="url"/><category term="usbkey"/><category term="utf-8"/><category term="uuid"/><category term="vaccum"/><category term="variable"/><category term="vba"/><category term="virtualbox"/><category term="vm"/><category term="vol_id"/><category term="vulnerability"/><category term="washer"/><category term="washing-machine"/><category term="web3"/><category term="webinar"/><category term="webserver"/><category term="why3"/><category term="window"/><category term="winff"/><category term="wmv"/><category term="word"/><category term="work philosophy"/><category term="write"/><category term="xargs"/><category term="xev"/><category term="xinit"/><category term="xorg.conf"/><category term="xporter"/><category term="xterm"/><category term="zoom"/><title type='text'>Commandes en Vrac</title><subtitle type='html'>cmd-line, geek stuff, some notes, ...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>284</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-3158708660341145854</id><published>2026-04-17T14:39:00.002-04:00</published><updated>2026-04-17T15:10:36.920-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="automation"/><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="bashrc"/><category scheme="http://www.blogger.com/atom/ns#" term="devops"/><category scheme="http://www.blogger.com/atom/ns#" term="kubeconfig"/><category scheme="http://www.blogger.com/atom/ns#" term="kubectl"/><category scheme="http://www.blogger.com/atom/ns#" term="kubectx"/><category scheme="http://www.blogger.com/atom/ns#" term="kubernetes"/><category scheme="http://www.blogger.com/atom/ns#" term="multi-cluster"/><category scheme="http://www.blogger.com/atom/ns#" term="rancher"/><category scheme="http://www.blogger.com/atom/ns#" term="SRE"/><title type='text'>Managing kubeconfig files + download from Rancher </title><content type='html'>&lt;h2&gt;Managing kubeconfig files across multiple Rancher clusters&lt;/h2&gt;

&lt;p&gt;When you manage several Kubernetes clusters through Rancher, you quickly end up with a pile of kubeconfig files. Downloading them by hand from the Rancher UI is tedious, keeping track of which ones are loaded is error-prone, and testing connectivity after a VPN change or token rotation is a chore.&lt;/p&gt;

&lt;p&gt;Here is the setup I landed on: a download script, a directory convention, auto-discovery in the shell, and a parallel connectivity tester.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#directory-layout&quot;&gt;Directory layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#downloading-kubeconfigs&quot;&gt;Downloading kubeconfigs from Rancher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#auto-discovery&quot;&gt;Auto-discovery in .bashrc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#testing-connectivity&quot;&gt;Testing connectivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#putting-it-all-together&quot;&gt;Putting it all together&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;directory-layout&quot;&gt;Directory layout&lt;/h3&gt;

&lt;pre&gt;&lt;code&gt;~/.kube/
  config                        # default kubectl config (GKE, kind, etc.)
  clusters/
    rancher_kubeconfig_dl.sh    # download script
    test-kubeconfigs.sh         # connectivity tester
    local.yaml                  # kubeconfig files live here
    cluster-us-east-1.yaml
    cluster-us-west-2.yaml
    cluster-eu-west-1.yaml
    cluster-ap-south-1.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The scripts and kubeconfig files all live in &lt;code&gt;~/.kube/clusters/&lt;/code&gt;. The test script filters by &lt;code&gt;kind: Config&lt;/code&gt; so it ignores non-kubeconfig files like itself.&lt;/p&gt;

&lt;h3 id=&quot;downloading-kubeconfigs&quot;&gt;Downloading kubeconfigs from Rancher&lt;/h3&gt;

&lt;p&gt;Rancher exposes a &lt;code&gt;generateKubeconfig&lt;/code&gt; action on its v3 API. The following script lists all clusters your token has access to and downloads each kubeconfig into a directory.&lt;/p&gt;

&lt;p&gt;First, create an API key in Rancher: top-right avatar, Account &amp; API Keys, Create API Key. You get a token like &lt;code&gt;token-xxxxx:yyyyyyy&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
# rancher_kubeconfig_dl.sh
# Downloads all kubeconfig YAML files from a Rancher instance.
#
# Usage:
#   RANCHER_TOKEN=token-xxxxx:yyyyyyy ./rancher_kubeconfig_dl.sh
#
# To get a token manually:
#   Rancher UI -&gt; top-right avatar -&gt; Account &amp; API Keys -&gt; Create API Key

set -euo pipefail

RANCHER_URL=&quot;${RANCHER_URL:-https://rancher.example.com}&quot;
RANCHER_TOKEN=&quot;${RANCHER_TOKEN:-}&quot;
OUTPUT_DIR=&quot;${OUTPUT_DIR:-.}&quot;

# -- Auth --
if [[ -z &quot;$RANCHER_TOKEN&quot; ]]; then
  echo &quot;ERROR: Set RANCHER_TOKEN (e.g. token-xxxxx:yyyyyyy)&quot;
  echo &quot;       Rancher UI -&gt; Avatar -&gt; Account &amp; API Keys -&gt; Create API Key&quot;
  exit 1
fi

CURL_OPTS=(-sSf -H &quot;Authorization: Bearer ${RANCHER_TOKEN}&quot;)

# -- Fetch cluster list --
echo &quot;-&gt; Fetching cluster list from ${RANCHER_URL} ...&quot;
clusters_json=$(curl &quot;${CURL_OPTS[@]}&quot; &quot;${RANCHER_URL}/v3/clusters&quot;)

tmp=$(mktemp)
trap &#39;rm -f &quot;$tmp&quot;&#39; EXIT
echo &quot;$clusters_json&quot; | jq -r &#39;.data[] | .id + &quot;\t&quot; + .name&#39; &gt; &quot;$tmp&quot;

count=$(wc -l &lt; &quot;$tmp&quot; | tr -d &#39; &#39;)
[[ &quot;$count&quot; -eq 0 ]] &amp;&amp; { echo &quot;No clusters found (check your token permissions).&quot;; exit 1; }
echo &quot;-&gt; Found ${count} cluster(s)&quot;
mkdir -p &quot;$OUTPUT_DIR&quot;

# -- Download kubeconfig per cluster --
while IFS=$(printf &#39;\t&#39;) read -r id name; do
  safe=$(echo &quot;$name&quot; | tr -cs &#39;[:alnum:]-_.&#39; &#39;-&#39; | sed &#39;s/-$//&#39;)
  out=&quot;${OUTPUT_DIR}/${safe}.yaml&quot;
  echo &quot;  ${name} (${id}) -&gt; ${out}&quot;
  curl &quot;${CURL_OPTS[@]}&quot; \
    -X POST \
    &quot;${RANCHER_URL}/v3/clusters/${id}?action=generateKubeconfig&quot; \
    | jq -r &#39;.config&#39; \
    &gt; &quot;$out&quot;
done &lt; &quot;$tmp&quot;

echo &quot;&quot;
echo &quot;Done. Kubeconfigs saved to: ${OUTPUT_DIR}/&quot;
ls -lh &quot;$OUTPUT_DIR&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Run it once, or whenever you add a new cluster to Rancher:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;RANCHER_TOKEN=token-xxxxx:yyyyyyy ./rancher_kubeconfig_dl.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Each cluster gets its own file, named after the cluster. No manual copy-pasting from the Rancher UI.&lt;/p&gt;

&lt;h3 id=&quot;auto-discovery&quot;&gt;Auto-discovery in .bashrc&lt;/h3&gt;

&lt;p&gt;kubectl merges all files listed in the &lt;code&gt;KUBECONFIG&lt;/code&gt; environment variable (colon-separated). Instead of maintaining a hardcoded list that goes stale every time you add or remove a cluster, use &lt;code&gt;find&lt;/code&gt; to discover them at shell startup:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# In ~/.bashrc or ~/.zshrc
export KUBECONFIG=~/.kube/config:$(find ~/.kube/clusters -name &#39;*.yaml&#39; 2&gt;/dev/null | tr &#39;\n&#39; &#39;:&#39; | sed &#39;s/:$//&#39;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This starts with the default &lt;code&gt;~/.kube/config&lt;/code&gt; (for GKE, kind, minikube, or anything else) and appends every YAML file found in the clusters directory. &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;tr&lt;/code&gt;, and &lt;code&gt;sed&lt;/code&gt; are all POSIX — this works on macOS, Linux, and BSDs. Avoid &lt;code&gt;find -printf&lt;/code&gt; which is a GNU extension and won&#39;t work on macOS.&lt;/p&gt;

&lt;p&gt;Drop a new file in, open a new terminal, and &lt;code&gt;kubectx&lt;/code&gt; sees it immediately. Remove a file and it disappears. No editing required.&lt;/p&gt;

&lt;h3 id=&quot;testing-connectivity&quot;&gt;Testing connectivity&lt;/h3&gt;

&lt;p&gt;After a VPN reconnect, a token rotation, or just to check that everything is reachable, run the test script. It finds all kubeconfig files in a directory, extracts every context from each file, and tests them all in parallel:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
# test-kubeconfigs.sh
# Test connectivity for all kubeconfig YAML files in a directory.
# Usage: ./test-kubeconfigs.sh [directory]
#   directory: path containing kubeconfig YAML files (default: script directory)

set -euo pipefail
shopt -s nullglob

dir=&quot;${1:-$(dirname &quot;$0&quot;)}&quot;

if [[ ! -d &quot;$dir&quot; ]]; then
  echo &quot;Error: &#39;$dir&#39; is not a directory&quot; &gt;&amp;2
  exit 1
fi

test_context() {
  local f=&quot;$1&quot; ctx=&quot;$2&quot; name
  name=&quot;$(basename &quot;$f&quot;)&quot;
  if kubectl --kubeconfig=&quot;$f&quot; --context=&quot;$ctx&quot; cluster-info --request-timeout=5s &amp;&gt;/dev/null; then
    echo &quot;OK    $name  context=$ctx&quot;
  else
    echo &quot;FAIL  $name  context=$ctx&quot;
  fi
}

pids=()
found=0

for f in &quot;$dir&quot;/*.yaml &quot;$dir&quot;/*.yml; do
  [[ -f &quot;$f&quot; ]] || continue
  grep -q &#39;kind: Config&#39; &quot;$f&quot; 2&gt;/dev/null || continue
  found=$((found + 1))

  contexts=$(kubectl --kubeconfig=&quot;$f&quot; config get-contexts -o name 2&gt;/dev/null)
  if [[ -z &quot;$contexts&quot; ]]; then
    echo &quot;SKIP  $(basename &quot;$f&quot;)  (no contexts found)&quot; &amp;
    pids+=($!)
    continue
  fi

  for ctx in $contexts; do
    test_context &quot;$f&quot; &quot;$ctx&quot; &amp;
    pids+=($!)
  done
done

if [[ $found -eq 0 ]]; then
  echo &quot;No kubeconfig files (kind: Config) found in $dir&quot;
  exit 1
fi

fail=0
for pid in &quot;${pids[@]}&quot;; do
  wait &quot;$pid&quot; || fail=$((fail + 1))
done

pass=$(( ${#pids[@]} - fail ))
echo &quot;&quot;
echo &quot;Results: $pass ok, $fail failed (from $found files)&quot;
[[ $fail -eq 0 ]]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Each test runs as a background job, so checking six clusters takes as long as the slowest one (typically the 5-second timeout for an unreachable cluster), not six times that.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./test-kubeconfigs.sh
OK    cluster-us-east-1.yaml   context=cluster-us-east-1
OK    cluster-us-west-2.yaml   context=cluster-us-west-2
OK    cluster-eu-west-1.yaml   context=cluster-eu-west-1
FAIL  cluster-ap-south-1.yaml  context=cluster-ap-south-1
OK    local.yaml               context=local

Results: 4 ok, 1 failed (from 5 files)
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;putting-it-all-together&quot;&gt;Putting it all together&lt;/h3&gt;

&lt;p&gt;The workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;rancher_kubeconfig_dl.sh&lt;/code&gt; once (or after adding clusters in Rancher) to download all kubeconfigs into &lt;code&gt;~/.kube/clusters/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open a new terminal. The &lt;code&gt;find&lt;/code&gt;-based &lt;code&gt;KUBECONFIG&lt;/code&gt; export picks up all files automatically. &lt;code&gt;kubectx&lt;/code&gt; lists every context.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;test-kubeconfigs.sh&lt;/code&gt; to verify connectivity to all clusters in parallel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No manual list to maintain, no UI clicking, and a quick way to verify everything is reachable.&lt;/p&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/3158708660341145854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2026/04/managing-kubeconfig-files-download-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/3158708660341145854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/3158708660341145854'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2026/04/managing-kubeconfig-files-download-from.html' title='Managing kubeconfig files + download from Rancher '/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-1906879376038292809</id><published>2026-04-01T19:13:00.000-04:00</published><updated>2026-04-01T19:13:35.776-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="automation"/><category scheme="http://www.blogger.com/atom/ns#" term="home"/><category scheme="http://www.blogger.com/atom/ns#" term="homeassistant"/><category scheme="http://www.blogger.com/atom/ns#" term="localtuya"/><category scheme="http://www.blogger.com/atom/ns#" term="reverse-engineering"/><category scheme="http://www.blogger.com/atom/ns#" term="ropvacnic"/><category scheme="http://www.blogger.com/atom/ns#" term="ropvacnic_S1"/><category scheme="http://www.blogger.com/atom/ns#" term="tuya"/><category scheme="http://www.blogger.com/atom/ns#" term="vaccum"/><title type='text'>Reverse-engineering Ropvacnic S1 vacuum for homeassistant integration</title><content type='html'>&lt;h2&gt;Integrating the Ropvacnic S1 into Home Assistant via LocalTuya&lt;/h2&gt;
 
&lt;p&gt;The Ropvacnic S1 is a Tuya-based robot vacuum. Getting it to work locally in Home Assistant requires some digging — the DP numbers aren&#39;t documented anywhere, and LocalTuya has a bug in its locate function. This guide documents everything I found.&lt;/p&gt;
 
&lt;p&gt;&lt;strong&gt;Why local control?&lt;/strong&gt; Faster response, no cloud dependency, works if Tuya servers go down. The device still sends data to Tuya&#39;s cloud, but Home Assistant commands go directly over your LAN.&lt;/p&gt;
 
&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt; Home Assistant OS 2026.3.4 · LocalTuya 5.2.3 · Protocol 3.4 · Region: Western America&lt;/p&gt;
 
&lt;hr&gt;
 
&lt;h3&gt;Step 1 — Tuya IoT Platform Setup&lt;/h3&gt;
 
&lt;p&gt;Create an account at &lt;strong&gt;iot.tuya.com&lt;/strong&gt; (not tuya.com — click &quot;Developer Platform&quot; at the bottom). Create a Cloud Project with these settings:&lt;/p&gt;
 
&lt;ul&gt;
  &lt;li&gt;Industry: Smart Home&lt;/li&gt;
  &lt;li&gt;Development Method: Smart Home&lt;/li&gt;
  &lt;li&gt;Data Center: &lt;strong&gt;Western America&lt;/strong&gt; (for Canada/USA accounts)&lt;/li&gt;
&lt;/ul&gt;
 
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The Data Center must match your Tuya Smart app region. A mismatch causes a &quot;Data center inconsistency&quot; error when scanning the QR code.&lt;/p&gt;
 
&lt;p&gt;Under &lt;strong&gt;Devices → Link Tuya App Account&lt;/strong&gt;, scan the QR code with your Tuya Smart app. Then note:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Access ID&lt;/strong&gt; — from the Overview tab&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Access Secret&lt;/strong&gt; — from the Overview tab&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;UID&lt;/strong&gt; — from the linked account (starts with &lt;code&gt;az...&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
 
&lt;hr&gt;
 
&lt;h3&gt;Step 2 — Discover DPs with tinytuya&lt;/h3&gt;
 
&lt;p&gt;A DP (Data Point) is a numbered channel that controls one specific function of the device. Install tinytuya on your computer to identify them all:&lt;/p&gt;
 
&lt;pre&gt;
pip3 install tinytuya
python3 -m tinytuya wizard
# Enter your Access ID, Secret, UID and region (us)
 
python3 -m tinytuya snapshot
# Poll: Y → shows all live DP values
&lt;/pre&gt;
 
&lt;h4&gt;Complete DP Map — Ropvacnic S1&lt;/h4&gt;
 
&lt;table border=&quot;1&quot; cellpadding=&quot;6&quot; cellspacing=&quot;0&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;DP&lt;/th&gt;
      &lt;th&gt;Code&lt;/th&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Values&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;switch&lt;/td&gt;&lt;td&gt;Boolean&lt;/td&gt;&lt;td&gt;true / false&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;switch_go&lt;/td&gt;&lt;td&gt;Boolean&lt;/td&gt;&lt;td&gt;true / false&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;mode&lt;/td&gt;&lt;td&gt;Enum&lt;/td&gt;&lt;td&gt;standby, random, wall_follow, spiral, chargego&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;direction_control&lt;/td&gt;&lt;td&gt;Enum&lt;/td&gt;&lt;td&gt;forward, backward, turn_left, turn_right, stop&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;status&lt;/td&gt;&lt;td&gt;Enum&lt;/td&gt;&lt;td&gt;standby, smart_clean, goto_charge, charging, charge_done, paused&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;residual_electricity&lt;/td&gt;&lt;td&gt;Integer&lt;/td&gt;&lt;td&gt;0–100 (%)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;clean_time&lt;/td&gt;&lt;td&gt;Integer&lt;/td&gt;&lt;td&gt;minutes&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;clean_area&lt;/td&gt;&lt;td&gt;Integer&lt;/td&gt;&lt;td&gt;m²&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;seek (locate)&lt;/td&gt;&lt;td&gt;Boolean&lt;/td&gt;&lt;td&gt;true / false&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;suction&lt;/td&gt;&lt;td&gt;Enum&lt;/td&gt;&lt;td&gt;gentle, normal, strong&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;edge_brush&lt;/td&gt;&lt;td&gt;Integer&lt;/td&gt;&lt;td&gt;0–100 (%)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;filter&lt;/td&gt;&lt;td&gt;Integer&lt;/td&gt;&lt;td&gt;0–100 (%)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;water_control&lt;/td&gt;&lt;td&gt;Enum&lt;/td&gt;&lt;td&gt;closed, low, middle, high&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
 
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; DP 13 (seek/locate) is not visible in the standard tinytuya output. It was found by brute-force testing DPs 10–16 using &lt;code&gt;d.set_value(dp, True)&lt;/code&gt; and listening for the vacuum&#39;s beep.&lt;/p&gt;
 
&lt;hr&gt;
 
&lt;h3&gt;Step 3 — LocalTuya Entity Configuration&lt;/h3&gt;
 
&lt;p&gt;Install LocalTuya via HACS, restart HA, then go to &lt;strong&gt;Settings → Devices &amp;amp; Services → Add Integration → LocalTuya&lt;/strong&gt;.&lt;/p&gt;
 
&lt;p&gt;Set Manual DPS to: &lt;code&gt;1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25&lt;/code&gt;&lt;/p&gt;
 
&lt;p&gt;Configure the entity with these values:&lt;/p&gt;
 
&lt;table border=&quot;1&quot; cellpadding=&quot;6&quot; cellspacing=&quot;0&quot;&gt;
  &lt;thead&gt;
    &lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;&lt;td&gt;ID (status DP)&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Power DP (powergo_dp)&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Mode DP&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Battery DP&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Fan Speed DP&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Clean Time DP&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Clean Area DP&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Locate DP&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Fault DP&lt;/td&gt;&lt;td&gt;(leave empty)&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Idle Status&lt;/td&gt;&lt;td&gt;standby,sleep&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Docked Status&lt;/td&gt;&lt;td&gt;charging,chargecompleted,charge_done&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Returning Status&lt;/td&gt;&lt;td&gt;goto_charge&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Modes list&lt;/td&gt;&lt;td&gt;standby,random,wall_follow,spiral,chargego&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Return home mode&lt;/td&gt;&lt;td&gt;chargego&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Fan speeds list&lt;/td&gt;&lt;td&gt;gentle,normal,strong&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Pause state&lt;/td&gt;&lt;td&gt;paused&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;Stop status&lt;/td&gt;&lt;td&gt;standby&lt;/td&gt;&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
 
&lt;hr&gt;
 
&lt;h3&gt;Step 4 — Fix vacuum.py (LocalTuya bug)&lt;/h3&gt;
 
&lt;p&gt;LocalTuya 5.2.3 has a bug in &lt;code&gt;async_locate&lt;/code&gt; — it sends an empty string &lt;code&gt;&quot;&quot;&lt;/code&gt; instead of &lt;code&gt;True&lt;/code&gt;, so the locate button does nothing. Fix it via the Terminal add-on:&lt;/p&gt;
 
&lt;pre&gt;
sed -i &#39;s/set_dp(&quot;&quot;, self._config\[CONF_LOCATE_DP\])/set_dp(True, self._config[CONF_LOCATE_DP])/g&#39; \
  /config/custom_components/localtuya/vacuum.py
 
# Verify
grep -A3 &quot;async_locate&quot; /config/custom_components/localtuya/vacuum.py
&lt;/pre&gt;
 
&lt;hr&gt;
 
&lt;h3&gt;Step 5 — Fix config via Terminal (if GUI doesn&#39;t save)&lt;/h3&gt;
 
&lt;p&gt;The LocalTuya GUI sometimes doesn&#39;t persist certain changes (notably &lt;code&gt;mode_dp&lt;/code&gt; and &lt;code&gt;id&lt;/code&gt;). Edit the config file directly:&lt;/p&gt;
 
&lt;pre&gt;
# Backup first!
cp /config/.storage/core.config_entries \
   /config/.storage/core.config_entries.backup
 
# Status DP = 5 (reads DP 5 for state)
sed -i &#39;s/&quot;id&quot;:1,&quot;idle_status_value&quot;:&quot;standby,sleep&quot;/&quot;id&quot;:5,&quot;idle_status_value&quot;:&quot;standby,sleep&quot;/g&#39; \
  /config/.storage/core.config_entries
 
# powergo_dp must be 1 (start/pause)
sed -i &#39;s/&quot;powergo_dp&quot;:5/&quot;powergo_dp&quot;:1/g&#39; \
  /config/.storage/core.config_entries
 
# mode_dp = 3 (stop + return to base)
sed -i &#39;s/&quot;mode_dp&quot;:0/&quot;mode_dp&quot;:3/g&#39; \
  /config/.storage/core.config_entries
 
# locate_dp = 13
sed -i &#39;s/&quot;locate_dp&quot;:0/&quot;locate_dp&quot;:13/g&#39; \
  /config/.storage/core.config_entries
 
# Remove fault_dp entirely (causes false errors)
sed -i &#39;s/,&quot;fault_dp&quot;:[0-9]*//g&#39; \
  /config/.storage/core.config_entries
&lt;/pre&gt;
 
&lt;p&gt;After edits, reload LocalTuya: &lt;strong&gt;Settings → Devices &amp;amp; Services → LocalTuya → 3 dots → Reload&lt;/strong&gt; — no full restart needed.&lt;/p&gt;
 
&lt;hr&gt;
 
&lt;h3&gt;Final Result&lt;/h3&gt;
 
&lt;p&gt;After completing all steps, the Ropvacnic S1 is fully controllable from Home Assistant with local-only communication:&lt;/p&gt;
 
&lt;ul&gt;
  &lt;li&gt;State correctly shows &lt;strong&gt;Docked&lt;/strong&gt;, &lt;strong&gt;Cleaning&lt;/strong&gt;, &lt;strong&gt;Returning&lt;/strong&gt;, and &lt;strong&gt;Paused&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;Start, Pause, Stop, and Return to Base all work&lt;/li&gt;
  &lt;li&gt;Locate (beep) works after the vacuum.py fix&lt;/li&gt;
  &lt;li&gt;Battery percentage displayed in real time&lt;/li&gt;
  &lt;li&gt;Fan speed (gentle / normal / strong) selectable from HA&lt;/li&gt;
  &lt;li&gt;Clean time and area tracked per session&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/1906879376038292809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2026/04/reverse-engineering-ropvacnic-s1-vacuum.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/1906879376038292809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/1906879376038292809'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2026/04/reverse-engineering-ropvacnic-s1-vacuum.html' title='Reverse-engineering Ropvacnic S1 vacuum for homeassistant integration'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-8920002220108527143</id><published>2025-11-21T16:05:00.002-05:00</published><updated>2025-11-21T16:05:15.517-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cours"/><category scheme="http://www.blogger.com/atom/ns#" term="elearning"/><category scheme="http://www.blogger.com/atom/ns#" term="learning"/><category scheme="http://www.blogger.com/atom/ns#" term="moc"/><category scheme="http://www.blogger.com/atom/ns#" term="un"/><title type='text'>UN / unodc elearning</title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;https://elearningunodc.org/local/pages/?id=3&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/8920002220108527143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/11/un-unodc-elearning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/8920002220108527143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/8920002220108527143'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/11/un-unodc-elearning.html' title='UN / unodc elearning'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-8510122511414491832</id><published>2025-09-30T16:53:00.002-04:00</published><updated>2025-09-30T16:53:56.779-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="chainguard"/><category scheme="http://www.blogger.com/atom/ns#" term="docker"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="supply chain"/><title type='text'>[ref] Chainguard 101</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://images.chainguard.dev&quot;&gt;https://images.chainguard.dev&lt;/a&gt;/&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://edu.chainguard.dev&quot;&gt;https://edu.chainguard.dev&lt;/a&gt;/&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://edu.chainguard.dev/chainguard/chainguard-images/videos/debugging_distroless&quot;&gt;https://edu.chainguard.dev/chainguard/chainguard-images/videos/debugging_distroless&lt;/a&gt;/&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/iximiuz/cdebug&quot;&gt;https://github.com/iximiuz/cdebug&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://mt165.co.uk/blog/static-link-go&quot;&gt;https://mt165.co.uk/blog/static-link-go&lt;/a&gt;/&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;Links from Adrian Mouat&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://www.linkedin.com/in/adrianmouat&quot;&gt;https://www.linkedin.com/in/adrianmouat&lt;/a&gt;/ (Chainguard)&amp;nbsp;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Chainguard slack :&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://communityinviter.com/apps/chainguardcommunity/invite&quot;&gt;https://communityinviter.com/apps/chainguardcommunity/invite&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/8510122511414491832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/09/ref-chainguard-101.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/8510122511414491832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/8510122511414491832'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/09/ref-chainguard-101.html' title='[ref] Chainguard 101'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-6385275800874691369</id><published>2025-09-11T14:39:00.003-04:00</published><updated>2025-09-11T14:39:28.070-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cmdline"/><category scheme="http://www.blogger.com/atom/ns#" term="converting"/><category scheme="http://www.blogger.com/atom/ns#" term="image"/><category scheme="http://www.blogger.com/atom/ns#" term="imagemagick"/><category scheme="http://www.blogger.com/atom/ns#" term="jpeg"/><category scheme="http://www.blogger.com/atom/ns#" term="size"/><title type='text'>Image magick, reduce size of jpg files by 50%</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;for file in *.jpg; do magick &quot;$file&quot; -resize 50% &quot;resized/$file&quot;; done&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/6385275800874691369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/09/image-magick-reduce-size-of-jpg-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/6385275800874691369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/6385275800874691369'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/09/image-magick-reduce-size-of-jpg-files.html' title='Image magick, reduce size of jpg files by 50%'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-5503670023605090782</id><published>2025-09-08T15:24:00.006-04:00</published><updated>2025-09-08T15:24:36.474-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ansible"/><category scheme="http://www.blogger.com/atom/ns#" term="best-practices"/><category scheme="http://www.blogger.com/atom/ns#" term="dynamic inventory"/><category scheme="http://www.blogger.com/atom/ns#" term="gcp"/><category scheme="http://www.blogger.com/atom/ns#" term="google cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="inventory"/><title type='text'>Ansible : GCP Google Cloud (Compute) ansible dynamic inventory with cache</title><content type='html'>&lt;p&gt;Inventory definition GCP compute&lt;/p&gt;&lt;div style=&quot;background-color: white; color: #3b3b3b; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; line-height: 18px; white-space: pre;&quot;&gt;&lt;div&gt;---&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;plugin&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;google.cloud.gcp_compute&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;# https://docs.ansible.com/ansible/latest/collections/google/cloud/gcp_compute_inventory.html&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;# https://gitlab.com/gitlab-org/gitlab-environment-toolkit/-/blob/main/docs/environment_configure.md#google-cloud-platform-gcp&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;projects&lt;/span&gt;:&lt;/div&gt;&lt;div&gt; - project_id&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;auth_kind&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;serviceaccount&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;# must match `ansible_user` below, cf. other article on how to set this up&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;service_account_file&lt;/span&gt;: ./&lt;span style=&quot;color: blue;&quot;&gt;gcp-sa.json&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;filters&lt;/span&gt;:&lt;/div&gt;&lt;div&gt; &lt;span style=&quot;color: green;&quot;&gt;# only return running instances, we won&#39;t be able to connect to sopped instances&lt;/span&gt;&lt;/div&gt;&lt;div&gt; - &lt;span style=&quot;color: blue;&quot;&gt;status = RUNNING&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt; # for example, only return compute instances with label foo = foobar&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; - &lt;span style=&quot;color: blue;&quot;&gt;labels.foo = foobar&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;keyed_groups&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;  - &lt;span style=&quot;color: maroon;&quot;&gt;key&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;labels&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;span style=&quot;color: maroon;&quot;&gt;prefix&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;label&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;hostnames&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;  - &lt;span style=&quot;color: blue;&quot;&gt;name&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  - &lt;span style=&quot;color: blue;&quot;&gt;public_ip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  - &lt;span style=&quot;color: blue;&quot;&gt;private_ip&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: maroon;&quot;&gt;compose&lt;/span&gt;:&lt;/div&gt;&lt;div&gt; &lt;span style=&quot;color: green;&quot;&gt;#&amp;lt;ansible variable to be set&amp;gt;  &amp;lt;data from gcp discovery&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;span style=&quot;color: green;&quot;&gt;# Set an inventory parameter to use the Public IP address to connect to the host&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;span style=&quot;color: green;&quot;&gt;#ansible_host: public_ip&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;span style=&quot;color: maroon;&quot;&gt;ansible_host&lt;/span&gt;:           &lt;span style=&quot;color: blue;&quot;&gt;networkInterfaces[0].accessConfigs[0].natIP&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;span style=&quot;color: maroon;&quot;&gt;ansible_user&lt;/span&gt;:           &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;&#39;sa_115528571027174573787&#39;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;div&gt; &lt;span style=&quot;color: green;&quot;&gt;# GCP compute label &lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt;&quot;activate_this&quot;&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; value&lt;/span&gt;&lt;span style=&quot;color: green;&quot;&gt; =&amp;gt; ansible variable &quot;run_this&quot; value&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt; &lt;span style=&quot;color: maroon;&quot;&gt;run_this&lt;/span&gt;:    &lt;span style=&quot;color: blue;&quot;&gt;labels[&#39;activate_this&#39;]&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;div style=&quot;color: #3b3b3b; line-height: 18px;&quot;&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/5503670023605090782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/09/ansible-gcp-google-cloud-compute.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/5503670023605090782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/5503670023605090782'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/09/ansible-gcp-google-cloud-compute.html' title='Ansible : GCP Google Cloud (Compute) ansible dynamic inventory with cache'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-7116327532650014848</id><published>2025-08-28T15:41:00.001-04:00</published><updated>2025-09-12T14:52:03.583-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ansible"/><category scheme="http://www.blogger.com/atom/ns#" term="check"/><category scheme="http://www.blogger.com/atom/ns#" term="health"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="observability"/><category scheme="http://www.blogger.com/atom/ns#" term="service"/><category scheme="http://www.blogger.com/atom/ns#" term="services"/><category scheme="http://www.blogger.com/atom/ns#" term="systemd"/><category scheme="http://www.blogger.com/atom/ns#" term="timer"/><title type='text'>Systemd healtcheck with side service and monotonic timer, auto-healing</title><content type='html'>&lt;p&gt;&lt;b&gt;What : bypass the lack of healthcheck of systemd&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;systemd service &quot;what-service.service&quot;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;systemd timer&amp;nbsp; &quot;&lt;/b&gt;&lt;b&gt;what-service-healthcheck.timer&quot;&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;triggers a systemd service &quot;&lt;b&gt;what-service-healthcheck.service&quot;&lt;/b&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot; style=&quot;font-weight: 400;&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;1&quot; data-interop-new-line=&quot;1&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_1&quot;&gt;&lt;/div&gt;&lt;/div&gt;&amp;nbsp;which lanches a script &quot;&lt;/b&gt;&lt;b&gt;service_health_check.sh&quot;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;script that :&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;curl&#39;s heal-tcheck URL &quot;&lt;/b&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;HEALTH_CHECK_URL&quot;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;if KO, restart the targetted service&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;what-service-healthcheck.timer&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;1&quot; data-interop-new-line=&quot;1&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_1&quot;&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;2&quot; data-interop-new-line=&quot;2&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_2&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;Description=Run health check every 15 seconds&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;3&quot; data-interop-new-line=&quot;3&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_3&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;4&quot; data-interop-new-line=&quot;4&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_4&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;[Timer]&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;5&quot; data-interop-new-line=&quot;5&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_5&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;# Wait 1 minute after boot before the first check&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;6&quot; data-interop-new-line=&quot;6&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_6&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;OnBootSec=1min&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;7&quot; data-interop-new-line=&quot;7&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_7&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;8&quot; data-interop-new-line=&quot;8&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_8&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;# Run the check 15 seconds after the last time it finished&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;9&quot; data-interop-new-line=&quot;9&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_9&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;OnUnitActiveSec=15s&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;10&quot; data-interop-new-line=&quot;10&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_10&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;11&quot; data-interop-new-line=&quot;11&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;08eacba4fbaa31d50848cd810803da84aac0c6cb_0_11&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;[Install]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;WantedBy=timers.target&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;By default the &lt;i&gt;timer&lt;/i&gt;&amp;nbsp;&lt;i&gt;service&lt;/i&gt; will trigger the unit &lt;i&gt;service&lt;/i&gt; with the same name, no need to specify it.&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;b&gt;what-service-healthcheck.service.j2&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;1&quot; data-interop-new-line=&quot;1&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;b2b39578ed5f9df3f1446a8fbf5d8884e6300948_0_1&quot;&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;2&quot; data-interop-new-line=&quot;2&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;b2b39578ed5f9df3f1446a8fbf5d8884e6300948_0_2&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;Description=Health Check for&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;{{ what_service&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;}}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;3&quot; data-interop-new-line=&quot;3&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;b2b39578ed5f9df3f1446a8fbf5d8884e6300948_0_3&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;Requires={{ what_service&amp;nbsp;}}.service&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;4&quot; data-interop-new-line=&quot;4&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;b2b39578ed5f9df3f1446a8fbf5d8884e6300948_0_4&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;5&quot; data-interop-new-line=&quot;5&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;b2b39578ed5f9df3f1446a8fbf5d8884e6300948_0_5&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;6&quot; data-interop-new-line=&quot;6&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;b2b39578ed5f9df3f1446a8fbf5d8884e6300948_0_6&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;Type=oneshot&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ExecStart=/usr/local/bin/service_health_check.sh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Restart=on-failure&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;OnFailure=&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;{{ what_service }}&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;b&gt;service_health_check.sh&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;plaintext&quot;&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;1&quot; data-interop-new-line=&quot;1&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_1&quot;&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;2&quot; data-interop-new-line=&quot;2&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_2&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;3&quot; data-interop-new-line=&quot;3&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_3&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;c&quot;&gt;# The health check endpoint&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;4&quot; data-interop-new-line=&quot;4&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_4&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;nv&quot;&gt;HEALTH_CHECK_URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;http://localhost:{{ running_port }}/health_check&quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;5&quot; data-interop-new-line=&quot;5&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_5&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;6&quot; data-interop-new-line=&quot;6&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_6&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Use curl to check the endpoint.&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;7&quot; data-interop-new-line=&quot;7&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_7&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;c&quot;&gt;# --fail: Makes curl exit with a non-zero status code on server errors (4xx or 5xx).&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;8&quot; data-interop-new-line=&quot;8&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_8&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;c&quot;&gt;# --silent: Hides the progress meter.&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;9&quot; data-interop-new-line=&quot;9&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_9&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;c&quot;&gt;# --output /dev/null: Discards the response body.&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;10&quot; data-interop-new-line=&quot;10&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_10&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; curl &lt;span class=&quot;nt&quot;&gt;--silent&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--fail&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--max-time&lt;/span&gt; 2 &lt;span class=&quot;nt&quot;&gt;--output&lt;/span&gt; /dev/null &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HEALTH_CHECK_URL&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;11&quot; data-interop-new-line=&quot;11&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_11&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;k&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Health check failed for {{ service_name&amp;nbsp;}}. Restarting...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;12&quot; data-interop-new-line=&quot;12&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;8327cb94109a7db32e9ef69fbf8b6f1cc3812e78_0_12&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;# Restart is performed on failure from healthcheck service&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;exit 1&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;fi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;k&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;k&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;k&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;k&quot;&gt;Adding through ansible (to do : fix indentation, blog isn&#39;t great for this)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;k&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;b&gt;&amp;lt;role&amp;gt;/tasks/main.yml&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;k&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;---&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;46&quot; data-interop-new-line=&quot;46&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_46_46&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip expanded expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel expanded expanded&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; id=&quot;LC46&quot; lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Generate what-service systemd file&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;47&quot; data-interop-old-line=&quot;47&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_47_47&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;47&quot; data-interop-new-line=&quot;47&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_47_47&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip expanded expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel expanded expanded&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; id=&quot;LC47&quot; lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;ansible.builtin.template&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;48&quot; data-interop-old-line=&quot;48&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_48_48&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;48&quot; data-interop-new-line=&quot;48&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_48_48&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip expanded expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel expanded expanded&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; id=&quot;LC48&quot; lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;s&quot;&gt;what-service.service.j2&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;49&quot; data-interop-old-line=&quot;49&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_49_49&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;49&quot; data-interop-new-line=&quot;49&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_49_49&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip expanded expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel expanded expanded&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; id=&quot;LC49&quot; lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/etc/systemd/system/what-service.service&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;50&quot; data-interop-old-line=&quot;50&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_50_50&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;50&quot; data-interop-new-line=&quot;50&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_50_50&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip expanded expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel expanded expanded&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; id=&quot;LC50&quot; lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0755&quot;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;51&quot; data-interop-old-line=&quot;51&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_51_51&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;51&quot; data-interop-new-line=&quot;51&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_51_51&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip expanded expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel expanded expanded&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; id=&quot;LC51&quot; lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;notify&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Restart&amp;nbsp;&lt;/span&gt;&lt;/span&gt;what-service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel expansion&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;52&quot; data-interop-old-line=&quot;52&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;14fbe2b76ac0acf85b7a9f4a43501589811c090d_52_52&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage right-side has-tooltip expanded expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side expanded&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel expanded expanded&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; id=&quot;LC52&quot; lang=&quot;yaml&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;shell&quot;&gt;&lt;span class=&quot;k&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Copy the health check script&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;   &lt;/span&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;16&quot; data-interop-new-line=&quot;16&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_16&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;ansible.builtin.copy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;17&quot; data-interop-new-line=&quot;17&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_17&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&amp;nbsp;&lt;/span&gt;service_health_check.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;18&quot; data-interop-new-line=&quot;18&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_18&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/usr/local/bin/service_health_check.sh&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;19&quot; data-interop-new-line=&quot;19&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_19&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;root&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;20&quot; data-interop-new-line=&quot;20&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_20&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;root&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;21&quot; data-interop-new-line=&quot;21&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_21&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0755&#39;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;22&quot; data-interop-new-line=&quot;22&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_22&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;23&quot; data-interop-new-line=&quot;23&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_23&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;vars:&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;service_name: what-service&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Copy the health check systemd service file&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;24&quot; data-interop-new-line=&quot;24&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_24&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;ansible.builtin.copy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;25&quot; data-interop-new-line=&quot;25&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_25&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;what-service-healthcheck.service&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;26&quot; data-interop-new-line=&quot;26&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_26&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/etc/systemd/system/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;what-service&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;s&quot;&gt;-healthcheck.service&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;27&quot; data-interop-new-line=&quot;27&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_27&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;root&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;28&quot; data-interop-new-line=&quot;28&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_28&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;root&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;29&quot; data-interop-new-line=&quot;29&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_29&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0644&#39;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;30&quot; data-interop-new-line=&quot;30&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_30&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;notify&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Reload systemd&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;31&quot; data-interop-new-line=&quot;31&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_31&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;32&quot; data-interop-new-line=&quot;32&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_32&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Copy the health check systemd timer file&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;33&quot; data-interop-new-line=&quot;33&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_33&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;ansible.builtin.copy&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;34&quot; data-interop-new-line=&quot;34&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_34&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;what-service&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;s&quot;&gt;-healthcheck.timer&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;35&quot; data-interop-new-line=&quot;35&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_35&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/etc/systemd/system/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;what-service&lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;s&quot;&gt;-healthcheck.timer&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;36&quot; data-interop-new-line=&quot;36&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_36&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;root&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;37&quot; data-interop-new-line=&quot;37&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_37&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;root&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;38&quot; data-interop-new-line=&quot;38&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_38&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;0644&#39;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;39&quot; data-interop-new-line=&quot;39&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_39&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;notify&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Reload systemd&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;s&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;40&quot; data-interop-new-line=&quot;40&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_40&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;41&quot; data-interop-new-line=&quot;41&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_41&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Enable and start the health check timer&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;42&quot; data-interop-new-line=&quot;42&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_42&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;ansible.builtin.systemd&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;43&quot; data-interop-new-line=&quot;43&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_43&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;healthcheck.timer&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;44&quot; data-interop-new-line=&quot;44&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_44&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;started&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;45&quot; data-interop-new-line=&quot;45&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;c1b1cc7edf9bcbcf5034e3b5e634d376c2bb1b4a_14_45&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;enabled&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;yes&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;    &lt;span class=&quot;na&quot;&gt;daemon_reload&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;yes&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Ensures systemd is reloaded before starting&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;c1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;25&quot; data-interop-new-line=&quot;25&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_24_25&quot;&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;&lt;b&gt;&amp;lt;role&amp;gt;/handlers/main.yml&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;5&quot; data-interop-new-line=&quot;5&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_5_5&quot;&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel null&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Restart&amp;nbsp;&lt;/span&gt;&lt;/span&gt;what-service&amp;nbsp;&lt;br /&gt;&lt;span class=&quot;na&quot;&gt;&lt;span class=&quot;idiff left right addition&quot;&gt;ansible.builtin.&lt;/span&gt;service&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;7&quot; data-interop-old-line=&quot;7&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_7_7&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;7&quot; data-interop-new-line=&quot;7&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_7_7&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip null&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side null&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel null&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;what-service&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;8&quot; data-interop-old-line=&quot;8&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_8_8&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;8&quot; data-interop-new-line=&quot;8&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_8_8&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip null&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side null&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel null&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;restarted&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;9&quot; data-interop-old-line=&quot;9&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_9_9&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;9&quot; data-interop-new-line=&quot;9&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_9_9&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip null&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side null&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel null&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;daemon_reload&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-interop-line=&quot;10&quot; data-interop-old-line=&quot;10&quot; data-interop-type=&quot;old&quot; data-testid=&quot;left-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_10_10&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage left-side has-tooltip&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;10&quot; data-interop-new-line=&quot;10&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_10_10&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip null&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side null&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel null&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Reload systemd&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;26&quot; data-interop-new-line=&quot;26&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_24_26&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;ansible.builtin.service&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;27&quot; data-interop-new-line=&quot;27&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_24_27&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;daemon_reload&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;yes&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;28&quot; data-interop-new-line=&quot;28&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_24_28&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;29&quot; data-interop-new-line=&quot;29&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_24_29&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Restart what-service-healthcheck.timer&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;30&quot; data-interop-new-line=&quot;30&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_24_30&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;  &lt;span class=&quot;na&quot;&gt;ansible.builtin.service&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;31&quot; data-interop-new-line=&quot;31&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_24_31&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;s&quot;&gt;what-service-healthcheck.timer&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-right right-side&quot; data-interop-line=&quot;32&quot; data-interop-new-line=&quot;32&quot; data-interop-type=&quot;new&quot; data-testid=&quot;right-side&quot; id=&quot;a551455c2233416c232c083cab21e8d380bf71d2_24_32&quot;&gt;&lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;    &lt;span class=&quot;na&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;restarted&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;   &lt;div class=&quot;diff-grid-row diff-tr line_holder parallel&quot;&gt;&lt;div class=&quot;diff-grid-left left-side&quot; data-testid=&quot;left-side&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;diff-td line-coverage left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings left-side empty-cell&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-coverage right-side has-tooltip new new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line-inline-findings right-side new new_line&quot;&gt;&lt;/div&gt; &lt;div class=&quot;diff-td line_content with-coverage right-side parallel new new new_line&quot;&gt;&lt;span class=&quot;line&quot; data-lang=&quot;yaml&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;    &lt;span class=&quot;na&quot;&gt;daemon_reload&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/7116327532650014848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/08/systemd-healtcheck-with-side-service.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/7116327532650014848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/7116327532650014848'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/08/systemd-healtcheck-with-side-service.html' title='Systemd healtcheck with side service and monotonic timer, auto-healing'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-3544621170759357632</id><published>2025-07-24T16:44:00.004-04:00</published><updated>2025-07-24T16:44:26.738-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ansible"/><category scheme="http://www.blogger.com/atom/ns#" term="apt"/><category scheme="http://www.blogger.com/atom/ns#" term="apt_info"/><category scheme="http://www.blogger.com/atom/ns#" term="apt_info.py monitoring"/><category scheme="http://www.blogger.com/atom/ns#" term="debian"/><category scheme="http://www.blogger.com/atom/ns#" term="node-exporter"/><category scheme="http://www.blogger.com/atom/ns#" term="package"/><category scheme="http://www.blogger.com/atom/ns#" term="prometheus"/><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu"/><title type='text'>apt info - ansible tasks + roles to install apt_info.py automatically along node-exporter + Grafana dashboard</title><content type='html'>&lt;p&gt;Create a file with openmetrics values, so that it be exporter along node-exporter metrics.&lt;/p&gt;&lt;p&gt;=&amp;gt; script runs every 12h to report the status of apt packages to upgrade writes it in&amp;nbsp; /var/lib/node_exporter/apt_info.prom&amp;nbsp;&lt;/p&gt;&lt;p&gt;which is ingested by prometheus when calling node-exporter.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The metrics are used by a grafana dashboard available here :&amp;nbsp;https://grafana.com/grafana/dashboards/23777-apt-ugrades/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;div style=&quot;background-color: white; color: #3b3b3b; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; line-height: 18px; white-space: pre;&quot;&gt;&lt;div&gt;---&lt;/div&gt;&lt;div&gt;- &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;Monitoring probes - setup exporters running on each server&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  &lt;span style=&quot;color: maroon;&quot;&gt;hosts&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;all&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  &lt;span style=&quot;color: maroon;&quot;&gt;vars&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;   &lt;span style=&quot;color: maroon;&quot;&gt;become_user&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;root&lt;/span&gt;&lt;/div&gt;&lt;div&gt;   &lt;span style=&quot;color: maroon;&quot;&gt;become&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;  &lt;span style=&quot;color: maroon;&quot;&gt;tasks&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;  &lt;span style=&quot;color: green;&quot;&gt;# https://github.com/ncabatoff/process-exporter&lt;/span&gt;&lt;/div&gt;&lt;div&gt;   - &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;Install .deb package of process-exporter&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;ansible.builtin.apt&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;deb&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;https://github.com/ncabatoff/process-exporter/releases/download/v0.8.3/process-exporter_0.8.3_linux_amd64.deb&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;become&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;   - &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;Download and install apt_info.py&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;ansible.builtin.get_url&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;url&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;https://raw.githubusercontent.com/prometheus-community/node-exporter-textfile-collector-scripts/refs/heads/master/apt_info.py&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;dest&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;/usr/local/bin/apt_info.py&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;mode&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;&#39;0755&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;become&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;   - &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;Install apt_info.py dependencies via apt&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;ansible.builtin.apt&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;{{ item }}&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;state&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;present&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;update_cache&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;become&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;with_items&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;      - &lt;span style=&quot;color: blue;&quot;&gt;python3-prometheus-client&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      - &lt;span style=&quot;color: blue;&quot;&gt;python3-apt&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      - &lt;span style=&quot;color: blue;&quot;&gt;cron&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;   - &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;Add a cron job to run apt_info.py every 12 hours&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;ansible.builtin.cron&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;Run apt_info.py every 12 hours&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;minute&lt;/span&gt;: &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;hour&lt;/span&gt;: &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;*/12&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;job&lt;/span&gt;: &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;/usr/local/bin/apt_info.py &amp;gt; /var/lib/node_exporter/apt_info.prom&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;become&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;ignore_errors&lt;/span&gt;: &lt;span style=&quot;color: #a31515;&quot;&gt;&quot;{{ ansible_check_mode }}&quot;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;   - &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;Ensure APT auto update is enabled&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;ansible.builtin.copy&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;dest&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;/etc/apt/apt.conf.d/99_auto_apt_update.conf&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;content&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;&#39;APT::Periodic::Update-Package-Lists &quot;1&quot;;&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;owner&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;root&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;group&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;root&lt;/span&gt;&lt;/div&gt;&lt;div&gt;      &lt;span style=&quot;color: maroon;&quot;&gt;mode&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;&#39;0644&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;     &lt;span style=&quot;color: maroon;&quot;&gt;become&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;  &lt;span style=&quot;color: maroon;&quot;&gt;roles&lt;/span&gt;:&lt;/div&gt;&lt;div&gt;   &lt;span style=&quot;color: green;&quot;&gt;# https://github.com/prometheus-community/ansible/tree/main/roles/node_exporter&lt;/span&gt;&lt;/div&gt;&lt;div&gt;   - &lt;span style=&quot;color: maroon;&quot;&gt;name&lt;/span&gt;: &lt;span style=&quot;color: blue;&quot;&gt;prometheus.prometheus.node_exporter&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;   &lt;span style=&quot;color: green;&quot;&gt;#  node_exporter_textfile_dir: &quot;/var/lib/node_exporter&quot; # default&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: green;&quot;&gt;```&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/3544621170759357632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/07/apt-info-ansible-tasks-roles-to-install.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/3544621170759357632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/3544621170759357632'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/07/apt-info-ansible-tasks-roles-to-install.html' title='apt info - ansible tasks + roles to install apt_info.py automatically along node-exporter + Grafana dashboard'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-690541698005944789</id><published>2025-05-29T06:19:00.005-04:00</published><updated>2025-05-29T06:19:57.619-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="monitoring"/><category scheme="http://www.blogger.com/atom/ns#" term="RED"/><category scheme="http://www.blogger.com/atom/ns#" term="ref"/><category scheme="http://www.blogger.com/atom/ns#" term="SRE"/><category scheme="http://www.blogger.com/atom/ns#" term="USE"/><title type='text'>SRE &amp; monitoring  of distributed systems </title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li class=&quot;li1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;Google SRE book, Chapter 6 &lt;br /&gt;&lt;a href=&quot;https://sre.google/sre-book/monitoring-distributed-systems/&quot;&gt;https://sre.google/sre-book/monitoring-distributed-systems/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(and more globally, the whole Goolge SRE book explains a full methodology of SRE from monitoring to incident management)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;font-family: Helvetica;&quot;&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;2 different type of recommended monitoring : USE and RED&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li class=&quot;li1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;RED Method explained at GrafanaCon 2018&amp;nbsp; &lt;a href=&quot;https://grafana.com/blog/2018/08/02/the-red-method-how-to-instrument-your-services/&quot;&gt;https://grafana.com/blog/2018/08/02/the-red-method-how-to-instrument-your-services/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li class=&quot;li1&quot; style=&quot;font-family: Helvetica; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 12px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; line-height: normal; margin: 0px;&quot;&gt;USE Deep dive&amp;nbsp; &lt;a href=&quot;http://brendangregg.com/usemethod.html&quot;&gt;http://brendangregg.com/usemethod.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/690541698005944789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/05/sre-monitoring-of-distributed-systems.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/690541698005944789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/690541698005944789'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/05/sre-monitoring-of-distributed-systems.html' title='SRE &amp; monitoring  of distributed systems '/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-5131175517129746579</id><published>2025-05-28T18:09:00.002-04:00</published><updated>2025-05-28T18:09:17.700-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blockchain"/><category scheme="http://www.blogger.com/atom/ns#" term="BLS"/><category scheme="http://www.blogger.com/atom/ns#" term="cryptography"/><category scheme="http://www.blogger.com/atom/ns#" term="ref"/><category scheme="http://www.blogger.com/atom/ns#" term="signature"/><title type='text'>Some cryptographic references and blockchain applications</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-sourcepos=&quot;72:1-72:14&quot; dir=&quot;auto&quot;&gt;&lt;/h3&gt;&lt;ul data-sourcepos=&quot;74:1-76:166&quot; dir=&quot;auto&quot;&gt;&lt;li data-sourcepos=&quot;74:1-74:156&quot;&gt;&lt;a data-sourcepos=&quot;74:7-74:156&quot; href=&quot;https://toc.cryptobook.us/book.pdf&quot; rel=&quot;nofollow noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Boneh–Shoup &lt;em data-sourcepos=&quot;74:22-74:64&quot;&gt;A Graduate Course in Applied Cryptography&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;blockquote&gt;&lt;b&gt;Preface&lt;/b&gt;: [...] &lt;i&gt;This book is about exactly that: constructing practical cryptosystems for which we can argue&amp;nbsp;&lt;/i&gt;&lt;i&gt;security under plausible assumptions. The book covers many constructions for different tasks in&amp;nbsp;&lt;/i&gt;&lt;i&gt;cryptography. For each task we define a precise security goal that we aim to achieve and then&amp;nbsp;&lt;/i&gt;&lt;i&gt;present constructions that achieve the required goal. To analyze the constructions, we develop a&amp;nbsp;&lt;/i&gt;&lt;i&gt;unified framework for doing cryptographic proofs. A reader who masters this framework will be&amp;nbsp;&lt;/i&gt;&lt;i&gt;capable of applying it to new constructions that may not be covered in the book.&lt;/i&gt;[...]&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;ul data-sourcepos=&quot;74:1-76:166&quot; dir=&quot;auto&quot;&gt;&lt;li data-sourcepos=&quot;74:1-74:156&quot;&gt;&lt;a data-sourcepos=&quot;75:7-75:136&quot; href=&quot;https://eprint.iacr.org/2018/483.pdf&quot; rel=&quot;nofollow noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Dan Boneh, Manu Drijvers, Gregory Neven &lt;em data-sourcepos=&quot;75:48-75:97&quot;&gt;Compact Multi-Signatures for Smaller Blockchains&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;Abstract&lt;/b&gt;&lt;i&gt;:&amp;nbsp;We construct new multi-signature schemes that provide new&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;functionality. Our schemes are designed to reduce the size of the Bitcoin&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;blockchain, but are useful in many other settings where multi-signatures&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;are needed. All our constructions support both signature compression&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;and public-key aggregation. Hence, to verify that a number of parties&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;signed a common message m, the verifier only needs a short multi-&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;signature, a short aggregation of their public keys, and the message m.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;We give new constructions that are derived from Schnorr signatures and&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;from BLS signatures. Our constructions are in the plain public key model,&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;meaning that users do not need to prove knowledge or possession of their&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;secret key.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul data-sourcepos=&quot;74:1-76:166&quot; dir=&quot;auto&quot;&gt;&lt;li data-sourcepos=&quot;76:1-76:166&quot;&gt;&lt;a data-sourcepos=&quot;76:7-76:166&quot; href=&quot;https://medium.com/@coolcottontail/rogue-key-attack-in-bls-signature-and-harmony-security-eac1ea2370ee&quot; rel=&quot;nofollow noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Rogue Key Attack in BLS Signature and Harmony Security&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;div&gt;&lt;b&gt;Intro: &lt;/b&gt;&lt;i&gt;Consensus algorithm is one of the most important components in blockchain. &lt;/i&gt;&lt;a class=&quot;af np&quot; href=&quot;https://harmony.one&quot; rel=&quot;noopener ugc nofollow&quot; style=&quot;font-style: italic;&quot; target=&quot;_blank&quot;&gt;Harmony Blockchain&lt;/a&gt;&lt;i&gt; achieves consensus through the &lt;/i&gt;&lt;a class=&quot;af np&quot; href=&quot;http://https//harmony.one/whitepaper&quot; rel=&quot;noopener ugc nofollow&quot; style=&quot;font-style: italic;&quot; target=&quot;_blank&quot;&gt;Fast Byzantine Fault Tolerance (FBFT)&lt;/a&gt;&lt;i&gt;
 algorithm. In FBFT, instead of asking all validators to broadcast their
 votes, the leader runs a multi-signature signing process to collect the
 validators’ votes in a O(1)-sized multi-signature and then broadcast it
 to all validators. Consensus is reached when all the validators 
validate the aggregated signature against the aggregated public keys for
 this round of consensus.&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/5131175517129746579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/05/some-cryptographic-references-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/5131175517129746579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/5131175517129746579'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/05/some-cryptographic-references-and.html' title='Some cryptographic references and blockchain applications'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-2191008757559226887</id><published>2025-05-28T18:09:00.001-04:00</published><updated>2025-05-28T18:09:03.157-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="grafana"/><category scheme="http://www.blogger.com/atom/ns#" term="monitoring"/><category scheme="http://www.blogger.com/atom/ns#" term="prometheus"/><title type='text'>(vrac / to edit / to format) Prometheus sandbox - demo / prometheus relabeling tool &amp; ref / grafana demo </title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* The Art of Metric Relabeling in Prometheus:&amp;nbsp;&lt;/p&gt;&lt;p&gt;https://heiioncall.com/guides/the-art-of-metric-relabeling-in-prometheus&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* relabeler online testing tool :&amp;nbsp;&lt;br /&gt;https://relabeler.promlabs.com/&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhQSfAexPfmZ7GPErOVYU05dkgW4iwCrPSxXMCHewu61WD9AFf7suReLW9v8ImLuYKXPIisPaHHR_-Fr62zyVW5xcjaT40BME0wpmgQrnBCB2pzTl2Hl_igj7lh-F0NXvYConeF_O2R42x19UUxXiCNQwD8rpcKKFmYdxeOAUPyTNoXkzSJqG4K53UFWNA&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;444&quot; data-original-width=&quot;2318&quot; height=&quot;61&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhQSfAexPfmZ7GPErOVYU05dkgW4iwCrPSxXMCHewu61WD9AFf7suReLW9v8ImLuYKXPIisPaHHR_-Fr62zyVW5xcjaT40BME0wpmgQrnBCB2pzTl2Hl_igj7lh-F0NXvYConeF_O2R42x19UUxXiCNQwD8rpcKKFmYdxeOAUPyTNoXkzSJqG4K53UFWNA&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhQSfAexPfmZ7GPErOVYU05dkgW4iwCrPSxXMCHewu61WD9AFf7suReLW9v8ImLuYKXPIisPaHHR_-Fr62zyVW5xcjaT40BME0wpmgQrnBCB2pzTl2Hl_igj7lh-F0NXvYConeF_O2R42x19UUxXiCNQwD8rpcKKFmYdxeOAUPyTNoXkzSJqG4K53UFWNA&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgbdeSaPxm3KX9nxrONhS1byHUOPNlY4qBZrZPQbn8lLMxpjWdzfUNPj0BSc15fYrRbdyJMT_RTMU0mkt1mCTRtezBbipe7IOrbK2t3u3GGRiusyDs1X_nK0ELmjmWn-8W3WD-A-Iv86Lt9XYDdAUL5_MYLNkEqPJioLSlR8QtwvPPoUtJWW5_8ax-z6OE&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1652&quot; data-original-width=&quot;2220&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgbdeSaPxm3KX9nxrONhS1byHUOPNlY4qBZrZPQbn8lLMxpjWdzfUNPj0BSc15fYrRbdyJMT_RTMU0mkt1mCTRtezBbipe7IOrbK2t3u3GGRiusyDs1X_nK0ELmjmWn-8W3WD-A-Iv86Lt9XYDdAUL5_MYLNkEqPJioLSlR8QtwvPPoUtJWW5_8ax-z6OE&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;* relabeling cookbook (mostly compatible with prometheus too)&amp;nbsp;https://docs.victoriametrics.com/victoriametrics/relabeling/#how-to-remove-labels-from-targets&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* open / demo instance of grafana :&amp;nbsp; https://play.grafana.org/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* Grafana dashboards directory :&amp;nbsp;https://grafana.com/grafana/dashboards/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* Open / demo instance of prometheus :&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;https://prometheus.demo.prometheus.io/query&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;https://prometheus.demo.prometheus.io/config&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;


&lt;verbatim&gt;
  global:
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  evaluation_interval: 15s
  external_labels:
    environment: demo-prometheus-io.c.macro-mile-203600.internal
runtime:
  gogc: 75
alerting:
  alertmanagers:
  - follow_redirects: true
    enable_http2: true
    scheme: http
    timeout: 10s
    api_version: v2
    static_configs:
    - targets:
      - demo.prometheus.io:9093
rule_files:
- /etc/prometheus/rules/*.yml
- /etc/prometheus/rules/*.yaml
- /etc/prometheus/rules/*.rules
scrape_config_files:
- /etc/prometheus/scrape_configs/*
scrape_configs:
- job_name: prometheus
  honor_timestamps: true
  track_timestamps_staleness: false
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  metrics_path: /metrics
  scheme: http
  enable_compression: true
  follow_redirects: true
  enable_http2: true
  static_configs:
  - targets:
    - demo.prometheus.io:9090
- job_name: random
  honor_timestamps: true
  track_timestamps_staleness: false
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  metrics_path: /metrics
  scheme: http
  enable_compression: true
  follow_redirects: true
  enable_http2: true
  file_sd_configs:
  - files:
    - /etc/prometheus/file_sd/random.yml
    refresh_interval: 5m
- job_name: caddy
  honor_timestamps: true
  track_timestamps_staleness: false
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  metrics_path: /metrics
  scheme: http
  enable_compression: true
  follow_redirects: true
  enable_http2: true
  static_configs:
  - targets:
    - localhost:2019
- job_name: grafana
  honor_timestamps: true
  track_timestamps_staleness: false
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  metrics_path: /metrics
  scheme: http
  enable_compression: true
  follow_redirects: true
  enable_http2: true
  static_configs:
  - targets:
    - demo.prometheus.io:3000
- job_name: node
  honor_timestamps: true
  track_timestamps_staleness: false
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  metrics_path: /metrics
  scheme: http
  enable_compression: true
  follow_redirects: true
  enable_http2: true
  file_sd_configs:
  - files:
    - /etc/prometheus/file_sd/node.yml
    refresh_interval: 5m
- job_name: alertmanager
  honor_timestamps: true
  track_timestamps_staleness: false
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  metrics_path: /metrics
  scheme: http
  enable_compression: true
  follow_redirects: true
  enable_http2: true
  file_sd_configs:
  - files:
    - /etc/prometheus/file_sd/alertmanager.yml
    refresh_interval: 5m
- job_name: cadvisor
  honor_timestamps: true
  track_timestamps_staleness: true
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  metrics_path: /metrics
  scheme: http
  enable_compression: true
  follow_redirects: true
  enable_http2: true
  file_sd_configs:
  - files:
    - /etc/prometheus/file_sd/cadvisor.yml
    refresh_interval: 5m
- job_name: blackbox
  honor_timestamps: true
  track_timestamps_staleness: false
  params:
    module:
    - http_2xx
  scrape_interval: 15s
  scrape_timeout: 10s
  scrape_protocols:
  - OpenMetricsText1.0.0
  - OpenMetricsText0.0.1
  - PrometheusText1.0.0
  - PrometheusText0.0.4
  metrics_path: /probe
  scheme: http
  enable_compression: true
  follow_redirects: true
  enable_http2: true
  relabel_configs:
  - source_labels: [__address__]
    separator: ;
    target_label: __param_target
    replacement: $1
    action: replace
  - source_labels: [__param_target]
    separator: ;
    target_label: instance
    replacement: $1
    action: replace
  - separator: ;
    target_label: __address__
    replacement: 127.0.0.1:9115
    action: replace
  static_configs:
  - targets:
    - http://localhost:9100
&lt;/verbatim&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/2191008757559226887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/05/vrac-to-edit-to-format-prometheus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/2191008757559226887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/2191008757559226887'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/05/vrac-to-edit-to-format-prometheus.html' title='(vrac / to edit / to format) Prometheus sandbox - demo / prometheus relabeling tool &amp; ref / grafana demo '/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhQSfAexPfmZ7GPErOVYU05dkgW4iwCrPSxXMCHewu61WD9AFf7suReLW9v8ImLuYKXPIisPaHHR_-Fr62zyVW5xcjaT40BME0wpmgQrnBCB2pzTl2Hl_igj7lh-F0NXvYConeF_O2R42x19UUxXiCNQwD8rpcKKFmYdxeOAUPyTNoXkzSJqG4K53UFWNA=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-525347327103791986</id><published>2025-03-04T14:31:00.003-05:00</published><updated>2025-03-04T14:31:21.971-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="certifications"/><category scheme="http://www.blogger.com/atom/ns#" term="exam"/><category scheme="http://www.blogger.com/atom/ns#" term="hashicorp"/><category scheme="http://www.blogger.com/atom/ns#" term="infrastructure"/><category scheme="http://www.blogger.com/atom/ns#" term="terraform"/><title type='text'>terraform Associate certification notes &amp; links</title><content type='html'>&lt;p&gt;Terraform Associate exam is a 60-minute, multiple choice exam for beginner-level learners.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Terraform Authoring and Operations Professional exam is 4 hours long, lab-based with some MCQs, and intended for very experienced Terraform users.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;p&gt;All domains covered in terraform associate certification / more in-depth about what exam covers: &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/certification-003&quot;&gt;https://developer.hashicorp.com/terraform/tutorials/certification-003&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Learning path&lt;/b&gt; - &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/certification-003/associate-study-003&quot;&gt;https://developer.hashicorp.com/terraform/tutorials/certification-003/associate-study-003&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Exam objectives&lt;/b&gt;&amp;nbsp;&lt;a href=&quot;https://developer.hashicorp.com/certifications/infrastructure-automation#terraform-associate-(003)-details&quot;&gt;https://developer.hashicorp.com/certifications/infrastructure-automation#terraform-associate-(003)-details&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Content list&lt;/b&gt; - &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/certification-003/associate-review-003&quot;&gt;https://developer.hashicorp.com/terraform/tutorials/certification-003/associate-review-003&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Sample questions&lt;/b&gt; - &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/certification-003/associate-questions&quot;&gt;https://developer.hashicorp.com/terraform/tutorials/certification-003/associate-questions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Chris study notes : &lt;a href=&quot;https://www.freecodecamp.org/news/terraform-certified-associate-003-study-notes/&quot;&gt;https://www.freecodecamp.org/news/terraform-certified-associate-003-study-notes/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Hashicorp discuss forum:&amp;nbsp;&lt;a href=&quot;https://discuss.hashicorp.com/c/terraform-core/27&quot;&gt;https://discuss.hashicorp.com/c/terraform-core/27&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;b&gt;official forum for Terraform&lt;/b&gt;&amp;nbsp;newbies: HashiCorp Discuss:&amp;nbsp;&lt;a href=&quot;https://discuss.hashicorp.com/latest&quot;&gt;https://discuss.hashicorp.com/latest&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Notice which questions have checkboxes, and for those, make sure you check the right number of boxes.&amp;nbsp; This goes back to reading the whole question.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Some HCP topics covered&amp;nbsp; at a basic level, specifically in &lt;i&gt;objective 9, &quot;Understanding HCP Terraform capabilities&quot;.&amp;nbsp;&amp;nbsp;&lt;/i&gt;You can learn more about exactly what topics are covered and how to study for them by reviewing our study materials: &lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/certification-003&quot;&gt;https://developer.hashicorp.com/terraform/tutorials/certification-003&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;How-to request extra time if English as a second language: instructions for requesting accommodations: &lt;a href=&quot;https://hashicorp-certifications.zendesk.com/hc/en-us/articles/360046049832&quot;&gt;https://hashicorp-certifications.zendesk.com/hc/en-us/articles/360046049832&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;Are the questions focused on AWS provider? exams are provider-agnostic when possible.&amp;nbsp;&lt;/p&gt;&lt;p&gt;exam would be on which tf version? Product version tested: Terraform 1.0 or higher&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://developer.hashicorp.com/certifications/infrastructure-automation#terraform-authoring-and-operations-professional-details&quot;&gt;operations-professional-details&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;You will need a GitHub account to register for your exam appointment.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Currently (march 2025) each Associate exam appointment is $70.50 USD.&amp;nbsp; More about the administrative details of our Terraform exams here:&amp;nbsp;&lt;a href=&quot;https://developer.hashicorp.com/certifications/infrastructure-automation&quot;&gt;https://developer.hashicorp.com/certifications/infrastructure-automation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;How to purchase and schedule your appointment here:&amp;nbsp;&lt;a href=&quot;https://hashicorp-certifications.zendesk.com/hc/en-us/articles/360049215692&quot;&gt;https://hashicorp-certifications.zendesk.com/hc/en-us/articles/360049215692&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;How to re-certify on this page: &lt;a href=&quot;https://hashicorp-certifications.zendesk.com/hc/en-us/articles/9677396620941&quot;&gt;https://hashicorp-certifications.zendesk.com/hc/en-us/articles/9677396620941&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;p&gt;If you already hold an unexpired Terraform Associate certification, and then pass Terraform Pro, you’re Associate certification expiration date will be extended.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;p&gt;What is the validity for this certification ? certifications are valid for two years&lt;/p&gt;&lt;/li&gt;&lt;li&gt;How many questions are on the 1-hour exam? We don&#39;t publish these details about the exam, but for the average test-taker, 60 minutes is enough time to answer every question we present. If you are concerned about time, you can see if you qualify for an accommodation here: &lt;a href=&quot;https://hashicorp-certifications.zendesk.com/hc/en-us/articles/360046049832&quot;&gt;https://hashicorp-certifications.zendesk.com/hc/en-us/articles/360046049832&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Other certs&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Current&amp;nbsp;&lt;b&gt;Terraform Pro certification&lt;/b&gt;&amp;nbsp;is for AWS! Check out more here:&amp;nbsp;&lt;a href=&quot;https://developer.hashicorp.com/certifications/infrastructure-automation#terraform-authoring-and-operations-professional-details&quot;&gt;https://developer.hashicorp.com/certifications/infrastructure-automation#terraform-authoring-and-&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Study materials for the Terraform Authoring and Operations Professional exam:&amp;nbsp;&lt;a href=&quot;https://developer.hashicorp.com/terraform/tutorials/pro-cert&quot;&gt;https://developer.hashicorp.com/terraform/tutorials/pro-cert&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Vault Associate session coming up! &lt;a href=&quot;https://www.hashicorp.com/en/events/webinars/vault-associate-exam-prep&quot;&gt;https://www.hashicorp.com/en/events/webinars/vault-associate-exam-prep&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Study resources for&lt;b&gt;&amp;nbsp;Vault&lt;/b&gt;&amp;nbsp;Pro:&amp;nbsp;&lt;a href=&quot;https://developer.hashicorp.com/vault/tutorials/ops-pro-cert&quot;&gt;https://developer.hashicorp.com/vault/tutorials/ops-pro-cert&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/525347327103791986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2025/03/terraform-associate-certification-notes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/525347327103791986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/525347327103791986'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2025/03/terraform-associate-certification-notes.html' title='terraform Associate certification notes &amp; links'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-2056736527358863320</id><published>2024-11-19T18:02:00.005-05:00</published><updated>2024-11-19T18:02:43.683-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="instanced"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="list-units"/><category scheme="http://www.blogger.com/atom/ns#" term="mask"/><category scheme="http://www.blogger.com/atom/ns#" term="operating system"/><category scheme="http://www.blogger.com/atom/ns#" term="service"/><category scheme="http://www.blogger.com/atom/ns#" term="start"/><category scheme="http://www.blogger.com/atom/ns#" term="systemctl"/><category scheme="http://www.blogger.com/atom/ns#" term="systemd"/><category scheme="http://www.blogger.com/atom/ns#" term="template unit"/><category scheme="http://www.blogger.com/atom/ns#" term="typo"/><category scheme="http://www.blogger.com/atom/ns#" term="unit"/><title type='text'>removing unwanted *typo* systemd instance&#39;d template units</title><content type='html'>&lt;p&gt;&amp;nbsp;Systemd has this great feature :&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;file: &lt;span style=&quot;font-family: courier;&quot;&gt;foo@.service&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;contains the definition, as usual, with &quot;&lt;span style=&quot;font-family: courier;&quot;&gt;%&lt;/span&gt;i&quot;&lt;/p&gt;&lt;p&gt;=&amp;gt; will replace anything in the service file&amp;nbsp;&lt;/p&gt;&lt;p&gt;for example:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;systemctl start foo@bar.service&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;systemctl start foo@resto.service&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;=&amp;gt; will start&amp;nbsp; service &lt;span style=&quot;font-family: courier;&quot;&gt;foo@bar&amp;nbsp;&lt;/span&gt; and &lt;span style=&quot;font-family: courier;&quot;&gt;foo@resto&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;but if resto does not make a valid service, it fails and can&#39;t be easily removed from the list of &lt;i&gt;apparently formerly existing services.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;(cf. for example&amp;nbsp;&lt;a href=&quot;https://bbs.archlinux.org/viewtopic.php?id=286912&amp;amp;p=1&quot;&gt;https://bbs.archlinux.org/viewtopic.php?id=286912&amp;amp;p=1&lt;/a&gt;&amp;nbsp;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;As you can see with the command :&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;systemctl list-units --type=service | grep &#39;foo&#39;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; UNIT&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; LOAD&amp;nbsp; &amp;nbsp;ACTIVE SUB&amp;nbsp; &amp;nbsp; &amp;nbsp;DESCRIPTION&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; foo@alpha.service&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;loaded active running Foo for protocol alpha&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;● foo@lish.service&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; masked failed failed&amp;nbsp; foo@lish.service&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;=&amp;gt; Solution (on ubuntu, but no reason it does not work elsewhere)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;systemctl mask foo@resto.service #this creates a symlink / replaces the symlink with one pointing to /dev/null, and marks the service as failed =&amp;gt; no restart will happen again&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;systemctl reset-failed # cleans failed services&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/2056736527358863320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/11/removing-unwanted-typo-systemd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/2056736527358863320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/2056736527358863320'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/11/removing-unwanted-typo-systemd.html' title='removing unwanted *typo* systemd instance&#39;d template units'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-8767076853876093686</id><published>2024-11-15T11:41:00.005-05:00</published><updated>2024-11-15T16:39:36.912-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="animation"/><category scheme="http://www.blogger.com/atom/ns#" term="art"/><category scheme="http://www.blogger.com/atom/ns#" term="canvas"/><category scheme="http://www.blogger.com/atom/ns#" term="code"/><category scheme="http://www.blogger.com/atom/ns#" term="color"/><category scheme="http://www.blogger.com/atom/ns#" term="creative"/><category scheme="http://www.blogger.com/atom/ns#" term="editor"/><category scheme="http://www.blogger.com/atom/ns#" term="js"/><category scheme="http://www.blogger.com/atom/ns#" term="math"/><category scheme="http://www.blogger.com/atom/ns#" term="nft"/><category scheme="http://www.blogger.com/atom/ns#" term="p5js"/><category scheme="http://www.blogger.com/atom/ns#" term="processing"/><category scheme="http://www.blogger.com/atom/ns#" term="random"/><category scheme="http://www.blogger.com/atom/ns#" term="shapes"/><category scheme="http://www.blogger.com/atom/ns#" term="tezos"/><category scheme="http://www.blogger.com/atom/ns#" term="web3"/><title type='text'>workshop - Intro to Creative Coding &amp; Generative Art, by Ahmad Moussa (links)</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;a href=&quot;https://slides.com/ahmadmoussa-3/creative-coding-generative-art&quot;&gt;https://slides.com/ahmadmoussa-3/creative-coding-generative-art&lt;/a&gt;&lt;/p&gt;&lt;p&gt;by&amp;nbsp;https://x.com/gorillasu&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://timeline.lerandom.art&quot;&gt;https://timeline.lerandom.art&lt;/a&gt;&amp;nbsp;Generative Art Timeline&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://editor.p5js.org&quot;&gt;https://editor.p5js.org&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://x.com/gorillasu/status/1857444190910664749&quot;&gt;https://x.com/gorillasu/status/1857444190910664749&lt;/a&gt; example with p5js&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://openprocessing.org/sketch/2320206&quot;&gt;https://openprocessing.org/sketch/2320206&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;example on fxHash&amp;nbsp;&lt;a href=&quot;https://www.fxhash.xyz/marketplace/generative/15063&quot;&gt;https://www.fxhash.xyz/marketplace/generative/15063&lt;/a&gt;&lt;/p&gt;&lt;p&gt;colors palette :&amp;nbsp;&lt;a href=&quot;https://ronikaufman.github.io/color_pals&quot;&gt;https://ronikaufman.github.io/color_pals&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;colors manipulation js library : &lt;a href=&quot;https://gka.github.io/chroma.js/&quot;&gt;https://gka.github.io/chroma.js/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;+ &lt;a href=&quot;https://encycolorpedia.com/2b3c00&quot;&gt;https://encycolorpedia.com/2b3c00&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://iquilezles.org/articles/distfunctions/&quot;&gt;https://iquilezles.org/articles/distfunctions/&lt;/a&gt;&amp;nbsp;shapes and math&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;doc on fxHash :&amp;nbsp;&lt;a href=&quot;https://docs.fxhash.xyz&quot;&gt;https://docs.fxhash.xyz&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Tricks :&amp;nbsp;&lt;/p&gt;&lt;p&gt;- when playing with RGB, start from the median value 127.5 and move around +/- 127.5&lt;/p&gt;&lt;p&gt;- RGB + 2 chars =&amp;gt; 2 chars of transparency&lt;/p&gt;&lt;p&gt;- cos/sin/tan [0..1] with frameCount native variable of p5js : use pi to divide values and have the last frame coincide with the first frame of the loop.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--- first example&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;let a = 1;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;var b;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;const windowWidth = 800;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;const windowHeitgh = 800;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;function setup() {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; // attach a canvas element to the dom&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; createCanvas(windowWidth, windowHeitgh);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;// runs continously for each frame of the video, unless noLoop() inside&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;function draw() {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; // &quot;#efface&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; // &quot;#decede&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; background(&quot;#decede&quot;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; ellipse(100, 150, 100)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; fill (&quot;#efface&quot;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; rect (300, 200, 200)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; noStroke()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp; stroke(&quot;blue&quot;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier; font-size: x-small;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-- animated&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let a = 1;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;var b;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;const windowWidth = 400;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;const windowHeitgh = windowWidth;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function setup() {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // attach a canvas element to the dom&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; createCanvas(windowWidth, windowHeitgh);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;// runs continously for each frame of the video, unless noLoop() inside&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function draw() {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // &quot;#efface&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // &quot;#decede&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; background(&quot;#decede&quot;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; noStroke()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let t = frameCount&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // for (let y = 0; y &amp;lt; 400; y=y+1){&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; //&amp;nbsp; &amp;nbsp;ellipse (200, y, 5)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // console.log(frameCount/50)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; for (let y = 0; y &amp;lt; 400; y=y+1){&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; fill(127.5 + sin (-frameCount/50 + y/20) * 127.5,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;127.5 + sin (-frameCount/50 + y/20) * 127.5,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;127.5 + sin (-frameCount/50 + y/20) * 127.5)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ellipse (200 + sin (-frameCount/50 + y/20) * 20,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;y,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;20 + cos (frameCount/30 + y/10) * 10)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;--- moving, and colors changing (by me, inspired by GorillaSun)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let a = 1;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;var b;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;const windowWidth = 400;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;const windowHeitgh = windowWidth;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let variation = 0&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let variation2 = 2&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function setup() {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // attach a canvas element to the dom&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; createCanvas(windowWidth, windowHeitgh);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; frameRate(50) // frame / s&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; randomSeed(0) // so that random always does the same&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; variation = random(0, 80)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; variation2 = random(100, 80)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let loopLength = 75&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;// runs continously for each frame of the video, unless noLoop() inside&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function draw() {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // &quot;#efface&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // &quot;#decede&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; background(&quot;#decede&quot;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // trick to&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let t = ( frameCount % loopLength ) / loopLength&amp;nbsp; * 2 * PI;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // console.log(sin(PI))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // noStroke()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // for (let y = 0; y &amp;lt; 400; y=y+1){&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; //&amp;nbsp; &amp;nbsp;ellipse (200, y, 5)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; // console.log(frameCount/50)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; for (let y = 0; y &amp;lt; 400; y=y+1){&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; stroke (127.5 + sin (-t + y/variation) * 127.5,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 127.5 + sin (-t + y/20) * 127.5,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 127.5 + sin (-t + y/variation2) * 127.5)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; // fill(127.5 + sin (-t/50 + y/20) * 127.5,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; &amp;nbsp; &amp;nbsp; 127.5 + sin (-t/50 + y/20),&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; //&amp;nbsp; &amp;nbsp; &amp;nbsp; 127.5 + sin (-t/50 + y/20) * 127.5)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; noFill()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; square (200 + sin (-t/50 + y/variation) * 20,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 200 + tan (-t/50 + y/variation) * variation*variation/3,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;20 + cos (t/30 + y/variation) * variation)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function keyPressed(){&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; console.log(keyCode)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; if (keyCode == 56){&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; saveGif(&#39;annimation&#39;, 4)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;--- other links and code from the presentation&lt;/span&gt;&lt;/h4&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;other code from the presentation :&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Sinus Wave by Ahmad Moussa || Gorilla Sun&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://openprocessing.org/sketch/1784279&quot;&gt;https://openprocessing.org/sketch/1784279&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function setup() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;createCanvas(400, 400);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function draw() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;background(0);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;noStroke();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;let t = millis()/500&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;for(let y = 20; y &amp;lt; 380; y++){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; fill(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 127.5 + 127.5 * sin(t + y/40),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 127.5 - 127.5 * cos(t + y/40),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 127.5 + 127.5 * cos(t + y/40)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; ellipse(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 200 + sin(t + y/80 +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sin(t + y/400) +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cos(t + y/100)*2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;) * 30,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; y + sin(t + y/80 +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sin(t + y/400))*15,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 20 + sin(t + y/10) * 15)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;variation square&amp;nbsp;by Ahmad Moussa || Gorilla Sun&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function setup() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;createCanvas(400, 400);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function draw() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;background(0);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;noStroke();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;let t = millis()/500&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;for(let y = 20; y &amp;lt; 380; y++){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; fill(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 127.5 + 127.5 * sin(t + y/40),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 127.5 + 127.5 * cos(t + y/40),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 127.5 - 127.5 * sin(t + y/80)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; ellipse(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 200 + sin(t + y/80 +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sin(t + y/400) +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cos(t + y/50)*2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;) * 30,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; y + sin(t + y/80 +&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sin(t + y/400))*15,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; 20 + sin(t + y/30) * 15)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;b&gt;LINKS&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://neal.fun/&quot;&gt;https://neal.fun/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://datasciencebydesign.org/blog/a-conversation-with-saskia-freeke&quot;&gt;https://datasciencebydesign.org/blog/a-conversation-with-saskia-freeke&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://www.instagram.com/p/Cs9Jyz_ss1Y/&quot;&gt;https://www.instagram.com/p/Cs9Jyz_ss1Y/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://onemillioncheckboxes.com/&quot;&gt;https://onemillioncheckboxes.com/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://www.todepond.com/&quot;&gt;https://www.todepond.com/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://www.instagram.com/p/C1m2zkYsTPx/&quot;&gt;https://www.instagram.com/p/C1m2zkYsTPx/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://www.holo.mg/dossiers/vera-molnar-weaving-variations/&quot;&gt;https://www.holo.mg/dossiers/vera-molnar-weaving-variations/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://x.com/v3ga/status/1734285242809065546&quot;&gt;https://x.com/v3ga/status/1734285242809065546&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://www.youtube.com/@HYPERRAUMTV/videos&quot;&gt;https://www.youtube.com/@HYPERRAUMTV/videos&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;i&gt;Zach Lieberman,&amp;nbsp;&lt;/i&gt;&lt;em&gt;Talk: Poetic Computation + atlas of blobs&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://openprocessing.org/user/272186?view=sketches&amp;amp;o=48&quot;&gt;https://openprocessing.org/user/272186?view=sketches&amp;amp;o=48&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://openprocessing.org/sketch/1790997&quot;&gt;https://openprocessing.org/sketch/1790997&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://openprocessing.org/sketch/1792470&quot;&gt;https://openprocessing.org/sketch/1792470&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://openprocessing.org/sketch/2320206&quot;&gt;https://openprocessing.org/sketch/2320206&lt;/a&gt; simple circles packing&amp;nbsp;by Ahmad Moussa || Gorilla Sun&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;br /&gt;(with :&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;lt;script src=&quot;https://openprocessing.org/openprocessing_sketch.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1.9.4/lib/p5.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1.9.4/lib/addons/p5.sound.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt; )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let circles = []&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let numAttempts = 20000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let canvas_width = 800&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let canvas_height = 800&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let padding = 50&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function setup() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; createCanvas(canvas_width, canvas_height);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; pixelDensity(4)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; background(0)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; stroke(255)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; for(let n = 0; n &amp;lt; numAttempts; n++){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let randX = random(padding, canvas_width-padding)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let randY = random(padding, canvas_height-padding)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let randR = random(5, 120)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let placeable = true&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; for(let circle of circles){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; let d = dist(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; randX, randY, circle.x, circle.y&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(d &amp;lt; randR + circle.r + 5){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; placeable = false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; if(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (randX + randR &amp;gt; canvas_width-padding) ||&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (randX - randR &amp;lt; padding) ||&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (randY + randR &amp;gt; canvas_height-padding) ||&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (randY - randR &amp;lt; padding)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; placeable = false&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; if(placeable){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; circles.push(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x: randX, y: randY, r: randR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; strokeWeight(2)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;noFill()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; for(let circle of circles){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ellipse(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; circle.x,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; circle.y ,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; circle.r*2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; noLoop()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://openprocessing.org/sketch/1959720&quot;&gt;https://openprocessing.org/sketch/1959720&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Particle System with Grid Lookup&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;div&gt;by Ahmad Moussa || Gorilla Sun&amp;nbsp;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/p5@1.6.0/lib/p5.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;nbsp;&lt;/span&gt;)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;p5.disableFriendlyErrors = true;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let N_PARTICLES = 50;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let particles = [];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;let grid;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function setup() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; createCanvas(windowWidth, windowHeight);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; grid = new Grid(windowWidth, windowHeight, 22);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; for (let n = 0; n &amp;lt; N_PARTICLES; n++) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let particle = new Particle(new createVector(random(windowWidth), random(windowHeight)))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; particles.push(particle);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; grid.addParticle(particle);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;function draw() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; background(220);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; if (mouseIsPressed) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; for(let n = 0; n &amp;lt; 5; n++){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;let particle = new Particle(new createVector(mouseX+random(-1,1), mouseY+random(-1,1)))&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;particles.push(particle);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;grid.addParticle(particle);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; textSize(30)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; textAlign(LEFT, TOP)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let numCollisionChecks = 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let startneigh = performance.now();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; for (let p of particles) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let neighbors = grid.getNeighbors(p)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; numCollisionChecks += p.checkCollision(neighbors)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;p.updateState();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let endneigh = performance.now();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let coll = `${numCollisionChecks} collisions computed in ${ endneigh - startneigh} ms`&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let startup = Date.now();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; for (let p of particles) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;p.checkEdges();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; grid.removeParticle(p)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; grid.addParticle(p)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let endup = Date.now();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let up = &#39;Grid updated in &#39; + round(endup - startup, 2) + &#39; ms&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;noFill()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let startd = Date.now();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; for (let p of particles) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; p.display();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let endd = Date.now();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; let dr = &#39;Draw in &#39; + round(endd - startd, 2) + &#39; ms&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; fill(0)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; text(&#39;Particles: &#39; + particles.length, 10, 10)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; text(coll, 10, 50);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; text(up, 10, 90);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; text(dr, 10, 130);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;class Particle {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; constructor(pos) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.pos = pos;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.velocity = createVector(random(-1.25, 1.25), random(-1.25, 1.25));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.acceleration = createVector(0, 0);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.mass = random(3, 10)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.radius = this.mass;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.maxSpeed = 10;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; updateState(newPos) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.velocity.add(this.acceleration);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.velocity.limit(this.maxSpeed); // Limit the particle&#39;s speed&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.pos.add(this.velocity);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; checkEdges() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; if (this.pos.x - this.radius &amp;lt; 0) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.pos.x = this.radius; // Prevent from leaving the canvas from the left side&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.velocity.x *= -1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; } else if (this.pos.x + this.radius &amp;gt; width) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.pos.x = width - this.radius; // Prevent from leaving the canvas from the right side&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.velocity.x *= -1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; if (this.pos.y - this.radius &amp;lt; 0) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.pos.y = this.radius; // Prevent from leaving the canvas from the top&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.velocity.y *= -1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; } else if (this.pos.y + this.radius &amp;gt; height) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.pos.y = height - this.radius; // Prevent from leaving the canvas from the bottom&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.velocity.y *= -1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; checkCollision(otherParticles) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;let counter = 0&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; for (let other of otherParticles) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (this != other) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let distance = this.pos.dist(other.pos);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let minDistance = this.radius + other.radius + 1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (distance &amp;lt;= minDistance) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Calculate collision response&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let normal = p5.Vector.sub(other.pos, this.pos).normalize();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let relativeVelocity = p5.Vector.sub(other.velocity, this.velocity);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let impulse = p5.Vector.mult(normal, 2 * p5.Vector.dot(relativeVelocity, normal) / 2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Apply repulsion force to prevent sticking&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let repulsion = p5.Vector.mult(normal, minDistance - distance + 2).mult(1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Update velocities&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.velocity.add(p5.Vector.div(impulse, this.mass));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; other.velocity.sub(p5.Vector.div(impulse, other.mass));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Apply repulsion force&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.pos.sub(p5.Vector.div(repulsion, this.mass));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; other.pos.add(p5.Vector.div(repulsion, other.mass));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;				&lt;/span&gt;counter++&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;return counter&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; display() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ellipse(this.pos.x, this.pos.y, this.radius * 2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;/*&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; The lookup grid&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;class Grid {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; constructor(i, t, s) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; (this.cellSize = s),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; (this.numCols = Math.ceil(i / s)),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; (this.numRows = Math.ceil(t / s)),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; (this.cells = []);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; for (let e = 0; e &amp;lt; this.numCols; e++) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; this.cells[e] = [];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; for (let l = 0; l &amp;lt; this.numRows; l++) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.cells[e][l] = [];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; addParticle(i) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let t = Math.floor(i.pos.x / this.cellSize);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let s = Math.floor(i.pos.y / this.cellSize);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; this.cells[t][s].push(i)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; i.gridCell = {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; col: t,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; row: s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; removeParticle(i) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; col: t,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; row: s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; } = i.gridCell&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let e = this.cells[t][s];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let l = e.indexOf(i);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; e.splice(l, 1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; determineCell(i) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let t = Math.floor(i.pos.x / this.cellSize);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let s = Math.floor(i.pos.y / this.cellSize);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; return {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; col: t,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; row: s&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; getNeighbors(particle) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let top_left = [&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; floor((particle.pos.x - particle.radius) / this.cellSize),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; floor((particle.pos.y - particle.radius) / this.cellSize),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let bottom_right = [&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; floor((particle.pos.x + particle.radius) / this.cellSize),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; floor((particle.pos.y + particle.radius) / this.cellSize),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; ]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; let neighbors = []&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; for (let i = top_left[0]; i &amp;lt;= bottom_right[0]; i++) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; for (let j = top_left[1]; j &amp;lt;= bottom_right[1]; j++) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (i &amp;lt; 0 || j &amp;lt; 0 || i &amp;gt;= this.numCols || j &amp;gt;= this.numRows) continue&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; let c = this.cells[i][j]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (let p of c) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // don&#39;t add the particle itself&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (p != particle) neighbors.push(p)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; return neighbors&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/8767076853876093686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/11/workshop-intro-to-creative-coding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/8767076853876093686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/8767076853876093686'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/11/workshop-intro-to-creative-coding.html' title='workshop - Intro to Creative Coding &amp; Generative Art, by Ahmad Moussa (links)'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-213515104782311580</id><published>2024-10-03T10:11:00.005-04:00</published><updated>2024-10-03T10:11:27.348-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="exporter"/><category scheme="http://www.blogger.com/atom/ns#" term="JSON"/><category scheme="http://www.blogger.com/atom/ns#" term="json_exporter"/><category scheme="http://www.blogger.com/atom/ns#" term="metrics"/><category scheme="http://www.blogger.com/atom/ns#" term="o11y"/><category scheme="http://www.blogger.com/atom/ns#" term="observability"/><category scheme="http://www.blogger.com/atom/ns#" term="open metrics"/><category scheme="http://www.blogger.com/atom/ns#" term="prometheus"/><category scheme="http://www.blogger.com/atom/ns#" term="telemetry"/><title type='text'>json_exporter prometheus debug</title><content type='html'>&lt;p&gt;&amp;nbsp;JSON url to convert : &lt;span style=&quot;font-family: courier;&quot;&gt;http://json_url/foobar.json&lt;/span&gt;&lt;/p&gt;&lt;p&gt;json_exporter running locally : &lt;span style=&quot;font-family: courier;&quot;&gt;localhost:7979&lt;/span&gt; or &lt;span style=&quot;font-family: courier;&quot;&gt;json_exporter:7979&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Status of the json_exporter, does NOT contain the metrics from the targets, only related to the process itself (useful to know if it&#39;s up or not for example).&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;localhost:7979/metrics&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Check the result of a JSON URL to be converted / aka. what prometheus should scrape&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;curl http://json_url/foobar.json&lt;/span&gt; =&amp;gt; JSON (original)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;curl localhost:7979/probe?target=https://json_url/foobar.json&lt;/span&gt; =&amp;gt; openmetrics converted by json_exporter&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Other useful commands :&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* edit, restart, wait, check json_exporter output&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;sudo vi /etc/json_exporter/config.yml &amp;amp;&amp;amp; sudo systemctl restart json_exporter &amp;amp;&amp;amp; sleep 5 &amp;amp;&amp;amp; curl http://localhost:7979/probe?target=http://json_url/foobar.json&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* edit, check and restart prometheus :&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;sudo vi /etc/prometheus/prometheus.yml &amp;amp;&amp;amp; sudo promtool check config /etc/prometheus/prometheus.yml &amp;amp;&amp;amp; sudo systemctl restart prometheus.service&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/213515104782311580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/10/jsonexporter-prometheus-debug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/213515104782311580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/213515104782311580'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/10/jsonexporter-prometheus-debug.html' title='json_exporter prometheus debug'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-5743389617811450508</id><published>2024-09-09T12:07:00.006-04:00</published><updated>2024-09-09T12:07:43.756-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="date"/><category scheme="http://www.blogger.com/atom/ns#" term="format"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="spreadsheet"/><category scheme="http://www.blogger.com/atom/ns#" term="tableur"/><title type='text'>Google Spreadsheet conditional formatting for week days check (display weekends with a different color)</title><content type='html'>&lt;p&gt;Goal:&amp;nbsp;&lt;/p&gt;&lt;p&gt;I have a column of dates that I want to format so that weekends are in a different color.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Solution :&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;conditional formatting and the formula &lt;span style=&quot;font-family: courier;&quot;&gt;=OR(WEEKDAY(A1)=7;WEEKDAY(A1)=1)&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhNnM6X2pq64RuHzYSJ-UHvXo9CrEbdtb2HQHzT_fRGqzYw49B2v61B-jLBZ-kHsx9neiNRryA5Z9aByokw4iC89gCht8KZKsHaaKeg8Nowb_4X23OMHmaQ5aNKxVzavJQYJyejqmyALFOj8uVu_bWqS40R5BzGVL61rabH3edLPRsNHRTp18b2W7kuB6E&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1384&quot; data-original-width=&quot;378&quot; height=&quot;487&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhNnM6X2pq64RuHzYSJ-UHvXo9CrEbdtb2HQHzT_fRGqzYw49B2v61B-jLBZ-kHsx9neiNRryA5Z9aByokw4iC89gCht8KZKsHaaKeg8Nowb_4X23OMHmaQ5aNKxVzavJQYJyejqmyALFOj8uVu_bWqS40R5BzGVL61rabH3edLPRsNHRTp18b2W7kuB6E=w134-h487&quot; width=&quot;134&quot; /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/a&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhNnM6X2pq64RuHzYSJ-UHvXo9CrEbdtb2HQHzT_fRGqzYw49B2v61B-jLBZ-kHsx9neiNRryA5Z9aByokw4iC89gCht8KZKsHaaKeg8Nowb_4X23OMHmaQ5aNKxVzavJQYJyejqmyALFOj8uVu_bWqS40R5BzGVL61rabH3edLPRsNHRTp18b2W7kuB6E&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEioJJ6dsoNvSBTgUXY9vhoLMmB5Hu4XRMO04bs-KrufA-KWagCGpGs87ljEQInIPYXsWwibuA0M4jnEhe208v-vRaLRieEhF421LWpSZbb5Rbjb1mtnmyg1VfiQhjWV3jzxfGvKyUcro9S9IxzbPdB96M6ZGeWvu4F5Dp297VrwiaDT05C9orPJB0v1Dec&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1162&quot; data-original-width=&quot;642&quot; height=&quot;502&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEioJJ6dsoNvSBTgUXY9vhoLMmB5Hu4XRMO04bs-KrufA-KWagCGpGs87ljEQInIPYXsWwibuA0M4jnEhe208v-vRaLRieEhF421LWpSZbb5Rbjb1mtnmyg1VfiQhjWV3jzxfGvKyUcro9S9IxzbPdB96M6ZGeWvu4F5Dp297VrwiaDT05C9orPJB0v1Dec=w278-h502&quot; width=&quot;278&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;color: #0000ee;&quot;&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;span style=&quot;color: #0000ee;&quot;&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/5743389617811450508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/09/google-spreadsheet-conditional.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/5743389617811450508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/5743389617811450508'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/09/google-spreadsheet-conditional.html' title='Google Spreadsheet conditional formatting for week days check (display weekends with a different color)'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhNnM6X2pq64RuHzYSJ-UHvXo9CrEbdtb2HQHzT_fRGqzYw49B2v61B-jLBZ-kHsx9neiNRryA5Z9aByokw4iC89gCht8KZKsHaaKeg8Nowb_4X23OMHmaQ5aNKxVzavJQYJyejqmyALFOj8uVu_bWqS40R5BzGVL61rabH3edLPRsNHRTp18b2W7kuB6E=s72-w134-h487-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-2235926792020340584</id><published>2024-08-19T17:59:00.007-04:00</published><updated>2024-08-19T18:34:56.669-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ansible"/><category scheme="http://www.blogger.com/atom/ns#" term="ci"/><category scheme="http://www.blogger.com/atom/ns#" term="CICD"/><category scheme="http://www.blogger.com/atom/ns#" term="extends"/><category scheme="http://www.blogger.com/atom/ns#" term="gcp"/><category scheme="http://www.blogger.com/atom/ns#" term="gitlab"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="os-login"/><category scheme="http://www.blogger.com/atom/ns#" term="RSA"/><category scheme="http://www.blogger.com/atom/ns#" term="service account"/><category scheme="http://www.blogger.com/atom/ns#" term="ssh"/><category scheme="http://www.blogger.com/atom/ns#" term="ssh-keygen"/><title type='text'>GCP+ansible+gitlab-ci : OS-login for ansible with dynamic google compute inventory and gitlab-ci</title><content type='html'>&lt;p&gt;&quot;How to configure OS Login in GCP for Ansible&quot; + ansible dynamic inventory for GCP compute + update on accepted cryptographic algo for SSH key + gitlab-ci example&lt;/p&gt;&lt;p&gt;Context:&amp;nbsp;&lt;/p&gt;&lt;p&gt;2024 update on https://alex.dzyoba.com/blog/gcp-ansible-service-account/ =&amp;gt; thanks ! this still works, but the ssk-keygen by default doesn&#39;t provide keys that are accepted by gcp os-login.&lt;/p&gt;&lt;p&gt;+ updated precisions that took me too much time to infer, understood after reading : https://cloud.google.com/compute/docs/connect/create-ssh-keys =&amp;gt; the SSH keys need to be in ssh-rsa !&lt;/p&gt;&lt;p&gt;+ ansible dynamic inventory configuration (as of 2024-aug)&lt;/p&gt;&lt;p&gt;+ automation example with gitlab-ci (as of 2024-aug)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Note: For the sake of completeness, ease of reproduction by the reader and leveraging the CC-BY-SA copyright, I include the sections of the great blog post cited as [1] and add my contributions when and where I needed too.&amp;nbsp;&lt;/p&gt;&lt;h2 id=&quot;service-account&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Service account&lt;/span&gt;&lt;/h2&gt;&lt;blockquote&gt;&amp;nbsp;(cf. [1] - no change so far)&amp;nbsp;&lt;i&gt;OS Login allows SSH access for IAM users - there is no need to
provision Linux users on an instance.&lt;/i&gt;&lt;p&gt;&lt;i&gt;So Ansible should have access to the instances via IAM user. This is
accomplished via &lt;a href=&quot;https://cloud.google.com/iam/docs/understanding-service-accounts&quot;&gt;IAM service account&lt;/a&gt;.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;You can create service account via Console (web UI), via Terraform template or
(as in [this] case) via gcloud:&lt;/i&gt;&lt;/p&gt;&lt;p&gt;



&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ gcloud iam service-accounts create ansible-sa \
     --display-name &quot;Service account for Ansible&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;configure-os-login&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;Configure OS Login&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&amp;nbsp;(cf. [1,5,6] - no change so far)&lt;/div&gt;&lt;blockquote&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;Now, the trickiest part – configuring OS Login for service account. &lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;&lt;i&gt;0. Enable OS Login for all VMs in the project&lt;/i&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;Before you
do anything else make sure to enable it for your project:&lt;/i&gt;&lt;/div&gt;&lt;p&gt;

&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ gcloud compute project-info add-metadata \
    --metadata enable-oslogin=TRUE&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;i&gt;1.&amp;nbsp;Add roles&lt;/i&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;i&gt;Fresh service account don&#39;t have any IAM roles, so&amp;nbsp;&lt;/i&gt;ansible-sa&lt;i&gt;&amp;nbsp;doesn’t have permission
to do anything. To allow OS Login we have to add these 4 roles to the Ansible
service account:&lt;/i&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;i&gt;Compute Instance Admin (beta)&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Compute Instance Admin (v1) =&amp;gt; &lt;/i&gt;login as root (for &quot;become: true&quot; with ansible)&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Compute OS Admin Login =&amp;gt;&amp;nbsp;&lt;/i&gt;&amp;nbsp;login as a regular user&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Service Account User&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;i&gt;Here is how to do it via gcloud:&lt;/i&gt;&lt;/p&gt;&lt;p&gt;



&lt;/p&gt;&lt;pre&gt;&lt;code&gt;for role in \
    &#39;roles/compute.instanceAdmin&#39; \
    &#39;roles/compute.instanceAdmin.v1&#39; \
    &#39;roles/compute.osAdminLogin&#39; \
    &#39;roles/iam.serviceAccountUser&#39;
do \
    gcloud projects add-iam-policy-binding \
        my-gcp-project-241123 \
        --member=&#39;serviceAccount:ansible-sa@my-gcp-project-241123.iam.gserviceaccount.com&#39; \
        --role=&quot;${role}&quot;
done
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;i&gt;2. Create key for service account and save it&amp;nbsp;&lt;/i&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;i&gt;Service account is useless without key, create one with gcloud,&amp;nbsp;&lt;/i&gt;&amp;nbsp;and save it, we will use it for the dynamic inventory connection further down the path.&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;i&gt;This will create GCP key, not the SSH key.&lt;/i&gt;&lt;pre&gt;&lt;code&gt;$ gcloud iam service-accounts keys create \
    .gcp/gcp-key-ansible-sa.json \
    --iam-account=ansible-sa@my-gcp-project.iam.gserviceaccount.com&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;i&gt;3. Create SSH key for service account&amp;nbsp;&lt;/i&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;(cf. [1]&amp;nbsp; modified ! with command from [2])&lt;/i&gt;&lt;/div&gt;&lt;p&gt;&lt;strike&gt;&lt;i&gt;This&amp;nbsp; [&lt;/i&gt;was supposed&lt;i&gt;] the easiest part.&amp;nbsp;&lt;/i&gt;$ ssh-keygen -f ssh-key-ansible-sa&lt;/strike&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;By default ssh-keygen provided an ssh-ed25519 ssh key, leading to a&amp;nbsp; &lt;span style=&quot;font-family: courier;&quot;&gt;Permission denied (publickey)&lt;/span&gt;&amp;nbsp;when trying to connect with Ansible and OS-login (but no issue when connecting directly from the command-line). Specify `-t rsa` when creating your SSH keys.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ &lt;/code&gt;ssh-keygen -t rsa -f ssh-key-ansible-sa -b 2048&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;i&gt;4. Add SSH&amp;nbsp;key for OS login to service account&lt;/i&gt;&lt;/h3&gt;&lt;blockquote&gt;(cf. [1] - no change)&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;Now, to allow service account to access instances via SSH it has to have SSH public key
added to it. To do this, first, we have to activate service account in gcloud:&lt;/i&gt;&lt;pre&gt;&lt;code&gt;$ gcloud auth activate-service-account \
    --key-file=.gcp/gcp-key-ansible-sa.json
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This command uses GCP key we’ve created on step 2.&lt;/p&gt;&lt;p&gt;Now we add SSH key to the service account:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ gcloud compute os-login ssh-keys add \
    --key-file=ssh-key-ansible-sa.pub
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;5. Switch back&amp;nbsp;from service account&lt;/h3&gt;&lt;p&gt;(cf. [1] - no change)&lt;i&gt;&amp;nbsp;&lt;/i&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;$ gcloud config set account your@gmail.com
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Connecting to the instance with OS login&amp;nbsp;&lt;/h2&gt;(cf. [1] - with change to the command to bypass the ssh-agent)&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;Now, we have everything configured on the GCP side, we can check that it’s
working.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Note, that you don’t need to add SSH key to compute metadata, authentication
works via OS login. But this means that you need to know a special user name for
the service account.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Find out the service account id.&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;


&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ gcloud iam service-accounts describe \
    ansible-sa@my-gcp-project.iam.gserviceaccount.com \
    --format=&#39;value(uniqueId)&#39;
106627723496398399336
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;This id is used to form user name in OS login – it’s &lt;code&gt;&lt;b&gt;sa_&amp;lt;unique_id&amp;gt;&lt;/b&gt;&lt;/code&gt;.&lt;/i&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;Here is how to use it to check SSH access is working,&amp;nbsp;&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;Specify the RSA private key, and to bypass the ssh-agent, specify to only test the identity provided in the command (&lt;b&gt;IdentitiesOnly=yes&lt;/b&gt;), not all the keys you may have loaded in your running ssh-agent.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;

&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ &lt;b&gt;ssh -o &quot;IdentitiesOnly=yes&quot; -i ssh-key-ansible-sa&lt;/b&gt; sa_106627723496398399336@10.0.0.44
...&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/pre&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;i&gt;Configuring Ansible&lt;/i&gt;&lt;br /&gt;&lt;/h2&gt;&lt;pre&gt;&lt;code&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;i&gt; &lt;/i&gt;Ansible GCP static inventory&lt;/span&gt;&lt;/h3&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-weight: normal;&quot;&gt;&amp;nbsp;(cf. [1] - no change for static inventory, more on dynamic inventory just after)&lt;/span&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;And for the final part – make Ansible work with it.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;There is a special variable &lt;code&gt;ansible_user&lt;/code&gt; that sets user name for SSH when
Ansible connects to the host.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;In my case, I have a group &lt;code&gt;gcp&lt;/code&gt; where all GCP instances are added, and so I can
set &lt;code&gt;ansible_user&lt;/code&gt; in group_vars like this:&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&lt;i&gt;# File inventory/dev/group_vars/gcp
ansible_user: sa_10662772349639839933&lt;/i&gt;6&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;font-family: Times; white-space: normal;&quot;&gt;&lt;/h2&gt;&lt;h4&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/h4&gt;&lt;h4&gt;&lt;i&gt;(thanks a lot to [1]&#39;s author A&lt;/i&gt;lex Dzyoba, those previous steps helped me a lot in going this far ! now, let&#39;s add dynamic inventory and how I run it from gitlab-ci...) &lt;/h4&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: arial;&quot;&gt;Ansible GCP dynamic inventory&lt;/span&gt;&lt;/h3&gt;&lt;p style=&quot;-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;The compose section of the dynamic GCP inventory ansible plugin (google.cloud.gcp_compute, cf. [3]) expects a jinga2 template, to pass a variable directly, you need to double escape it:&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote style=&quot;border: none; margin: 0px 0px 0px 40px; padding: 0px;&quot;&gt;&lt;pre&gt;&lt;code&gt; ansible_user: &quot;&#39;&lt;i&gt;sa_10662772349639839933&lt;/i&gt;6&#39;&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;#example of inventory.gcp.yml&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;---
plugin: google.cloud.gcp_compute

projects:
 - your-gcp-project

auth_kind: serviceaccount
# must match `ansible_user` below, json file must be available
service_account_file: ./.gcp/gcp-key-ansible-sa.json

filters:
 - status = RUNNING

keyed_groups:
  - key: labels
    prefix: label
  - key: zone
    prefix: zone
  - key: project
    prefix: project
  - key: labels[&#39;compoment&#39;]
    prefix: component

compose:
 ansible_host:           networkInterfaces[0].accessConfigs[0].natIP
 ansible_user:           &quot;&#39;&lt;i&gt;sa_10662772349639839933&lt;/i&gt;6&#39;&quot;&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;h2 id=&quot;configuring-ansible&quot; style=&quot;white-space: normal;&quot;&gt;&lt;span style=&quot;font-family: Times;&quot;&gt;Configuring Ansible (ansible.cfg &lt;/span&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;ssh_args&lt;/span&gt;&lt;span style=&quot;font-family: Times;&quot;&gt;)&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style=&quot;font-family: georgia;&quot;&gt;Make sure to instruct ansible to use the correct &lt;b&gt;private&lt;/b&gt; key when connecting to the servers&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;ssh_args = -i ssh-key-ansible-sa &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#file ansible.cfg :&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre style=&quot;text-align: left;&quot;&gt;&lt;code&gt;[defaults]
;debug = true
roles_path = ./vendor-roles:./roles
collections_path = ./vendor-collections:./collections
stdout_callback = yaml
deprecation_warnings = True
host_key_checking = False
forks = 10
callbacks_enabled = timer, profile_tasks, profile_roles
;remote_user = &lt;i&gt;sa_10662772349639839933&lt;/i&gt;6&lt;br /&gt;
remote_tmp = /tmp

[ssh_connection]
pipelining = True
scp_if_ssh = True
ssh_args = -i ssh-key-ansible-sa
&lt;/code&gt;&lt;/pre&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Gitlab-ci example&lt;/h2&gt;&lt;div&gt;Identify an image that has ansible installed (and maintained), I used&amp;nbsp;&lt;span style=&quot;background-color: white; color: #dd1144; font-family: &amp;quot;GitLab Mono&amp;quot;, &amp;quot;JetBrains Mono&amp;quot;, Menlo, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monospace, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;registry.gitlab.com/gitlab-org/gitlab-environment-toolkit:latest &lt;/span&gt;but if you find other /lighter one, let me know !&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Gitlab-ci secret files [4] doc is set from the gitlab project&#39;s configuration, in the CI settings&amp;nbsp; and doc can be found here&amp;nbsp;https://docs.gitlab.com/ee/ci/secure_files/index.html&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Using gitlab-ci feature secret files [4], store the ssh RSA secret key (for ssh)&lt;/li&gt;&lt;li&gt;Using gitlab-ci feature&amp;nbsp;secret files [4], store the GCP json file for GCP authentication (for dynamic inventory).&lt;/li&gt;&lt;li&gt;We gather the files in the&amp;nbsp;&lt;span style=&quot;background-color: white; color: #2e2e2e; font-family: &amp;quot;GitLab Mono&amp;quot;, &amp;quot;JetBrains Mono&amp;quot;, Menlo, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monospace, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;prepare_ssh_ansible &lt;/span&gt;job&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have multiple jobs using Ansible, factorize (here&amp;nbsp; in the&amp;nbsp;&lt;span style=&quot;background-color: white; color: #2e2e2e; font-family: &amp;quot;GitLab Mono&amp;quot;, &amp;quot;JetBrains Mono&amp;quot;, Menlo, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monospace, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;prepare_ssh_ansible&lt;/span&gt;&amp;nbsp;job), and extends, here in the&amp;nbsp;&lt;span style=&quot;background-color: white; color: #2e2e2e; font-family: &amp;quot;GitLab Mono&amp;quot;, &amp;quot;JetBrains Mono&amp;quot;, Menlo, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monospace, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; white-space: pre;&quot;&gt;ssh-access, ansible-ping, ansible-inventory&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Example playbook, in this case, is located in ~/ansible/playbook/ssh.yml; replace with your own playbook).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;# file: .gitlab-ci.yml&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;background-color: white; color: #2e2e2e; font-family: &amp;quot;GitLab Mono&amp;quot;, &amp;quot;JetBrains Mono&amp;quot;, Menlo, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monospace, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; line-height: 18px; white-space: pre;&quot;&gt;&lt;div&gt;variables:&lt;/div&gt;&lt;div&gt;  ANSIBLE_DYN_INVENTORY      : &lt;span style=&quot;color: #dd1144;&quot;&gt;&quot;inventory.gcp.yml&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  ANSIBLE_CHECK              : &lt;span style=&quot;color: #dd1144;&quot;&gt;&quot;--check -vvv&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  SECURE_FILES_DOWNLOAD_PATH: &lt;span style=&quot;color: #dd1144;&quot;&gt;&#39;./secured_files/&#39;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;background-color: white; color: #2e2e2e; font-family: &amp;quot;GitLab Mono&amp;quot;, &amp;quot;JetBrains Mono&amp;quot;, Menlo, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monospace, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; line-height: 18px; white-space: pre;&quot;&gt;&lt;div&gt;prepare_ssh_ansible:&lt;/div&gt;&lt;div&gt;  &lt;span style=&quot;color: #999988; font-style: italic;&quot;&gt;# image: librespace/ansible:9.6.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  image: &lt;span style=&quot;color: #dd1144;&quot;&gt;registry.gitlab.com/gitlab-org/gitlab-environment-toolkit:latest&lt;/span&gt;&lt;/div&gt;&lt;div&gt;  before_script:&lt;/div&gt;&lt;div&gt;    &lt;span style=&quot;color: #999988; font-style: italic;&quot;&gt;# install missing packages&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;apt update --allow-releaseinfo-change -y -qq &amp;amp;&amp;amp; apt install -y ansible curl bash jq&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    &lt;span style=&quot;color: #999988; font-style: italic;&quot;&gt;# gitlab-ci secured_files (cf [4]) for GCP service account credentials&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;curl --silent &quot;https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer&quot; | bash&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;mkdir ./ansible/.gcp/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #dd1144;&quot;&gt;    - cp ${SECURE_FILES_DOWNLOAD_PATH}/gcp-key-ansible-sa.json ./ansible/.gcp/gcp-key-ansible-sa.json&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;cp ${SECURE_FILES_DOWNLOAD_PATH}/ssh-key-ansible-sa ./ansible/ssh-key-ansible-sa &amp;amp;&amp;amp; chmod 400 ./ansible/ssh-key-ansible-sa&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;    &lt;span style=&quot;color: #999988; font-style: italic;&quot;&gt;# cf https://docs.ansible.com/ansible/9/scenario_guides/guide_gce.html#providing-credentials-as-environment-variables&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;export GCP_AUTH_KIND=&quot;serviceaccount&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;export GCP_SERVICE_ACCOUNT_FILE=&quot;./ansible/.gcp/gcp-key-ansible-sa.json&quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;export GCP_SCOPES=&quot;https://www.googleapis.com/auth/compute&quot;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;export ANSIBLE_HOME=./ansible&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;cd ./ansible/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;export ANSIBLE_CONFIG=./ansible.cfg&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    &lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;ansible-galaxy            install -r requirements.yaml --roles-path ./vendor-roles&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;ansible-galaxy collection install -r requirements.yaml -p ./vendor-collections/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;ansible --version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;background-color: white; color: #2e2e2e; font-family: &amp;quot;GitLab Mono&amp;quot;, &amp;quot;JetBrains Mono&amp;quot;, Menlo, &amp;quot;DejaVu Sans Mono&amp;quot;, &amp;quot;Liberation Mono&amp;quot;, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Courier New&amp;quot;, &amp;quot;andale mono&amp;quot;, &amp;quot;lucida console&amp;quot;, monospace, Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; line-height: 18px; white-space: pre;&quot;&gt;&lt;div&gt;ansible-inventory:&lt;/div&gt;&lt;div&gt;  extends:&lt;/div&gt;&lt;div&gt;    &lt;span style=&quot;color: #dd1144;&quot;&gt;.prepare_ssh_ansible    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;  script:&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;ansible-inventory -i ${ANSIBLE_DYN_INVENTORY}  --graph&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #dd1144;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;div&gt;ansible-ping:&lt;/div&gt;&lt;div&gt;  extends:&lt;/div&gt;&lt;div&gt;    &lt;span style=&quot;color: #dd1144;&quot;&gt;.prepare_ssh_ansible    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;  script:&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;ansible all -i ${ANSIBLE_DYN_INVENTORY} -m ping -vvv&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #dd1144;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;line-height: 18px;&quot;&gt;&lt;div&gt;ssh-access:&lt;/div&gt;&lt;div&gt;  extends:&lt;/div&gt;&lt;div&gt;    &lt;span style=&quot;color: #dd1144;&quot;&gt;.prepare_ssh_ansible    &lt;/span&gt;&lt;/div&gt;&lt;div&gt;  script:&lt;/div&gt;&lt;div&gt;    - &lt;span style=&quot;color: #dd1144;&quot;&gt;ansible-playbook -i ${ANSIBLE_DYN_INVENTORY} playbooks/ssh.yml&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;References :&lt;/h2&gt;&lt;p&gt;[1] https://alex.dzyoba.com/blog/gcp-ansible-service-account/&lt;/p&gt;&lt;p&gt;[2] https://cloud.google.com/compute/docs/connect/create-ssh-keys&amp;nbsp;&lt;/p&gt;&lt;p&gt;[3] https://docs.ansible.com/ansible/latest/collections/google/cloud/gcp_compute_inventory.html&amp;nbsp;&lt;/p&gt;&lt;p&gt;[4] https://docs.gitlab.com/ee/ci/secure_files/index.html&lt;/p&gt;&lt;p&gt;[5]&amp;nbsp;https://cloud.google.com/compute/docs/oslogin&lt;/p&gt;&lt;p&gt;[6]&amp;nbsp;https://cloud.google.com/compute/docs/oslogin/set-up-oslogin&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/2235926792020340584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/08/gcpansiblegitlab-ci-os-login-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/2235926792020340584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/2235926792020340584'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/08/gcpansiblegitlab-ci-os-login-for.html' title='GCP+ansible+gitlab-ci : OS-login for ansible with dynamic google compute inventory and gitlab-ci'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-4539384332533253400</id><published>2024-07-31T19:47:00.004-04:00</published><updated>2024-07-31T19:47:21.683-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="emacs"/><category scheme="http://www.blogger.com/atom/ns#" term="package"/><category scheme="http://www.blogger.com/atom/ns#" term="texteditor"/><title type='text'>Emacs packages</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;a href=&quot;https://melpa.org/&quot;&gt;https://melpa.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/4539384332533253400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/07/emacs-packages.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/4539384332533253400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/4539384332533253400'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/07/emacs-packages.html' title='Emacs packages'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-4732867133367982235</id><published>2024-06-04T15:18:00.004-04:00</published><updated>2024-06-04T15:18:25.538-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogs"/><category scheme="http://www.blogger.com/atom/ns#" term="tech"/><title type='text'>Engineering blogs (2024)</title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Engineering at Microsoft: &lt;a href=&quot;https://devblogs.microsoft.com/engineering-at-microsoft/&quot;&gt;https://devblogs.microsoft.com/engineering-at-microsoft/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;• Github: &lt;a href=&quot;https://github.blog/category/engineering/&quot;&gt;https://github.blog/category/engineering/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;• LinkedIn Engineering: &lt;a href=&quot;https://www.linkedin.com/blog/engineering&quot;&gt;https://www.linkedin.com/blog/engineering&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• AWS Architecture: &lt;a href=&quot;https://aws.amazon.com/blogs/architecture/&quot;&gt;https://aws.amazon.com/blogs/architecture/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Slack: &lt;a href=&quot;https://slack.engineering/&quot;&gt;https://slack.engineering/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Nextflix Tech: &lt;a href=&quot;https://netflixtechblog.com&quot;&gt;https://netflixtechblog.com&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;• Spotify: &lt;a href=&quot;https://engineering.atspotify.com&quot;&gt;https://engineering.atspotify.com&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Meta: &lt;a href=&quot;https://engineering.fb.com&quot;&gt;https://engineering.fb.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;• Instagram: &lt;a href=&quot;https://instagram-engineering.com&quot;&gt;https://instagram-engineering.com&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Uber: &lt;a href=&quot;https://www.uber.com/en-CH/blog&quot;&gt;https://www.uber.com/en-CH/blog&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;• Lyft: &lt;a href=&quot;https://eng.lyft.com&quot;&gt;https://eng.lyft.com&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;• Airbnb: &lt;a href=&quot;https://medium.com/airbnb-engineering&quot;&gt;https://medium.com/airbnb-engineering&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Yelp: &lt;a href=&quot;https://engineeringblog.yelp.com/&quot;&gt;https://engineeringblog.yelp.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Twitter: &lt;a href=&quot;https://blog.x.com/engineering/en_us&quot;&gt;https://blog.x.com/engineering/en_us&lt;/a&gt;&lt;/p&gt;&lt;p&gt;• Pinterest: &lt;a href=&quot;https://medium.com/pinterest-engineering&quot;&gt;https://medium.com/pinterest-engineering&lt;/a&gt;&lt;/p&gt;&lt;p&gt;• Canva: &lt;a href=&quot;https://www.canva.dev/blog/engineering&quot;&gt;https://www.canva.dev/blog/engineering&lt;/a&gt;/&lt;/p&gt;&lt;p&gt;• Shopify: &lt;a href=&quot;https://shopify.engineering/&quot;&gt;https://shopify.engineering/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Reddit: &lt;a href=&quot;https://www.reddit.com/r/RedditEng/&quot;&gt;https://www.reddit.com/r/RedditEng/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;• Reddit: &lt;a href=&quot;https://www.reddit.com/r/RedditEng/?rdt=65525&quot;&gt;https://www.reddit.com/r/RedditEng/?rdt=65525&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Stripe: &lt;a href=&quot;https://stripe.com/blog/engineering&quot;&gt;https://stripe.com/blog/engineering&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• Discord: &lt;a href=&quot;https://discord.com/blog&quot;&gt;https://discord.com/blog&lt;/a&gt;&lt;/p&gt;&lt;p&gt;• Databricks: &lt;a href=&quot;https://www.databricks.com/blog/category/engineering&quot;&gt;https://www.databricks.com/blog/category/engineering&lt;/a&gt;&lt;/p&gt;&lt;p&gt;• Hotstar: &lt;a href=&quot;https://blog.hotstar.com&quot;&gt;https://blog.hotstar.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;• MongoDB: &lt;a href=&quot;https://www.mongodb.com/blog/channel/engineering-blog&quot;&gt;https://www.mongodb.com/blog/channel/engineering-blog&lt;/a&gt;&lt;/p&gt;&lt;p&gt;• Dropbox: &lt;a href=&quot;https://dropbox.tech&quot;&gt;https://dropbox.tech&lt;/a&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/4732867133367982235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/06/engineering-blogs-2024.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/4732867133367982235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/4732867133367982235'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/06/engineering-blogs-2024.html' title='Engineering blogs (2024)'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-9148747884535157227</id><published>2024-05-22T16:46:00.003-04:00</published><updated>2024-05-22T16:46:53.440-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jq"/><category scheme="http://www.blogger.com/atom/ns#" term="JSON"/><title type='text'>list of awesome jq tools</title><content type='html'>&lt;p&gt;from&amp;nbsp;&lt;a href=&quot;https://github.com/fiatjaf/awesome-jq?tab=readme-ov-file#tools&quot;&gt;https://github.com/fiatjaf/awesome-jq?tab=readme-ov-file#tools&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;example:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/jcsalterego/jqq/&quot;&gt;https://github.com/jcsalterego/jqq/&lt;/a&gt;&amp;nbsp; interactive json path explorer `jqq &amp;lt;expr&amp;gt; file&amp;gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/9148747884535157227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/05/list-of-awesome-jq-tools.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/9148747884535157227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/9148747884535157227'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/05/list-of-awesome-jq-tools.html' title='list of awesome jq tools'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-922745327828990869</id><published>2024-05-22T16:06:00.009-04:00</published><updated>2024-05-22T16:08:30.383-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dns"/><category scheme="http://www.blogger.com/atom/ns#" term="DNSSEC"/><title type='text'>DNS debugging</title><content type='html'>&lt;p&gt;&amp;nbsp;Doing some digging about why a specific DNS wasn&#39;t propagating properly everywhere, I found out that it was related to a wrong DNSSEC declaration.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Tool to check if the DNS record is properly propagated&amp;nbsp;&lt;a href=&quot;https://www.whatsmydns.net&quot;&gt;https://www.whatsmydns.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Debug DNS settings &amp;amp; DNSSEC settings&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://dnsviz.net&quot;&gt;https://dnsviz.net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.zonemaster.net&quot;&gt;https://www.zonemaster.net&lt;/a&gt;/&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;a bit more details about DNSSEC&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blog.ovhcloud.com/an-introduction-to-dnssec/&quot;&gt;https://blog.ovhcloud.com/an-introduction-to-dnssec/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;DNS DNSKEY and DS records &quot;&lt;i&gt;The DNSKEY and DS records are used by DNSSEC resolvers to verify the authenticity of DNS records.&lt;/i&gt;&quot;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.cloudflare.com/learning/dns/dns-records/dnskey-ds-records/&quot;&gt;https://www.cloudflare.com/learning/dns/dns-records/dnskey-ds-records/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;some debuging steps&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://serverfault.com/questions/1018543/dns-not-resolving-in-all-locations-after-a-week&quot; target=&quot;_blank&quot;&gt;https://serverfault.com/questions/1018543/dns-not-resolving-in-all-locations-after-a-week&amp;nbsp;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/922745327828990869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/05/dns-debugging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/922745327828990869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/922745327828990869'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/05/dns-debugging.html' title='DNS debugging'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-1564354014014119501</id><published>2024-04-07T09:32:00.004-04:00</published><updated>2024-06-04T15:18:51.590-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="RFC"/><title type='text'>RFC 1178. Choosing a Name for Your Computer (c ACM 1989)</title><content type='html'>&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp;RFC 1178&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Informational&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Network Working Group&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; D. Libes&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Request for Comments: 1178&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Integrated Systems Group/NIST&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;FYI: 5&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Choosing a Name for Your Computer&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Status of this Memo&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;This FYI RFC is a republication of a Communications of the ACM&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;article on guidelines on what to do and what not to do when naming&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;your computer [1].&amp;nbsp; This memo provides information for the Internet&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;community.&amp;nbsp; It does not specify any standard.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Distribution of this memo is unlimited.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Abstract&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;In order to easily distinguish between multiple computers, we give&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;them names.&amp;nbsp; Experience has taught us that it is as easy to choose&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;bad names as it is to choose good ones.&amp;nbsp; This essay presents&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;guidelines for deciding what makes a name good or bad.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Keywords: domain name system, naming conventions, computer&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;administration, computer network management&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Introduction&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;As soon as you deal with more than one computer, you need to&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;distinguish between them.&amp;nbsp; For example, to tell your system&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;administrator that your computer is busted, you might say, &quot;Hey Ken.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Goon is down!&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Computers also have to be able to distinguish between themselves.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Thus, when sending mail to a colleague at another computer, you might&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;use the command &quot;mail libes@goon&quot;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;In both cases, &quot;goon&quot; refers to a particular computer.&amp;nbsp; How the name&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;is actually dereferenced by a human or computer need not concern us&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;here.&amp;nbsp; This essay is only concerned with choosing a &quot;good&quot; name.&amp;nbsp; (It&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;is assumed that the reader has a basic understanding of the domain&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;name system as described by [2].)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;By picking a &quot;good&quot; name for your computer, you can avoid a number of&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;problems that people stumble over again and again.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Here are some guidelines on what NOT to do.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Libes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Page 1]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name Your Computer&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t overload other terms already in common use.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Using a word that has strong semantic implications in the&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;current context will cause confusion.&amp;nbsp; This is especially true&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;in conversation where punctuation is not obvious and grammar is&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;often incorrect.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For example, a distributed database had been built on top of&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;several computers.&amp;nbsp; Each one had a different name.&amp;nbsp; One machine&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;was named &quot;up&quot;, as it was the only one that accepted updates.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Conversations would sound like this: &quot;Is up down?&quot;&amp;nbsp; and &quot;Boot&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the machine up.&quot; followed by &quot;Which machine?&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;While it didn&#39;t take long to catch on and get used to this&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;zaniness, it was annoying when occasionally your mind would&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;stumble, and you would have to stop and think about each word&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;in a sentence.&amp;nbsp; It is as if, all of a sudden, English has&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;become a foreign language.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t choose a name after a project unique to that machine.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;A manufacturing project had named a machine &quot;shop&quot; since it was&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;going to be used to control a number of machines on a shop&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;floor.&amp;nbsp; A while later, a new machine was acquired to help with&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;some of the processing.&amp;nbsp; Needless to say, it couldn&#39;t be called&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;shop&quot; as well.&amp;nbsp; Indeed, both machines ended up performing more&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;specific tasks, allowing more precision in naming.&amp;nbsp; A year&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;later, five new machines were installed and the original one&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;was moved to an unrelated project.&amp;nbsp; It is simply impossible to&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;choose generic names that remain appropriate for very long.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Of course, they could have called the second one &quot;shop2&quot; and so&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;on.&amp;nbsp; But then one is really only distinguishing machines by&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;their number.&amp;nbsp; You might as well just call them &quot;1&quot;, &quot;2&quot;, and&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;3&quot;.&amp;nbsp; The only time this kind of naming scheme is appropriate&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;is when you have a lot of machines and there are no reasons for&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;any human to distinguish between them.&amp;nbsp; For example, a master&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;computer might be controlling an array of one hundred&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;computers.&amp;nbsp; In this case, it makes sense to refer to them with&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the array indices.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;While computers aren&#39;t quite analogous to people, their names&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;are.&amp;nbsp; Nobody expects to learn much about a person by their&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;name.&amp;nbsp; Just because a person is named &quot;Don&quot; doesn&#39;t mean he is&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the ruler of the world (despite what the &quot;Choosing a Name for&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;your Baby&quot; books say).&amp;nbsp; In reality, names are just arbitrary&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tags.&amp;nbsp; You cannot tell what a person does for a living, what&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;their hobbies are, and so on.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Libes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Page 2]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name Your Computer&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t use your own name.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Even if a computer is sitting on your desktop, it is a mistake&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;to name it after yourself.&amp;nbsp; This is another case of&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;overloading, in which statements become ambiguous.&amp;nbsp; Does &quot;give&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the disk drive to don&quot; refer to a person or computer?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Even using your initials (or some other moniker) is&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unsatisfactory.&amp;nbsp; What happens if I get a different machine&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;after a year?&amp;nbsp; Someone else gets stuck with &quot;don&quot; and I end up&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;living with &quot;jim&quot;.&amp;nbsp; The machines can be renamed, but that is&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;excess work and besides, a program that used a special&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;peripheral or database on &quot;don&quot; would start failing when it&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wasn&#39;t found on the &quot;new don&quot;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;It is especially tempting to name your first computer after&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yourself, but think about it.&amp;nbsp; Do you name any of your other&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;possessions after yourself?&amp;nbsp; No.&amp;nbsp; Your dog has its own name, as&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;do your children.&amp;nbsp; If you are one of those who feel so inclined&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;to name your car and other objects, you certainly don&#39;t reuse&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;your own name.&amp;nbsp; Otherwise you would have a great deal of&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;trouble distinguishing between them in speech.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For the same reason, it follows that naming your computer the&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;same thing as your car or another possession is a mistake.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t use long names.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;This is hard to quantify, but experience has shown that names&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;longer than eight characters simply annoy people.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Most systems will allow prespecified abbreviations, but why not&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;choose a name that you don&#39;t have to abbreviate to begin with?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;This removes any chance of confusion.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Avoid alternate spellings.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Once we called a machine &quot;czek&quot;.&amp;nbsp; In discussion, people&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continually thought we were talking about a machine called&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;check&quot;.&amp;nbsp; Indeed, &quot;czek&quot; isn&#39;t even a word (although &quot;Czech&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;is).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Purposely incorrect (but cute) spellings also tend to annoy a&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;large subset of people.&amp;nbsp; Also, people who have learned English&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;as a second language often question their own knowledge upon&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;seeing a word that they know but spelled differently.&amp;nbsp; (&quot;I&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;guess I&#39;ve always been spelling &quot;funxion&quot; incorrectly.&amp;nbsp; How&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;embarrassing!&quot;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Libes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Page 3]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name Your Computer&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;By now you may be saying to yourself, &quot;This is all very&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;silly...people who have to know how to spell a name will learn&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;it and that&#39;s that.&quot; While it is true that some people will&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;learn the spelling, it will eventually cause problems&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;somewhere.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For example, one day a machine named &quot;pythagoris&quot; (sic) went&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;awry and began sending a tremendous number of messages to the&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;site administrator&#39;s computer.&amp;nbsp; The administrator, who wasn&#39;t a&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;very good speller to begin with, had never seen this machine&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;before (someone else had set it up and named it), but he had to&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;deal with it since it was clogging up the network as well as&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bogging down his own machine which was logging all the errors.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Needless to say, he had to look it up every time he needed to&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;spell &quot;pythagoris&quot;.&amp;nbsp; (He suspected there was an abbreviation,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;but he would have had to log into yet another computer (the&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;local nameserver) to find out and the network was too jammed to&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;waste time doing that.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Avoid domain names.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For technical reasons, domain names should be avoided.&amp;nbsp; In&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;particular, name resolution of non-absolute hostnames is&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;problematic.&amp;nbsp; Resolvers will check names against domains before&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checking them against hostnames.&amp;nbsp; But we have seen instances of&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mailers that refuse to treat single token names as domains.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;For example, assume that you mail to &quot;libes@rutgers&quot; from&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;yale.edu.&amp;nbsp; Depending upon the implementation, the mail may go&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;to rutgers.edu or rutgers.yale.edu (assuming both exist).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Avoid domain-like names.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Domain names are either organizational (e.g., cia.gov) or&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;geographical (e.g., dallas.tx.us).&amp;nbsp; Using anything like these&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tends to imply some connection.&amp;nbsp; For example, the name &quot;tahiti&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sounds like it means you are located there.&amp;nbsp; This is confusing&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if it is really somewhere else (e.g., &quot;tahiti.cia.gov is&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;located in Langley, Virginia?&amp;nbsp; I thought it was the CIA&#39;s&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Tahiti office!&quot;).&amp;nbsp; If it really is located there, the name&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;implies that it is the only computer there.&amp;nbsp; If this isn&#39;t&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wrong now, it inevitably will be.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;There are some organizational and geographical names that work&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fine.&amp;nbsp; These are exactly the ones that do not function well as&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;domain names.&amp;nbsp; For example, amorphous names such as rivers,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mythological places and other impossibilities are very&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;suitable.&amp;nbsp; (&quot;earth&quot; is not yet a domain name.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Libes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Page 4]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name Your Computer&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t use antagonistic or otherwise embarrassing names.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Words like &quot;moron&quot; or &quot;twit&quot; are good names if no one else is&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;going to see them.&amp;nbsp; But if you ever give someone a demo on your&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;machine, you may find that they are distracted by seeing a&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nasty word on your screen.&amp;nbsp; (Maybe their spouse called them&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;that this morning.)&amp;nbsp; Why bother taking the chance that they&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;will be turned off by something completely irrelevant to your&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;demo.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t use digits at the beginning of the name.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Many programs accept a numerical internet address as well as a&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;name.&amp;nbsp; Unfortunately, some programs do not correctly&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;distinguish between the two and may be fooled, for example, by&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a string beginning with a decimal digit.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Names consisting entirely of hexadecimal digits, such as&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&quot;beef&quot;, are also problematic, since they can be interpreted&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;entirely as hexadecimal numbers as well as alphabetic strings.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t use non-alphanumeric characters in a name.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Your own computer may handle punctuation or control characters&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;in a name, but most others do not.&amp;nbsp; If you ever expect to&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connect your computer to a heterogeneous network, you can count&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;on a variety of interpretations of non-alphanumeric characters&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;in names.&amp;nbsp; Network conventions on this are surprisingly&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nonstandard.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t expect case to be preserved.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Upper and lowercase characters look the same to a great deal of&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;internet software, often under the assumption that it is doing&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;you a favor.&amp;nbsp; It may seem appropriate to capitalize a name the&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;same way you might do it in English, but convention dictates&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;that computer names appear all lowercase.&amp;nbsp; (And it saves&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;holding down the shift key.)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Now that we&#39;ve heard what not to do, here are some suggestions on&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;names that work well.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Use words/names that are rarely used.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;While a word like &quot;typical&quot; or &quot;up&quot; (see above) isn&#39;t computer&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;jargon, it is just too likely to arise in discussion and throw&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;off one&#39;s concentration while determining the correct referent.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Instead, use words like &quot;lurch&quot; or &quot;squire&quot; which are unlikely&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Libes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Page 5]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name Your Computer&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;to cause any confusion.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;You might feel it is safe to use the name &quot;jose&quot; just because&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;no one is named that in your group, but you will have a problem&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if you should happen to hire Jose.&amp;nbsp; A name like &quot;sphinx&quot; will&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;be less likely to conflict with new hires.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Use theme names.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Naming groups of machines in a common way is very popular, and&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;enhances communality while displaying depth of knowledge as&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;well as imagination.&amp;nbsp; A simple example is to use colors, such&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;as &quot;red&quot; and &quot;blue&quot;.&amp;nbsp; Personality can be injected by choices&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;such as &quot;aqua&quot; and &quot;crimson&quot;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Certain sets are finite, such as the seven dwarfs.&amp;nbsp; When you&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order your first seven computers, keep in mind that you will&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;probably get more next year.&amp;nbsp; Colors will never run out.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Some more suggestions are: mythical places (e.g., Midgard,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Styx, Paradise), mythical people (e.g., Procne, Tereus, Zeus),&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;killers (e.g., Cain, Burr, Boleyn), babies (e.g., colt, puppy,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tadpole, elver), collectives (e.g., passel, plague, bevy,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;covey), elements (e.g., helium, argon, zinc), flowers (e.g.,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tulip, peony, lilac, arbutus).&amp;nbsp; Get the idea?&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Use real words.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Random strings are inappropriate for the same reason that they&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;are so useful for passwords.&amp;nbsp; They are hard to remember.&amp;nbsp; Use&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;real words.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Don&#39;t worry about reusing someone else&#39;s hostname.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Extremely well-known hostnames such as &quot;sri-nic&quot; and &quot;uunet&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;should be avoided since they are understood in conversation as&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;absolute addresses even without a domain.&amp;nbsp; In all other cases,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the local domain is assumed to qualify single-part hostnames.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;This is similar to the way phone numbers are qualified by an&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;area code when dialed from another area.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;In other words, if you have choosen a reasonable name, you do&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;not have to worry that it has already been used in another&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;domain.&amp;nbsp; The number of hosts in a bottom-level domain is small,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;so it shouldn&#39;t be hard to pick a name unique only to that&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;domain.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Libes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Page 6]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name Your Computer&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; There is always room for an exception.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;I don&#39;t think any explanation is needed here.&amp;nbsp; However, let me&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;add that if you later decide to change a name (to something&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sensible like you should have chosen in the first place), you&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;are going to be amazed at the amount of pain awaiting you.&amp;nbsp; No&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;matter how easy the manuals suggest it is to change a name, you&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;will find that lots of obscure software has rapidly accumulated&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;which refers to that computer using that now-ugly name.&amp;nbsp; It all&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;has to be found and changed.&amp;nbsp; People mailing to you from other&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sites have to be told.&amp;nbsp; And you will have to remember that&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;names on old backup media labels correspond to different names.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;I could go on but it would be easier just to forget this&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;guideline exists.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Conclusion&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Most people don&#39;t have the opportunity to name more than one or two&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;computers, while site administrators name large numbers of them.&amp;nbsp; By&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;choosing a name wisely, both user and administrator will have an&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;easier time of remembering, discussing and typing the names of their&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;computers.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;I have tried to formalize useful guidelines for naming computers,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;along with plenty of examples to make my points obvious.&amp;nbsp; Having been&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;both a user and site administrator, many of these anecdotes come from&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;real experiences which I have no desire to relive.&amp;nbsp; Hopefully, you&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;will avoid all of the pitfalls I have discussed by choosing your&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;computer&#39;s name wisely.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Credits&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Thanks to the following people for suggesting some of these&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;guidelines and participating in numerous discussions on computer&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;naming: Ed Barkmeyer, Peter Brown, Chuck Hedrick, Ken Manheimer, and&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Scott Paisley.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;This essay first appeared in the Communications of the ACM, November,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;1989, along with a Gary Larson cartoon reprinted with permission of&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;United Press Syndicate.&amp;nbsp; The text is not subject to copyright, since&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;it is work of the National Institute of Standards and Technology.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;However, the author, CACM, and NIST request that this credit appear&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;with the article whenever it is reprinted.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Libes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Page 7]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Name Your Computer&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;References&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;[1]&amp;nbsp; Libes, D., &quot;Choosing a Name for Your Computer&quot;, Communications&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;of the ACM, Vol. 32, No. 11, Pg. 1289, November 1989.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;[2]&amp;nbsp; Mockapetris, P., &quot;Domain Names - Concepts and Facilities&quot;,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;RFC 1034, USC/Information Sciences Institute, November 1987.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Security Considerations&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Security issues are not discussed in this memo.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Author&#39;s Address&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Don Libes&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Integrated Systems Group&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;National Institute of Standards and Technology&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Gaithersburg, MD 20899&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;Phone: (301) 975-3535&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;EMail:&amp;nbsp; libes@cme.nist.gov&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Libes&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[Page 8]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Informational&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Document type&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC Informational&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;August 1990&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Select version&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC 1178&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Author&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Don Libes&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;RFC stream&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Legacy stream&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;Other formats&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/1564354014014119501/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/04/rfc-1178-choosing-name-for-your.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/1564354014014119501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/1564354014014119501'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/04/rfc-1178-choosing-name-for-your.html' title='RFC 1178. Choosing a Name for Your Computer (c ACM 1989)'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-8456215849377652383</id><published>2024-03-26T14:32:00.000-04:00</published><updated>2024-03-26T14:32:03.088-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="lexique"/><title type='text'>terminology: VUCA</title><content type='html'>&lt;p&gt;&amp;nbsp;VUCA environments = volatile, uncertain, complex and ambiguous (VUCA)&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/8456215849377652383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/03/terminology-vuca.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/8456215849377652383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/8456215849377652383'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/03/terminology-vuca.html' title='terminology: VUCA'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-6841259623717377257</id><published>2024-03-26T10:52:00.002-04:00</published><updated>2024-03-26T10:52:13.013-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CICD"/><category scheme="http://www.blogger.com/atom/ns#" term="container"/><category scheme="http://www.blogger.com/atom/ns#" term="package"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><category scheme="http://www.blogger.com/atom/ns#" term="sign"/><category scheme="http://www.blogger.com/atom/ns#" term="supply chain"/><title type='text'>CI/CD and secure supply chain </title><content type='html'>&lt;p&gt;https://www.sigstore.dev/ ( &amp;amp; cosig https://github.com/sigstore/cosign )&lt;/p&gt;&lt;p&gt;https://in-toto.io/ &lt;/p&gt;&lt;p&gt;(cf. red hat trusted software supply chain which actually embeds those open source tools)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;+ backstage.io for &quot;platform engineering&quot;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/6841259623717377257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/03/cicd-and-secure-supply-chain.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/6841259623717377257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/6841259623717377257'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/03/cicd-and-secure-supply-chain.html' title='CI/CD and secure supply chain '/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5085828936695353728.post-2233024640718621662</id><published>2024-02-29T09:24:00.003-05:00</published><updated>2024-02-29T09:24:36.167-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="clean"/><category scheme="http://www.blogger.com/atom/ns#" term="code"/><category scheme="http://www.blogger.com/atom/ns#" term="commit"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="hook"/><category scheme="http://www.blogger.com/atom/ns#" term="vcs"/><title type='text'>git pre-commit hooks library</title><content type='html'>&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;cf.&amp;nbsp; https://codimd.nomadic-labs.com/p/YcXmjg1qv#/4&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;pre-commit is a tool that helps to configure git pre-commit hooks, with an abundance of already configured scripts&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;pre-commit install and configuration&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;Install in system&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;(apt-get / brew ) install pre-commit&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;install in repo&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;then in eac&lt;span style=&quot;background-color: white;&quot;&gt;h repo clone (set-up pre-commit for this repo):&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;pre-commit install&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;then (configure) edit&amp;nbsp;&lt;/span&gt;.&lt;span style=&quot;font-family: courier;&quot;&gt;pre-commit-config.yaml&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;.pre-commit-config.yaml &lt;/span&gt;example&amp;nbsp; (from&amp;nbsp;&lt;/span&gt;https://gitlab.com/tezos/tezos/-/blob/master/.pre-commit-config.yaml?ref_type=heads )&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: courier;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;# See https://pre-commit.com for more information&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;# See https://pre-commit.com/hooks.html for more hooks&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;repos:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; - repo: https://github.com/pre-commit/pre-commit-hooks&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; rev: v3.2.0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; hooks:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - id: trailing-whitespace&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - id: end-of-file-fixer&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; - repo: https://github.com/koalaman/shellcheck-precommit&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; rev: v0.9.0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; hooks:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - id: shellcheck&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args: [ &quot;--external-sources&quot; ]&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; - repo: https://github.com/cisagov/pre-commit-shfmt&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; rev: v0.0.2&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; hooks:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - id: shfmt&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # These settings must mirror the ones set in `scripts/lint.sh`.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args: [ &quot;-i&quot;, &quot;2&quot;, &quot;-sr&quot;, &quot;-d&quot; ]&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; - repo: https://github.com/arenadotio/pre-commit-ocamlformat&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; rev: 0439858&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; hooks:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - id: ocamlformat&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args: [ &quot;-i&quot; ]&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; - repo: https://github.com/hadolint/hadolint&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; rev: v2.9.3&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; hooks:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - id: hadolint-docker&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; - repo: https://github.com/python-jsonschema/check-jsonschema&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; rev: 0.28.0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; hooks:&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; - id: check-gitlab-ci&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; args: [&quot;--verbose&quot;]&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; files: &#39;(\.gitlab-ci\.yml|\.gitlab/ci/.*\.yml)&#39;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;General Notes about pre-commits&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;background-color: white; letter-spacing: 0.185775px;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;runs only against staged files&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;background-color: white;&quot;&gt;to run manually :&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; letter-spacing: 0.185775px;&quot;&gt;pre-commit run --all-files&lt;/span&gt;&lt;/p&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: white; letter-spacing: 0.185775px;&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;span style=&quot;background-color: white;&quot;&gt;to run 1 check specifically&amp;nbsp; (example :&amp;nbsp;&lt;/span&gt;run only&lt;span style=&quot;letter-spacing: 0.185775px;&quot;&gt;&amp;nbsp; 1 plugin (shfmt) )&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;code style=&quot;background-color: white; box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; letter-spacing: 0.185775px;&quot;&gt;pre-commit run shfmt&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code style=&quot;background-color: white; box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; letter-spacing: 0.185775px;&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code style=&quot;background-color: white; box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; letter-spacing: 0.185775px;&quot;&gt;&lt;br /&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: white; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; letter-spacing: 0.185775px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;background-color: #191919; color: white; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 42px; letter-spacing: 0.185775px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;script data-ad-client=&quot;ca-pub-2055981612210969&quot; async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dailycmd.blogspot.com/feeds/2233024640718621662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dailycmd.blogspot.com/2024/02/git-pre-commit-hooks-library.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/2233024640718621662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5085828936695353728/posts/default/2233024640718621662'/><link rel='alternate' type='text/html' href='http://dailycmd.blogspot.com/2024/02/git-pre-commit-hooks-library.html' title='git pre-commit hooks library'/><author><name>cm</name><uri>http://www.blogger.com/profile/12262849190520949133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>