<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Thomas Mertz</title>
	<atom:link href="https://tmertz.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://tmertz.com</link>
	<description>Project manager, producer and chaos wrangler.</description>
	<lastBuildDate>Tue, 18 Feb 2025 21:24:39 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://tmertz.com/wp-content/uploads/2021/02/cropped-14067444_1070341143035093_5720195293363127213_n-32x32.jpg</url>
	<title>Thomas Mertz</title>
	<link>https://tmertz.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>The benign anarchists beginners guide to personal opsec</title>
		<link>https://tmertz.com/2025/02/the-benign-anarchists-beginners-guide-to-personal-opsec/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Tue, 18 Feb 2025 21:18:36 +0000</pubDate>
				<category><![CDATA[Journal]]></category>
		<category><![CDATA[Travel]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1839</guid>

					<description><![CDATA[We live in a world where the assumption of privacy has been non-existent for quite a long time. Whether its autocracies, corporations or some third entity you should take steps to safeguard your data and protect your communications. Even in existing liberal democracies we&#8217;re seeing an increasing slide towards authoritarianism and fascism, and it is [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>We live in a world where the assumption of privacy has been non-existent for quite a long time. Whether its autocracies, corporations or some third entity you should take steps to safeguard your data and protect your communications. </p>



<p>Even in existing liberal democracies we&#8217;re seeing an increasing slide towards authoritarianism and fascism, and it is important to understand that the slide into those forms of government happen slowly until they happen very suddenly. The current political climate in the US is a solid example, and Europe is &#8211; despite what we might want to tell ourselves &#8211; not that far behind.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>“Ultimately, arguing that you don&#8217;t care about the right to privacy because you have nothing to hide is no different than saying you don&#8217;t care about free speech because you have nothing to say.”<br>― <strong>Edward Snowden</strong></p>
</blockquote>



<p>Opsec is an abbreviation for Operations Security, and it describes a doctrine on how to safeguard information so it may be kept secret and not used against you. </p>



<p>Wikipedia defines it thusly: &#8220;<strong><a href="https://en.wikipedia.org/wiki/Operations_security" data-type="link" data-id="https://en.wikipedia.org/wiki/Operations_security">Operations security</a></strong> (<strong>OPSEC</strong>) is a process that identifies critical information to determine whether friendly actions can be observed by enemy intelligence, determines if information obtained by adversaries could be interpreted to be useful to them, and then executes selected measures that eliminate or reduce adversary exploitation of friendly critical information.&#8221;</p>



<p>So, what can you &#8211; a civilian &#8211; do to protect and safeguard your information? It&#8217;s not really all that difficult or complicated. It might be depressing. Sorry about that.</p>



<p>First of all, assume that any and all communications and data is compromised by default. Work from there. </p>



<p>Use secure email. I recommend <a href="https://proton.me">ProtonMail</a>. You can use a domain they provide or your own. Proton is encrypted and secure email hosted in the EU, a political region with some of the strictest privacy protections on the planet (for the time being &#8211; local governments are doing what they can to circumvent EU regulations). </p>



<p>Use a VPN as often as possible. Proton provides VPN services. Others that I&#8217;ve found to work well are <a href="https://refer-nordvpn.com/DHMfcOwUuAC">NordVPN</a> (this is an affiliate link) and ExpressVPN.  <br>VPN is an acronym that means Virtual Private Network, and is a means of encrypting and obfuscating your inline activity from your ISP. <br>This is especially relevant in countries like Denmark that have a <a href="https://www.altinget.dk/digital/artikel/lektor-telelogning-kraenker-grundlaeggende-rettigheder-og-gaar-imod-faelleseuropaeiske-vaerdier">telecommunications surveillance law</a> (linked article is in Danish) in place. Assume all your activity online is logged. </p>



<p>Switch away from your ISPs DNS servers. If you use a VPN that will likely already have been handled for you. I recommend reading <a href="https://www.lifewire.com/how-to-change-dns-server-settings-2617979">this article</a> on how to get started on changing your DNS servers.</p>



<p>Use end-to-end encrypted private messaging. The only really good solution for that right now is <a href="https://signal.org">Signal</a>. Signal has a proven track record and is run by a non-profit with no commercial interests. <br>End-to-end encryption means that any messages sent are readable only by you and the recipients, but are heavily encrypted while being transmitted. Signal also supports configuring the service to automatically delete your conversations after a certain amount of time, so even if someone managed to crack your code and access your device, the messages would be gone. </p>



<p>Most countries now have laws in place that allow them to demand of you that you unlock your devices to allow them to search them. This is an obvious security risk, and given that high speed internet pretty much ubiquitous globally I highly recommend you delete sensitive files from your devices before crossing any border. You can always redownload them once you get to your destination. </p>



<p>And finally &#8230; remember, any service you use for free means that you are paying with your data. </p>



<p>I will update this post as and when I think of more stuff. If you have any ideas, comments or suggestions please feel free to send them my way, and I will include them here.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Getting the code to work</title>
		<link>https://tmertz.com/2024/10/getting-the-code-to-work/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Wed, 23 Oct 2024 17:40:34 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gaming]]></category>
		<category><![CDATA[10four]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[cbradio]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1742</guid>

					<description><![CDATA[A big part of the 10Four project is detecting a button press. This, I had been told, would be trivial using an Arduino Leonardo. That was true. It took me all of 20 minutes and a bit of light googling to parse together what I needed. Here&#8217;s the code I use. Next up is hijacking [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>A big part of the 10Four project is detecting a button press. This, I had been told, would be trivial using an Arduino Leonardo. That was true. </p>



<p>It took me all of 20 minutes and a bit of light googling to parse together what I needed. Here&#8217;s the code I use.</p>



<pre class="wp-block-code"><code>#include "Keyboard.h"   // This loads the library that allows the Arduino to mimic itself as a standard USB keyboard. 

const int BUTTON_PIN = 7;

int lastState = LOW;
int currentState;

void setup() {
  Serial.begin(9600);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  Keyboard.begin();   // The keyboard library is loaded into memory. 
}

void loop() {
  // read the state of the switch/button:
  currentState = digitalRead(BUTTON_PIN);

  if(lastState == HIGH &amp;&amp; currentState == LOW) { // button is pressed
    pressedTime = millis();
    Keyboard.press(KEY_LEFT_SHIFT);
    Keyboard.press(KEY_TAB);
    Keyboard.press('S');S
  }
  else if(lastState == LOW &amp;&amp; currentState == HIGH) { // button is released
    Keyboard.releaseAll();   // I instruct the keyboard library to release all keys, ending the PTT
  }

  // save the the last state
  lastState = currentState;
}
</code></pre>



<p>Next up is hijacking the CB handset I have. I have already disassembled it and started poking around. I didn&#8217;t know these things come with a speaker built in, and we&#8217;re not going to use that, so it has to go. </p>



<div class="wp-block-media-text is-stacked-on-mobile is-vertically-aligned-top"><figure class="wp-block-media-text__media"><img fetchpriority="high" decoding="async" width="403" height="377" src="https://tmertz.com/wp-content/uploads/2024/10/dualplug.jpg.webp" alt="" class="wp-image-1743 size-full" srcset="https://tmertz.com/wp-content/uploads/2024/10/dualplug.jpg.webp 403w, https://tmertz.com/wp-content/uploads/2024/10/dualplug.jpg-300x281.webp 300w, https://tmertz.com/wp-content/uploads/2024/10/dualplug.jpg-125x117.webp 125w" sizes="(max-width: 403px) 100vw, 403px" /></figure><div class="wp-block-media-text__content">
<p>I did however find a wiring diagram that I think is going to be helpful. I am hoping I can wire everything up to run via the existing cable which has four leads in it. Should be doable as long as the button and the microphone can share a ground wire.</p>
</div></div>



<p>Anyhoo. I am cautiously optimistic about this project. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Adding a little bit of CB charm to videogames</title>
		<link>https://tmertz.com/2024/10/adding-a-little-bit-of-cb-charm-to-videogames/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Fri, 18 Oct 2024 08:00:14 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gaming]]></category>
		<category><![CDATA[10four]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[cbradio]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1731</guid>

					<description><![CDATA[We&#8217;ve seen it in the trucker movies. I&#8217;m thinking stuff like Convoy. It looks hella cool whenever the guy reaches up in his cab, grabs the mic and talks into it. I&#8217;ve been playing a bit of Space Trucker, Elite Dangerous, etc and I want to replicate that feeling. So this idea originally came from [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>We&#8217;ve seen it in the trucker movies. I&#8217;m thinking stuff like Convoy. It looks hella cool whenever the guy reaches up in his cab, grabs the mic and talks into it. </p>



<p>I&#8217;ve been playing a bit of Space Trucker, Elite Dangerous, etc and I want to replicate that feeling. </p>



<p>So this idea originally came from a buddy of mine (hey, Troels), and he talked about using an Arduino Leonardo to enable the push-to-talk (PTT) function on the handset and hooking that into a Discord chat, or even just a games own PTT functionality. </p>



<p>So here&#8217;s the idea &#8230; get a handset, an Arduino Leonardo board. Wire that up and hook it into your gaming rig. Extremely simplified. </p>



<p>I have zero experience with Arduino, but since I tend to learn best when I have an actual practical project I want to do this seems like it will fit the bill nicely. I am looking forward to this, and I think it&#8217;s going to be fun. And I&#8217;ve been looking for an excuse to get into Arduino and play around with it. </p>



<h3 class="wp-block-heading">Bill of goods</h3>



<ul class="wp-block-list">
<li><strong>Arduino Leonardo board</strong> <br>Or compatible. There are a ton of cheaper boards than the OG, I am using a board from Keyestudio.</li>



<li><strong>A CB radio handset</strong><br>I got a PROMAXPOWER (what a name) one on the cheap from Amazon.</li>



<li><strong>A variety of bits</strong> <br>Breadboard, wires, etc. to test on before final assembly.</li>
</ul>



<h3 class="wp-block-heading">The expected outcome </h3>



<p>I want to outline some criteria&#8217;s for success on this one. Just to give myself something to go back to if I get lost or go too far down a rabbit hole. </p>



<ol class="wp-block-list">
<li><strong>PTT functionality</strong> <br>The PTT button needs to be connected to the Arduino, to engage the PTT function, and send the correct keyboard combination to the computer to engage PTT. </li>



<li><strong>Audio capture</strong> <br>I should be able to capture audio from the handheld mic and send it to the computer. <br>I genuinely don&#8217;t know how I am gonna do this yet, but I have a few ideas.</li>
</ol>



<h3 class="wp-block-heading">Extra credit </h3>



<p>If I achieve the above then ideally I want to build it out into a self contained unit. 3D print a housing, with dedicated connectors, and the like. Something inspired by the look of CB radios or LogitechGs flight sim control panels. Maybe something that I can mount under my desk, or on my desk shelf. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Project Carcade, pt II</title>
		<link>https://tmertz.com/2024/10/project-carcade-pt-ii/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Fri, 18 Oct 2024 07:01:37 +0000</pubDate>
				<category><![CDATA[Car]]></category>
		<category><![CDATA[Journal]]></category>
		<category><![CDATA[car]]></category>
		<category><![CDATA[carcade]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[raspberrypi]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1637</guid>

					<description><![CDATA[I did my little prototyping, and it worked like a charm. The Sony AVX AV3250 has a parking break sensor, that enables the display to show the videosignal if, and only if, the parking break is enabled. Or, if you do like I did, and just ground it to the chassis of the car. The [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I did my little prototyping, and it worked like a charm. </p>



<p>The Sony AVX AV3250 has a parking break sensor, that enables the display to show the videosignal if, and only if, the parking break is enabled. Or, if you do like I did, and just ground it to the chassis of the car. </p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="768" src="https://tmertz.com/wp-content/uploads/2023/08/IMG_2752-1024x768.jpg" alt="" class="wp-image-1639" srcset="https://tmertz.com/wp-content/uploads/2023/08/IMG_2752-1024x768.jpg 1024w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2752-300x225.jpg 300w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2752-768x576.jpg 768w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2752-125x94.jpg 125w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2752-600x450.jpg 600w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2752-1536x1152.jpg 1536w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2752-1200x900.jpg 1200w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2752.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">During installation and fidgeting around with the wiring.</figcaption></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="768" src="https://tmertz.com/wp-content/uploads/2023/08/IMG_2753-1024x768.jpg" alt="" class="wp-image-1640" srcset="https://tmertz.com/wp-content/uploads/2023/08/IMG_2753-1024x768.jpg 1024w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2753-300x225.jpg 300w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2753-768x576.jpg 768w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2753-125x94.jpg 125w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2753-600x450.jpg 600w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2753-1536x1152.jpg 1536w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2753-1200x900.jpg 1200w, https://tmertz.com/wp-content/uploads/2023/08/IMG_2753.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">And the final result.</figcaption></figure>
</div>
</div>



<p>The next bit is to plan out the permanent power connection, and design the panel and bracket that will hold the connections and devices. I&#8217;ve been screwing around in TinkerCad, and I ordered some &#8220;powerthiefs&#8221;, essentially a power splitter with a separate fuse. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Order of Operations</title>
		<link>https://tmertz.com/2023/07/order-of-operations/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Sun, 30 Jul 2023 19:09:37 +0000</pubDate>
				<category><![CDATA[Car]]></category>
		<category><![CDATA[Journal]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1635</guid>

					<description><![CDATA[As I mentioned in my previous post I bought a car last year. I have been very happy with it, but the headunit in (which was cheap Chinese thing) annoyed me. It would crash often, and just generally be unreliable. Also, in the 2006 Honda Civic when you remove the stock head unit you lose [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>As I mentioned in my previous post I bought a car last year. I have been very happy with it, but the headunit in (which was cheap Chinese thing) annoyed me. It would crash often, and just generally be unreliable. </p>



<p>Also, in the 2006 Honda Civic when you remove the stock head unit you lose access to a small secondary screen that display stuff like the date and time, as well as the current AC settings. Not in and of itself a huge issue, but nonetheless I preferred having things work if at all possible. </p>



<p>So when I went to install my new head unit I also purchased a canbus adapter (as they are called) from a company called Connects2. They do all sorts of cool stuff for after market head units and it made the installation a breeze. </p>



<p>However, after installing my new head unit I no longer had the use of the audio steering wheel controls. No volume up/down, skip and play/pause. Ever so slightly more annoying. First I thought it might&#8217;ve been an issue with the head unit connector cable, so I bought a new one. When that didn&#8217;t work they thought it might be a defective canbus adapter. </p>



<p>None of that was true. What did in fact happen was that I had put the cables together in the wrong order. <br>I had installed everything by first connecting cables to the car and then the headunit. It was supposed to be the other way around. None of the instructions mentioned this, so I assume its one of those things that is &#8220;just known&#8221; in the car audio installer world. I only found out about this after googling for months, and suddenly stumbling across an eight year old youtube video (I don&#8217;t have the link, sorry), that said &#8220;always connect back from the head unit&#8221;. </p>



<p>Regardless. I have my controls back. I am happy. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Project Carcade</title>
		<link>https://tmertz.com/2023/07/project-carcade/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Thu, 27 Jul 2023 17:02:37 +0000</pubDate>
				<category><![CDATA[Car]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[car]]></category>
		<category><![CDATA[carcade]]></category>
		<category><![CDATA[electronics]]></category>
		<category><![CDATA[raspberrypi]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1624</guid>

					<description><![CDATA[About a year ago I bought a car that I have been eyeing ever since I first saw it. The 2006 Honda Civic hatchback with the space shuttle facelift that relaunched the Civic in Europe. It&#8217;s an astonishingly cool car, and I was very lucky. The one I found was in mint condition, and loaded [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignright size-medium"><img loading="lazy" decoding="async" width="300" height="224" src="https://tmertz.com/wp-content/uploads/2023/07/86-300x224.jpg" alt="" class="wp-image-1629" srcset="https://tmertz.com/wp-content/uploads/2023/07/86-300x224.jpg 300w, https://tmertz.com/wp-content/uploads/2023/07/86-768x574.jpg 768w, https://tmertz.com/wp-content/uploads/2023/07/86-125x93.jpg 125w, https://tmertz.com/wp-content/uploads/2023/07/86-600x448.jpg 600w, https://tmertz.com/wp-content/uploads/2023/07/86.jpg 1024w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>



<p>About a year ago I bought a car that I have been eyeing ever since I first saw it. The 2006 Honda Civic hatchback with the space shuttle facelift that relaunched the Civic in Europe. It&#8217;s an astonishingly cool car, and I was very lucky. The one I found was in mint condition, and loaded up with extras. I have affectionately named it <a href="https://en.wikipedia.org/wiki/Lockheed_SR-71_Blackbird" target="_blank" rel="noreferrer noopener">Blackbird</a>.</p>



<p>Despite not being born with it the previous owner had even had it retrofitted with an Android based headunit. That served me well in the beginning, and I managed to get Carplay working on it using a CarLinkIt dongle and the AutoKit app. But it was a very cheap unit, likely bought for next to nothing from China. It crashed often &#8211; becoming so unresponsive I would need to pull over to, turn off the car, and restart the car to get the unit to reboot. So &#8230; it was not long for this world. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="400" src="https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250-1024x400.jpeg" alt="" class="wp-image-1625" srcset="https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250-1024x400.jpeg 1024w, https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250-300x117.jpeg 300w, https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250-768x300.jpeg 768w, https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250-125x49.jpeg 125w, https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250-600x234.jpeg 600w, https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250-1536x600.jpeg 1536w, https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250-1200x469.jpeg 1200w, https://tmertz.com/wp-content/uploads/2023/07/1661167808-xav-ax3250.jpeg 2028w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>About two months ago I installed a Sony XAV-AX3250. This is a midrange unit. With my tinnitus high audio quality is kinda wasted on me, but I did want something that was going to be stable. And this unit had gotten some pretty reviews. </p>



<p>There is absolutely nothing amazing about this device. Which is exactly how I want it. </p>



<p>There was one thing that caught my eye &#8230; the back of this unit has a minijack A/V port, also known as a TRRS port. This is a port that carries stereo audio and a composite video signal over minijack. Composite resolution is 576i which, let&#8217;s be honest, is paltry. </p>



<p><strong>However!</strong> 576i is perfect for old consoles. It&#8217;s the resolution of old CRT tv&#8217;s, after all. </p>



<p>I do have a couple of spare Raspberry Pi&#8217;s kicking about the place, and they have a TRRS connector, too. And they a low power enough that they can easily run off of a USB charger in the car (and in the future, with a bit luck, through a hardwired connection). </p>



<p>Then I could take that RasPi, and drop something like <a rel="noreferrer noopener" href="https://retropie.org.uk" target="_blank">RetroPie</a> on it &#8230; and presto, mobile gaming with all the old classics. </p>



<h4 class="wp-block-heading">So here&#8217;s the plan</h4>



<p>First up, I need to make sure this is even feasible. So step 1 is gonna grab all the stuff I already have and just kinda prototype it; meaning boot the RasPi in the car, and get some sort of signal up on the head unit. </p>



<p>Already have most of what I need, including some SNES style USB controllers, cables, patches, and more. </p>



<p>If that works, then I need to wire everything up &#8230; that means grabbing a fuse patch and hardwiring the power connector. </p>



<p>I hope this works. It&#8217;ll make the breaks on the long road trips and the waits at ferries a lot more fun. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Stack monitoring and debugging</title>
		<link>https://tmertz.com/2023/02/stack-monitoring-and-debugging/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Mon, 27 Feb 2023 23:08:34 +0000</pubDate>
				<category><![CDATA[Journal]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1569</guid>

					<description><![CDATA[I still write a ton of code. Code needs to be maintained. That means keeping an eye on how your code performs. While talking through that process with a friend and a client, I thought it might be interesting to write a bit about my process. Git is the common thread I use Gitlab for [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>I still write a ton of code. Code needs to be maintained. That means keeping an eye on how your code performs. While talking through that process with a friend and a client, I thought it might be interesting to write a bit about my process. </p>



<h4 class="wp-block-heading">Git is the common thread</h4>



<p>I use <a href="https://gitlab.com/" data-type="URL" data-id="https://gitlab.com/" target="_blank" rel="noreferrer noopener">Gitlab</a> for all my git&#8217;ing needs. Gitlab is a full fledged software project management stack, and contains everything from git repos, wikis, CI and much much much. I originally chose Gitlab because I was bootstrapping my business years ago, and it was the easiest way to have infinite private git repos. <br>I am assuming that you could drop in almost any git server offering out there. </p>



<h4 class="wp-block-heading">Catch problems before they are deployed</h4>



<p>Gitlab CI is a really solid and strong tool. It is equivalent to Github Actions, in case you&#8217;re using that. Part of the CI process is linting, testing and security auditing. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="477" src="https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x-1024x477.png" alt="" class="wp-image-1573" srcset="https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x-1024x477.png 1024w, https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x-300x140.png 300w, https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x-768x358.png 768w, https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x-125x58.png 125w, https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x-600x279.png 600w, https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x-1536x715.png 1536w, https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x-1200x559.png 1200w, https://tmertz.com/wp-content/uploads/2023/02/ci-cd-test-deploy-illustration_2x.png 1890w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>I have my Gitlab CI configured to use docker, and it runs off a second hand Intel NUC I have chucked in the back of a cupboard. I run a variety of docker images to do some pre-deployment checks. I try to write solid code, but everyone has a bad day, and these tools help to catch problems before they deploy and become embarrassing. It&#8217;s not a failsafe, but just another bit in my toolbox. </p>



<p>The docker images I use are almost exclusively provided by a group called <a rel="noreferrer noopener" href="https://pipeline-components.dev" data-type="URL" data-id="https://pipeline-components.dev" target="_blank">pipelinecomponents</a>, and their repo on Docker Hub is amazing. Because I most often work in PHP and frontend technologies my most used of their containers are:</p>



<ul class="wp-block-list">
<li><strong>eslint</strong>; does static analysis of JavaScript, and flags any potential issues</li>



<li><strong>stylelint</strong>; verifies the compiled CSS output and flags deprecated methods and code</li>



<li><strong>php-linter</strong>; runs static analysis on PHP and will validate against specific versions of PHP </li>



<li><strong>php-security-checker</strong>; reviews the contents of composer.json and flags any dependencies that may have been declared insecure</li>



<li><strong>php-codesniffer</strong>; does essentially the same as php-linter, but I am a belt and suspenders kind of guy</li>
</ul>



<h4 class="wp-block-heading">&#8230; and yet, still &#8230;</h4>



<p>I have all these tools and still something will fail or break. Maybe I didn&#8217;t test for a very specific edgecase? Maybe a scenario cropped up that I hadn&#8217;t accounted for? Regardless, the last thing you want is to learn about issues from your users. It is much much better if your code can report on itself when it breaks or fails. </p>



<p>This is where the genius tool known as <a rel="noreferrer noopener" href="https://sentry.io/" data-type="URL" data-id="https://sentry.io/" target="_blank">Sentry</a> comes in. You integrate Sentry into your codebase and it will monitor and report on any abnormalities, including a full stack trace of the failing code. </p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://tmertz.com/wp-content/uploads/2023/02/unsymbolicated-stack-trace.png" alt="" class="wp-image-1572" width="686" height="332" srcset="https://tmertz.com/wp-content/uploads/2023/02/unsymbolicated-stack-trace.png 686w, https://tmertz.com/wp-content/uploads/2023/02/unsymbolicated-stack-trace-300x145.png 300w, https://tmertz.com/wp-content/uploads/2023/02/unsymbolicated-stack-trace-125x60.png 125w, https://tmertz.com/wp-content/uploads/2023/02/unsymbolicated-stack-trace-600x290.png 600w" sizes="auto, (max-width: 686px) 100vw, 686px" /><figcaption class="wp-element-caption"><br></figcaption></figure>



<p>Sentry integrates with Gitlab and vice versa, so every time I deploy new versions all tools are aware of the latest release, and Sentry will automatically flag new bugs to the appropriate release. It will help you track regressions, it will help you identify users, and much much more. </p>



<p>It took me a while to configure and set everything up, but ever since it got set up I have lost count of how many hours this has saved me in debugging and tracing.</p>



<p>This is my pipeline. There are many like it. But this one is mine. Like I said, all of these tools run off of a NUC in cupboard, using Docker. </p>



<p>You can recreate most of the same workflows and automations using a vast variety of tools. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Growing pains</title>
		<link>https://tmertz.com/2018/08/growing-pains/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Tue, 07 Aug 2018 19:05:41 +0000</pubDate>
				<category><![CDATA[Journal]]></category>
		<category><![CDATA[Roleplaying]]></category>
		<category><![CDATA[drama]]></category>
		<category><![CDATA[dziobak larp studios]]></category>
		<category><![CDATA[larping]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1194</guid>

					<description><![CDATA[Preface; this is just some scattered thoughts and reaction to events that unfolded in the larping community today. There&#8217;s probably a ton of stuff that I need to elaborate on at some point.&#160; I started larping when I was 13 years old, some 20+ years ago. Back then we were the weird kids running around [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="has-small-font-size"><strong>Preface</strong>; this is just some scattered thoughts and reaction to events that unfolded in the larping community today. There&#8217;s probably a ton of stuff that I need to elaborate on at some point.&nbsp;</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="933" height="468" src="https://tmertz.com/wp-content/uploads/2018/08/this-is-fine.0-e1533668557423.jpg" alt="" class="wp-image-1195" srcset="https://tmertz.com/wp-content/uploads/2018/08/this-is-fine.0-e1533668557423.jpg 933w, https://tmertz.com/wp-content/uploads/2018/08/this-is-fine.0-e1533668557423-300x150.jpg 300w, https://tmertz.com/wp-content/uploads/2018/08/this-is-fine.0-e1533668557423-768x385.jpg 768w, https://tmertz.com/wp-content/uploads/2018/08/this-is-fine.0-e1533668557423-125x63.jpg 125w, https://tmertz.com/wp-content/uploads/2018/08/this-is-fine.0-e1533668557423-600x301.jpg 600w" sizes="auto, (max-width: 933px) 100vw, 933px" /><figcaption>This meme feels particularly appropriate today.</figcaption></figure>



<p>I started larping when I was 13 years old, some 20+ years ago. Back then we were the weird kids running around woods with padded sticks and bedsheets with holes cut in them. </p>



<p>But the worlds we built felt so real and captivating, that it really shouldn&#8217;t come as a surprise that this particular bug was one that stuck around. </p>



<p>Larping permeates all layers of societies and larpers come from all walks of life. It&#8217;s one of the things that make this community great. Especially in Scandinavia where I believe we do what we can to make sure that there&#8217;s room for everyone; in spite of flaws, social ineptitude or diagnosis. </p>



<p>Most of us have always been the odd ducks, so I&#8217;d like to tell myself we&#8217;re more tolerant of whatever damage the others carry around (this is of course total bullshit, but I like the thought and the idea that this is what we work towards). </p>



<p>Fast forward to today, and larping is a massive hobby. We who participate in it form international communities and share incredible experiences. We pour obscene amounts of money, time and effort into crafting our worlds, and as we&#8217;ve grown up we&#8217;ve become an increasingly demanding audience.</p>



<h3 class="wp-block-heading">Commercialising our art </h3>



<p>It&#8217;s difficult to talk about larping in Scandinavia without mentioning Dziobak Larp Studios. They&#8217;re the producers of the massive events you&#8217;ve read about on Geek &amp; Sundry, HuffPo and elsewhere. From the Harry Potter-ish College of Wizardry to the Downton Abbey inspired Fairweather Manor they&#8217;ve managed to bring larping into the mainstream. That is in and of itself a massive accomplishment. But sadly these successes have not come without cost. </p>



<p>DLS is the brainchild of &#8220;Visionary Wild Card&#8221; Claus Raasted. Claus is an old acquaintance of mine, and I can definitely vouch for the &#8220;wild card&#8221; part of his chosen title. We&#8217;ve  rarely seen eye to eye, and at times it has led to clashes, which were from my perspective more a matter of personality than objective. It&#8217;s hard to refute the benefit of having Claus in our community. He is, for better and worse, a trailblazer and a force to be reckoned with. </p>



<h3 class="wp-block-heading">So, what&#8217;s the problem</h3>



<p>Sadly, as DLS has grown and the company is trying to be profitable that &#8220;come hell or high water&#8221; attitude has repeatedly caused problems for DLS. It&#8217;s easy to see how this particular aspect of Claus&#8217; personality permeates his company. </p>



<p>There was a time when the laissez-faire attitude of associations were easier to deal with because everyone was a volunteer and just doing the best they could with what was available. To me it feels like as if DLS is often trying to play itself down as &#8220;just another association&#8221;, while still being a for-profit company. </p>



<p>It feels to me that DLS hasn&#8217;t quite realized that there&#8217;s a different level of expectation when you&#8217;re a for profit company selling a product. Sure, they may say it&#8217;s co-creation, and that&#8217;s likely true, but that&#8217;s also really easy to sell with a customerbase as intensely passionate as the average larper. </p>



<p>No one is perfect, and growing a company naturally means you will fuck up from time to time. It is, however, how you manage those fuckups that will define your long term success. And it is managing it&#8217;s fuckups that it seems to me that DLS stumbles again and again. </p>



<ul class="wp-block-list"><li>Rather than respond to criticism by listening and integrating, they try to silence critics. By going so far as using a business relationship to silence a critic by contacting their employer. Or by saying that critics have hurt their employees feelings (welcome to the big leagues; this is how customers react).</li><li>Fucking up rights management. Which is an admittedly difficult arena when you have so many passionate volunteers who will spend so much of their spare time to make sure their experience at your event is the best experience it can possibly be. But that just makes it so much more important that you get it right every single time.</li><li>And worst of all; repeatedly working with and hiring abusers and then turning a blind eye when made aware of the situation. This feels particularly grating as Claus has repeatedly positioned himself as a proactive feminist in the larping community, so seeing this kind of behaviour from his company ends making all his good works smack of manipulation and hollow talk (which I know it isn&#8217;t, but goddammit if it doesn&#8217;t feel like it).</li></ul>



<p>It seems like the guiding principle at DLS is not unlike Facebooks; &#8220;move fast and break stuff&#8221;. The problem is of course that DLS has far less social capital than Facebook, and each time they break stuff they also erode the community&#8217;s confidence in them. </p>



<p>Most of the time I don&#8217;t respond or react at all to these kinds of things, but DLS is swiftly becoming the face of larp in a commercial sense, and I am so tired of seeing them drop the ball. Am I being unfair or too harsh? Maybe, though I don&#8217;t think so. All of my frustration is founded in wanting these lovable morons to succeed.  </p>



<p>DLS would do well to figure out what their position is on social issues, because right now it certainly feels like they&#8217;re picking and choosing when it is convenient to respect and protect those who love and attend their events. Maybe then it&#8217;ll be easier to root for them again?</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>missed connections; emergency exit row</title>
		<link>https://tmertz.com/2018/04/missed-connections-emergency-exit-row/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Wed, 04 Apr 2018 17:57:54 +0000</pubDate>
				<category><![CDATA[Journal]]></category>
		<category><![CDATA[Travel]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[missed connections]]></category>
		<category><![CDATA[travelling]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1144</guid>

					<description><![CDATA[You: Lovely infectious laughter, brunette, travelling with your friend. Me: tall chubby red bearded supergeek. We started laughing about the Chinese gentleman who thought we were waving at him when we were yelling at him to take a step backward, so a young mother could get into her seat next to her child. We never [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>You: Lovely infectious laughter, brunette, travelling with your friend. Me: tall chubby red bearded supergeek. </p>



<p>We started laughing about the Chinese gentleman who thought we were waving at him when we were yelling at him to take a step backward, so a young mother could get into her seat next to her child. <br/> We never stopped laughing for the two and a half hour flight. You found it especially funny that I got elbowed in the eye by the flight attendant during the safety demonstration, though you admitted to feeling bad for laughing at my misfortune. <br/> You had been visiting Malta for Easter break with your friend, and was sad to be leaving. I jokingly invited you and your friend to come visit. You accepted (your friend roller her eyes at this). </p>



<p>I don’t know if it was fear or stress at missing my connecting flight, but I never got around to giving you my email address. If you’re out there, I’d like to buy you a cup of coffee sometime. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Private webhooks</title>
		<link>https://tmertz.com/2018/01/private-webhooks/</link>
		
		<dc:creator><![CDATA[Thomas]]></dc:creator>
		<pubDate>Thu, 18 Jan 2018 07:08:45 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[webhooks]]></category>
		<guid isPermaLink="false">https://tmertz.com/?p=1093</guid>

					<description><![CDATA[I was looking into setting up my own incoming webhook server, because webhooks are super cool and useful for a variety of things. And also because I am a giant nerd and wanted to play around with some stuff.  Now, there are very few ready made components for this out there, so I had to do [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignright" style="width:160px"><img loading="lazy" decoding="async" src="https://tmertz.com/wp-content/uploads/2018/01/outgoing-webhook_512-300x300.png" alt="" width="160" height="160" />
    <figcaption>Webhooks are cool!</figcaption>
</figure>



<p>I was looking into setting up my own incoming webhook server, because webhooks are super cool and useful for a variety of things. <br/>And also because I am a giant nerd and wanted to play around with some stuff. </p>



<p>Now, there are very few ready made components for this out there, so I had to do a bit of digging and I&#x27;ve ended up with the configuration I&#x27;m documenting here for posterity. </p>



<p>My setup is running on a VM on my local network, and I&#x27;ve routed an obscure port to it, so I can receive webhook requests from anywhere on the internet. <br/>The setup is as follows:</p>



<ul class="wp-block-list">
    <li>a VM running Ubuntu 16.04.3<br/></li>
    <li>Adnan Hajdarević&#x27;s awesome <a href="https://github.com/adnanh/webhook">Webhook server</a> written in Go.</li>
</ul>



<h2 class="wp-block-heading">Setting up Go</h2>



<p>Go is not in Ubuntus repos yet (should be in 17.04, but that does not have LTS support). So I followed <a href="https://medium.com/@patdhlk/how-to-install-go-1-8-on-ubuntu-16-04-710967aa53c9">these excellent instructions</a>. </p>



<h2 class="wp-block-heading">Running the program as a service</h2>



<p>First I install the webhook server. </p>



<pre class="wp-block-code"><code>go get github.com/adnanh/webhook</code></pre>



<p>This has no real value if I have to log in to the server and manually start it after each reboot, so with a little help from <a href="http://caiustheory.com">Caius</a> I managed to set it up as a service, so the webhook runs on each boot. </p>



<pre class="wp-block-code"><code>[Unit]
Description=Webhook service
ConditionPathExists=/home/[username]/work/bin/webhook
After=network.target

[Service]
Type=simple
User=[username]
Group=[username]
LimitNOFILE=1024

Restart=on-failure
RestartSec=10
startLimitIntervalSec=60

WorkingDirectory=/var/webhook
ExecStart=/home/[username]/work/bin/webhook -hooks /var/webhook/config/hooks.json -verbose

# make sure log directory exists and owned by syslog
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /var/log/echoservice
ExecStartPre=/bin/chown syslog:adm /var/log/echoservice
ExecStartPre=/bin/chmod 755 /var/log/echoservice
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=webhookd

[Install]
WantedBy=multi-user.target</code></pre>



<p>The program loads a config file called hooks.json, that I&#x27;ve placed in /var/webhook/config, and it&#x27;s a basic file that lists the names of the hooks available, what script that hook should activate and what the working directory for that command is.</p>



<pre class="wp-block-code"><code>[
  {
    &quot;id&quot;: &quot;redeploy-webhook&quot;,
    &quot;execute-command&quot;: &quot;/var/scripts/redeploy.sh&quot;,
    &quot;command-working-directory&quot;: &quot;/var/webhook&quot;
  }
]</code></pre>



<p>Now I can define what hooks I want, and whatever scripts I need to have executed. Examples of this could be having my Hue lights flash if one of my servers crash, or privately scrobbling my Plex views, to name but a few things I can do with this little box. <br/></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
