<?xml-stylesheet href="/rss.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>cybersim&#39;s blog</title>
    <link>https://cybersim.ch/</link>
    <description>Recent content on cybersim&#39;s blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-UK</language>
    <managingEditor>check my website (cybersime)</managingEditor>
    <webMaster>check my website (cybersime)</webMaster>
    <lastBuildDate>Sun, 22 Mar 2026 09:20:33 +0100</lastBuildDate>
    
        <atom:link href="https://cybersim.ch/index.xml" rel="self" type="application/rss+xml" />
    
    
    
        <item>
        <title>APTs and Elephants</title>
        <link>https://cybersim.ch/posts/apts-and-elephants/</link>
        <pubDate>Sun, 22 Mar 2026 09:20:33 +0100</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/apts-and-elephants/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/apts-and-elephants/ -&lt;p&gt;The threat landscape is scattered with animals: pandas, bears, and even kittens — all dangerous cyber creatures. There&amp;rsquo;s even sandworms and sandstorms. These names are commonly used by vendors, researchers and threat intelligence companies to designate APTs, Advanced Persistent Threats. Each company has its own nomenclature: Microsoft uses a &lt;a href=&#34;https://learn.microsoft.com/en-us/unified-secops/microsoft-threat-actor-naming&#34;&gt;weather system&lt;/a&gt;, Palo Alto&amp;rsquo;s Unit 42 references &lt;a href=&#34;https://unit42.paloaltonetworks.com/unit-42-threat-group-naming-update/&#34;&gt;star constellations&lt;/a&gt;, and in 2013, Mandiant (now Google) published a &lt;a href=&#34;https://cloud.google.com/blog/topics/threat-intelligence/mandiant-exposes-apt1-chinas-cyber-espionage-units&#34;&gt;report on the initial APT1&lt;/a&gt;, which is associated with the Chinese government. MITRE maintains an extensive list of commonly known &lt;a href=&#34;https://attack.mitre.org/groups/&#34;&gt;threat actor groups&lt;/a&gt;; threat intelligence researchers usually keep their own &amp;ldquo;Spreadsheet of Doom&amp;rdquo;, a Who&amp;rsquo;s Who of threat actors.&lt;/p&gt;
&lt;p&gt;Newcomers to cyber threat intelligence (CTI) examine such a list and observe that &lt;a href=&#34;https://attack.mitre.org/groups/G0094/&#34;&gt;Magic Hound&lt;/a&gt; is also called TA453, COBALT ILLUSION, Charming Kitten, ITG18, Phosphorus, Newscaster, APT35, or Mint Sandstorm. They are then tempted to draw a big equals sign between all these names. Which name to use is left to the author or their employer; sometimes, it is simply what initially stuck in public perception. For example, I read more about &amp;ldquo;Charming Kitten&amp;rdquo; and less about &amp;ldquo;Magic Hound&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;However, APTs are a construct.&lt;/p&gt;
&lt;p&gt;They are not clear-cut entities.&lt;/p&gt;
&lt;p&gt;Rather, these names are similar to &lt;a href=&#34;https://en.wikipedia.org/wiki/Blind_men_and_an_elephantblind&#34;&gt;blind people who touch an elephant for the first time&lt;/a&gt; and describe their impression of what an elephant is (Sinology side note: 盲人摸像). Each company requires data to form any threat intelligence. For those who sit at the intelligence source, this means customer data, such as agents running on customer devices, or employees responding to customer incidents. Sophos serves many SMEs, which means their data is based on small companies who are often easily compromised. Google Mandiant responds to incidents of Fortune 500 companies, who operate on a global scale and usually have a decent security posture. Kaspersky has lost a lot of Western customers since the war in Ukraine started, which means their customers are now in other parts of the world, with different IT environments than Europe. Consequently, the data that formed &amp;ldquo;Magic Hound&amp;rdquo; won&amp;rsquo;t be identical to the one that constructed &amp;ldquo;Charming Kitten&amp;rdquo;. Based on some similarities however, they are commonly grouped together. As a result, analysts see the various names of a group on MITRE&amp;rsquo;s web site and use their names interchangeably, which is imprecise and misses this key background knowledge.&lt;/p&gt;
&lt;p&gt;And what distinguishes your run-of-the-mill script kiddie from an APT? What turns a UNC (UNCagetorized threat actor, Mandiant) into a Kitten (threat actor linked to Iran, CrowdStrike)?  Most vendors have their &amp;ldquo;secret magic sauce&amp;rdquo; that marks the birth of a threat group. As an open-source, vendor-neutral rule of thumb: An activity group can be formed when two vertices of the &lt;a href=&#34;https://www.recordedfuture.com/blog/diamond-model-intrusion-analysis&#34;&gt;Diamond Model&lt;/a&gt; overlap across intrusions or campaigns, for example overlaps in infrastructure and victims. Note that this must not be necessarily an &amp;ldquo;APT&amp;rdquo;; and all companies will have their own methodology of what constitutes &amp;ldquo;their&amp;rdquo; APTs.&lt;/p&gt;
&lt;p&gt;Finally, APTs change over time. China&amp;rsquo;s PLA and general governmental system have been overhauled multiple times under Xi Jinping, and the TTPs of the &lt;a href=&#34;https://attack.mitre.org/groups/G0032/&#34;&gt;Lazarus Group&lt;/a&gt; has surely not stayed identical since 2009.&lt;/p&gt;
&lt;p&gt;Which name to use, then? CTI is, like its big aunt Journalism, about who consumes the intelligence. Most of your audiences won&amp;rsquo;t be aware of the minutiae detailed in this blog post. They likely don&amp;rsquo;t even care. So: Use the threat actor name that fits your audience, but try to point out somewhere whose nomenclature it is and provide one, two alternative names. If you say &amp;ldquo;ELECTRUM&amp;rdquo;, my brain will draw a blank, but if you say &lt;a href=&#34;https://attack.mitre.org/groups/G0034/&#34;&gt;&amp;ldquo;Sandworm&amp;rdquo;&lt;/a&gt;, I&amp;rsquo;ll see the elephant.&lt;/p&gt;
&lt;p&gt;Image Source: Nightcafe/Flux 2&lt;/p&gt;
- https://cybersim.ch/posts/apts-and-elephants/ - </description>
        </item>
    
    
    
        <item>
        <title>It&#39;s Been a While</title>
        <link>https://cybersim.ch/posts/its-been-a-while-infosec/</link>
        <pubDate>Fri, 05 Dec 2025 10:00:24 +0100</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/its-been-a-while-infosec/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/its-been-a-while-infosec/ -&lt;p&gt;&amp;ldquo;You know a lot&amp;rdquo;, remarked an apprentice recently while I was looking at some tickets from the Stone Age and explaining long-gone threats. The more younger people join infosec, the more I realise: Yes, in fact, I have been around for a while. Surely, &lt;em&gt;Hackers&lt;/em&gt; (1995) was my gateway drug, but attending my first Chaos Communication Congress in 2010 was true First Contact. Back then, if you weren&amp;rsquo;t already working in tech, this was one of the few opportunities to dive into infosec topics. Live-hacking CTFs on YouTube were not really a thing yet, and if you wanted access to the scene, this was the place to go. Most other conferences — even today — have price tags clearly meant to be paid by an employer and not by yourself. And if it&amp;rsquo;s one-third of your part-time salary, why even bother? During the 2010s, I became a regular C3 attendee while also connecting with more and more peers online (thanks, 2010s Twitter). And even though I&amp;rsquo;m only a few years into an actual infosec job, the knowledge has accumulated: Confs, meet-ups, more confs, workshops, years of tech-journalism, a computer science degree.&lt;/p&gt;
&lt;p&gt;A lot has changed. My first &lt;a href=&#34;https://blackhoodie.re/&#34;&gt;Blackhoodie&lt;/a&gt; workshop was a watershed moment (eternal thanks, Marion): For the first time in my life I was in a room full of other women keen on learning reverse engineering. They exist! The event grew from 30 to 80 women within a couple of years and is now a movement of its own, with self-organised events all over the world. Infosec has become more &lt;em&gt;accessible&lt;/em&gt;. Gatekeeping in offensive security and &amp;ldquo;hacking&amp;rdquo; is still the modus operandi, but CTFs have proliferated, most conferences stream to YouTube (even some pricey ones), tutorials and materials are everywhere.&lt;/p&gt;
&lt;p&gt;A lot has not changed. Fifteen years later, I still enter a room full of strangers and no one takes it for granted that I can actually handle a computer, let alone a command line. You can have a conference for women in cybersecurity, but once you subtract all non-technical people, the number left is your representation in today&amp;rsquo;s teams. Women&amp;rsquo;s toilets at infosec events still have next to no queues (except for said conference type). Non-tech people are amazed to hear that, yes, the percentage of women (and other non-cis-het-White-male identities) in my field has remained low. &lt;a href=&#34;https://cybersim.ch/posts/tiring-questions-quick-answers/&#34;&gt;Please do not ask me why&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But: Over the last 15 years, I&amp;rsquo;ve grown to become part of communities — especially &lt;a href=&#34;https://rhacklette41.github.io/about/&#34;&gt;local communities&lt;/a&gt;. Our tiny, casual meet-up before the Pandemic has grown into a sizeable member group. Once a month I get to sit at a table with like-minded FINTA people; once a year I am in a room full of good old friends and peers who accompanied me for the last 10+ years (thanks!). &amp;ldquo;Nevertheless, she persisted&amp;rdquo;, goes the popular saying, and hopefully, when I retire, everyone who enters a room will at least be considered a potential next Acid Burn.&lt;/p&gt;
- https://cybersim.ch/posts/its-been-a-while-infosec/ - </description>
        </item>
    
    
    
        <item>
        <title>The Birthday Dress</title>
        <link>https://cybersim.ch/posts/the-birthday-dress/</link>
        <pubDate>Sat, 13 Sep 2025 11:01:09 +0200</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/the-birthday-dress/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/the-birthday-dress/ -&lt;p&gt;Some birthdays are more special than others, and some projects are more challenging than others. My &lt;a href=&#34;https://charmpatterns.com/joan-wiggle-dress-pattern/&#34;&gt;&amp;ldquo;Joan Wiggle Dress&amp;rdquo;&lt;/a&gt; represents both.  The pattern was the reason why I joined Gertie&amp;rsquo;s Patreon in the first place, but the striped, stretchy Ponte that is required for the chevron pattern was surprisingly hard to find. After several twists and turns my research led to a mauve stretch lace with a wave pattern (of all things) in an online shop. Several months later I found the perfect backdrop in a brick-and-mortar shop: silver faux leather. Never have I sewn lace or faux leather — this project was going to match the birthday in uniqueness.&lt;/p&gt;
&lt;p&gt;While the pattern is simple and comes together quickly, the materials were a challenge: Lace is tricky, faux leather too thick to handle, and together they spell trouble. I did a lot of research on sewing techniques and received savvy advice &lt;a href=&#34;https://cybersim.ch/posts/erasure-of-expertise/&#34;&gt;in a local haberdashery shop that has sadly closed since&lt;/a&gt;. Without that expert lady there, this project would have failed spectacularly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cybersim.ch/images/birthday-dress-progress.jpg&#34; alt=&#34;Progress pictures of the Joan Wiggle Dress front&#34;&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s some notes on the process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Three prototypes&lt;/li&gt;
&lt;li&gt;Test-wash everything&lt;/li&gt;
&lt;li&gt;One-shot sewing only, no ripping open of seams. Clippers are your best friends – every pin, every needle leaves permanent holes.&lt;/li&gt;
&lt;li&gt;Adjusted the height (easy) and orientation of the bust dart (hard). Many finished dresses show a &amp;ldquo;V&amp;rdquo;-shaped bust dart instead of a straight line, and I wanted a straight one too.&lt;/li&gt;
&lt;li&gt;So much cold sweat lost over matching up the lace on the vertical front seam&lt;/li&gt;
&lt;li&gt;Thank you, shop lady: Faux leather dulls the needle in the blink of an eye, so do not use the overlocker or its knife. Changed Jeans needles twice on my regular sewing machine.&lt;/li&gt;
&lt;li&gt;Use the lace like interlining and sew it onto the underlying faux leather, then treat as one&lt;/li&gt;
&lt;li&gt;To achieve this, use wash-away stay tape to fix the lace onto the seam allowance of the feaux leather, then zigzag the two together&lt;/li&gt;
&lt;li&gt;Feaux leather does not need to be finished and can be left untreated&lt;/li&gt;
&lt;li&gt;Thank you, shop lady: A wash-away film called &amp;ldquo;Avalon&amp;rdquo; from Madeira is used for quilting, but I used it to sew together the bust darts. Sew the film just inside the bust dart seams onto the right side of the interlined fabric, then close the bust dart. That way, the lace does not shift on the slippery feaux leather and you get precise seams.&lt;/li&gt;
&lt;li&gt;Hand sewing. So much hand sewing. I sewed all the seams by hand and finished the hem with a lace band.&lt;/li&gt;
&lt;li&gt;Best worn with an underdress&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://cybersim.ch/images/birthday-dress-collage.jpg&#34; alt=&#34;The Joan Wiggle Dress, collage front, close-ups of front and hem, side-view&#34;&gt;&lt;/p&gt;
&lt;p&gt;The amount of  XP gained during this project definitely unlocked a new sewing skill level: The dress turned into an absolute success! This marvelous Joan Wiggle Dress is the first glamour item in my wardrobe, and it shall be worn on many fancy occasions to come. Also the faux leather feels like a second skin and &lt;em&gt;still&lt;/em&gt; the dress is comfortable to wear for hours. If ever I can find striped Ponte, there shall be a twin for less glamorous events.&lt;/p&gt;
- https://cybersim.ch/posts/the-birthday-dress/ - </description>
        </item>
    
    
    
        <item>
        <title>Die neue Mitbewohnerin</title>
        <link>https://cybersim.ch/posts/dressform/</link>
        <pubDate>Sun, 07 Sep 2025 18:44:48 +0200</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/dressform/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/dressform/ -&lt;p&gt;Verrenkter Nacken, zerstochene Finger, ungelenke Selfies: Irgendeinmal war genug. Eine Schneiderbüste musste her. Also ein Torso auf einem Ständer, woran eine Hobbyschneiderin alle Änderungen und Drapierungen anbringt, um sie später auf das Schnittmuster zu übertragen. Statt sich verzweifelt vor dem Badezimmerspiegel zu drehen und Nadeln in den &lt;del&gt;Körper&lt;/del&gt; Stoff zu stechen, arbeitet man sozusagen mit einem Ersatzkörper. Doch nicht irgendeinen – ich wollte &lt;em&gt;meinen&lt;/em&gt;. Denn egal, ob Ready-to-Wear-Kleider oder Off-the-Shelf-Büsten, mein Körper ist jenseits jeglicher Zielgruppenvorstellungen.&lt;/p&gt;
&lt;p&gt;Vor Jahren hatte ich bereits ein kleines, kanadisches Unternehmen im Auge. Dessen Geschäftsmodell ist ähnlich wie die (gescheiterte) Idee der Kleidermarke Zozo: Die Kundin erhält einen lustigen, hautengen Anzug nach Hause (Stichwort: Mocap), scannt den eigenen Körper mit dem Smartphone, und das Unternehmen fertigt daraus eine Schneiderbüste. Damals ging die Idee von Zozo ein, weil die Messungen viel zu ungenau waren. Zufällig entdeckte ich ein Schweizer Unternehmen, das ebenfalls Schneiderbüsten auf Mass anfertigt; und da ich gerne lokale Geschäfte unterstütze, unternahm ich einen Roadtrip in die Heimatregion von Wilhelm Tell.&lt;/p&gt;
&lt;p&gt;Am Dorfeingang begrüssten mich bereits die Statuen von Tell und Walter, doch bei &amp;ldquo;Zimmermann Büsten&amp;rdquo; war es keine Frau Zimmermann, sondern Jenny Curtins: Die gelernte Damen- und Theaterschneiderin folgte während Corona dem Ruf ihrer heimatlichen Berge und kehrte nach Schwyz zurück. Dort kam sie in Kontakt mit der bereits älteren Inhaberin von &amp;ldquo;Zimmermann Büsten&amp;rdquo;, einem Betrieb, der seit 1937 Büsten von Hand herstellt. Von ihr lernte sie das Handwerk, übernahm den Betrieb und beschloss, den Fertigungsprozess um einen Twist zu erweitern.&lt;/p&gt;
&lt;p&gt;Und hier kommt das wundersame Venn-Diagramm &amp;ldquo;Hobbyschneiderin&amp;rdquo; und &amp;ldquo;Computernerd&amp;rdquo; ins Spiel. Treffen sich nämlich klassisches Handwerk und moderne Technologie, ist meine Neugierde geweckt. In einem iterativen Prozess entwickelte Jenny Curtins eine neuartige Schneiderbüste auf Mass, wobei sie das gelernte, traditionelle Büstenhandwerk um moderne Technologien erweiterte. Ihre Innovation traf genau meine Schnittmenge, und als Journalistin wäre daraus sofort eine Reportage geworden. Nun arbeite ich aber in der Infosec, und mein kleiner Blog muss für die Story herhalten.&lt;/p&gt;
&lt;p&gt;Ich betrat also das Obergeschoss des Chalets, wo sie zusammen mit einer Freundin ihr Atelier beherbergt. In einem holzgetäferten Zimmer mit niedriger Decke zwängte ich mich zuerst in Shapewear, um allfällige Unebenheiten auszugleichen. Dann betrat ich eine kleine Plattform ohne mir den Kopf an der niedrigen Decke anzustossen, und erstarrte in der Pose einer Schaufensterpuppe. Während die Plattform rotierte und ich sie mit Fragen löcherte, nahm Jenny Curtins mit einem 3D-Handscanner meine Körperform digital auf. Zu meiner Überraschung hat die Technologie in den letzten Jahren enorme Fortschritte gemacht und sich von einem hochpreisigen Industrieprodukt zu kommerzialisierter Massenware entwickelt. Massenware, die Innovation im Kleinen ermöglicht. Schliesslich bestaunte ich mein 3D-Rohbild im Handscanner – eine Punktewolke mit noch vielen Unebenheiten, die später am Computer ausgebessert werden müssen.&lt;/p&gt;
&lt;p&gt;Danach folgt der Schritt von digital zu analog: Das finale Modell wird im 3D-Drucker gedruckt und dann in  klassischer Fertigungsweise zu einer Büste verarbeitet. Der Torso wird aussen gekleistert, mit einer Wattierung versehen und danach mit Stoff satt überzogen. Same-Day-Delivery ist ausgeschlossen – der ganze Prozess dauert mehrere Monate. Und wenn schon lokal, dann richtig: Der Holzständer kam gleich vom ansässigen Drechsler.&lt;/p&gt;
&lt;p&gt;Drei Monate später kam sie endlich, die Schneiderbüste, die verdrehte Nacken, zerstochene Finger und ungelenke Selfies erübrigt. Ein Meilenstein nach bald zehn Jahren Hobbyschneiderei: Check! Und last but not least: Bessere Bilder! Denn die Büste ermöglicht, den Blog hier mit besseren Aufnahmen meiner Werke zu zieren. Zwei ältere Blog-Posts haben deswegen gleich bessere Bilder erhalten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cybersim.ch/posts/git-commit-dress/&#34;&gt;The Git Commit Dress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://cybersim.ch/posts/python-nobubo/&#34;&gt;From Dress to Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Schlussnotiz 1: Es gibt bewusst keine Links - der Post ist keine gesponserte Werbung, sondern eine Würdigung des Venn-Diagramms &amp;ldquo;klassisches Handwerk trifft moderne Technologie&amp;rdquo;. Wer mehr zum Unternehmen wissen möchte, weiss wie googeln.&lt;/p&gt;
&lt;p&gt;Schlussnotiz 2: Der Blog-Post entstand zuerst auf Englisch, aber irgendwie hing ich fest. Der Text wollte einfach nicht von der Hand gehen. Wechsel auf Deutsch, und siehe da – die Worte flossen. Ein Fall von &lt;a href=&#34;https://cybersim.ch/posts/neither-fish-nor-bird/&#34;&gt;lokalem Einkaufen, lokalem Schreiben&lt;/a&gt;.&lt;/p&gt;
- https://cybersim.ch/posts/dressform/ - </description>
        </item>
    
    
    
        <item>
        <title>Erasure of Expertise</title>
        <link>https://cybersim.ch/posts/erasure-of-expertise/</link>
        <pubDate>Fri, 30 May 2025 08:32:47 +0200</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/erasure-of-expertise/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/erasure-of-expertise/ -&lt;p&gt;There&amp;rsquo;s a shop in my town that&amp;rsquo;s about to close. I usually don&amp;rsquo;t care about such announcements, as a lot of my shopping happens online anyway. Except when.&lt;/p&gt;
&lt;p&gt;Except I&amp;rsquo;m a hobby sewist with no formal training, who entered the craft by way of Burda without Google or YouTube (1/10 would not recommend). I still learn by failing and improve with each garment, but sometimes I am just &lt;em&gt;stuck&lt;/em&gt;. Stuck as in unable to measure myself properly, stuck as in unable to do certain fitting adjustments. Stuck, because of lacking expertise. Of course, there&amp;rsquo;s plenty of expertise online, yet also &amp;ldquo;&lt;a href=&#34;https://clothingengineer.com/2025/04/13/master-the-coverstitch-machine/&#34;&gt;expertise&lt;/a&gt;&amp;rdquo;. This is when human contact helps you to become unstuck. And I kid you not, such humans can also be found in real stores.&lt;/p&gt;
&lt;p&gt;Many bigger towns have at least one brick-and-mortar haberdashery selling &lt;em&gt;just that one thing&lt;/em&gt; that you need to succeed. That button in the perfect matching color. Top-quality zippers. Horsehair canvas. But these stores not only sell things, they have staff who know their stock down to the last tiny brooch and are often skilled crafters and sewists themselves. Elderly women who have sewn all their lives, know the tricks of the trade, and how to complete the most intricate projects – and who are more than happy to share their knowledge.&lt;/p&gt;
&lt;p&gt;This is why I love and need physical shops: They not only sell goods, they also provide expertise. A recent project (to be blogged) had so many firsts that I was at a loss as how to tackle it. Instead of finding questionable opinions online, I went to my local haberdashery and the employee there knew exactly what I needed, provided options, and I succeeded thanks to her help.&lt;/p&gt;
&lt;p&gt;When I went back with my finished pride, I spotted a note of doom in the shop window: The original owner retires and closes the store. It will likely be replaced by some chain, whose employees answer every question with &amp;ldquo;We only have what&amp;rsquo;s here&amp;rdquo;. I presented my project to the employee to thank her and share my joy – and expressed my grief about the shop&amp;rsquo;s closure. Its end erases the best haberdashery in my vicinity, and all the expertise that helped my project to completion. &amp;ldquo;We are looking for a successor&amp;rdquo;, she said politely. Her eyes were watery.&lt;/p&gt;
&lt;p&gt;Image source: Nightcafé/Google Imagen 3.0&lt;/p&gt;
- https://cybersim.ch/posts/erasure-of-expertise/ - </description>
        </item>
    
    
    
        <item>
        <title>Reflections on Writing and AI</title>
        <link>https://cybersim.ch/posts/ai-writing-reflections/</link>
        <pubDate>Sun, 13 Apr 2025 20:00:51 +0200</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/ai-writing-reflections/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/ai-writing-reflections/ -&lt;p&gt;The most frequent answer you hear in IT: &amp;ldquo;It depends&amp;rdquo;. Using AI to write texts? &amp;ldquo;It depends&amp;rdquo;. End of story.&lt;/p&gt;
&lt;p&gt;Just kidding.&lt;/p&gt;
&lt;p&gt;The answer I sent to my colleague was longer — basically a mini-blog post that evolved into this one.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;First, the good news: Asking GenAI to write texts &lt;em&gt;is&lt;/em&gt; useful. My native language is Swiss German; an AI that fixes my non-native English errors is a game changer. I will always miss some meanings, idioms, gerunds — things the AI can spot and explain.&lt;/p&gt;
&lt;p&gt;Other use cases resemble the idea of &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Gebrauchsmusik&#34;&gt;Gebrauchsmusik&lt;/a&gt;&amp;rdquo;, which in this case would be &amp;ldquo;&lt;a href=&#34;https://de.wikipedia.org/wiki/Gebrauchstext&#34;&gt;Gebrauchstexte&lt;/a&gt;&amp;rdquo; in a wider sense: Boilerplate texts with specific purposes that I find tedious to write, as it is about formalities, less about creativity. Let AI handle the boring stuff.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s basically it.&lt;/p&gt;
&lt;p&gt;If you look at a football field or a golf course, all you see is grass, neatly trimmed to the same height, conforming to some standard. It&amp;rsquo;s boring as hell. AI texts are a trimmed sports lawn. Sometimes, uniformly dull with lots of empty phrases.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;  Sometimes, they are repetitive and lackluster, void of any rhetorical device or sense of rhythm.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; It&amp;rsquo;s like walking through a concrete industrial space instead of walking through a lively, colorful street. But writing should use all the colors to play and paint a picture that echoes your inner voice.&lt;/p&gt;
&lt;p&gt;Text is also like clay: It can be easily reshaped into any form. Following this metaphor, I am rarely attached to my texts.&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;  If you ask me to scrap them, edit them, change them in any way and give me a good reason to do so, I am happy to oblige. Especially if you are an editor who does these things daily. Always trust the editor. The editor will improve your text, while keeping its origins. On the other hand, the AI lawn mower alters your texts ignoring both their essence and your voice.&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Which brings up the next point: Editing is not the same as writing. Me reviewing AI output requires a different skill set than writing. It requires fact-checking details, looking for cohesion and what&amp;rsquo;s missing. Writing, however, is something completely different. As a journalist I learned the phrase that you truly understood a topic if you&amp;rsquo;ve reported on it. Not by reading, but by creating a story and writing it, no matter if it&amp;rsquo;s for ears or eyes. Thinking is often a mess, jumbled, chaotic. Writing means putting elements in a sequential order, considering the how and why, what&amp;rsquo;s left in and out. What&amp;rsquo;s at the core of this problem? This is the major issue. Then the minor one. Finally, what&amp;rsquo;s not relevant and left out. AI will save you the trouble, but also shave down your skills.&lt;/p&gt;
&lt;p&gt;Coincidentally, two recent blog posts even highlight this: &lt;a href=&#34;https://lucianonooijen.com/blog/why-i-stopped-using-ai-code-editors/&#34;&gt;Luciano Nooijen writes&lt;/a&gt; how he ditched most code editors as he lost his &amp;ldquo;Fingerspitzengefühl&amp;rdquo; when coding (another German word!). &lt;a href=&#34;https://lucianonooijen.com/blog/why-i-stopped-using-ai-code-editors/&#34;&gt;Nico Dekens writes&lt;/a&gt; how CTI analysts lose their critical thinking because they rely too much on AI output. Writing, coding, critical thinking all turned into passive skills when they are in fact a craft.&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I neither want to lose my voice nor my craft.&lt;/p&gt;
&lt;p&gt;Addendum: While writing this, I realized that my criticism is actually bigger than the listed advantages. That is not my final verdict though. My final verdict is that we still learn to use AI for all sorts of tasks, while figuring out what helps and what harms us in the long run. We need to try and experiment — and have discussions about it.&lt;/p&gt;
&lt;p&gt;Post addendum: Of course I asked GenAI to fix my English. It changed &lt;code&gt;&amp;quot;It depends&amp;quot;.&lt;/code&gt; to &lt;code&gt;&amp;quot;It depends.&amp;quot;&lt;/code&gt;. Thanks, AI, but this is a decision that usually precedes eons of newsroom editor fights, and differs across English variants. You just changed it.&lt;/p&gt;
&lt;p&gt;The AI also rewrote &lt;code&gt;Sometimes, uniformly dull with lots of empty phrases. Sometimes, repetitive and lackluster, devoid of any rhetorical device or sense of rhythm.&lt;/code&gt; to a &lt;code&gt;Sometimes uniformly dull, filled with empty phrases. At other times, they’re repetitive and lifeless, lacking rhetorical devices or any sense of rhythm.&lt;/code&gt; It completely missed the intentional repetition for exactly the reason it was criticized.&lt;/p&gt;
&lt;p&gt;Image source: Nightcafé/Dreamshaper XL Lightning&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Sorry, dear colleague, for the wall of text that may have surprised you, not sorry, because it led to an intellectual exchange that sparked my thinking and writing. Thank you :)&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Many models have been trained on the sales pitches and ads that pollute the open web.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;I won&amp;rsquo;t link that infosec blog post from a big vendor. It was a desert made of concrete.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;Why else would I publish them here? But: Stealing my texts and &amp;ldquo;repurposing&amp;rdquo; them as yours is not clay, that&amp;rsquo;s plagiarism.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;This is where &amp;ldquo;Gebrauchstexte&amp;rdquo; as a term is handy: They do not need to carry my voice. If I have to write Gebrauchstexte, let the AI do it – no problem.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;Many, many years ago I read &lt;a href=&#34;https://en.wikipedia.org/wiki/The_Craftsman_%28book%29&#34;&gt;Richard Sennett&amp;rsquo;s &amp;ldquo;The Craftsman&amp;rdquo;&lt;/a&gt;. I dimly remember it&amp;rsquo;s basically about exactly this topic and I should give it another read.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
- https://cybersim.ch/posts/ai-writing-reflections/ - </description>
        </item>
    
    
    
        <item>
        <title>Adventures in Keyboarding: Daily Drivers</title>
        <link>https://cybersim.ch/posts/adventures-in-keyboarding-daily-drivers/</link>
        <pubDate>Thu, 20 Mar 2025 19:22:28 +0100</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/adventures-in-keyboarding-daily-drivers/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/adventures-in-keyboarding-daily-drivers/ -&lt;p&gt;Peak influencer-dom has probably been reached when you convince other co-workers to buy a good-quality-but-pricey keyboard. Since my last blog post, two more Moonlanders appeared on our floor, and it all started with rows of blinkenlights on my desk instead of lettered keykaps. Three Moonlanders on one office floor should be enough to finally report results after long-term usage.&lt;/p&gt;
&lt;h1 id=&#34;pain-and-posture&#34;&gt;Pain and Posture&lt;/h1&gt;
&lt;p&gt;Monotony is the enemy of good posture, and so it is with my keyboards: Instead of completely switching to the Moonlander, I alternate between my trusty QWERTZ, off-the-shelf keyboard and the Bone-layout Moonlander. On some days, I prefer typing at high-speed, on others I crave the macros and dedicated special keys which I configured on my own layout. I will never reach my QWERTZ speeds with the Bone layout, but a mouse, scroll wheel, and media control all on one keyboard makes it a powerful tool for tedious tasks.  Form-wise, I currently use the Moonlander with its platform add-ons, and prop up the hand rests via stacked cardboards, so I don&amp;rsquo;t create a dent in my wrists. My body also welcomes these changes: The more variety I introduce, the better for my posture. Conversely, the more monotony my body suffers, the more it complains.&lt;/p&gt;
&lt;h1 id=&#34;traveling-back-to-basics&#34;&gt;Traveling: Back to Basics&lt;/h1&gt;
&lt;p&gt;Traveling gear is the only thing I have not quite figured out yet. One thing I love about my &lt;a href=&#34;https://cybersim.ch/posts/adventures-in-keyboarding/&#34;&gt;Kyria&lt;/a&gt;, the little keyboard that started my keyboarding adventures: At 480g, it&amp;rsquo;s extremely compact and light. However, it gave me some wrist pains and I just can&amp;rsquo;t reach a reasonable typing speed. On the other hand, I shlepped the Moonlander in a big plastic box to a week-long workshop and struggled to set up and stow away the thing every day. For another recent workshop I brought a cheap, light Logitech QWERTZ keyboard, which was enough for the occasional typing. At 75%, it neatly fits into my backpack and I can temporarily live without a numpad. For now, this is my go-to solution.&lt;/p&gt;
&lt;h1 id=&#34;layout-and-macros&#34;&gt;Layout and Macros&lt;/h1&gt;
&lt;p&gt;After over two years, my &lt;a href=&#34;https://configure.zsa.io/moonlander/layouts/4oNyo/6rLyN/0&#34;&gt;Bone-DE-CH&lt;/a&gt; layout has been refined to the bone (ha). The only downside lies in some macros: the circumflex and the backtick are notoriously cumbersome to type on a Swiss keyboard, and I&amp;rsquo;ve written macros for each. Sadly, they cannot be directly integrated in ZSA&amp;rsquo;s online tool Oryx (or I was too impatient for a GUI deep-dive), so flashing the keyboard directly from the browser is not possible. Instead, I:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download the source&lt;/li&gt;
&lt;li&gt;Fiddle the macros into the updated keymap file&lt;/li&gt;
&lt;li&gt;Compile the firmware&lt;/li&gt;
&lt;li&gt;Flash the keyboard using Wally&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It works, but it&amp;rsquo;s time-intensive and I fear Wally won&amp;rsquo;t be supported anymore at some point. Here are the two macros for those who want to add them to their own QMK keymap (DE-CH):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;enum&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;custom_keycodes&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;ST_MACRO_0&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;ST_MACRO_1&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// --- lots of layers here ---
&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;bool&lt;/span&gt; &lt;span style=&#34;color:#75af00&#34;&gt;process_record_user&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;uint16_t&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;keycode&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;keyrecord_t&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;record&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:#00a8c8&#34;&gt;switch&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;keycode&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:#00a8c8&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;ST_MACRO_0&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:#00a8c8&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;record&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;event&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;pressed&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:#75af00&#34;&gt;SEND_STRING&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;SS_TAP&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;X_EQL&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;SS_TAP&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;X_SPC&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;));&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// prints ^ with one keystroke
&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#00a8c8&#34;&gt;break&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:#00a8c8&#34;&gt;case&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;ST_MACRO_1&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:#00a8c8&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;record&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;event&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;pressed&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:#75af00&#34;&gt;SEND_STRING&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;SS_DOWN&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;X_LSFT&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;SS_TAP&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;X_EQL&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;SS_UP&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;X_LSFT&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#75af00&#34;&gt;SS_TAP&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;X_SPC&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;));&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// prints backtick ` with one keystroke
&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;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#00a8c8&#34;&gt;break&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;All in all it took me about six months to learn the layout, another six to master all the unconscious controls like Alt+F4 or Ctrl+S, and touch-typing complex passwords is still next-level &lt;em&gt;hard&lt;/em&gt;.&lt;/p&gt;
&lt;h1 id=&#34;blinkenlights-baby&#34;&gt;Blinkenlights, Baby&lt;/h1&gt;
&lt;p&gt;Strangers rarely assume I&amp;rsquo;m a computery person even if I and the job title say I am  – something something bias – until they see my keyboard. The blank blinkenlight keycaps evoke gasps and seem to max out my hacker scale in the eye of the beholder, when all I can say is &amp;ldquo;I really like computers&amp;rdquo; and &amp;ldquo;pain is a good motivator&amp;rdquo;. Still, it amazes me how much the Moonlander serves as a &lt;a href=&#34;https://en.wikipedia.org/wiki/Signified_and_signifier&#34;&gt;signifier&lt;/a&gt; of nerd-dom, instead of being just a tool that suits your needs. It&amp;rsquo;s also a bit sad to still experience this in 2025.&lt;/p&gt;
- https://cybersim.ch/posts/adventures-in-keyboarding-daily-drivers/ - </description>
        </item>
    
    
    
        <item>
        <title>From Black Magic to Pandas in CTI</title>
        <link>https://cybersim.ch/posts/cti-pandas-heatmap/</link>
        <pubDate>Fri, 21 Feb 2025 16:23:59 +0100</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/cti-pandas-heatmap/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/cti-pandas-heatmap/ -&lt;p&gt;Every day, black magic is performed in offices; mysterious numbers appear on-screen as if directed by an invisible hand. The tool for such a magical performance is called Excel. While I use it for simple budgetary needs, I do not excel at using it (scnr) and admire everyone who knows how. To this day, it still looks like black magic to me, and I rather prefer excelling (sorry-not-sorry) in the art of taming Pythons.&lt;/p&gt;
&lt;p&gt;Recently I was given the chance to attend the SANS FOR578 class on Cyber Threat Intelligence which was a delight in itself. The other delight consisted of lessons in black magic – using Excel to create pivot tables and cast other spells. Meanwhile, Python has gained a strong presence in data science, and as a Pythonista, I wanted to solve some of the exercises using Python instead. Additionally, data sets are becoming so big that manual work in Excel simply leads to nowhere. I have only shallow experience in data science, so I considered this a useful challenge.&lt;/p&gt;
&lt;p&gt;What follows are some notes on translating a couple of Excel tasks into Python which are also related to CTI. I am a bit familiar with pandas, and used GenAI to quickly generate prototypes and then refine them into what I was looking for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note 2026-02-01:&lt;/strong&gt; This blog post was written with pandas 2. &lt;a href=&#34;https://pandas.pydata.org/community/blog/pandas-3.0.html&#34;&gt;Pandas 3&lt;/a&gt; introduces easier ways to access data using &lt;code&gt;pd.col()&lt;/code&gt;.&lt;/p&gt;
&lt;h1 id=&#34;notes-on-the-code-snippets&#34;&gt;Notes on the Code Snippets&lt;/h1&gt;
&lt;p&gt;You can find Jupyter Notebooks of the simple queries and the heatmap &lt;a href=&#34;https://github.com/bytinbit/cti-with-pandas&#34;&gt;in this GitHub repo&lt;/a&gt;. The Jupyter Notebooks all create fake, randomized data that do not in any way correlate to the class content. They are all common tasks in Excel.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The simple queries create a fake data set with cheese types sold on a particular time and month.&lt;/li&gt;
&lt;li&gt;Another data set contains fake username-password combinations and IP addresses reserved for example code (&lt;a href=&#34;https://datatracker.ietf.org/doc/html/rfc5735&#34;&gt;RFC5735&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;The heatmap uses a selection of Chinese zodiac animals linked to a random year-date combination.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The snippets below are just the most relevant parts to answer the question without any setup. For that, see the whole Jupyter Notebooks.&lt;/p&gt;
&lt;h1 id=&#34;simple-queries-frequency-analysis&#34;&gt;Simple Queries: Frequency Analysis&lt;/h1&gt;
&lt;p&gt;Which was the month with the highest sale and latest time sold?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;sorted_df&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;sort_values&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;by&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:#d88200&#34;&gt;&amp;#34;Month&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Time Sold&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;ascending&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;True&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;False&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;],&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;na_position&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;last&amp;#34;&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;sorted_df&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;iloc&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;What was the month with the highest sales?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;weekday_counts&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;groupby&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#39;Month&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;size&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;reset_index&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;name&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;sort_values&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;by&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Month&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;ascending&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;False&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;weekday_counts&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;iloc&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h1 id=&#34;simple-queries-search-data&#34;&gt;Simple Queries: Search Data&lt;/h1&gt;
&lt;p&gt;Search for an IP address, first with equals, then as substring search.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;filtered_df&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;loc&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;IP Address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;203.0.113.42&amp;#34;&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;filtered_df_sub&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;loc&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;IP Address&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;contains&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;203.0.113.42&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;na&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;False&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;What are the two most common passwords?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;counted_passwords&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Password&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;value_counts&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;()&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;head&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Search for an IP address across the whole data frame.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;searched&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;apply&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;lambda&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;row&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;row&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;astype&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;contains&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;203.0.113.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;na&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;False&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;case&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;False&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;any&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(),&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;axis&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Search the username column either for &lt;code&gt;god&lt;/code&gt; or &lt;code&gt;toor&lt;/code&gt; then get its corresponding password.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;pw&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;loc&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Username&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;str&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;contains&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;god|toor&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;na&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;False&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;)][&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Password&amp;#34;&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h1 id=&#34;pivot-table-and-heatmap&#34;&gt;Pivot Table and Heatmap&lt;/h1&gt;
&lt;p&gt;Generate a pivot table out of a data set, where rows are dates and columns are the Chinese zodiac animals. Count occurrences as aggregation function.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;animal_per_month&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;df&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;pivot_table&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;index&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Date&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;columns&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Zodiac&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;aggfunc&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;fill_value&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;groups&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;animal_per_month&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;columns&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;tolist&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;animal_per_month&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;animal_per_month&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;reindex&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;columns&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;groups&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Create grand totals:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;grand_total&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;animal_per_month&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;copy&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;grand_total&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;loc&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Grand Total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;animal_per_month&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;sum&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;axis&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;grand_total&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;Grand Total&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;animal_per_month&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;sum&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;axis&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Now to the heatmap. In the task, the grand totals were not part of the heatmap itself and uncolored. Which means: Generating heatmaps in Python is easy. Generating heatmaps in Python that look like the one in Excel is &lt;em&gt;difficult&lt;/em&gt;. I used GenAI to quickly create a prototype. Then followed the familiar rabbit hole of a hallucinating GenAI when I wanted to have the grand totals not included in the heatmap coloring.&lt;/p&gt;
&lt;p&gt;After many very-similar-yet-different questions to The Cheery Robot that is GenAI, I found an answer on &lt;a href=&#34;https://stackoverflow.com/questions/53606027/exclude-a-column-from-seaborn-heatmap-formatting-but-keep-in-the-map&#34;&gt;StackOverflow&lt;/a&gt;. It uses one heatmap as a mask over the other. Let&amp;rsquo;s create the mask:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;mask&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;np&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;zeros&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;grand_total&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;shape&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;mask&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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 style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;True&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# mask the Grand Total row&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;mask&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;[:,&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#00a8c8&#34;&gt;True&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# mask the Grand Total column&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After some trial and error with a visualization library called seaborn, I achieved my desired result using the mask:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#111&#34;&gt;sns&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;heatmap&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;grand_total&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;mask&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;mask&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;cmap&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;RdYlGn_r&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;cbar&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;False&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;sns&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;heatmap&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;grand_total&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;alpha&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;cbar&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;False&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;annot&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#00a8c8&#34;&gt;True&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;cmap&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;RdYlGn_r&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#111&#34;&gt;annot_kws&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:#d88200&#34;&gt;&amp;#34;size&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;color&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#111&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#d88200&#34;&gt;&amp;#34;k&amp;#34;&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&amp;hellip; and can now present this lovely heatmap that is not Excel:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cybersim.ch/images/cti-pandas-heatmap.png&#34; alt=&#34;a lovely heatmap with grand totals not included&#34;&gt;&lt;/p&gt;
&lt;p&gt;A heatmap! With grand totals in white!&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s again the repo with the full code: &lt;a href=&#34;https://github.com/bytinbit/cti-with-pandas&#34;&gt;cti-with-pandas&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Image source: RealVisXL/Nightcafe&lt;/p&gt;
- https://cybersim.ch/posts/cti-pandas-heatmap/ - </description>
        </item>
    
    
    
        <item>
        <title>Marvels in Digital Art</title>
        <link>https://cybersim.ch/posts/nxtmuseum/</link>
        <pubDate>Sun, 09 Feb 2025 19:26:50 +0100</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/nxtmuseum/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/nxtmuseum/ -&lt;p&gt;&amp;ldquo;Man kann mit einem Computer Kunst und Schönheit schaffen&amp;rdquo;, &lt;a href=&#34;https://www.ccc.de/en/hackerethics&#34;&gt;says the OG hacker ethics&lt;/a&gt; (&amp;ldquo;You can create art and beauty on a computer.&amp;rdquo;) and nothing embodies this better than the &lt;a href=&#34;https://nxtmuseum.com/&#34;&gt;Nxt Museum&lt;/a&gt; in Amsterdam. While the &lt;a href=&#34;https://de.wikipedia.org/wiki/Museum_of_Digital_Art_%28Z%C3%BCrich%29&#34;&gt;Museum of Digital Art in Zurich&lt;/a&gt; perished during the pandemic, the Nxt Museum opened its doors in 2020 and persisted. Its latest exhibition caught me again with my mouth open and a &amp;ldquo;holy sh&amp;hellip;&amp;rdquo; under my breath.&lt;/p&gt;
&lt;p&gt;One of its current installations, &amp;ldquo;All-together-now&amp;rdquo; (2025) by &lt;a href=&#34;https://www.children-of-the-light.com/&#34;&gt;Children of the Light&lt;/a&gt;, takes a scientific breakthrough from 2019 and turns it into an art experience. In that year, the first-ever image of a black hole was published, made even more famous by the researcher Katie Bouman, whose &lt;a href=&#34;https://alltogether.swe.org/2019/04/katie-bouman-and-the-black-hole-heard-round-the-world/&#34;&gt;delighted expression at the breakthrough&lt;/a&gt; went viral. Thanks to the artists, we now stand in a room with five huge halos. Each of them turns at an individual speed, emits white and amber light, and each round evokes another optical illusion of haze, light, and magic. We essentially relive Katie Bouman&amp;rsquo;s moment back in 2019: Staring at a small cosmos in wonder and amazement, experiencing pure delight in what human creativity and ingenuity can bring forth.&lt;/p&gt;
&lt;p&gt;If you ever visit Amsterdam and are remotely into digital art: The Nxt Museum is worth a tour and every Euro of the ticket. Take your time to sit through all the installations without a smartphone; marvel at the hacker ethic being turned into its finest possible representations. Be aware that many installations contain flashing lights.&lt;/p&gt;
&lt;p&gt;Image source: ALL-TOGETHER-NOW (2025) by Children of the Light, Installation, photograph by Maarten Nauw, Nxt Museum. Thank you to Nxt Museum for responding to my inquiry about an image to illustrate this tiny blog entry.&lt;/p&gt;
- https://cybersim.ch/posts/nxtmuseum/ - </description>
        </item>
    
    
    
        <item>
        <title>Book Note: Some Desperate Glory</title>
        <link>https://cybersim.ch/posts/desperate-glory/</link>
        <pubDate>Sat, 01 Feb 2025 08:31:00 +0100</pubDate>
        <author>check my website (cybersime)</author>
        <guid>https://cybersim.ch/posts/desperate-glory/</guid>
        <description>cybersim&#39;s blog https://cybersim.ch/posts/desperate-glory/ -&lt;p&gt;&amp;ldquo;Some Desperate Glory&amp;rdquo; by Emily Tesh came out in 2023 and won a Hugo award in 2024 for best novel. It&amp;rsquo;s a science-fiction novel, but also one about fascism and the deradicalization of a young woman called Kyr. With every recent headline my brain circles back to that book. &amp;ldquo;Blog it&amp;rdquo;, my brain says.&lt;/p&gt;
&lt;p&gt;The book is brilliant in many ways, so find the basic plot and some reviews in the link section below. What I want to highlight here is the narrative technique of an unreliable narrator combined with Kyr as the main focalizer of the story, and its effect on us, the readers.&lt;/p&gt;
&lt;p&gt;Kyr grows up in a fascist society, hard, passionate, relentless in her pursuit, determined to win in any way. Accustomed to sci-fi narratives we readers believe her. Here the good, there the baddies. Star Wars: clear-cut lines and enemies. Slowly, cracks appear. Slowly, we doubt. Slowly, Kyr doubts. Something is wrong with Gaea Station where she grew up. Something is wrong about her being top of her class, then delegated to the baby factory. Something is wrong with her brother Magnus – or is it us? The glitz of her world crumbles, as we discover along with Kyr the lies that kept her believing, as we discover how such a society operates once the veil of radicalization is lifted. How everyone suffers by clinging to beliefs which only serve a few powerful men.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s brilliant.&lt;/p&gt;
&lt;p&gt;There are a ton of texts about fascism and the cruelties of Hitler, Mussolini, Franco, and all the others. We&amp;rsquo;ve been through this before. However, it&amp;rsquo;s stories that have the most power. In these times, we need stories of hope, stories that help people understand what is going on and where we could end up. This is one.&lt;/p&gt;
&lt;h1 id=&#34;links&#34;&gt;Links&lt;/h1&gt;
&lt;p&gt;Tesh, Emily: &amp;ldquo;Some Desperate Glory&amp;rdquo;, Tor: 2023, 9781250834980.&lt;/p&gt;
&lt;p&gt;Tor publishes ebooks without DRM, it&amp;rsquo;s worth buying it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://emilytesh.net/some-desperate-glory/&#34;&gt;Book on Emily Tesh&amp;rsquo;s website&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://emilytesh.net/some-desperate-glory/content-notes-for-some-desperate-glory/&#34;&gt;Content notes by Emily Tesh&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Some_Desperate_Glory_%28novel%29&#34;&gt;Wikipedia: Some Desperate Glory&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://womenwriteaboutcomics.com/2024/12/review-some-desperate-glory-by-emily-tesh-is-a-space-opera-for-today/&#34;&gt;Review on WWAC, 2024&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://locusmag.com/2023/04/alexandra-pierce-reviews-some-desperate-glory-by-emily-tesh/&#34;&gt;Review on Locus, 2023&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Image source: Nightcafé/Dreamshaper XL&lt;/p&gt;
- https://cybersim.ch/posts/desperate-glory/ - </description>
        </item>
    
    
  </channel>
</rss> 
