<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Serge Gebhardt (sgeb.io)</title>
    <link>https://sgeb.io/</link>
    <description>Recent content on Serge Gebhardt (sgeb.io)</description>
    <language>en-us</language>
    <copyright>&amp;copy; 2013-2024 Serge Gebhardt</copyright>
    <pubDate>Wed, 17 Jan 2024 00:16:00 +0100</pubDate>
    <lastBuildDate>Wed, 17 Jan 2024 00:16:00 +0100</lastBuildDate>
    <atom:link href="https://sgeb.io/" rel="self" type="application/rss+xml" /><item>
      <title>Homelab / Dell R730</title>
      <link>https://sgeb.io/posts/homelab/dell-r730/</link>
      <pubDate>Thu, 30 Mar 2023 23:37:00 +0200</pubDate>
      <atom:updated>Wed, 10 May 2023 10:41:44 +0200</atom:updated>
      
      <guid>https://sgeb.io/posts/homelab/dell-r730/</guid>
      <description>&lt;h2 id=&#34;versions&#34;&gt;Versions&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&#34;https://www.dell.com/support/home/en-us/product-support/product/poweredge-r730/drivers&#34;&gt;here&lt;/a&gt; for the list of drivers and updates for the R730.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BIOS&lt;/td&gt;
&lt;td&gt;2.15.0&lt;/td&gt;
&lt;td&gt;🚨 Latest 2.16.0, released 2022-Nov-29, urgent. &lt;a href=&#34;https://www.dell.com/support/home/en-us/drivers/driversdetails?driverid=7557v&amp;amp;oscode=biosa&amp;amp;productcode=poweredge-r730&#34;&gt;Details&lt;/a&gt;, &lt;a href=&#34;https://dl.dell.com/FOLDER09083832M/4/R730_R730XD_R630_BIOS_2.16.0.pdf&#34;&gt;Release Notes&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iDRAC / Lifecycle Controller&lt;/td&gt;
&lt;td&gt;2.83.83.83&lt;/td&gt;
&lt;td&gt;⚠️ Latest 2.84.84.84, released 2023-Mar-10, recommended. &lt;a href=&#34;https://www.dell.com/support/home/en-us/drivers/driversdetails?driverid=g79dw&amp;amp;oscode=biosa&amp;amp;productcode=poweredge-r730&#34;&gt;Details&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PERC H730P Mini&lt;/td&gt;
&lt;td&gt;25.5.9.0001&lt;/td&gt;
&lt;td&gt;✅ Already on latest, released 2021-Jul-13. &lt;a href=&#34;https://www.dell.com/support/home/en-us/drivers/driversdetails?driverid=700gg&amp;amp;oscode=biosa&amp;amp;productcode=poweredge-r730&#34;&gt;Details&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backplane Expander&lt;/td&gt;
&lt;td&gt;2.25&lt;/td&gt;
&lt;td&gt;⚠️ Looks like there might be an update to 3.35, but not sure it&amp;rsquo;s applicable. &lt;a href=&#34;https://www.dell.com/support/home/en-us/drivers/driversdetails?driverid=hypyy&amp;amp;oscode=biosa&amp;amp;productcode=poweredge-r730&#34;&gt;Details&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power Supply 750W (PN: G6W6K)&lt;/td&gt;
&lt;td&gt;00.24.6D&lt;/td&gt;
&lt;td&gt;⚠️ Latest 00.30.C2, released 2021-Jul-14, recommended. &lt;a href=&#34;https://www.dell.com/support/home/en-us/drivers/driversdetails?driverid=jv7g6&amp;amp;oscode=wst14&amp;amp;productcode=poweredge-r730&#34;&gt;Details&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NIC X540&lt;/td&gt;
&lt;td&gt;19.5.12&lt;/td&gt;
&lt;td&gt;✅ Already on latest, released 2020-Feb-14. &lt;a href=&#34;https://www.dell.com/support/home/en-us/drivers/driversdetails?driverid=40ntk&amp;amp;oscode=biosa&amp;amp;productcode=poweredge-r730&#34;&gt;Details&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Table last updated: 2023-May.&lt;/p&gt;
&lt;h2 id=&#34;storage-expansion-options&#34;&gt;Storage Expansion Options&lt;/h2&gt;
&lt;p&gt;A couple of random things I&amp;rsquo;ve learned while investigating expansion options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Dell offers two official expansion options, the others being bespoke and not
officially supported nor endorsed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;A &amp;ldquo;Mid-Bay 4-LFF Kit&amp;rdquo; with P/N 4FHR4. It supports 4 additional LFF disks
and attaches on top of where the CPU and RAM slots sit. In order to fit it
requires replacing the default CPU heatsinks with low profile ones (P/N
8K3F3), meaning CPUs get less cooling and run hotter. The bay replaces the
cooling shroud, i.e. the black plastic funneling cover behind the fan bar.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s probably the most appropriate way to fit LFF disks into the R730. But
the kit is relatively pricey (~300-400€) and I haven&amp;rsquo;t found an easy way
to source it. That&amp;rsquo;s more than I paid for the entire server so I won&amp;rsquo;t
pursue this option.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &amp;ldquo;Rear Flex 2-SFF Bay Kit&amp;rdquo; with P/N 4CJTY. I&amp;rsquo;m not sure, but they might
only fit the R730xd (sic, &lt;strong&gt;xd&lt;/strong&gt; version). I could find a &amp;ldquo;Read Flex 2-LFF
Bay Kit&amp;rdquo; with P/N YWTC2. Presumably same caveat re. xd model applies.&lt;/p&gt;
&lt;p&gt;This option isn&amp;rsquo;t interesting to me since I&amp;rsquo;m not looking at expanding SFF
disks, I have enough free slots in the front bay.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are two SATA-2 connectors on the system board (between CPU1 and PSUs);
one for CD tray, one for Tape Backup Unit (TPU). Beware, SATA-2, not SATA-3,
meaning limited to 3 Gbit/s, which wouldn&amp;rsquo;t be a big issue for hypervisor
boot drives on a RAID1. Both connectors can be used to connect ordinary SATA
HDDs or SSDs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The chassis I have is 8-SFF (SFF = Small Form Factor, aka 2.5&amp;quot; drives), with
the right bay enclosure empty. This is where an additional 8-SFF bay goes
into for the 16-SFF model. It seems to be roughly the size of two stacked
5.25&amp;quot; bays and I&amp;rsquo;m still assessing whether it will fit two (hot-plug)
3.5&amp;quot;-in-5.25&amp;quot; hot-swap bays, so as to extend the default 8-SFF with 2
additional LFF disks.&lt;/p&gt;
&lt;p&gt;This would allow to build sizeable storage (e.g. 2x20TB RAID1) with fewer and
cheaper disks than with LFF disks only. LFF disks are generally smaller in
capacity and are more expensive on cost per TB; plus, more drives consume
more energy, roughly 5 W per HDD while idle (meaning approx. 20€/year/disk
idling with energy prices as of March 2023 in my location).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The R730 cannot natively boot from an NVMe/PCIe drive. There is a project
called &amp;ldquo;clover&amp;rdquo; to bridge this gap (as far as I&amp;rsquo;ve understood it&amp;rsquo;s a
USB-booted image that initializes drivers and whatnot and then hands over
booting from NVMe/PCIe. I haven&amp;rsquo;t tested it and won&amp;rsquo;t pursue this option for
now, as I&amp;rsquo;m not keen on relying on potentially fragile workarounds for a
server environment (no offense, haven&amp;rsquo;t tried it, just being cautious for
now).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is an optional two-slot SD-card reader supporting built-in mirroring
for redundancy. This is often used as boot volume, e.g. for ESXi.
Additionally there is also an onboard USB slot within the chassis for usage
as boot volume, though doesn&amp;rsquo;t support redundancy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item><item>
      <title>Homelab / Networking</title>
      <link>https://sgeb.io/posts/homelab/networking/</link>
      <pubDate>Tue, 25 Apr 2023 16:50:00 +0200</pubDate>
      <atom:updated>Tue, 09 May 2023 09:46:26 +0200</atom:updated>
      
      <guid>https://sgeb.io/posts/homelab/networking/</guid>
      <description>&lt;h2 id=&#34;cidrs-and-vlans&#34;&gt;CIDRs and VLANs&lt;/h2&gt;
&lt;p&gt;The network is segmented by usage and level of trust:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;th&gt;Trust Level&lt;/th&gt;
&lt;th&gt;CIDR&lt;/th&gt;
&lt;th&gt;VLAN ID&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;Trusted, Restricted&lt;/td&gt;
&lt;td&gt;10.51.0.0/22&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;ndash;&amp;gt; Networking&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&amp;ndash;&amp;gt; 10.51.0.xx&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;ndash;&amp;gt; Server IPMI&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&amp;ndash;&amp;gt; 10.51.1.xx&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;ndash;&amp;gt; Misc (PDU, UPS, etc)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&amp;ndash;&amp;gt; 10.51.2.xx&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trusted Services&lt;/td&gt;
&lt;td&gt;Trusted&lt;/td&gt;
&lt;td&gt;10.51.16.0/22&lt;/td&gt;
&lt;td&gt;116&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Untrusted Services, IoT, Multimedia&lt;/td&gt;
&lt;td&gt;Untrusted&lt;/td&gt;
&lt;td&gt;10.51.32.0/22&lt;/td&gt;
&lt;td&gt;132&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMZ&lt;/td&gt;
&lt;td&gt;Untrusted&lt;/td&gt;
&lt;td&gt;10.51.64.0/22&lt;/td&gt;
&lt;td&gt;164&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Networks:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary User Network&lt;/td&gt;
&lt;td&gt;Trusted&lt;/td&gt;
&lt;td&gt;10.77.0.0/22&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guests&lt;/td&gt;
&lt;td&gt;Untrusted&lt;/td&gt;
&lt;td&gt;10.77.16.0/22&lt;/td&gt;
&lt;td&gt;216&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The CIDRs are optimized for quick network identification and to avoid typos
(network IPs differ always by at least 2 digits). Network size of &lt;code&gt;/22&lt;/code&gt; provides
1,022 available IPs per network, which should be enough headroom for future
needs.&lt;/p&gt;
&lt;p&gt;The infrastructure networks (10.51.xx.xx) are for out-of-band management, device
management, services, IoT, set-top boxes, TVs, loudspeakers, gaming consoles,
etc. Basically for anything that isn&amp;rsquo;t a personal user device. The nmemonic of
prefix &lt;code&gt;10.51.&lt;/code&gt; is &amp;ldquo;Area 51&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The user networks (10.77.xx.xx) are for personal user devices, segregated into
trusted and untrusted (i.e. guest) devices. The nmemonic of prefix &lt;code&gt;10.77.&lt;/code&gt; is
that it stands for July 7th, a date close to my heart.&lt;/p&gt;
&lt;p&gt;Hints: &lt;a href=&#34;https://cidr.xyz&#34;&gt;cidr.xyz&lt;/a&gt; is a great web-based CIDR range visualizer. On the CLI, &lt;a href=&#34;https://jodies.de/ipcalc&#34;&gt;&lt;code&gt;ipcalc&lt;/code&gt;&lt;/a&gt;
is my favorite (available on Homebrew, apt, yum, etc).&lt;/p&gt;
&lt;h2 id=&#34;cable-color-coding&#34;&gt;Cable color-coding&lt;/h2&gt;
&lt;p&gt;Cables going into switches are color-coded as follows:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Color&lt;/th&gt;
&lt;th&gt;Connection type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;White / Gray&lt;/td&gt;
&lt;td&gt;Default, normal client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red&lt;/td&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Green&lt;/td&gt;
&lt;td&gt;Uplink, trunk, inter-switch, WLAN (i.e. acting as a type of uplink)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yellow&lt;/td&gt;
&lt;td&gt;WAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orange&lt;/td&gt;
&lt;td&gt;Reserved (due to ambiguity with mostly orange installation cables)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</description>
    </item><item>
      <title>Homelab / Power Consumption</title>
      <link>https://sgeb.io/posts/homelab/power-consumption/</link>
      <pubDate>Thu, 23 Mar 2023 21:20:00 +0100</pubDate>
      <atom:updated>Thu, 23 Mar 2023 21:20:50 +0100</atom:updated>
      
      <guid>https://sgeb.io/posts/homelab/power-consumption/</guid>
      <description>&lt;p&gt;Here are quick notes on power consumption while testing my homelab equipment.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Storage&lt;/th&gt;
&lt;th&gt;Other&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Idle Power&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Idle Monthly Energy&lt;/th&gt;
&lt;th style=&#34;text-align:right&#34;&gt;Max Power&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dell R720&lt;/td&gt;
&lt;td&gt;2x E5-2697v2&lt;/td&gt;
&lt;td&gt;128 GB DDR3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;4x 1GbE&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dell R730&lt;/td&gt;
&lt;td&gt;2x E5-2699v4&lt;/td&gt;
&lt;td&gt;160 GB DDR4-2133 (10x16GB)&lt;/td&gt;
&lt;td&gt;4x 600 GB SAS 6 Gbps (2.5&amp;quot;)&lt;/td&gt;
&lt;td&gt;2x 10GbE + 2x 1GbE; 2x 750W PSU (1 connected)&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;98 W&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;~71 kWh&lt;/td&gt;
&lt;td style=&#34;text-align:right&#34;&gt;&amp;gt; 400 W&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ideas to decrease power consumption:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Move from smaller disks to fewer bigger disks.&lt;/li&gt;
&lt;li&gt;Upgrade from smaller RAM modules to bigger RAM modules (totalling to same
capacity). Power consumption grows with amount of modules, not amount of
capacity. P(2x16GB) &amp;gt; P(1x32GB).&lt;/li&gt;
&lt;li&gt;Double-check BIOS settings and OS support for power management.&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item><item>
      <title>High Output Management</title>
      <link>https://sgeb.io/bookshelf/high-output-management/</link>
      <pubDate>Thu, 30 Jun 2022 17:00:00 +0200</pubDate>
      <atom:updated>Thu, 30 Jun 2022 17:04:32 +0200</atom:updated>
      
      <guid>https://sgeb.io/bookshelf/high-output-management/</guid>
      <description></description>
    </item><item>
      <title>Cloud Native Java</title>
      <link>https://sgeb.io/bookshelf/cloud-native-java/</link>
      <pubDate>Wed, 29 Jun 2022 15:29:00 +0200</pubDate>
      <atom:updated>Wed, 29 Jun 2022 18:14:58 +0200</atom:updated>
      
      <guid>https://sgeb.io/bookshelf/cloud-native-java/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m mixed about this book and wouldn&amp;rsquo;t recommend it when starting out with Java
and Spring.&lt;/p&gt;
&lt;p&gt;It contains all the right directions but misses out on providing enough depth on
any of them. The high-level structure seems right, but the flow within each
section feels unorganized. It doesn&amp;rsquo;t provide enough explanations, background
and theory to be a good fundamental book to get started; yet it also isn&amp;rsquo;t
hands-on enough to serve as go-to reference. It tries to fill this weird middle
ground, which in my opinion isn&amp;rsquo;t very valuable.&lt;/p&gt;
&lt;p&gt;Some of the technologies used have fallen out of fashion since the book was
published. Also, the deployment and runtime environment is focused on Cloud
Foundry, which isn&amp;rsquo;t a surprise given the book&amp;rsquo;s subtitle but of limited value
if you&amp;rsquo;re not using Cloud Foundry.&lt;/p&gt;
&lt;p&gt;For a book that is literally titled &amp;ldquo;Cloud Native Java&amp;rdquo;, I&amp;rsquo;d have expected more
environment-agnostic material. A more suitable title for the contents of this
book would have been &amp;ldquo;Running Spring on Cloud Foundry using Netflix OSS
Components&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I enjoyed the examples built on Spring abstractions (e.g. Spring Data, Spring
Integration, Spring Batch, Spring Security). They continue to be relevant
despite the book being 5 years old at time of this writing. Although the comment
above still applies: it is only scratching the surface and isn&amp;rsquo;t a comprehensive
book on Spring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Table of contents:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I. Basics
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;The Cloud Native Application&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Bootcamp: Introducing Spring Boot and Cloud Foundry&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Twelve-Factor Application Style Configuration&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;The Forklifted Application&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;II. Web Services
&lt;ul&gt;
&lt;li&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;REST APIs&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Routing&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;Edge Services&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;III. Data Integration
&lt;ul&gt;
&lt;li&gt;
&lt;ol start=&#34;9&#34;&gt;
&lt;li&gt;Managing Data&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;10&#34;&gt;
&lt;li&gt;Messaging&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;11&#34;&gt;
&lt;li&gt;Batch Processes and Tasks&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;12&#34;&gt;
&lt;li&gt;Data Integration&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IV. Production
&lt;ul&gt;
&lt;li&gt;
&lt;ol start=&#34;13&#34;&gt;
&lt;li&gt;The Observable System&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;14&#34;&gt;
&lt;li&gt;Service Brokers&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol start=&#34;15&#34;&gt;
&lt;li&gt;Continuous Delivery&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;V. Appendix
&lt;ul&gt;
&lt;li&gt;A. Using Spring Boot with Java EE&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item><item>
      <title>Scrollable YouTube recommendations (via userscript)</title>
      <link>https://sgeb.io/posts/scrollable-youtube-recommendations-via-userscript/</link>
      <pubDate>Wed, 29 Jun 2022 10:47:00 +0200</pubDate>
      <atom:updated>Wed, 29 Jun 2022 10:49:26 +0200</atom:updated>
      
      <guid>https://sgeb.io/posts/scrollable-youtube-recommendations-via-userscript/</guid>
      <description>&lt;p&gt;When watching a video, YouTube shows additional recommendations on the
right-hand side. Unfortunately this recommendations pane is not independently
scrollable, meaning that the video being watched moves out of the visible area
when scrolling the list of recommendations.&lt;/p&gt;
&lt;p&gt;Here is a userscript to fix this.&lt;/p&gt;
&lt;p&gt;A userscript is a JavaScript snippet, which can modify the current page at
runtime. It is executed by the browser when the location predicate matches.
Functionality can range from style adjustments (such as in this case) to
augmenting the page with additional functionality.&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&#34;https://www.tampermonkey.net&#34;&gt;Tampermonkey&lt;/a&gt; to manage userscripts. It
is a successor to Greasemonkey, which made userscripts popular. I don&amp;rsquo;t know the
advantages of each and haven&amp;rsquo;t spent much time researching alternatives.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ==UserScript==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// @name         YouTube - scrollable recommendations pane
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// @namespace    http://tampermonkey.net/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// @version      0.1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// @description  Make recommendations pane scrollable so that video doesn&amp;#39;t move out of visible area.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// @author       You
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// @match        https://www.youtube.com/watch?*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// @grant        GM_addStyle
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ==/UserScript==
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;function&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#39;use strict&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75af00&#34;&gt;GM_addStyle&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;        #secondary {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;            overflow: scroll;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;            height: 100vh;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;    `&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item><item>
      <title>My preferred date formats</title>
      <link>https://sgeb.io/posts/my-preferred-date-formats/</link>
      <pubDate>Tue, 29 Mar 2022 01:36:00 +0200</pubDate>
      <atom:updated>Sun, 26 Jun 2022 20:49:19 +0200</atom:updated>
      
      <guid>https://sgeb.io/posts/my-preferred-date-formats/</guid>
      <description>&lt;p&gt;Dates are an important part of business communication. Yet there&amp;rsquo;s surprisingly
little agreement or consistency regarding their format. What&amp;rsquo;s worse than
inconsistency is that they&amp;rsquo;re often ambiguous, leading to misunderstandings and
unmet expectations.&lt;/p&gt;
&lt;p&gt;The following describes my personal preferences for date and time formats. By
nature they are opinionated, your mileage may vary. I&amp;rsquo;m sharing my rationale
here; it isn&amp;rsquo;t an attempt at convincing you to use the same.&lt;/p&gt;
&lt;p&gt;Note that I focus on conveying information in a business context, not on
stylistic considerations for use in prose or official letters.&lt;/p&gt;
&lt;h2 id=&#34;requirements&#34;&gt;Requirements&lt;/h2&gt;
&lt;p&gt;Date formats must be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;simple&lt;/li&gt;
&lt;li&gt;understandable at first glance&lt;/li&gt;
&lt;li&gt;unambiguous&lt;/li&gt;
&lt;li&gt;compatible with usage in filenames and other common places&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Furthermore, I&amp;rsquo;m limiting this post to English only. I&amp;rsquo;ve tried to bring some of
them to German, but they just didn&amp;rsquo;t work right.&lt;/p&gt;
&lt;h2 id=&#34;dates&#34;&gt;Dates&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;2022-03-25&lt;/strong&gt;: the standard, also recommended in ISO-8601. Useful when dates must
be fully qualified. Also well-suited for filenames because the format is
Big-Endian&amp;mdash;meaning the elements are listed from most significant (the year) to
least significant (the day)&amp;mdash;and file browsers usually order by filename,
leading to an automatic sorting by date as well.&lt;/p&gt;
&lt;p&gt;Month and day are zero-padded; 2022-03-25 instead of 2022-3-25.&lt;/p&gt;
&lt;p&gt;The separators are dashes, not dots or slashes. The former is hard to parse when
skimming quickly and the latter is incompatible with filenames, where slash is
often the directory separator. Also, I do not recommend removing the separators
as some people do for filenames; dates become really hard to parse and it&amp;rsquo;s only
saving two characters.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022-Mar-25&lt;/strong&gt;: a different variant of the above, with abbreviated month name
instead of its ordinal number. Easier to read for humans. But not recommended
for filenames since the names of the months aren&amp;rsquo;t ordered alphabetically,
losing out on automatic chronological sorting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mar-25&lt;/strong&gt;: for brevity I sometimes omit the year when it is clearly identified
from context. Such as: &amp;ldquo;We&amp;rsquo;ll make the decision on Apr-05, please provide all
answers by Apr-02 EOD.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;When omitting the year, always use the abbreviated month name (not the ordinal
month number) to avoid ambiguity. Don&amp;rsquo;t do this: &amp;ldquo;We&amp;rsquo;ll make the decision on
04-05, please provide all answers by 04-02 EOD&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2022-03&lt;/strong&gt; / &lt;strong&gt;2022-Mar&lt;/strong&gt;: references a particular month. The repeated year is a
bit verbose when used multiple times in close vicinity. Also, despite following
the logical Big-Endian order, it feels unnatural to some readers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mar&#39;22&lt;/strong&gt;: used as alternative reference to a month. It sometimes reads more
naturally and avoids too much verbosity. The apostrophe is a contraction of the
year, similarly to how &amp;ldquo;I would do&amp;rdquo; turns into &amp;ldquo;I&amp;rsquo;d do&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;On some occasions I&amp;rsquo;ll drop the year altogether and write only Mar or March. I
usually do this in chats or other information communication, but I avoid doing
it in documents which are likely to be read after the current year ended.&lt;/p&gt;
&lt;p&gt;Note that there is only a single character differentiating Mar-22 (March 22nd)
from Mar&#39;22 (March 2022). When there is a risk of creating ambiguity, I revert
to the more verbose format.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EOY, EOQ, EOM, EOW, EOD&lt;/strong&gt;: these stand for &amp;ldquo;End Of {Year, Quarter, Month, Week,
Day}&amp;rdquo;. The qualifier should be included to remove ambiguity. Some examples:
&amp;ldquo;We&amp;rsquo;ll plan till EOQ2 and execute in early Q3&amp;rdquo;, &amp;ldquo;Results are expected by EOW12&amp;rdquo;,
or &amp;ldquo;Demand is strong compared to EOY&#39;21&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;For some reason abbreviations for &amp;ldquo;Beginning Of&amp;rdquo; aren&amp;rsquo;t common. I&amp;rsquo;ve never seen
references such as BOY&#39;22, BOW32, BOQ3, BOD.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;H1, H2&lt;/strong&gt;: first and second half of the year. Unless absolutely clear from
context, the year should be included to remove ambiguity, such as &amp;ldquo;2022-H1&amp;rdquo;.
Given its duration of 6 months, it&amp;rsquo;s quite probable that any document containing
such references will be relevant even after the current year ended. Therefore
I&amp;rsquo;d recommend always adding the year.&lt;/p&gt;
&lt;p&gt;Since references to H1 or H2 are sparse, I avoid the apostrophe form of the
year. Meaning I use &amp;ldquo;2022-H1&amp;rdquo;, not &amp;ldquo;H1&#39;22&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;times&#34;&gt;Times&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;16:15&lt;/strong&gt;: my general preference is for zero-padded 24h-format. It is easier to
parse, always unambiguous and naturally sorted in file browsers. But I don&amp;rsquo;t
hold that preference strongly. The am/pm-format is shorter and quicker to type,
as in &amp;ldquo;let&amp;rsquo;s meet tmrw 2-3pm&amp;rdquo;. I use both formats, but will lean towards
24h-format in documents.&lt;/p&gt;
&lt;p&gt;The more common hours-minutes separator is colon. When using dot separator or
not using any separator at all, it should be clear from context that it is a
time; usually that isn&amp;rsquo;t much of an issue.&lt;/p&gt;
&lt;p&gt;Some examples: 4:15pm, 4.15pm, 16:15, 16.15, 1615, 16h15. They all work fine.&lt;/p&gt;
&lt;p&gt;Zero-padded means 09:15 instead of 9:15.&lt;/p&gt;
&lt;p&gt;My only ask:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Be consistent within the same document or message;&lt;/li&gt;
&lt;li&gt;Replace 12am and 12pm with noon and midnight;&lt;/li&gt;
&lt;li&gt;If communicating with people in different timezones, always include that
information with the time, e.g. &amp;ldquo;16:15 CET&amp;rdquo; or &amp;ldquo;4.15pm GMT&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thanks!&lt;/p&gt;
</description>
    </item><item>
      <title>Bookmarks: HTML, CSS, JS, Frontend</title>
      <link>https://sgeb.io/posts/bookmarks-html-css-js-frontend/</link>
      <pubDate>Mon, 21 Mar 2022 20:48:00 +0100</pubDate>
      <atom:updated>Thu, 24 Mar 2022 23:31:47 +0100</atom:updated>
      
      <guid>https://sgeb.io/posts/bookmarks-html-css-js-frontend/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://webdesign.tutsplus.com/tutorials/quick-tip-how-to-use-html5-picture-for-responsive-images--cms-21015&#34;&gt;HTML5 “picture”, “srcset”, and “sizes” for Responsive Images&lt;/a&gt; (2019)&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item><item>
      <title>Launch Magit from the command line</title>
      <link>https://sgeb.io/posts/magit-cli/</link>
      <pubDate>Sun, 12 Dec 2021 21:34:00 +0100</pubDate>
      <atom:updated>Sun, 12 Dec 2021 21:34:00 +0100</atom:updated>
      
      <guid>https://sgeb.io/posts/magit-cli/</guid>
      <description>&lt;p&gt;I frequently want to open a Magit buffer on the current git repo when navigation
directories from the command line.&lt;/p&gt;
&lt;p&gt;With the following script saved in your local bin directory, type &lt;code&gt;magit&lt;/code&gt; to
open a new Emacs buffer with Magit status on the git repo of your current
working directory. It creates a new Emacs frame if in graphical mode, or
displays the buffer in the terminal otherwise. Very convenient.&lt;/p&gt;
&lt;p&gt;Requires Emacs to run as server.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;set&lt;/span&gt; -euo pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;if&lt;/span&gt; ! emacsclient -a &lt;span style=&#34;color:#111&#34;&gt;false&lt;/span&gt; --eval nil --quiet &amp;gt;/dev/null 2&amp;gt;&lt;span style=&#34;color:#111&#34;&gt;&amp;amp;&lt;/span&gt;1&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#111&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Error: Emacs not running.&amp;#34;&lt;/span&gt; &amp;gt;&lt;span style=&#34;color:#111&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#111&#34;&gt;exit&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;IS_GRAPHICAL&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;$(&lt;/span&gt;emacsclient -a &lt;span style=&#34;color:#111&#34;&gt;false&lt;/span&gt; --eval &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;(display-graphic-p)&amp;#34;&lt;/span&gt; --quiet&lt;span style=&#34;color:#00a8c8&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;ARGS&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;$IS_GRAPHICAL&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#111&#34;&gt;ARGS&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;-n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;exec&lt;/span&gt; emacsclient &lt;span style=&#34;color:#111&#34;&gt;$ARGS&lt;/span&gt; -c --eval &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;(progn (magit-status) (delete-other-windows))&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;src-block-caption&#34;&gt;
  &lt;span class=&#34;src-block-number&#34;&gt;Code Snippet 1:&lt;/span&gt;
  &lt;code&gt;~/usr/bin/magit&lt;/code&gt;
&lt;/div&gt;</description>
    </item><item>
      <title>Magit-delta brings Delta diff highlighting to Magit</title>
      <link>https://sgeb.io/posts/magit-delta/</link>
      <pubDate>Sun, 31 Oct 2021 16:25:00 +0100</pubDate>
      <atom:updated>Tue, 02 Nov 2021 10:37:36 +0100</atom:updated>
      
      <guid>https://sgeb.io/posts/magit-delta/</guid>
      <description>&lt;p&gt;I use &lt;a href=&#34;https://magit.vc/&#34;&gt;Magit&lt;/a&gt; (an Emacs mode) as convenience UI for Git. On the CLI, I appreciate
the improvements of &lt;a href=&#34;https://github.com/dandavison/delta&#34;&gt;Delta&lt;/a&gt; highlighting over the default diff output. Yet I only
recently discovered &lt;a href=&#34;https://github.com/dandavison/magit-delta&#34;&gt;magit-delta&lt;/a&gt; to combine the two: have Magit display diff
output with the beauty and improvements of Delta highlighting.&lt;/p&gt;
&lt;figure&gt;&lt;a href=&#34;screenshot.png&#34;&gt;&lt;img src=&#34;screenshot.png&#34;
         alt=&#34;Figure 1: Screenshot of magit-delta on a sample sqlite commit&#34; width=&#34;100%&#34;/&gt;&lt;/a&gt;&lt;figcaption&gt;
            &lt;p&gt;&lt;span class=&#34;figure-number&#34;&gt;Figure 1: &lt;/span&gt;Screenshot of magit-delta on a sample sqlite commit&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;a href=&#34;https://github.com/dandavison/delta&#34;&gt;Delta&lt;/a&gt;. On macOS: &lt;code&gt;brew install git-delta&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Install &lt;a href=&#34;https://github.com/dandavison/magit-delta&#34;&gt;magit-delta&lt;/a&gt; from MELPA. Of course &lt;a href=&#34;https://magit.vc/&#34;&gt;Magit&lt;/a&gt; is needed too.&lt;/li&gt;
&lt;li&gt;Activate with &lt;code&gt;M-x magit-delta-mode&lt;/code&gt; inside a magit diff buffer and refresh
the buffer with &lt;code&gt;g&lt;/code&gt; or &lt;code&gt;M-x magit-refresh&lt;/code&gt; (&lt;code&gt;gr&lt;/code&gt; on Spacemacs). See &lt;a href=&#34;https://github.com/dandavison/magit-delta/blob/master/README.md&#34;&gt;manual&lt;/a&gt; on
how to activate automatically.&lt;/li&gt;
&lt;li&gt;On Spacemacs, magit-delta is part of the &lt;code&gt;git&lt;/code&gt; layer. Enable it automatically
with:
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;setq-default&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;dotspacemacs-configuration-layers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;;; other layers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;git&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;:variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                     &lt;span style=&#34;color:#111&#34;&gt;git-enable-magit-delta-plugin&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;t&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;;; other layers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#111&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
    </item><item>
      <title>Website update, October 2021</title>
      <link>https://sgeb.io/posts/website-update-oct-2021/</link>
      <pubDate>Thu, 28 Oct 2021 00:00:00 +0000</pubDate>
      <atom:updated>Thu, 28 Oct 2021 00:00:00 +0000</atom:updated>
      
      <guid>https://sgeb.io/posts/website-update-oct-2021/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve neglected this site for the past 3 years. The last post is from
August 2018. During this time the tools and scripts for building and deploying
this website have decayed until they eventually failed entirely. I couldn&amp;rsquo;t
muster up the time and motivation to solve these issues.&lt;/p&gt;
&lt;p&gt;For context, this site is statically generated with Hugo and uses a custom
theme. The assets for the theme are built with Sass, PostCSS and Autoprefixer &amp;ndash;
no bundler or pipeline like Webpack, Gulp or Parcel (although I meant to add one
eventually). The build and deploy pipeline runs on Github Actions (migrated from
LambCI). The pages are hosted on AWS S3, delivered via CloudFront.&lt;/p&gt;
&lt;p&gt;The decay is due to a combination of reasons: entangled dependencies and
complexity, libraries introducing breaking changes (even in minor version
updates), and me not having pinned down dependency versions thoroughly enough to
guarantee reproducibility. I hope web technologies will evolve in a way to
simplify maintenance work of this kind in the future. It should either be a
routine task, or not required at all.&lt;/p&gt;
&lt;p&gt;Anyways, I&amp;rsquo;m finally updating the tooling, and making all the necessary
adjustments that come with it. I&amp;rsquo;m not fully done yet, but at least I can update
pages again and deploy them to the live domain.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m using this opportunity to make a couple of changes.&lt;/p&gt;
&lt;h2 id=&#34;urls-no-longer-contain-the-post-date&#34;&gt;URLs no longer contain the post date&lt;/h2&gt;
&lt;p&gt;Previously, URLs contained the year and month of the post, as hierarchical path
segments. I&amp;rsquo;m removing these because: a) This site isn&amp;rsquo;t a journal focused on
chronological order; b) The post date therefore isn&amp;rsquo;t an indicator of the
relevance of the content; c) Some posts are meant to be updated as things
change, but URLs can&amp;rsquo;t be easily updated to reflect the newer content; d) Google
ranks old content lower than newer content; e) URLs with dates are longer.&lt;/p&gt;
&lt;p&gt;Some indication of time is helpful, therefore all pages clearly feature the date
of last modification at the top of the post (which might be the same as post
date if no updates were done since publication). If relevant, a page might also
display the initial date of publication.&lt;/p&gt;
&lt;p&gt;Example of URL change:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://sgeb.io/posts/2017/07/synthetic-monitoring/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;https://sgeb.io/posts/synthetic-monitoring/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;new-post-types-notes-and-bookmarks&#34;&gt;New post types &lt;code&gt;notes&lt;/code&gt; and &lt;code&gt;bookmarks&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;I find it hard to publish regularly due to the high bar I (needlessly) set
myself regarding quality and relevance. Crafting quality content takes time;
much more than I&amp;rsquo;m willing to pour into this personal site on a regular basis.
It&amp;rsquo;s silly but I can&amp;rsquo;t bring myself to remove that mental blocker, despite it
having been an obstacle to publishing more frequently.&lt;/p&gt;
&lt;p&gt;Therefore I&amp;rsquo;m trying out something new. I&amp;rsquo;m adding two post types for
lower-quality content: &lt;code&gt;notes&lt;/code&gt; and &lt;code&gt;bookmarks&lt;/code&gt;. Caring less about quality of
these posts, and being up-front about it, means I&amp;rsquo;ll spend less time polishing
the content, which will hopefully result in an increased frequency of posts.
That at least is the plan, time will tell.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Notes&lt;/code&gt; are crude blips or brain dump posts on an issue I was solving or an idea
I was having. The scope is really narrow, and I won&amp;rsquo;t pay much attention to the
reader&amp;rsquo;s perspective. More a collection of useful learnings and references to
future me than a proper article. But maybe / hopefully they&amp;rsquo;ll still be useful
to others.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Bookmarks&lt;/code&gt; are just lists of interesting links about a particular topic. I&amp;rsquo;m
not sure how many bookmarks I&amp;rsquo;ll actually publish. I don&amp;rsquo;t meant these posts to
replace my browser bookmarks, nor any of the online bookmark aggregators. Still,
maybe others find the bookmarks useful. And if the capturing + publishing
process is lightweight enough, then that&amp;rsquo;s worth trying out.&lt;/p&gt;
&lt;h2 id=&#34;minor-changes&#34;&gt;Minor changes&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll make some small adjustments to titles (and URLs) of existing posts. Changed
URLs will be properly 301-redirected, nothing should break.&lt;/p&gt;
</description>
    </item><item>
      <title>Now</title>
      <link>https://sgeb.io/now/</link>
      <pubDate>Thu, 30 Jun 2016 00:00:00 +0000</pubDate>
      <atom:updated>Fri, 01 Oct 2021 00:00:00 +0000</atom:updated>
      
      <guid>https://sgeb.io/now/</guid>
      <description>&lt;p&gt;This is my &amp;ldquo;now&amp;rdquo; page, which is somewhat of a mix between an &amp;ldquo;about&amp;rdquo; page and a &amp;ldquo;what are you up to?&amp;rdquo; page. I drew inspiration from an idea by &lt;a href=&#34;https://nownownow.com/about&#34;&gt;Derek Sivers&lt;/a&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;&lt;img src=&#34;https://sgeb.io/img/profile_pic.png&#34; alt=&#34;Serge Gebhardt, profile pic&#34;&gt;&lt;/p&gt;
&lt;p&gt;I live in Munich, Germany, and work at &lt;a href=&#34;https://www.autoscout24.com&#34;&gt;AutoScout24&lt;/a&gt;, the largest online car marketplace in Europe, in the role of &lt;em&gt;Director of Engineering&lt;/em&gt;. I lead the Search &amp;amp; Performance group, which builds the core products matching buyers (demand) with relevant car stock (supply), providing the best possible experience while serving mutual interests. I additionally lead the Engineering Effectiveness group, responsible for developing tech strategy, guidance and tooling so that all engineering teams can work as effectively as possible.&lt;/p&gt;
&lt;p&gt;Before that I&amp;rsquo;ve led AutoScout24&amp;rsquo;s migration to AWS, in preparation of retiring the two physical datacenters (roughly 230 applications, 1500 server instances, 19 racks &amp;ndash; all in 14 months). I&amp;rsquo;ve also worked a number of years as software engineer in different product teams, with a focus on overall software architecture, before transitioning into the management side of tech.&lt;/p&gt;
&lt;p&gt;Previously I&amp;rsquo;ve spent 6 years as software engineering consultant at &lt;a href=&#34;https://www.thoughtworks.com&#34;&gt;ThoughtWorks&lt;/a&gt;, working with clients in Brazil (Porto Alegre), USA (San Francisco) and Germany (Hamburg, Berlin, Stuttgart and Munich).&lt;/p&gt;
&lt;p&gt;Prior to that I&amp;rsquo;ve co-founded a technology consulting company in Zurich, Switzerland.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Following my daughter&amp;rsquo;s birth in 2020, I&amp;rsquo;m spending most of my non-work time with family and friends. When I do find a quiet minute, I try to continue &lt;a href=&#34;https://sgeb.io/bookshelf/&#34;&gt;reading books&lt;/a&gt; (despite the strong appeal of just taking a nap instead, as nights have suffered since becoming a dad) and to tinker on &lt;a href=&#34;https://sgeb.io/projects/&#34;&gt;side projects&lt;/a&gt;. I also continue being an accounting and productivity nerd.&lt;/p&gt;
&lt;p&gt;You can reach me at: hello -at- this domain. My public GPG key has ID &lt;code&gt;1FCE89F3&lt;/code&gt;, download it as &lt;a href=&#34;https://sgeb.io/gpg/1FCE89F3.asc&#34;&gt;&lt;code&gt;.asc&lt;/code&gt;&lt;/a&gt; or &lt;a href=&#34;https://sgeb.io/gpg/1FCE89F3.gpg&#34;&gt;&lt;code&gt;.gpg&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;hr/&gt;
&lt;h3 id=&#34;currently-reading&#34;&gt;Currently reading&lt;/h3&gt;
&lt;div class=&#34;row&#34;&gt;
    &lt;ul class=&#34;side-by-side booklist&#34;&gt;
        &lt;li&gt;
            &lt;a href=&#34;https://sgeb.io/bookshelf/high-output-management/&#34;&gt;
                &lt;img src=&#34;https://sgeb.io/bookshelf/high-output-management/cover_small.jpg&#34; width=&#34;100&#34; height=&#34;153&#34; /&gt;
                &lt;div&gt;High Output Management&lt;/div&gt;
            &lt;/a&gt;
            
            &lt;div&gt;by Andrew S. Grove&lt;/div&gt;
            &lt;div&gt;&lt;span class=&#34;status&#34;&gt;(Reading)&lt;/span&gt;&lt;/div&gt;
        &lt;/li&gt;
        
    &lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;More books in the &lt;a href=&#34;https://sgeb.io/bookshelf/&#34;&gt;bookshelf&lt;/a&gt;.&lt;/p&gt;
</description>
    </item><item>
      <title>Outlook for Mac: How to rebuild search indexes</title>
      <link>https://sgeb.io/posts/outlook-mac-rebuild-search-indexes/</link>
      <pubDate>Thu, 16 Aug 2018 00:00:00 +0000</pubDate>
      <atom:updated>Thu, 16 Aug 2018 00:00:00 +0000</atom:updated>
      
      <guid>https://sgeb.io/posts/outlook-mac-rebuild-search-indexes/</guid>
      <description>&lt;p&gt;Today a colleague asked me for something I sent out via email. A search for the
appropriate keywords in Outlook only turned up year-old emails (we use Outlook
at work). Adjustments to the search scope — current folder, subfolders, all
folders — didn&amp;rsquo;t make a difference. I eventually had to use the outlook web
access to find the email.&lt;/p&gt;
&lt;p&gt;Outlook for Mac uses the macOS native Spotlight search as its search index. It
turns out these Spotlight search indexes were out of date or corrupted for the
relevant Outlook directories. Not sure why.&lt;/p&gt;
&lt;p&gt;Here is how to rebuild the Spotlight search indexes for Outlook for Mac 2016
(run in a terminal):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mdimport -d1 \
  -g &amp;#34;/Applications/Microsoft Outlook.app/Contents/Library/Spotlight/Microsoft Outlook Spotlight Importer.mdimporter&amp;#34; \
  &amp;#34;$HOME/Library/Group Containers/UBF8T346G9.Office/Outlook/Outlook 15 Profiles/Main Profile/&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rundown of the command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mdimport&lt;/code&gt;: command to import files into the macOS metadata datastore (aka
Spotlight).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d1&lt;/code&gt;: enable debug level 1.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-g &amp;lt;...&amp;gt;&lt;/code&gt;: load the plugin at provided path.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;$HOME/...&amp;quot;&lt;/code&gt;: path to the directory to index. &lt;code&gt;Main Profile&lt;/code&gt; is the default
profile, yours might be called differently.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This command might take a while to complete. After that Outlook found the emails
right away (might have to quit and restart Outlook first).&lt;/p&gt;
</description>
    </item><item>
      <title>Apple bug report: Screenshot controls on Touch Bar override shortcut behavior</title>
      <link>https://sgeb.io/posts/apple-bug-report-screenshot-settings-touch-bar-override-shortcut/</link>
      <pubDate>Tue, 07 Nov 2017 00:00:00 +0000</pubDate>
      <atom:updated>Fri, 10 Nov 2017 00:00:00 +0000</atom:updated>
      
      <guid>https://sgeb.io/posts/apple-bug-report-screenshot-settings-touch-bar-override-shortcut/</guid>
      <description>&lt;p&gt;The following is a bug report I&amp;rsquo;ve filed with Apple. Their bug database is not
public, so I&amp;rsquo;ve also submitted it to &lt;a href=&#34;https://openradar.appspot.com/&#34;&gt;Open
Radar&lt;/a&gt; and re-posting it here for future
reference.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update 2017-11-10:&lt;/strong&gt; the bug report was closed with &amp;ldquo;behaves as intended&amp;rdquo;.
Fair enough, though I was certainly confused by this intended behavior.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Product:&lt;/strong&gt; macOS → Preferences &lt;br&gt;
&lt;strong&gt;Classification:&lt;/strong&gt; Bug &lt;br&gt;
&lt;strong&gt;Bug Type:&lt;/strong&gt; UI/Usability &lt;br&gt;
&lt;strong&gt;Reproducibility:&lt;/strong&gt; Always &lt;br&gt;
&lt;strong&gt;Links:&lt;/strong&gt; &lt;a href=&#34;https://openradar.appspot.com/35388466&#34;&gt;rdar://35388466&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;Assume the option &amp;ldquo;Touch Bar shows: &lt;em&gt;App Controls with Control Strip&lt;/em&gt;&amp;rdquo; is set in
&lt;code&gt;Preferences → Keyboard&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;show_app_controls_with_control_strip.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;When the user invokes the system-wide shortcut to save a screenshot of a
selected area to a file (default: &lt;code&gt;shift-cmd-4&lt;/code&gt;), then additional screenshot
controls are displayed on the Touch Bar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;touch_bar_with_screenshot_controls.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;These settings are persisted and used as presets for the next invocation. This
effectively overrides the default behavior of the system-wide screenshot
shortcuts.&lt;/p&gt;
&lt;p&gt;It is particularly confusing when an option other than &amp;ldquo;Touch Bar shows: &lt;em&gt;App
Controls with Control Strip&lt;/em&gt;&amp;rdquo; is selected, such as &lt;em&gt;Expanded Control Strip&lt;/em&gt; or
&lt;em&gt;App Controls&lt;/em&gt;. Then the screenshot controls in the Touch Bar won&amp;rsquo;t display at
all, but the last-used settings are still in effect, without any feedback to the
user.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;show_expanded_control_strip.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;For example, if the user chose (using the Touch Bar) to copy the screenshot to
the clipboard instead of saving to a file, then all the system-wide screenshot
shortcuts will copy to clipboard&amp;mdash;even for those shortcuts that should
explicitly save to file (e.g. &lt;code&gt;shift-cmd-4&lt;/code&gt;). Same applies to other screenshot
settings selected on the Touch Bar (e.g. whether to capture a selected area or a
window, which application to open the screenshot in, etc).&lt;/p&gt;
&lt;p&gt;The only way I have found to restore the default macOS shortcut behavior is to
select the option &amp;ldquo;Touch Bar shows: &lt;em&gt;App Controls with Control Strip&lt;/em&gt;&amp;rdquo; and set
the screenshot controls to &amp;ldquo;Selected Portion&amp;rdquo; and &amp;ldquo;Save to Desktop&amp;rdquo;. Then revert
to the preferred option for &amp;ldquo;Touch Bar shows: &amp;hellip;&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;steps-to-reproduce&#34;&gt;Steps to Reproduce&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Execute the following in the terminal to set the screenshot storage location
to the Desktop:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; &amp;gt; defaults write com.apple.screencapture location ~/Desktop
 &amp;gt; killall SystemUIServer
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disable applications managing screenshots, such as Dropbox.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restore defaults in &lt;code&gt;Preferences → Keyboard → Shortcuts → Screen Shots&lt;/code&gt; and
enable all shortcuts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;shift-cmd-4&lt;/code&gt; to invoke the &amp;ldquo;Save picture of selected area as a file&amp;rdquo;
shortcut and take a screenshot of any part of the screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that the screenshot was saved on the Desktop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &amp;ldquo;Touch Bar shows: &lt;em&gt;App Controls with Control Strip&lt;/em&gt;&amp;rdquo; in &lt;code&gt;Preferences → Keyboard&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;shift-cmd-4&lt;/code&gt; to invoke the &amp;ldquo;Save picture of selected area as a file&amp;rdquo;
shortcut (do not select an area of the screen yet).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &amp;ldquo;Selected Portion&amp;rdquo; and &amp;ldquo;Save to &lt;em&gt;Clipboard&lt;/em&gt;&amp;rdquo; in the screenshot
controls on the Touch Bar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Take a screenshot of any part of the screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that the screenshot was indeed copied to the clipboard by pasting in a
Rich Text document in TextEdit.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select &amp;ldquo;Touch Bar shows: &lt;em&gt;Expanded Control Strip&lt;/em&gt;&amp;rdquo; in &lt;code&gt;Preferences → Keyboard&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press &lt;code&gt;shift-cmd-4&lt;/code&gt; to invoke the &amp;ldquo;Save picture of selected area as a file&amp;rdquo;
shortcut, verify that there is no feedback on the Touch Bar and take a
screenshot of any part of the screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that no screenshot file was saved on the Desktop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that the screenshot was copied to the clipboard by pasting in a Rich
Text document in TextEdit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;expected-results&#34;&gt;Expected Results&lt;/h2&gt;
&lt;p&gt;The last screenshot should be saved to the Desktop (same behavior as the first
shortcut). No options were presented to the user, hence the default behavior
applies.&lt;/p&gt;
&lt;h2 id=&#34;actual-results&#34;&gt;Actual Results&lt;/h2&gt;
&lt;p&gt;The last screenshot was copied to the clipboard (as set in the Touch Bar
screenshot controls for the previous screenshot).&lt;/p&gt;
&lt;h2 id=&#34;versionbuild&#34;&gt;Version/Build&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)&lt;/li&gt;
&lt;li&gt;macOS Sierra 10.12.6
&lt;ul&gt;
&lt;li&gt;latest update for Sierra as of time of this writing (2017-11-07)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;p&gt;No specific configuration.&lt;/p&gt;
</description>
    </item><item>
      <title>High Performance Browser Networking</title>
      <link>https://sgeb.io/bookshelf/high-performance-browser-networking/</link>
      <pubDate>Wed, 01 Nov 2017 00:00:00 +0000</pubDate>
      <atom:updated>Wed, 01 Nov 2017 00:00:00 +0000</atom:updated>
      
      <guid>https://sgeb.io/bookshelf/high-performance-browser-networking/</guid>
      <description>&lt;p&gt;A great reference on browser networking, my go-to book on the topic. I read the
third release (2015), which includes updates for HTTP/2.&lt;/p&gt;
&lt;p&gt;The material covers everything I was hoping to get out of the book. It is split
into four parts: low-level networking (TCP, UDP and TLS), wireless networks
(WiFi and mobile networks), HTTP (versions 1.x and 2), and finally browser APIs
(XHR, SSE, WebSocket, WebRTC). I found all chapters to hit the right depth of
detail&amp;mdash;except the one on WebRTC, which is quite exhaustive.&lt;/p&gt;
&lt;p&gt;Note that despite its name this is not a book about general web development. It
is about &lt;em&gt;networking&lt;/em&gt;. It provides insights and knowledge to optimize the
&lt;em&gt;networking&lt;/em&gt; aspects of web applications, whether on desktop or mobile device,
so that they yield the highest possible performance.&lt;/p&gt;
&lt;p&gt;A nice addition is that the book can be read online at the associated
&lt;a href=&#34;https://hpbn.co/&#34;&gt;website&lt;/a&gt;. This is helpful to quickly look something up and to
share links to a specific section.&lt;/p&gt;
&lt;p&gt;Here is the table of contents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Part 1. Networking 101
&lt;ul&gt;
&lt;li&gt;1. Primer on Latency and Bandwidth&lt;/li&gt;
&lt;li&gt;2. Building Blocks of TCP&lt;/li&gt;
&lt;li&gt;3. Building Blocks of UDP&lt;/li&gt;
&lt;li&gt;4. Transport Layer Security (TLS)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Part 2. Performance of Wireless Networks
&lt;ul&gt;
&lt;li&gt;5. Introduction to Wireless Networks&lt;/li&gt;
&lt;li&gt;6. WiFi&lt;/li&gt;
&lt;li&gt;7. Mobile Networks&lt;/li&gt;
&lt;li&gt;8. Optimizing for Mobile Networks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Part 3. HTTP
&lt;ul&gt;
&lt;li&gt;9. Brief History of HTTP&lt;/li&gt;
&lt;li&gt;10. Primer on Web Performance&lt;/li&gt;
&lt;li&gt;11. HTTP/1.X&lt;/li&gt;
&lt;li&gt;12. HTTP/2&lt;/li&gt;
&lt;li&gt;13. Optimizing Application Delivery&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Part 3. Browser APIs and Protocols
&lt;ul&gt;
&lt;li&gt;14. Primer on Browser Networking&lt;/li&gt;
&lt;li&gt;15. XMLHttpRequest&lt;/li&gt;
&lt;li&gt;16. Server-Sent Events (SSE)&lt;/li&gt;
&lt;li&gt;17. WebSocket&lt;/li&gt;
&lt;li&gt;18. WebRTC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item></channel>
</rss>
