<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/assets/feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Bitboxer - hacking</title>
  <link href="https://bitboxer.de/" rel="alternate"/>
  <link href="https://bitboxer.de/atom.xml" rel="self"/>
  <updated>2026-03-30T19:29:32+02:00</updated>
  <id>https://bitboxer.de/</id>
  <author>
    <name>Bodo Tasche</name>
    
  </author>

  
  <entry>
    <title type="html">No Subscription, No Ads - My Local Music Streaming Setup</title>
    <link href="https://bitboxer.de/2026/03/17/music"/>
    <updated>2026-03-17T00:00:00+01:00</updated>
    <id>https://bitboxer.de/2026/03/17/music</id>
    <content type="html">&lt;p&gt;I am currently making my digital life better and more sustainable for every party involved. One of the topics I am changing is music. I want music artists to get a fair share for the music I am listening to. The only way to do that is to actually buy music from them. If possible, through &lt;a href=&quot;https://bandcamp.com/&quot;&gt;Bandcamp&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I cleaned up my old library of music files and am slowly adding all the music I love and used to stream.&lt;/p&gt;

&lt;p&gt;To make this work for me, I investigated a lot and tested a ton of tools. I think I now have found my sweet spot. With apps that I love and are good looking, at least enough to actually use them daily without constantly thinking, “Oh my god, is this really worth it”.&lt;/p&gt;

&lt;p&gt;This is what my stack currently looks like:&lt;/p&gt;

&lt;h3 id=&quot;jellyfin&quot;&gt;Jellyfin&lt;/h3&gt;

&lt;p&gt;Our files are hosted on our trusted Synology server and use Jellyfin as our media server. I also installed a last.fm plugin so that Jellyfin does all the scrobbling and I don’t have to limit myself to apps that also do that. Pretty nifty.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://jellyfin.org/&quot;&gt;jellyfin.org&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;gelly&quot;&gt;Gelly&lt;/h3&gt;

&lt;p&gt;On Gnome I found this really nice looking app. Highly recommended. Every day I am impressed by how beautiful the Gnome apps are. And this is no exception. I will need to create a separate post about all the things I use on Gnome sometime soon.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/Fingel/gelly&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;manet&quot;&gt;Manet&lt;/h3&gt;

&lt;p&gt;This is the app I use on my iPhone and work Mac. It looks really nice and has all the features I need.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tilosoftware.io/manet&quot;&gt;Tilosoftware.io&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;symfonium&quot;&gt;Symfonium&lt;/h3&gt;

&lt;p&gt;I now also own an Android tablet. And this is the best app I found for this. There are tons of apps for Android phones that can connect to Jellyfin, but none had at least a half decent tablet layout. This has. So it won.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://symfonium.app/&quot;&gt;symfonium&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;bonus-player-cliamp&quot;&gt;Bonus player: cliamp&lt;/h3&gt;

&lt;p&gt;Of course there is an amazing cli option, too. cliamp is everything you need
from a command line music player. Nice visuals, quick search, easy to use.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bjarneo/cliamp&quot;&gt;cliAmp&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">French coast and back in an EV camper</title>
    <link href="https://bitboxer.de/2025/08/16/ev-long-distance"/>
    <updated>2025-08-16T00:00:00+02:00</updated>
    <id>https://bitboxer.de/2025/08/16/ev-long-distance</id>
    <content type="html">&lt;p&gt;Last week we came back from a camping trip to &lt;a href=&quot;https://www.openstreetmap.org/#map=11/45.5059/-1.0245&quot;&gt;Soulac-sur-Mer&lt;/a&gt;. Roughly 1600 km through Germany and France to the Atlantic coast. In an EV camper van. An &lt;a href=&quot;https://www.poessl-vanline.de/vanster/e-vanster&quot;&gt;e-Vanster&lt;/a&gt;, to be more specific. We got that car two years ago, and we absolutely love it.&lt;/p&gt;

&lt;p&gt;This car is a modified &lt;a href=&quot;https://www.citroen.co.uk/models/new-e-Spacetourer.html&quot;&gt;e-Spacetourer&lt;/a&gt; with an added pop-up roof, a small electric stove in the back, and electrical equipment to make it possible to use campground power systems via a &lt;a href=&quot;https://en.wikipedia.org/wiki/IEC_60309?useskin=vector&quot;&gt;CEE plug&lt;/a&gt;. The range is around 317 km on a charge. It’s basically a brick on wheels, so don’t expect it to be fast (limited to 130 km/h) or super energy efficient. But it gets its job done. On the positive side, it rides absolutely smoothly, and the EV part makes it lovely to merge onto a highway. Unlike a diesel camper van, where you’re constantly worried whether the car will accelerate fast enough for the short on-ramp. The turning radius is also roughly a meter better than the diesel counterpart because it has no huge engine block.&lt;/p&gt;

&lt;p&gt;This was the first time we used the relatively new &lt;a href=&quot;https://apps.apple.com/de/app/e-routes/id6449592949&quot;&gt;e-Routes&lt;/a&gt; app that Stellantis/Citroën offers. Before, we used &lt;a href=&quot;https://abetterrouteplanner.com/&quot;&gt;ABRP&lt;/a&gt; with a USB-ODB dongle. While ABRP theoretically has better data because of the direct vehicle access, the e-Routes navigation UI was much nicer. And it got the job done very smoothly. It sadly has one little quirk that needs to be fixed: three times the app decided to re-route us to another charger shortly after we left the highway system. Yes, in theory the next charger would have been better, because we had enough battery range to get to it, but the timing was… not good 😅. We also used the &lt;a href=&quot;https://www.chargeprice.app/&quot;&gt;Chargeprice&lt;/a&gt; to figure out what was the cheapest way to charge along the way. We booked two cards with monthly fees to get the reduced charging price. Something we don’t need in Berlin because we don’t drive enough. But this trip made them worth it.&lt;/p&gt;

&lt;p&gt;The drive itself was rather uneventful. We just followed what the e-Routes app told us to do. It showed how many charging spots were free at the next charging point, and how much battery we’d have left when arriving. Simple, easy, and relaxing. The French highway has a speed limit of 130 km/h, so driving there was less stressful. We had one charger that we couldn’t use because the stop was overcrowded by non-EV people trying to park everywhere. And another charger was broken — so we just used the next one 500 m away. At two charging points, we had to wait less than 10 minutes to be able to use the plug. That’s basically it. No struggles, no nail-biting stories I could tell. It was very uneventful. As it should be. And I love the charging breaks. Usually you go grab some snacks or go to the toilette and the battery is full enough again. And once we lifted the roof so that you could do a quick 15 min power nap while the car was charging. A trick normal EVs cannot do 😁.&lt;/p&gt;

&lt;p&gt;Would I do this again? Yes, we already booked the same place for next year. Would I change a thing? Yes, we have some ideas on how to improve our camping equipment a bit and will do that soon. Nothing groundbreaking, but you learn by using the equipment and discovering your needs.&lt;/p&gt;

&lt;p&gt;Three little tidbits I found interesting:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Even the campground shop had better baguette than anything you can get in Berlin&lt;/li&gt;
  &lt;li&gt;Bikers in France really want to live dangerously. Driving between two cars at 120–130 km/h on a two-lane highway system to get in front of them? Really?&lt;/li&gt;
  &lt;li&gt;French people like to use their left blinker on the highway. A lot. And don’t turn it off…&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Going viral on mastodon</title>
    <link href="https://bitboxer.de/2025/03/15/viral-mastodon"/>
    <updated>2025-03-15T00:00:00+01:00</updated>
    <id>https://bitboxer.de/2025/03/15/viral-mastodon</id>
    <content type="html">&lt;p&gt;Recently, I had &lt;a href=&quot;https://mastodon.social/@bitboxer/114024300854186610&quot;&gt;a post&lt;/a&gt; go somewhat viral (at least for my standards). The post currently has around 4,200 boosts and 3,700 favorites.&lt;/p&gt;

&lt;p&gt;The last time this happened was a couple of years ago. And this time it was different. In many interesting ways.&lt;/p&gt;

&lt;p&gt;So let’s go through some of the most noteworthy findings:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;It just worked&lt;/strong&gt;. Last time, the website had problems with the number of notifications. But this time? No issues. All apps I used were okay with the notifications, nothing got noticeably slower. No errors, no crashes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No weird/spam replies&lt;/strong&gt;. I still have some stomach ache when I think about the fact that moderation in Mastodon is on the shoulders of mostly unpaid people, but it works amazing. When I got these boost numbers on other platforms, the post would be flooded with spam, scams, and crypto bros. But not on Mastodon. Thank you to all the hardworking people for this ❤️.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No Nazis&lt;/strong&gt;. This is especially remarkable. It was a post about Nazi Germany. And zero Nazi replies. Keep up the good work, folks ✊.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Grouping of notifications helped&lt;/strong&gt;. This was added not too long ago, and I could already see how much it improved my life in this situation. Otherwise, I would not have been able to handle the number of messages coming in.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;It came in waves&lt;/strong&gt;. With algorithm-based social media, your post usually either kicks off immediately, stays active for a couple of days and dies off. Or does nothing whatsoever. Mastodon does not have that. All interactions happen organically. For that reason, you see waves of notifications. Occasionally, a post gets traction days or weeks after you post it.  A person boosts it and starts another round of interactions with the post. This is charming and shows the power of a non-algorithmic timeline. The message stays alive longer.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;I gained around 200 followers&lt;/strong&gt;. That’s a nice number. Higher than I expected with that number of boosts. Thank you for following me 🥰.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luckily, I had no bad experiences with this post. But In the future, I really would love to be able to restrict interactions. I would love to be able to easily ban a reply to be attached to my post. Or limit who can interact with it. I know there is work going on about this for a while now. And it’s hard to do correctly, but please implement that this year.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Berlin is Calling: Stand Up and Protest for Change!</title>
    <link href="https://bitboxer.de/2025/01/16/berlin-demos"/>
    <updated>2025-01-16T00:00:00+01:00</updated>
    <id>https://bitboxer.de/2025/01/16/berlin-demos</id>
    <content type="html">&lt;p&gt;In a bit over a month, Germany votes for the next government. It looks like conservative, right-leaning parties might win a lot of votes. Let us all try to prevent that. One way to do that is to go out on the street and protest to show others that we fight. That we haven’t given up hope for a better world.&lt;/p&gt;

&lt;p&gt;Clicking a ‘Sign the petition’-Button is not as important as thousands protesting on the streets.&lt;/p&gt;

&lt;p&gt;Many demonstrations are scheduled in Berlin. It would be great if you could join one (or more) of them.&lt;/p&gt;

&lt;p&gt;Here’s a partial list:&lt;/p&gt;

&lt;h3 id=&quot;wir-haben-es-satt-we-are-sick-of-it&quot;&gt;&lt;a href=&quot;https://www.wir-haben-es-satt.de/&quot;&gt;Wir haben es satt (We are sick of it)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; 18.01.2025, 12:00&lt;br /&gt;
&lt;strong&gt;Where:&lt;/strong&gt; Federal Chancellery of Germany&lt;br /&gt;
&lt;strong&gt;By:&lt;/strong&gt; BUND and several other organizations&lt;br /&gt;
&lt;strong&gt;Details&lt;/strong&gt;: &lt;a href=&quot;https://www.wir-haben-es-satt.de/&quot;&gt;wir-haben-es-satt.de&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;flinta-march&quot;&gt;&lt;a href=&quot;https://flintamarch.de/allgemein&quot;&gt;FLINTA* March&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; 19.01.2025, 12:00&lt;br /&gt;
&lt;strong&gt;Where:&lt;/strong&gt; Brandenburg Gate&lt;br /&gt;
&lt;strong&gt;By:&lt;/strong&gt; FLINTA*-Activists and other organizations&lt;br /&gt;
&lt;strong&gt;Details:&lt;/strong&gt; &lt;a href=&quot;https://flintamarch.de/allgemein/&quot;&gt;flintamarch.de&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;klimastreik-climate-strike&quot;&gt;&lt;a href=&quot;https://fridaysforfuture.de/klimastreik&quot;&gt;Klimastreik (Climate-Strike)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; 14.02.2025, 12:00&lt;br /&gt;
&lt;strong&gt;Where:&lt;/strong&gt; Brandenburg Gate&lt;br /&gt;
&lt;strong&gt;By:&lt;/strong&gt; Fridays For Future&lt;br /&gt;
&lt;strong&gt;Details&lt;/strong&gt;: &lt;a href=&quot;https://fridaysforfuture.de/klimastreik/&quot;&gt;fridaysforfuture.de&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;winter-csd&quot;&gt;&lt;a href=&quot;https://csd-berlin.de/winter-csd-2025&quot;&gt;Winter-CSD&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; 15.02.2025, 11:55&lt;br /&gt;
&lt;strong&gt;Where:&lt;/strong&gt; German Parliament&lt;br /&gt;
&lt;strong&gt;By:&lt;/strong&gt; CSD e.V.&lt;br /&gt;
&lt;strong&gt;Details:&lt;/strong&gt; &lt;a href=&quot;https://csd-berlin.de/winter-csd-2025&quot;&gt;csd-berlin.de&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;wir-stehen-zusammen--lichtermeer-gegen-den-rechtsruck-we-stand-together--sea-of-lights-against-the-shift-to-the-right&quot;&gt;&lt;a href=&quot;https://www.campact.de/presse/mitteilung/20250115-pm-lichtermeer_gegen_rechtsruck&quot;&gt;Wir stehen zusammen – Lichtermeer gegen den Rechtsruck (We stand together – sea of ​​lights against the shift to the right)&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; 25.01.2025, 16:30&lt;br /&gt;
&lt;strong&gt;Where:&lt;/strong&gt; Brandenburg Gate&lt;br /&gt;
&lt;strong&gt;By:&lt;/strong&gt; Campact, Parents against the Right and Fridays for Future among others&lt;br /&gt;
&lt;strong&gt;Details:&lt;/strong&gt; &lt;a href=&quot;https://www.campact.de/presse/mitteilung/20250115-pm-lichtermeer_gegen_rechtsruck/&quot;&gt;campact.de&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A complete list can be found on &lt;a href=&quot;https://www.demokrateam.org/bundesland/berlin/&quot;&gt;demokrateam.org&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">38c3 retrospective</title>
    <link href="https://bitboxer.de/2025/01/13/38c3/"/>
    <updated>2025-01-13T00:00:00+01:00</updated>
    <id>https://bitboxer.de/2025/01/13/38c3</id>
    <content type="html">&lt;p&gt;Yes, it’s true. Another year passed. And with it another CCC. Again with me sitting at home, enjoying a nice hot drink and watching the streams. &lt;a href=&quot;/2024/01/07/37c3/&quot;&gt;Last years&lt;/a&gt; talks were great, but somehow this year’s even topped it.&lt;/p&gt;

&lt;p&gt;If you need some nice talks to watch in this cold and gray time of year, here is the list of talks that I can recommend:&lt;/p&gt;

&lt;h3 id=&quot;correctiv-recherche-geheimplan-gegen-deutschland--1-jahr-danach&quot;&gt;Correctiv-Recherche „Geheimplan gegen Deutschland“ – 1 Jahr danach&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-correctiv-recherche-geheimplan-gegen-deutschland-1-jahr-danach&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;konnte-bisher-noch-nie-gehackt-werden-die-elektronische-patientenakte-kommt---jetzt-für-alle&quot;&gt;„Konnte bisher noch nie gehackt werden“: Die elektronische Patientenakte kommt - jetzt für alle&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-konnte-bisher-noch-nie-gehackt-werden-die-elektronische-patientenakte-kommt-jetzt-fr-alle&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;der-thüring-test-für-wahlsoftware&quot;&gt;Der Thüring-Test für Wahlsoftware&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-der-thring-test-fr-wahlsoftware&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;wir-wissen-wo-dein-auto-steht---volksdaten-von-volkswagen&quot;&gt;Wir wissen wo dein Auto steht - Volksdaten von Volkswagen&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-wir-wissen-wo-dein-auto-steht-volksdaten-von-volkswagen&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;weve-not-been-trained-for-this-life-after-the-newag-drm-disclosure&quot;&gt;We’ve not been trained for this: life after the Newag DRM disclosure&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-we-ve-not-been-trained-for-this-life-after-the-newag-drm-disclosure&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;erpressung-aus-dem-internet---auf-den-spuren-der-cybermafia&quot;&gt;Erpressung aus dem Internet - auf den Spuren der Cybermafia&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-erpressung-aus-dem-internet-auf-den-spuren-der-cybermafia&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;from-pegasus-to-predator---the-evolution-of-commercial-spyware-on-ios&quot;&gt;From Pegasus to Predator - The evolution of Commercial Spyware on iOS&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-from-pegasus-to-predator-the-evolution-of-commercial-spyware-on-ios&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;wann-klappt-der-anschluss-wann-nicht-und-wie-sagt-man-chaos-vorher&quot;&gt;Wann klappt der Anschluss, wann nicht und wie sagt man Chaos vorher?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-wann-klappt-der-anschluss-wann-nicht-und-wie-sagt-man-chaos-vorher&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;7-years-later-why-and-how-to-make-portable-open-hardware-computers-mntm&quot;&gt;7 Years Later: Why And How To Make Portable Open Hardware Computers (mntm)&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-7-years-later-why-and-how-to-make-portable-open-hardware-computers&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;autoritäre-zeitenwende-im-zeitraffer&quot;&gt;Autoritäre Zeitenwende im Zeitraffer&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-autoritre-zeitenwende-im-zeitraffer&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;hacking-yourself-a-satellite---recovering-beesat-1&quot;&gt;Hacking yourself a satellite - recovering BEESAT-1&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-hacking-yourself-a-satellite-recovering-beesat-1&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;projekt-bucketchallenge&quot;&gt;Projekt Bucketchallenge&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-projekt-bucketchallenge&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;gefährliche-meinung--wenn-wälder-brennen-und-klimaaktivistinnen-im-knast-sitzen&quot;&gt;Gefährliche Meinung – Wenn Wälder brennen und Klimaaktivist*innen im Knast sitzen&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-gefhrliche-meinung-wenn-wlder-brennen-und-klimaaktivist-innen-im-knast-sitzen&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;der-milliarden-steuerraub-cumex--wie-schädlich-ist-wirtschaftskriminalität-für-unsere-gesellschaft&quot;&gt;Der Milliarden-Steuerraub Cum/Ex – wie schädlich ist Wirtschaftskriminalität für unsere Gesellschaft?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-der-milliarden-steuerraub-cum-ex-wie-schdlich-ist-wirtschaftskriminalitt-fr-unsere-gesellschaft&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;knäste-hacken&quot;&gt;Knäste hacken&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-knste-hacken&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;das-ifg-ist-tot--best-of-informationsfreiheit-gefangenenbefreiung--machtübernahmen&quot;&gt;Das IFG ist tot – Best of Informationsfreiheit, Gefangenenbefreiung &amp;amp; Machtübernahmen&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-das-ifg-ist-tot-best-of-informationsfreiheit-gefangenenbefreiung-machtbernahmen&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;longtermismus--der-geist-des-digitalen-kapitalismus&quot;&gt;Longtermismus – der „Geist“ des digitalen Kapitalismus&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-longtermismus-der-geist-des-digitalen-kapitalismus&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;identity-theft-credit-card-fraud-and-cloaking-services--how-state-sponsored-propaganda-makes-use-of-the-cyber-criminal-toolbox&quot;&gt;Identity theft, credit card fraud and cloaking services – how state-sponsored propaganda makes use of the cyber criminal toolbox&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-identity-theft-credit-card-fraud-and-cloaking-services-how-state-sponsored-propaganda-makes-use-of-the-cyber-criminal-toolbox&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;security-nightmares&quot;&gt;Security Nightmares&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-security-nightmares&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;blinkencity-radio-controlling-street-lamps-and-power-plants&quot;&gt;BlinkenCity: Radio-Controlling Street Lamps and Power Plants&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-blinkencity-radio-controlling-street-lamps-and-power-plants&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;dialing-into-the-past-rce-via-the-fax-machine--because-why-not&quot;&gt;Dialing into the Past: RCE via the Fax Machine – Because Why Not?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-dialing-into-the-past-rce-via-the-fax-machine-because-why-not&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;from-silicon-to-sovereignty-how-advanced-chips-are-redefining-global-dominance&quot;&gt;From Silicon to Sovereignty: How Advanced Chips are Redefining Global Dominance&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/38c3-from-silicon-to-sovereignty-how-advanced-chips-are-redefining-global-dominance#t=176&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <title type="html">Favourite Podcasts of 2024</title>
    <link href="https://bitboxer.de/2024/12/31/favourite-podcasts/"/>
    <updated>2024-12-31T00:00:00+01:00</updated>
    <id>https://bitboxer.de/2024/12/31/favourite-podcasts</id>
    <content type="html">&lt;p&gt;According to &lt;a href=&quot;https://overcast.fm/&quot;&gt;Overcast&lt;/a&gt; these are the podcasts I listened to the most:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-01-01-podcasts/overcast.jpeg&quot; alt=&quot;An image of the most played podcasts in overcast, an iOS podcast player. First row is 99% invisible with 62 hours, Planet Money with 46 hoursand Piratensender Powerplay with 34 hours. Footer of the image says: 281 hours total listening time in Overcast&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I do not listen to as many podcasts as I used to do. Manly because I don’t have a commute and the school of my kid is just a 10-min bike ride away, but 281 hours still sound like a lot of hours 😅.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://99percentinvisible.org/&quot;&gt;99% Invisible&lt;/a&gt;,  the outstanding breakdown of &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Power_Broker?useskin=vector&quot;&gt;The Power Broker&lt;/a&gt; was my surprise delight of the year. Really worth a listen.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npr.org/sections/money/&quot;&gt;Planet Money&lt;/a&gt;, getting the latest on finance, without the dread of finance bros.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://piratensenderpowerplay.podigee.io/&quot;&gt;Piratensender Powerplay&lt;/a&gt;, German news discussed in a very left leaning smart way.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.macstories.net/comfort-zone/&quot;&gt;Comfort Zone&lt;/a&gt;, this was a nice surprise. This is the podcast I look forward to in the week.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.ehrenwort-podcast.de/&quot;&gt;Ehrenwort&lt;/a&gt;, history, scandals…what do you want more? I visited their first live show in November, can recommend.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://thinkingelixir.com/&quot;&gt;Thinking Elixir&lt;/a&gt; This is the first and only tech podcast that made the list. I used to listen to more of those, but somehow I needed more time away from work topics.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.thisamericanlife.org/&quot;&gt;This American Life&lt;/a&gt;. A classic. Still amazing.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sicherheitspod.de/&quot;&gt;Sicherheitshalber&lt;/a&gt;, German podcast about military/security. As a green voter, this was important to open up my bubble. And it’s still left-ish, so not too bad.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://camperstyle.de/thema/podcast/&quot;&gt;Camper-Style&lt;/a&gt;, camping is our current way of vacationing. This helped me to get inspired for some vacation/gear stuff.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;honorable-mentions&quot;&gt;Honorable mentions&lt;/h3&gt;

&lt;p&gt;Besides those top 9 shows, I wanted to mention three others. Sometimes quality is more important than quantity 😃.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.artofthescore.com.au/&quot;&gt;Art of the score&lt;/a&gt; — After a 1 1/2 year hiatus, they came back to just release one episode this year, but it was an “Interstellar” episode, so I can’t complain too much. If you love movies like I do (see &lt;a href=&quot;https://letterboxd.com/bitboxer/&quot;&gt;my letterboxd account&lt;/a&gt;), listening to them going through soundtracks is really wonderful.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://homecooking.show/&quot;&gt;Home Cooking&lt;/a&gt; - Also one episode after a 2-year break. The chemistry between them is so good. Cannot wait for the next episode in 2 years 😅.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://podcasts.apple.com/us/podcast/dear-millennial-with-megan-tan/id961509999&quot;&gt;Dear Millennial&lt;/a&gt; - This was my favourite podcast for a long time, and I am delighted that it now has new episodes coming out regularly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this list is not enough podcasts for you, I have a list of parenting podcasts on &lt;a href=&quot;https://papiberlin.de/en/resourcen/podcast&quot;&gt;PapiBerlin.de&lt;/a&gt; that you can follow.&lt;/p&gt;

&lt;p&gt;I am always open for podcast recommendations. If you have any, please send them to me either via &lt;a href=&quot;https://mastodon.social/@bitboxer&quot;&gt;mastodon&lt;/a&gt; or email 🤗.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Smart Heating with HomeAssistant</title>
    <link href="https://bitboxer.de/2024/12/24/home-assistant-smart-heating"/>
    <updated>2024-12-27T22:00:00+01:00</updated>
    <id>https://bitboxer.de/2024/12/24/home-assistnat-smart-heating</id>
    <content type="html">&lt;p&gt;One of the problems in our apartment was this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-30-heating/step_1.jpg&quot; alt=&quot;A simple temperature sensor with a dial that has the values *, 2, 3, 4, 5, 6&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A really dumb thermostat. Since we have floor heating, this little thing created tons of problems. Floor heating behaves like a big cargo ship. You cannot quickly move it around. The floor needs time to heat up, and if the desired temperature is reached, you cannot simply shut it down. It will continue to radiate heat to the room. With this dial, a accurate temperature was just not possible. Also we didn’t want to heat the rooms at night and wanted them to cool down. And ideally to warm up just before we wake up.&lt;/p&gt;

&lt;p&gt;The solution: get rid of this stupid thing and install something smarter. Something that has ZigBee and can be added to Home Assistant. Something like &lt;a href=&quot;https://de.aliexpress.com/item/1005005230261106.html?spm=a2g0o.productlist.main.17.5e6516bdtovHgc&amp;amp;algo_pvid=c64e0cf7-ad93-40f1-b007-3d1e63d13383&amp;amp;algo_exp_id=c64e0cf7-ad93-40f1-b007-3d1e63d13383-8&amp;amp;pdp_npi=4%40dis%21EUR%2160.84%2124.79%21%21%21452.01%21184.18%21%402140c1c317353318719886464e7502%2112000033175272820%21sea%21DE%21705460580%21X&amp;amp;curPageLogUid=2ptJr7w6nhLA&amp;amp;utparam-url=scene%3Asearch%7Cquery_from%3A&quot;&gt;the MOES ZigBee Smart Thermostat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First, I had to get rid of the old thermostat and install the new one. Luckily, this was relatively easy. Pull out the dial and you will find a little screw.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-30-heating/step_2.jpg&quot; alt=&quot;The dial is removed from the temperature sensor, revealing a little screw&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After that, you will find that the guts of the device is rather empty.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-30-heating/step_3.jpg&quot; alt=&quot;The inner workigns, you see three wires and a little metal strip that is the actual sensor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Get rid of it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-30-heating/step_4.jpg&quot; alt=&quot;A hole in the wall, three cables are visible&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Luckily, they left some nice schematics for us.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-30-heating/step_5.jpg&quot; alt=&quot;The cap of the temperature sensor, a schematic is printed inside&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Install the new thermostat following the schematics printed on it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-30-heating/step_6.jpg&quot; alt=&quot;The new sensor is attached, but not screwed into the wall. You see the backside of it and three wires&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Success.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-12-30-heating/step_7.jpg&quot; alt=&quot;The new temperature sensor showing 21.5 degrees Celcius&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The next step is to add it to your Home Assistant and add some rules. Since this is an unsupported ZigBee device, you will need to add a custom quirk to Home Assistant. &lt;a href=&quot;https://github.com/jacekk015/zha_quirks/blob/main/ts0601_thermostat_avatto.py&quot;&gt;This file&lt;/a&gt;  works fine with my device. &lt;a href=&quot;https://github.com/jacekk015/zha_quirks/blob/main/README.md&quot;&gt;The Readme&lt;/a&gt; of the file explains how to add the quirk to Home Assistant.&lt;/p&gt;

&lt;p&gt;The rules I have are something like “if the forecasted outside temperature today is below 15 degrees Celsius, activate the heating at 6 o’clock for 5 hours with a target temperature of 21 degrees Celsius”.  Nothing too fancy (yet).&lt;/p&gt;

&lt;p&gt;I also added a rule that activates the heater for 5 minutes per week in warmer months. That way I can work around the problem that the heating valve gets stuck, and I have to fix it each winter.&lt;/p&gt;

&lt;p&gt;If you see that the temperature of the device does not match the room temperature, you can tweak the offset a bit. Simply call the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;temperature_calibration&lt;/code&gt; function via ZigBee and set it to a new offset. After a few seconds, the device will update the temperature to the new value.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <title type="html">Email validation - easy to get wrong, simple to fix</title>
    <link href="https://bitboxer.de/2024/02/03/email-validation"/>
    <updated>2024-02-03T09:00:00+01:00</updated>
    <id>https://bitboxer.de/2024/02/03/email-validation</id>
    <content type="html">&lt;p&gt;If you mention email validation, most developers only think about the
technical aspect of it. What is a valid email? Basically, there are two ways of
thinking about it: &lt;a href=&quot;https://emailregex.com&quot;&gt;Regular expressions are enough&lt;/a&gt; or
&lt;a href=&quot;[https://www.netmeister.org/blog/email.html](https://emailregex.com)&quot;&gt;Regular expressions don’t cover 100% of the email standard&lt;/a&gt;.
For that I can only say: yes, a regular expression does not work for your
esoteric email addresses, but who cares? The &lt;a href=&quot;https://www.w3.org/TR/2012/WD-html-markup-20121025/input.email.html#form.data.emailaddress_xref2&quot;&gt;w3c spec&lt;/a&gt;
for  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;input type=&quot;email&quot;&amp;gt;&lt;/code&gt; says this should be done with this regular
expression:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/^[a-zA-Z0-9.!#$%&amp;amp;’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If your email address does not comply with that, you will have problems everywhere.&lt;/p&gt;

&lt;p&gt;Now that we have this boring part of the discussion out of the way, let’s focus
on the real problem.&lt;/p&gt;

&lt;p&gt;I build tons of MVPs in my life, and most of the time we needed to add some form
of email validation to the system. Either to comply with European regulations,
and/or to verify a correct email address. A correct email address is especially
important if you want to make sure that you can successfully convert someone to
a user. You need that to send notifications, engage with them and finally turn them
into a happy paying customer.&lt;/p&gt;

&lt;p&gt;The first, and most important part, should be to check if this is really needed.
Do you want to be allowed to send newsletters to the user? If yes, you need
a double opt-in. If not, you could simply go ahead without this. Simply let
everyone in, regardless of their email address. This has a gigantic upside: users
can use your app super quick. And for some use cases, it’s more important to let
users in quickly than to have a confirmed email address. The downside is, sadly,
rather big. You are not allowed to send marketing emails, you will have some users 
who cannot log in because two weeks later they realize that they must have had a typo
and their cookie expired and so much more.&lt;/p&gt;

&lt;p&gt;After you decided you want a double-opt-in and verify the email address, you have
to send out a confirmation email. You want this experience to be as smooth as
possible. Having users open their email account, wait for an email to arrive, and
then hopefully get them to click on the confirmation link, is a long process
that can lose lots of potential customers when done wrong.&lt;/p&gt;

&lt;p&gt;You need to make sure that all potential errors are addressed and can be fixed
quickly by the user.&lt;/p&gt;

&lt;p&gt;What could go wrong? Sadly, a lot. Your role is to make it simple for the user
to resolve all problems. Let´s go through all the steps and see what can go
wrong and how to fix the most common problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Entering the email address&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most important part is to mark the input field as an email field. Most browsers
will show the most recently used email addresses and help the user to fill in the
field. This will remove 99% of all typos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Highlight possible typos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After we got rid of 99% of all typos, we still have to deal with the remaining
1%. We cannot do much about the stuff before the @, but we can help with the
stuff after the @. There are libraries that can help you with that. They can
suggest that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gnail.com&lt;/code&gt; is probably a typo and the user meant &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gmail.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There are lots of libraries to do that, for example &lt;a href=&quot;https://github.com/julien-amblard/email-misspelled#readme&quot;&gt;email-misspelled&lt;/a&gt;,
&lt;a href=&quot;https://github.com/truemail-rb/truemail&quot;&gt;truemail&lt;/a&gt; or &lt;a href=&quot;https://github.com/micke/valid_email2&quot;&gt;valid_email2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Offer a simple “Did you mean &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gmail.com&lt;/code&gt;?” button to the user that they can click
to replace the typo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: After sending the email&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After the user submits the form, you send out an email and wait for the user to
click on the link. In my experience, &lt;strong&gt;THIS&lt;/strong&gt; is usually the page where users
realize that they had a typo or used the wrong email address.&lt;/p&gt;

&lt;p&gt;You need to make sure that the user can resolve this problem as quickly as
possible. You should show the user a message to what address the email was sent
to and that they should check their email account. If the user sees a
problem, you should give them the option to change the address. You should not
force the user to go back to the form and fill it out again. Simply give them
the option to fix the email address right there.&lt;/p&gt;

&lt;p&gt;Additionally, add a “resend email” button. This will help with cases where the
user deletes the email accidentally or the email gets lost in the spam folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: After clicking the link&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After the user clicks the link or enters the confirmation code, you should send
the user to a page that enables them to use your product as fast as possible.
Please don’t end on a page that simply says “Thanks for confirming your email
address”. This is the first page ‘inside of the app’ for your customers. They
should be greeted as such and have a clear path to using your product.&lt;/p&gt;

&lt;p&gt;I hope this helps you to make your email validation process as smooth as
possible. If you have any questions or suggestions, feel free to send me &lt;a href=&quot;mailto:bodo@tasche.me&quot;&gt;an email&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Tuya Zigbee IR Blaster in Home Assistant</title>
    <link href="https://bitboxer.de/2024/01/20/tuya-zigbee-ir/"/>
    <updated>2024-01-20T09:00:00+01:00</updated>
    <id>https://bitboxer.de/2024/01/20/tuya-zigbee-ir</id>
    <content type="html">&lt;p&gt;&lt;em&gt;Note: previously you needed a custom quirk, but since September the Tuya IR Blaster is natively supported in Home Assistant&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;After years of playing around with Philips Hue and never being really happy about it,
I switched to Home Assistant. I installed it on a &lt;a href=&quot;https://www.raspberrypi.com/&quot;&gt;Raspberry
Pie&lt;/a&gt;, added a ZigBee USB-Stick and never looked
back.&lt;/p&gt;

&lt;p&gt;It’s simply amazing. Fully customisable, everything local. And zero problems.&lt;/p&gt;

&lt;p&gt;There was only one thing I wished it had. Infrared output. I wanted to remote
control devices that only had IR-Input. I tried two Broadlink devices, and both
sucked. The first just didn’t want to connect to a properly secured wifi, the
other one was buggy as hell. I needed something better. And I found it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://de.aliexpress.com/item/1005005830413750.html?spm=a2g0o.productlist.main.3.7e6f4b55AkWeUg&amp;amp;algo_pvid=9c5773fd-cd27-4e2a-9ff8-81fe867afff3&amp;amp;algo_exp_id=9c5773fd-cd27-4e2a-9ff8-81fe867afff3-1&amp;amp;pdp_npi=4%40dis%21EUR%2145.89%2110.52%21%21%21352.20%21%21%402103895417041260957777174e7746%2112000034564582479%21sea%21DE%210%21AB&amp;amp;curPageLogUid=RW60f4UDSm6K&quot;&gt;The Tuya Zigbee IR Blaster
ZS06&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setting it up is as easy as the usual “a couple of clicks” in Home
Assistant.&lt;/p&gt;

&lt;p&gt;Let’s start.&lt;/p&gt;

&lt;h3 id=&quot;requirements&quot;&gt;Requirements&lt;/h3&gt;

&lt;p&gt;Things you need:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.home-assistant.io/installation/&quot;&gt;Fully installed Home Assistant&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;A &lt;a href=&quot;https://www.home-assistant.io/skyconnect/&quot;&gt;Zigbee USB-Stick&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;A fully configured &lt;a href=&quot;https://www.home-assistant.io/integrations/zha&quot;&gt;Zigbee Home
Automation&lt;/a&gt; device&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;

&lt;p&gt;To enable the support for the Tuya IR, you need to install have a working
zigbee stick. After that it is pretty straight forward.&lt;/p&gt;

&lt;h4 id=&quot;add-the-device-to-your-system&quot;&gt;Add the device to your system&lt;/h4&gt;

&lt;p&gt;Initiate the pairing process by pressing the button on the device for around 5
seconds till the LED starts blinking. You will be able to add the device in Home
Assistant now.&lt;/p&gt;

&lt;p&gt;Navigate to the ZHA configuration page and click on the “Add Devices” button.
The device should show up as “Tuya Zigbee IR Blaster ZS06”. Click on it and wait
for the pairing process to finish.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://my.home-assistant.io/redirect/config_zha/&quot;&gt;&lt;img src=&quot;https://my.home-assistant.io/badges/config_zha.svg&quot; alt=&quot;Open your Home Assistant instance and show your ZHA configuration
panel.&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the device was added, navigate to it and click on the “…” button in the
device info box. Click on “Manage zigbee device” to open the device
configuration page. There you can send commands to the device.&lt;/p&gt;

&lt;p&gt;Select the “&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ZosungIRControl&lt;/code&gt;” cluster and the “&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IRLearn&lt;/code&gt;” command. Your dialog
now should look like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2024-01-20-tuya-ir/screenshot.png&quot; alt=&quot;Screenshot of the manage zigbee device
dialog&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Press “Issue Zigbee command” and then the blue led should start to light up,
indicating that the device is waiting for an IR code.&lt;/p&gt;

&lt;p&gt;After you pressed a button on the remote, you can see the code in the attributes tab. For that you have to select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;last_learned_ir_code&lt;/code&gt; in the dropdown and press the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read attribute&lt;/code&gt; button.&lt;/p&gt;

&lt;p&gt;You can now test the code by selecting the “IRSend” command and paste the code
into the “code” field. Click on “Issue Zigbee command” and the device should
send the IR code.&lt;/p&gt;

&lt;p&gt;If everything works, you can now create a script to send the code. For that you
need to grab the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ieee&lt;/code&gt; code that is shown in the device info box after you
expanded the “Zigbee info”. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cluster_id&lt;/code&gt; is the ID of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ZosungIRControl&lt;/code&gt;
cluster, in my case 0xe004. Convert that to decimal and you get 57348. The
command in my case is “IRSend (id: 0x0002)”, which translates to decimal 2 and
the command type is always “server”.&lt;/p&gt;

&lt;p&gt;The final script should look like this:&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;zha.issue_zigbee_cluster_command&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;{}&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;cluster_type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;in&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;ieee&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;90:39:5e:ff:fe:0b:e4:cc&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;endpoint_id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;command_type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;server&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;cluster_id&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;57348&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# = 0xe004&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;&amp;gt;-&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;B3UjhBFrAo8GgAMALOAAAeABCwGPBkADQA8BawKABwEsAuAHB+AHAcAfQAFAC4ADQAuAA0AB4AMLAc6gwIcBLAJAA+AFAQFrAkADAY8GgAPAC+ALB0AT4AMDQDPAD0AL4AEDACxgCwUsAmsCjwaAA0AL4AGHAWsCQANAE+AHA0AXQANAF+APB0Ab4AMDA48GLALAAUAL4AED4AEbAY8GQAMCawIsIAGAhwMsAo8GgAPgCwHgAxtAC0AB4AEHgEfgBwEDjwYsAsABQAvgBwNANcATQAHgBYdAHeAJAQGPBoADQAFAC0Al4AcHQBPgAwPAH0ATQAvgBwPgAxcDawIsAg==&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you have everything you need to control your IR devices.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <title type="html">Book review: Naming Things</title>
    <link href="https://bitboxer.de/2024/01/08/naming-things/"/>
    <updated>2024-01-08T09:00:00+01:00</updated>
    <id>https://bitboxer.de/2024/01/08/naming-things</id>
    <content type="html">&lt;p&gt;At the end of last year, I realized that I somehow &lt;a href=&quot;https://bookwyrm.social/user/Bitboxer/2023-in-the-books?key=d31a7502275e47afaba1733e1d2c0acd&quot;&gt;stopped reading technical books&lt;/a&gt;. There was just too much going on to read that kind of content in my leisure time. Why learn a new thing when you also could escape to &lt;a href=&quot;https://bookwyrm.social/book/241579&quot;&gt;Teixcalaanli&lt;/a&gt;? But I started to crave some technical content and I looked at my pile of unread technical books.&lt;/p&gt;

&lt;p&gt;Luckily, one of the books I chose was &lt;a href=&quot;https://www.namingthings.co/&quot;&gt;this one&lt;/a&gt;. Naming things is hard. And on top of that, a wrong name leads to all kind of problems. This book explains the basic rules how you should name things in your code. Plain and simple. Luckily, the author also didn’t make the explanations longer than needed. These kinds of books are the best. Short enough to read in one sitting, long enough to cover everything you need to know.&lt;/p&gt;

&lt;p&gt;If you are a software developer, you really should get this book and put it next to your desk after you finished reading it. You will start referencing it when talking to your colleagues about code.&lt;/p&gt;

&lt;p&gt;5/5 stars from me.&lt;/p&gt;

&lt;p&gt;Get Naming Things at &lt;a href=&quot;https://www.namingthings.co/&quot;&gt;https://www.namingthings.co/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href=&quot;https://bookwyrm.social/user/bitboxer&quot;&gt;bookwyrm.social&lt;/a&gt; for more book reviews.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">37c3 retrospective</title>
    <link href="https://bitboxer.de/2024/01/07/37c3/"/>
    <updated>2024-01-07T09:00:00+01:00</updated>
    <id>https://bitboxer.de/2024/01/07/37c3</id>
    <content type="html">&lt;p&gt;The last time I did a CCC event retrospective was &lt;a href=&quot;/2019/01/21/35c3/&quot;&gt;4 years ago&lt;/a&gt;. I skipped 36c3 for reasons, but with 37c3 I’m back. I wasn’t in Hamburg this year, and I’m not sure if I want to join 38c3 in Hamburg, but time will tell.&lt;/p&gt;

&lt;p&gt;But let’s start with the talks I’ve watched and liked. If you think I missed something, please &lt;a href=&quot;https://bodo.tasche.me/&quot;&gt;let me know&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;breaking-drm-in-polish-trains&quot;&gt;Breaking “DRM” in Polish trains&lt;/h3&gt;

&lt;p&gt;This was the talk that had the most impact in the public media. A team of researchers showed how a polish train manufacturer implemented DRM in their
Trains and lied to the customer about it. Trying to get them to only use their own service for maintenance.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12142-breaking_drm_in_polish_trains&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;heimlich-manöver&quot;&gt;Heimlich-Manöver&lt;/h3&gt;

&lt;p&gt;The talk from &lt;a href=&quot;https://fragdenstaat.de/&quot;&gt;FragDenStaat&lt;/a&gt; is a must watch for me.
Nice recap what they did since 2020.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-11689-heimlich-manover&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;operation-triangulation-what-you-get-when-attack-iphones-of-researchers&quot;&gt;Operation Triangulation: What You Get When Attack iPhones of Researchers&lt;/h3&gt;

&lt;p&gt;Researchers from Kaspersky show how they found out that iPhones from their coworkers were hacked with a rather complex malware. This talk explains how they found out and what the malware did to infect the devices.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-11859-operation_triangulation_what_you_get_when_attack_iphones_of_researchers&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;scholz-greift-durch-die-afd-wird-verboten---deepfakes-auch&quot;&gt;Scholz greift durch: Die AfD wird verboten - Deepfakes auch!&lt;/h3&gt;

&lt;p&gt;This talk by the art collective &lt;a href=&quot;https://www.politicalbeauty.de/&quot;&gt;Politische Schönheit&lt;/a&gt; was a nice mix of art and politics. They explained
their last project where they created a deepfake of the german chancellor Olaf Scholz. They used this deepfake to create a video where he announces the ban of the german right wing party AfD.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12345-scholz_greift_durch_die_afd_wird_verboten_-_deepfakes_auch&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;bifröst-apples-rainbow-bridge-for-satellite-communication&quot;&gt;Bifröst: Apple’s Rainbow Bridge for Satellite Communication&lt;/h3&gt;

&lt;p&gt;A nice overview of how Apple is using satellite communication to provide internet access to their devices.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-11948-bifrost_apple_s_rainbow_bridge_for_satellite_communication&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-extremely-large-telescope-elt&quot;&gt;The Extremely Large Telescope (ELT)&lt;/h3&gt;

&lt;p&gt;Always wanted to know how the biggest telescope in the world is built? This talk is for you.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12020-the_extremely_large_telescope_elt&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;hirne-hacken-hackback-edition&quot;&gt;Hirne hacken: Hackback Edition&lt;/h3&gt;

&lt;p&gt;How do you act after you’ve been hacked and got a ransom note? Nice walk through of how to react and what to do.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12134-hirne_hacken_hackback_edition&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;security-nightmares&quot;&gt;Security Nightmares&lt;/h3&gt;

&lt;p&gt;The (nearly) yearly talk about the state of IT security in the world.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12224-security_nightmares&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;hacking-the-climate&quot;&gt;Hacking the climate&lt;/h3&gt;

&lt;p&gt;What are the current ideas how to fix climate change? This talk gives a nice overview of the current ideas and how they could work.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-11870-hacking_the_climate&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;kim-kaos-in-der-medizinischen-telematikinfrastruktur-ti&quot;&gt;KIM: Kaos In der Medizinischen Telematikinfrastruktur (TI)&lt;/h3&gt;

&lt;p&gt;How bad is the german medical infrastructure? This talk gives a nice overview of the cryptographic and security flaws in the german medical infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12030-kim_kaos_in_der_medizinischen_telematikinfrastruktur_ti&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;öffnet-eure-spaces-für-gehörlose&quot;&gt;Öffnet eure Spaces für Gehörlose!&lt;/h3&gt;

&lt;p&gt;How can you make your space more accessible for deaf people? This talk gives a nice overview of what you can do.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12100-offnet_eure_spaces_fur_gehorlose&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;unlocking-hardware-security-red-team-blue-team-and-trojan-tales&quot;&gt;Unlocking Hardware Security: Red Team, Blue Team, and Trojan Tales&lt;/h3&gt;

&lt;p&gt;This is a nice overview of how to attack hardware security and how to defend against it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12033-unlocking_hardware_security_red_team_blue_team_and_trojan_tales&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;new-important-instructions&quot;&gt;NEW IMPORTANT INSTRUCTIONS&lt;/h3&gt;

&lt;p&gt;LLMs have a lot of new security challenges. This talk gives a nice overview of ways to hack them and to extract data from people using the LLM.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12292-new_important_instructions&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;bluffs-bluetooth-forward-and-future-secrecy-attacks-and-defenses&quot;&gt;BLUFFS: Bluetooth Forward and Future Secrecy Attacks and Defenses&lt;/h3&gt;

&lt;p&gt;An attack on the Bluetooth protocol that showed that it’s possible to decrypt the traffic. This talk gives a nice overview of the attack and how to fix it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-12342-bluffs_bluetooth_forward_and_future_secrecy_attacks_and_defenses&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;how-to-build-a-submarine-and-survive&quot;&gt;How to build a submarine and survive&lt;/h3&gt;

&lt;p&gt;Never thought a talk about building a submarine would be this funny and interesting. Initially I skipped it, but thanks to &lt;a href=&quot;https://nafn.de/&quot;&gt;Malte&lt;/a&gt; I watched it and it was great.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://media.ccc.de/v/37c3-11828-how_to_build_a_submarine_and_survive&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Parenting resources</title>
    <link href="https://bitboxer.de/2024/01/03/parenting-resources/"/>
    <updated>2024-01-03T01:00:00+01:00</updated>
    <id>https://bitboxer.de/2024/01/03/parenting-resources</id>
    <content type="html">&lt;p&gt;Back &lt;a href=&quot;/2019/11/23/papiberlin/&quot;&gt;in 2019&lt;/a&gt; I started a &lt;a href=&quot;https://papiberlin.de&quot;&gt;digital fathers* community&lt;/a&gt;. We have a really nice &lt;a href=&quot;https://papiberlin.de/pages/slack&quot;&gt;Slack&lt;/a&gt; channel with tons of activity. In that channel, we share countless interesting links. I didn’t want those links to be lost in that massive pile that is the Slack history. And for that reason, I started to collect them &lt;a href=&quot;https://papiberlin.de/resourcen&quot;&gt;on this page&lt;/a&gt;. Hopefully, this page is also useful for you. If you have any suggestions that fit there, please let &lt;a href=&quot;https://papiberlin.de/contact&quot;&gt;us know&lt;/a&gt;.&lt;/p&gt;

</content>
  </entry>
  
  <entry>
    <title type="html">Story points - mostly worthless</title>
    <link href="https://bitboxer.de/2023/12/09/story-points/"/>
    <updated>2023-12-09T19:00:00+01:00</updated>
    <id>https://bitboxer.de/2023/12/09/story-points</id>
    <content type="html">&lt;p&gt;Story points are just smoke and mirrors. Yes, hear me out.&lt;/p&gt;

&lt;p&gt;People can’t stand chaos; we crave order. Many folks view story points as a way
to inject some order into the chaos of, say, agile development. This is
especially intriguing for large enterprises, those companies with a waterfall
mindset that decide to casually slap the word “Agile” onto their established
way of doing things.&lt;/p&gt;

&lt;p&gt;Now, let me break down why story points are nothing but a facade and share what I prefer instead.&lt;/p&gt;

&lt;h3 id=&quot;estimating-is-no-walk-in-the-park&quot;&gt;Estimating is no walk in the park&lt;/h3&gt;

&lt;p&gt;In a perfect, predictable world, this sentence might actually make sense:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The 4-Sprint-average is (0.5 + 0.63 + 0.67 + 0.82) / 4 = 0.655. If you have 36 person-days available in your upcoming Sprint, you should aim for ~24 Story Points.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Such order. We can clearly see how much we can fit into a sprint. All we need to
do is to figure out a solid way to assign precise points to stories and integrate
them into the sprint. The worst implementation I’ve ever witnessed was at a
company with three dev teams. After collectively estimating the tickets, they
randomly assigned them to the teams until each team hit the maximum number of
points. Chaos ensued. Tickets dependent on each other were spread across three
teams, resulting in Team 1 being blocked by Team 2. Not ideal.&lt;/p&gt;

&lt;p&gt;Estimating how long a task takes is a challenge. There are always surprises
lurking around the next corner. A story that seems “easy” could unexpectedly
turn into a two-month effort to refactor the code before it’s possible to
implement the ticket. Yes, it happens. Should it happen often? No. It’s a red
flag if it does. But more often than not, a ticket that is estimated for 2 days
needs 3. And that’s okay. It’s not a failure. It’s just how it is. If you look
at the sentence in the quote, you see the that they tried to factor in this
uncertainty by averaging the last four sprints. But that’s just a band-aid. It
doesn’t solve the actual problem: estimating is hard. Sometimes it’s just not
possible. Adding a factor to the equation doesn’t make it any easier. Or more
correct. If estimate most tickets take 2 days, but in
reality, they take 3? You’ll end up with a sprint that’s 50% over capacity. And
that’s not good. Usually that’s when the blame game starts.&lt;/p&gt;

&lt;h3 id=&quot;pressure-to-finish-by-estimated-time&quot;&gt;Pressure to finish by estimated time&lt;/h3&gt;

&lt;p&gt;If you estimate a ticket takes 2 days, you’ll feel the pressure to finish it in 2
days: that’s not good. You’ll be tempted to cut corners, to take shortcuts,
to do whatever it takes to finish the ticket in time. It creates technical debt.
It creates bugs. It creates an atmosphere of pressure. Cutting corners or taking
shortcuts can be a good thing. But only if you do it consciously. If you do it
because you feel the pressure to finish in time, you’ll end up with a mess.
A team that constantly feels this pressure will burn out.&lt;/p&gt;

&lt;h3 id=&quot;comparing-teams-with-each-other&quot;&gt;Comparing teams with each other&lt;/h3&gt;

&lt;p&gt;Unfortunately, I’ve seen many managers who compare teams based on how many story
points they complete in a sprint. This leads to peculiar outcomes. A team judged by the
number of points it can achieve in a sprint will likely estimate tickets more
generously. Maybe it’s subconscious, but they’ll do it. They just don’t want to
look bad compared to other teams that finished more points. And this renders
story point estimation worthless. You might see a cheerful “the team is becoming
more and more efficient” chart, but in reality, it may be the opposite. The
truth only reveals itself when you see what they actually delivered and try to
understand why.&lt;/p&gt;

&lt;h3 id=&quot;long-term-planning&quot;&gt;Long-Term Planning&lt;/h3&gt;

&lt;p&gt;If you’re sizing up everything for the next four sprints down the road (yes,
I’ve witnessed this in more than one team) and just chipping away at those
tickets, you’ve basically crafted a fancy version of waterfall. Agile
isn’t about that. Not at all. Long-term planning calls for different tools. If
you’re basing your long-term planning on the story points’ scope of tickets,
you’re planning with a level of detail that’s just not practical. It’s bound to
fail. Take a step back and attempt to plan with a higher level of abstraction.&lt;/p&gt;

&lt;h3 id=&quot;understanding-ticket-complexity&quot;&gt;Understanding Ticket Complexity&lt;/h3&gt;

&lt;p&gt;Another reason why folks fancy story points is because they’re a proxy for ticket complexity. This actually comes in handy when a team is trying to
grasp the details of a ticket. If one person estimates the ticket as a 5-day
task and everyone else sees it as a 3-day task, there’s a good chance the person
rating it at 5 days has a better idea on the ticket’s complexity. This gives you
an opportunity to understand why the ticket is so complex and perhaps reconsider
the approach, or at the very least, document the complexity within the ticket.
However, I think using a Fibonacci Sequence to estimate complexity for this
reason is a bit much.&lt;/p&gt;

&lt;h3 id=&quot;my-suggestion&quot;&gt;My Suggestion&lt;/h3&gt;

&lt;p&gt;During your sprint planning, go over the tickets and try to estimate roughly as
“small,” “medium,” or “big.” This should give you a ballpark idea of the
ticket’s complexity. If there’s a significant difference within the team,
discuss it. Record your findings in the ticket, and then let them go.&lt;/p&gt;

&lt;p&gt;Move tickets into your sprint based on priority and a sense of how much you can
fit into a sprint. If you find you need more tickets in the sprint, pull them
from the backlog (which should be sorted by priority) into the sprint. If you
end up with too many tickets in the sprint, shift them to the next one. Yes,
this is a bit chaotic. But it’s also agile. It’s okay to have a bit of chaos.&lt;/p&gt;

&lt;p&gt;The crucial thing is not to feel pressured into finishing all the tickets planned for the
sprint. If there’s a deadline, plan accordingly. Communicate the deadline, what
exactly needs to be delivered and (most importantly) why. You might have to
cut corners or take shortcuts, but do so consciously. The manager’s role is to
ensure the team doesn’t burn out, but also delivers. It’s a delicate balancing
act. If everyone is on the same page, it’s much easier to achieve the goal.&lt;/p&gt;

&lt;p&gt;Still not sold on the idea?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Estimating tasks will slow you down. Don’t do it. We gave it up over 10 years ago.”&lt;br /&gt;
— Jeff Sutherland (Co-Creator of Scrum) (&lt;a href=&quot;https://www.quora.com/What-are-the-techniques-set-by-the-Scrum-guidelines-for-a-task-estimation-in-sprint-planning-Are-there-any-limitations-to-these-techniques/answer/Jeff-Sutherland-10?srid=1yyk&quot;&gt;Source&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Thanks to Andrew, Luca and Peter for reading and correcting drafts of this and to Frederic for sending me the quote of Jeff Sutherland.&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Deadloch</title>
    <link href="https://bitboxer.de/2023/11/27/deadloch/"/>
    <updated>2023-11-27T01:00:00+01:00</updated>
    <id>https://bitboxer.de/2023/11/27/deadloch</id>
    <content type="html">&lt;p&gt;Have you heard of Deadloch? The chances are rather high that you haven’t yet, which is a shame. It is one of the hidden gems of streaming. There are so many shows released currently that some fantastic ones fall through the cracks.&lt;/p&gt;

&lt;p&gt;Deadloch is a show about a female police detective in a small New Zealand town who has to investigate a murder. Sounds like a typical murder mystery so far, but luckily, it isn’t. It’s way smarter than that. It constantly plays with gender roles, the cast is filled with queer people, and it doesn’t take itself seriously at all. The best ingredients to create an amazing show.&lt;/p&gt;

&lt;p&gt;Please do yourself a favor and try it. It’s on Amazon Prime.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">My default apps at the end of 2023</title>
    <link href="https://bitboxer.de/2023/11/12/default-apps-2023/"/>
    <updated>2023-11-12T01:00:00+01:00</updated>
    <id>https://bitboxer.de/2023/11/12/default-apps-2023</id>
    <content type="html">&lt;p&gt;In &lt;a href=&quot;/2017/02/13/sweet-setup/&quot;&gt;2017&lt;/a&gt; I did an interview with Sweet Setup and talked about
all the apps I was using at that moment. Last week I stumbled upon &lt;a href=&quot;https://birchtree.me/blog/my-default-apps-at-the-end-of-2023/&quot;&gt;this post&lt;/a&gt; by Matt Birchler and saw more and &lt;a href=&quot;https://defaults.rknight.me/&quot;&gt;more people doing the same&lt;/a&gt;. So I
thought it would be fun to do the same and see how my setup has changed over the years.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;✉️ Mail service: &lt;a href=&quot;https://mailbox.org&quot;&gt;mailbox.org&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📬 Mail client: Apple Mail&lt;/li&gt;
  &lt;li&gt;✅ Tasks: &lt;a href=&quot;https://omnigroup.com/omnifocus&quot;&gt;OmniFocus&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📰 RSS service: &lt;a href=&quot;https://github.com/stringer-rss/stringer&quot;&gt;Self hosted stringer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🗞️ RSS client: &lt;a href=&quot;https://www.reederapp.com/&quot;&gt;Reeder&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;⌨️ Launcher: &lt;a href=&quot;https://www.alfredapp.com/&quot;&gt;Alfred&lt;/a&gt;, I am too old school for &lt;a href=&quot;https://raycast.com/&quot;&gt;Raycast&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;☁️ Cloud storage: iCloud&lt;/li&gt;
  &lt;li&gt;🌅 Photo library: iCloud&lt;/li&gt;
  &lt;li&gt;🤳🏻 Photo editing: &lt;a href=&quot;https://www.adobe.com/products/photoshop.html&quot;&gt;Photoshop&lt;/a&gt; and &lt;a href=&quot;https://www.adobe.com/products/photoshop-lightroom.html&quot;&gt;Lightroom&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🌐 Web browser: &lt;a href=&quot;https://www.mozilla.org/en-US/firefox/&quot;&gt;Firefox&lt;/a&gt; on Desktop, Safari on iOS&lt;/li&gt;
  &lt;li&gt;🔖 Bookmarks: &lt;a href=&quot;https://raindrop.io/&quot;&gt;Raindrop.io&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📆 Calendar: &lt;a href=&quot;https://flexibits.com/fantastical&quot;&gt;Fantastical&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📹 Meeting reminders: &lt;a href=&quot;https://meetingbar.app/&quot;&gt;MeetingBar&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📖 Read it later: &lt;a href=&quot;https://getpocket.com/&quot;&gt;Pocket&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🌤️ Weather: &lt;a href=&quot;https://www.meetcarrot.com/weather/&quot;&gt;Carrot Weather&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🎙️ Podcasts: &lt;a href=&quot;https://overcast.fm/&quot;&gt;Overcast&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🎶 Music: &lt;a href=&quot;https://spotify.com/&quot;&gt;Spotify&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🔐 Passwords: &lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;💸 Budgeting: &lt;a href=&quot;https://www.ynab.com/&quot;&gt;YNAB&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🍿 Movie discovery/tracking: &lt;a href=&quot;https://letterboxd.com/bitboxer/&quot;&gt;Letterboxd&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📖 Book tracking: &lt;a href=&quot;https://bookwyrm.social/user/Bitboxer&quot;&gt;bookwyrm&lt;/a&gt;, and &lt;a href=&quot;https://www.goodreads.com/user/show/7425143-bodo-tasche&quot;&gt;Goodreads&lt;/a&gt; as fallback&lt;/li&gt;
  &lt;li&gt;📺 TV show tracking: &lt;a href=&quot;https://televisiontime.app/&quot;&gt;Television Time&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;⛰️ Habbit/Mood tracking: &lt;a href=&quot;https://daylio.net/&quot;&gt;Daylio&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📝 Notes: &lt;a href=&quot;https://bear.app/&quot;&gt;Bear&lt;/a&gt; for most stuff, trying &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obisidian&lt;/a&gt; for my current gig…let’s see.&lt;/li&gt;
  &lt;li&gt;🧮 Code Editor: &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt; and &lt;a href=&quot;https://neovim.io/&quot;&gt;NeoVim&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🔍 Code documentation browser: &lt;a href=&quot;https://kapeli.com/dash&quot;&gt;Dash&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;👨🏻‍💻 Terminal: &lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🔎 Search: &lt;a href=&quot;https://kagi.com/&quot;&gt;Kagi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📦 Package tracking: &lt;a href=&quot;https://parcelapp.net/&quot;&gt;Parcel&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;👩‍🍳 Recipe management: &lt;a href=&quot;https://mela.recipes/&quot;&gt;Mela&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;📁 File management: &lt;a href=&quot;https://www.binarynights.com/index.html&quot;&gt;Forklift 4&lt;/a&gt;, I need a &lt;a href=&quot;https://en.wikipedia.org/wiki/Norton_Commander&quot;&gt;Norton Commander&lt;/a&gt; way of working&lt;/li&gt;
  &lt;li&gt;⌨️ Keyboard: &lt;a href=&quot;https://www.zsa.io/moonlander/&quot;&gt;Moonlander&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you see, I am still ways away from &lt;a href=&quot;https://noirandchocolate.tumblr.com/post/637331670751756288/terry-was-once-asked-why-he-worked-across-six&quot;&gt;the setup of Terry Prattchet&lt;/a&gt; 😅.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Three things your API for mobile apps should have</title>
    <link href="https://bitboxer.de/2021/03/14/three-things-you-mobile-api-should-have/"/>
    <updated>2021-03-14T01:00:00+01:00</updated>
    <id>https://bitboxer.de/2021/03/14/three-things-you-mobile-api-should-have</id>
    <content type="html">&lt;p&gt;Every time I join a team as a freelancer I check a couple of things during my initial code review. Some are quite common, like:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Is the onboarding document and README still up to date?&lt;/li&gt;
  &lt;li&gt;Are the tests green?&lt;/li&gt;
  &lt;li&gt;How much do they test?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and many more.&lt;/p&gt;

&lt;p&gt;Besides all those rather common checks I also check a few things regarding the design of the API (if the project has one). Most of the time there are some important things missing. For example, the following three things.&lt;/p&gt;

&lt;h2 id=&quot;decline-too-old-clients&quot;&gt;Decline too old clients&lt;/h2&gt;

&lt;p&gt;You always want to be able to see the version and type of your clients. It’s nice to have for statistics, but also gets important if you want to introduce API breakage. You need a defined API response to force users to update the app. The app should get a return value that triggers a “Hey, this app needs an update to continue working“ screen. How you implement it depends on your API design.&lt;/p&gt;

&lt;h2 id=&quot;maintenance-mode&quot;&gt;Maintenance mode&lt;/h2&gt;

&lt;p&gt;You need a way to communicate a maintenance mode to your clients. The client then should show a warning or disable the app. Ideally, the app could continue to work, but that depends on what the app is about. As a bonus, you could show a message how long this maintenance will take, or show updates if this is an unexpected maintenance (for example because the &lt;a href=&quot;https://www.reuters.com/article/us-france-ovh-fire-idUSKBN2B20NU&quot;&gt;servers are on fire&lt;/a&gt;). Alternatively, link to a status page with further updates.&lt;/p&gt;

&lt;h2 id=&quot;communicate-with-the-users&quot;&gt;Communicate with the users&lt;/h2&gt;

&lt;p&gt;This is more optional than the two things above, but I found it rather useful. Build a way to communicate news to the users. Maybe as news section within the app, a popup dialog for urgent messages or something that fits your app design better. Having the possibility to inform about maintenance windows and to stay connected to your users reduces the bad reviews by &lt;strong&gt;a lot&lt;/strong&gt;. Just make sure the news are not too spammy.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">New project: Hier Baut Berlin</title>
    <link href="https://bitboxer.de/2021/03/06/hier-baut-berlin/"/>
    <updated>2021-03-06T01:00:00+01:00</updated>
    <id>https://bitboxer.de/2021/03/06/hier-baut-berlin</id>
    <content type="html">&lt;p&gt;A couple of years ago I was lucky to be in the first round of the &lt;a href=&quot;https://prototypefund.de/&quot;&gt;Prototype Fund&lt;/a&gt; and was able to build &lt;a href=&quot;https://signdict.org&quot;&gt;SignDict&lt;/a&gt;. A German sign language dictionary that now has around 88,500 unique visitors a month and is one of the leading sign dictionaries in Germany.&lt;/p&gt;

&lt;p&gt;I couldn’t believe my luck when I got accepted to the 9th round with another project. Starting this month I will be working on a project called &lt;a href=&quot;http://hierbautberlin.de&quot;&gt;Hier Baut Berlin&lt;/a&gt; while being paid by the German government.&lt;/p&gt;

&lt;p&gt;So, what does it do? It will help you see what the city of Berlin is doing in your local neighborhood. After you opened the site and specified a location, it will show you all construction projects and other things that the city
has planned or is building in your area at the moment. Additionally, you can also subscribe to that neighborhood and will be notified via email when new entries have been added.&lt;/p&gt;

&lt;p&gt;From now on, I will post progress reports every two weeks on the blog at &lt;a href=&quot;https://blog.hierbautberlin.de&quot;&gt;blog.hierbautberlin.de&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want you can also follow all updates on &lt;a href=&quot;https://twitter.com/HierBautBerlin&quot;&gt;Twitter&lt;/a&gt; or &lt;a href=&quot;https://github.com/hierbautberlin/website&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Disable iOS/IE phone number detection</title>
    <link href="https://bitboxer.de/2021/02/28/disable-phone-detection/"/>
    <updated>2021-02-28T01:00:00+01:00</updated>
    <id>https://bitboxer.de/2021/02/28/disable-phone-detection</id>
    <content type="html">&lt;p&gt;If you have a website with a lot of text on it, you might discover that iOS and Internet Explorer will sometimes add links when they think they discovered a phone number.&lt;/p&gt;

&lt;p&gt;A lot of the time the detection is wrong and might even destroy a bit of the layout of the page.&lt;/p&gt;

&lt;p&gt;To fix this you have to add some attributes to the page to disable the automatic format detection.&lt;/p&gt;

&lt;p&gt;For IE you have to add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x-ms-format-detection&lt;/code&gt; attribute and set it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;none&lt;/code&gt; in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;html&lt;/code&gt; header, like so:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;lang=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;en&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;x-ms-format-detection=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;See &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/x-ms-format-detection&quot;&gt;MDN&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;For iOS/Safari you have to add this meta attribute:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;format-detection&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;telephone=no&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;See the &lt;a href=&quot;https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html#//apple_ref/doc/uid/TP40008193-SW1&quot;&gt;Apple Developer documentation&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;It seems the list of stuff you have to add to a page to make it work smoothly everywhere gets longer and longer by every year.&lt;/p&gt;

&lt;p&gt;A rather complete list of things you could put into the header can be found on &lt;a href=&quot;https://htmlhead.dev/&quot;&gt;htmlhead.dev&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">&quot;Your eReader is not authorized&quot; on Kobo devices</title>
    <link href="https://bitboxer.de/2020/07/23/kobo-drm/"/>
    <updated>2020-07-23T02:00:00+02:00</updated>
    <id>https://bitboxer.de/2020/07/23/kobo-drm</id>
    <content type="html">&lt;p&gt;I really love my Kobo eReader. Cheaper than Amazon, I can put epubs on it and buy ebook at every store that is not called “Amazon”. Most ebooks are just watermarked and don’t have any DRM attached to them ♡. You can even lend epubs from your local library using awesome services like &lt;a href=&quot;https://overdrive.com&quot;&gt;OverDrive&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There is just one problem. If you own a Kobo eReader you might have seen this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Your eReader is not authorized to open this book. Because you previously deauthorized your eReader, you need to reimport the book using ADE“&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After that point you are not able to add any book from your library to it. My
solution to this was to hard reset the device. Luckily there is another
workaround. A disclaimer first: I really love most Adobe products, but the Adobe
Digital Edition is 🤬. It’s totally unclear to me why that software is in this
state and why this is the only DRM solution for ebooks outside the Amazon walled
garden nowadays.&lt;/p&gt;

&lt;p&gt;So how do you fix this problem? Like this:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Delete the not working ebook&lt;/li&gt;
  &lt;li&gt;Connect the kobo with your computer and leave it plugged in.&lt;/li&gt;
  &lt;li&gt;Start the Adobe Digital Editions App on your Mac&lt;/li&gt;
  &lt;li&gt;Delete the not working book from your ADE, you will need to re-download the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.asm&lt;/code&gt; file again later.&lt;/li&gt;
  &lt;li&gt;Remove the authorization of your eReader&lt;/li&gt;
  &lt;li&gt;Remove the authorization on ADE (Help -&amp;gt; Erase Authorization)&lt;/li&gt;
  &lt;li&gt;Go to your library and fetch a &lt;strong&gt;different book&lt;/strong&gt;. Yes you have to find a totally different book than the book that is not working.&lt;/li&gt;
  &lt;li&gt;Open it in ADE, it will ask you to re-authorize it.&lt;/li&gt;
  &lt;li&gt;Re-Authorize your eReader&lt;/li&gt;
  &lt;li&gt;Import the new book to the eReader&lt;/li&gt;
  &lt;li&gt;Open the book on your eReader and check that it is working&lt;/li&gt;
  &lt;li&gt;Download the book that was not working from your library and add it to ADE. This is really important. Do not re-import your existing .asm file. You need a new one.&lt;/li&gt;
  &lt;li&gt;Add it to your eReader&lt;/li&gt;
  &lt;li&gt;Done&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I am writing this down to remember these steps when I have to do them again 😉.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title type="html">Coworking for parents</title>
    <link href="https://bitboxer.de/2020/06/11/coworking-parents/"/>
    <updated>2020-06-11T02:00:00+02:00</updated>
    <id>https://bitboxer.de/2020/06/11/coworking-parents</id>
    <content type="html">&lt;p&gt;My wife is currently opening a coworking space for parents called &lt;a href=&quot;https://littlevillage.berlin/&quot;&gt;little village&lt;/a&gt; and because of that, I investigated the topic a lot in the last couple of months.&lt;/p&gt;

&lt;p&gt;Parents have different needs than other people. They have kids. And if the kid is too young for a kindergarten or you couldn’t manage to get a spot yet, you still need a place to work. These places are the ideal solution. Work on your stuff and your kid is in safe hands near you.&lt;/p&gt;

&lt;p&gt;What was missing was a page with an overview of all coworking places all around the world. Luckily I already had a huge list of places and just needed to put them on a map. With the awesome little power tool that is &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;jekyll&lt;/a&gt; it was relatively easy to build.&lt;/p&gt;

&lt;p&gt;Please see for yourself: &lt;a href=&quot;https://coworkingforparents.org/map&quot;&gt;coworkingforparents.org&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
</feed>
