<?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/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
>

<channel>
	<title>Stephan Sokolow&#039;s Blog</title>
	<atom:link href="http://blog.ssokolow.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ssokolow.com</link>
	<description>Programming, Linux, Web, and Fiction Reviews</description>
	<lastBuildDate>Thu, 09 Jul 2026 13:22:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blog.ssokolow.com/wp-content/uploads/2015/08/cropped-favicon-32x32.png</url>
	<title>Stephan Sokolow&#039;s Blog</title>
	<link>https://blog.ssokolow.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	<item>
		<title>Setting Up A Private Mumble Server</title>
		<link>https://blog.ssokolow.com/archives/2026/07/09/setting-up-a-private-mumble-server/</link>
					<comments>https://blog.ssokolow.com/archives/2026/07/09/setting-up-a-private-mumble-server/#respond</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Thu, 09 Jul 2026 13:22:50 +0000</pubDate>
				<category><![CDATA[Geek Stuff]]></category>
		<guid isPermaLink="false">https://blog.ssokolow.com/?p=7175</guid>

					<description><![CDATA[As I mentioned in a recent post, I set up a private Mumble server for the richer set of options for working around a friend&#8217;s network problems and, given that Discord continues their steps toward demanding that you share personal &#8230; <a href="https://blog.ssokolow.com/archives/2026/07/09/setting-up-a-private-mumble-server/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">As I mentioned in a <a href="https://blog.ssokolow.com/archives/2026/07/07/a-simple-modpack-info-generator-for-smapi/">recent post</a>, I set up a private <a href="https://www.mumble.info/">Mumble</a> server for the richer set of options for working around a friend&#8217;s network problems and, given that Discord continues their steps toward demanding that you share personal information with people who are likely to eventually get hacked , opening you up to identity theft (i.e. age verification), that&#8217;s not the only reason I&#8217;m happy with my choice.</p>



<p class="wp-block-paragraph">&#8230;so, here&#8217;s a quick overview of how you too can set up a private <a href="https://www.mumble.info/">Mumble</a> server with good security for voice (but not video) calls that <em>you</em> control. It&#8217;s not the most visually polished set of instructions, but it&#8217;s better than they were when I was just taking notes for my own future reference.</p>



<p class="wp-block-paragraph">(If you&#8217;re running a podcast and want to be able to fine-tune the mix or want clean audio for a local transcription model like <a href="https://github.com/m-bain/whisperX">WhisperX</a> (which <a href="https://amgadhasan.substack.com/p/sota-asr-tooling-long-form-transcription">apparently</a> has the highest accuracy) when people might be talking over each other, it&#8217;s also nice that Mumble has <a href="https://www.mumble.info/blog/for-the-record/">built-in</a>, open-source (i.e. auditable) support for recording each participant to a separate audio track that and doesn&#8217;t depend on a third-party server. <a href="https://craig.chat/">Craig</a> on the other hand… let&#8217;s just say I&#8217;m glad I haven&#8217;t needed more than OBS can do with a Mic vs. Firefox <a href="https://obsproject.com/kb/advanced-recording-guide-and-multi-track-audio">split</a> yet.)</p>



<h2 class="wp-block-heading">Instructions for Administrator:</h2>



<p class="wp-block-paragraph">Here are the steps for the most technically competent (or most willing to learn) person in your group to follow. You can run the server on Windows, macOS, or Linux and, since I run Kubuntu Linux LTS, I&#8217;ll also be providing more specific instructions that should work on any Debian-based Linux, including Mint.</p>



<p class="wp-block-paragraph">First, you&#8217;re going to set up the server and your client, register an account with your preferred name, and grant it administrator privileges.</p>



<ol class="wp-block-list">
<li><strong>If you&#8217;re running your server off your home PC, sign up with a free Dynamic DNS service</strong> so you can have a stable domain name for friends to add to their favourites/bookmarks.<br />(I recommend one that&#8217;s compatible with the DNS-based version of <a href="https://letsencrypt.org/">Let&#8217;s Encrypt</a> verification such as <a href="https://www.dynu.com/">Dynu</a> (what I use) or <a href="https://www.duckdns.org/">DuckDNS</a> so you can have encryption without self-signed certificates and without having to open port 80 or 443 to passing bots.)</li>



<li><strong><a href="https://www.mumble.info/downloads/">Download</a> and install both the mumble client and server.</strong> I installed both on my home PC. If you&#8217;re running a Debian-lineage distro, the packages to install are <code>mumble</code> and <code>mumble-server</code> and they should come with a ready-made set of systemd sandboxing rules, as can be inspected using <code>systemd-analyze security mumble-server.service</code>. (<code>Overall exposure level for mumble-server.service: 2.1 OK &#x1f642;</code> if you scroll to the bottom) &#8230;or you can run the client through Flatpak if you&#8217;re on Linux.</li>



<li><strong>If your install method didn&#8217;t do it for you, run the mumble server.</strong> This happens automatically with the Debian packages and, if you only want it to run some of the time, use <code>sudo systemctl disable mumble-server.service</code> to keep it from running on startup. You can use <code>sudo systemctl start mumble-server.service</code> and <code>sudo systemctl stop mumble-server.service</code> to turn it on and off. (If anyone&#8217;s interested, maybe I&#8217;ll write a quick guide on how to make double-clickable shell scripts out of them, including sudo prompts, and a tip on how to make those specific commands passwordless with <code>/etc/sudoers</code>)</li>



<li><strong>Open the mumble client.</strong> It should initially display the dialog from <code>Configure > Audio Wizard...</code> to set up your audio.</li>



<li><strong>Click the globe icon in the toolbar</strong> if the <code>Mumble Server Connect</code> dialog doesn&#8217;t open automatically, </li>



<li><strong>Set up a Favorites entry:</strong> You should see a single LAN entry for the server running on the same PC you&#8217;re on now. To avoid having to enter your username every time, right-click it and choose &#8220;Add to Favourites&#8221;, then the entry added to Favorites, choose <code>Edit...</code>, and fill out the <code>username</code> field. (If you don&#8217;t see it under LAN, click <code>Add New...</code> and fill in the IP address, your preferred username, and a friendly label manually.)</li>



<li><strong>Close the connect dialog and use <code>Configure > Certificate Wizard...</code></strong> to create a certificate so you can authenticate without using a password every time.</li>



<li><strong>Click the Globe icon to re-open the connect dialog and double-click the entry in Favorites</strong> to re-connect to your server with your new certificate.</li>



<li><strong>Use <code>Self > Register...</code></strong> to permanently bind your certificate to an entry in the server&#8217;s user database. (This will also lock the username associated with your certificate)</li>



<li><strong>Open the Mumble server&#8217;s log</strong> and look for a line that says <code>Password for 'SuperUser' set to '...'</code>. (If using Debian packages, run <code>journalctl --unit mumble-server.service</code> and type <code>/Password</code> followed by pressing Enter.)</li>



<li><strong>Login as SuperUser:</strong> Click the globe icon again, double-click the entry for the server under <code>LAN</code> (<strong>not</strong> <code>Favorites</code>) and enter <code>SuperUser</code> as the username and whatever password you got from that line in the log.</li>



<li><strong>Grant yourself admin permissions:</strong> Right-click <code>Root</code> in the channel/user list and choose <code>Edit...</code>. In the <code>Groups</code> tab, select &#8220;admin&#8221; from the drop-down box in the top <code>Group</code> section and then look down to the <code>Members</code> section and add yourself to the <code>Members</code> box (the left-most one) using the drop-down below it and the Add button. Then click <code>OK</code>. Your normal user now has admin privileges.<br /><br /><strong>NOTE:</strong> This dialog is how you control <strong>all</strong> permissioning. The <code>Root</code> channel is the server-wide permissions that everything will inherit from and you can create channels inside it with different permissions.<br /><br /><strong>NOTE:</strong> If Mumble doesn&#8217;t prompt you about the &#8220;mute cue&#8221;, it&#8217;s a sound that plays if you try to talk while muted and can be disabled by going into <code>Configure > Settings...</code>, selecting the <code>Audio Input</code> tab, scrolling down to the <code>Misc</code> section, and unchecking <code>Mute cue</code>.<br /><br />By default, Mumble will allow all connections. The simplest way to restrict access is to edit <a href="https://www.mumble.info/documentation/administration/config-file/"><code>mumble-server.ini</code></a> and restart the server. (<code>/etc/mumble/mumble-server.ini</code> with Debian packages)<br /><br />My suggestion is to set <code>serverpassword</code> to some easy-to-communicate thing to block port-scanning bots from stumbling into where they can see the list of users and channels, and set <code>certrequired=true</code> so that the authentication flow is &#8220;Trusted user uses the certificate wizard and then enters the password the first time, administrator registers them, and then that removes the password requirement and locks them into place in the permissions system&#8221;.<br /><br />You can then set it so, until users are registered, they can&#8217;t do anything but see the user and channel list. I suggest <a href="https://steamcommunity.com/sharedfiles/filedetails/?id=686093837">this guide</a> for understanding the permissions system. The two details I found either missing or insufficiently clear in the official guide are how permissions are resolved (last/lowest matching entry wins) and  what each permission does.</li>
</ol>



<p class="wp-block-paragraph">Other lines in the server config file that you may want to change are:</p>



<ul class="wp-block-list">
<li><code>welcometext=</code> takes a chunk of the dialect of HTML supported by <a href="https://doc.qt.io/archives/qt-5.15/richtext-html-subset.html">Qt&#8217;s rich text controls</a> which you can use to make a pretty/helpful welcome banner with hyperlinks and the like. (<a href="https://github.com/ShaneCunn/Mumble_Sample_Welcome_message">Example</a>)<br />You can also embed images without needing an external server using a <a href="https://monocalc.com/tool/encode_decode/data_uri_generator">data URI generator</a>.</li>



<li><code>port=</code> lets you set a non-default port so port-scanning bots that want to find Mumble servers have to scan all your ports instead of just checking the default one and then moving on to the next IP address. (Don&#8217;t worry. Mumble has a built-in mechanism for temp-banning IPs that try to brute-force the password.)</li>



<li><code>allowping=false</code> will prevent the current and maximum user count and maximum bandwidth from being exposed to the Connect dialog in users&#8217; clients before they successfully login.</li>



<li><code>imagemessagelength=0</code> will remove the length limit on messages containing embedded images. If you only have a few friends in your server, this shouldn&#8217;t hurt anything and improved the visible quality of the resultant images in my testing.</li>



<li><code>registerName=</code> without the other <code>register*=</code> parameters allows you to keep your server secret but change the name of the root channel from <code>Root</code> to something else.</li>



<li><code>sslCert=/path/to/fullChain.pem</code>, <code>sslKey=/path/to/privkey.pem</code>, (and <code>sslCA=/path/to/fullChain.pem</code> according to <a href="https://wiki.archlinux.org/title/Mumble">Archwiki</a>) are what to set if you have a TLS certificate from <a href="https://letsencrypt.org/">Let&#8217;s Encrypt</a>.</li>
</ul>



<p class="wp-block-paragraph">Beyond that, you can also run a copy of <a href="https://github.com/svenstaro/miniserve/">miniserve</a> as a companion file server for exchanging files with your friends without needing &#8220;the cloud&#8221; and link to it from your Mumble welcome message. (That&#8217;s what the script from my <a href="https://blog.ssokolow.com/archives/2026/07/07/a-simple-modpack-info-generator-for-smapi/">previous post</a> is used for.) It can also accept that TLS certificate via <code>--tls-cert=/path/to/fullChain.pem</code> and <code>--tls-key=/path/to/privkey.pem</code> for encrypted connections, and you can restrict access by giving your friends username-password pairs and storing them in a file you feed to <code>--auth-file=</code>.<br /><br /><strong>Don&#8217;t forget to forward the ports on your router and set exceptions in your PC&#8217;s firewall</strong> or none of this will be visible from outside.</p>



<ol class="wp-block-list"></ol>



<h2 class="wp-block-heading">Instructions for clients:</h2>



<ol class="wp-block-list">
<li><a href="https://www.mumble.info/downloads/">Download the client</a>. Unlike Discord, Mumble has no in-browser option unless the administrator is running a separate web client for you.</li>



<li>The first time you open the mumble client, it should open the dialog from <code>Configure > Audio Wizard...</code> to set up your audio. Follow the steps. (See the <code>Transmission</code> and <code>Audio Processing</code> sections in <code>Configure > Settings... > Audio Input</code> for additional options.)</li>



<li>If the <code>Mumble Server Connect</code> dialog opens automatically after you finish the audio wizard, close it. Instead, use <code>Configure > Certificate Wizard...</code> with the <code>Create a new certificate</code> option to create a certificate so you can authenticate without using a password every time. (Put whatever nick you want in the name field and leave the e-mail field empty.)</li>



<li>Click the globe icon in the toolbar to reopen the <code>Mumble Server Connect</code> field.</li>



<li>Click the <code>Add New…</code> button and fill in the details given to you by the friend who is running the server.</li>



<li>Double-click the entry that has appeared under <code>Favorite</code> to connect.</li>



<li>Mumble&#8217;s default layout is a little unusual so you&#8217;ll probably want to grab the divider between the narrow chat panel on the left and the wide channel/user list on the right and drag it to produce a more Discord-like Layout. (For more customization, see the &#8220;User Interface&#8221; tab in <code>Configure > Settings...</code>. I recommend selecting the <code>Hybrid</code> layout so the text chat field will allow longer messages before it starts to scroll.)</li>



<li>While you wait for the person running the server to verify your identity and then register your certificate to unlock more access, you&#8217;ll probably want to set these options under <code>Configure > Settings...</code>:
<ul class="wp-block-list">
<li><code>User Interface > Look and Feel > Show transmit mode dropdown in toolbar</code></li>



<li><code>Network > Connection > Reconnect to last server on startup</code></li>
</ul>
</li>



<li>Once you&#8217;re testing the call quality, the settings to play with are:
<ul class="wp-block-list">
<li>If your voice is too quiet, <code>Audio Input > Audio Processing > Max. Amplification</code> is the sender-side control to adjust. Recipients also have a local adjustment for themselves only in the context menu for each user in the list.</li>



<li>If ambient noise is a problem, try changing the type of <code>Audio Input > Audio Processing > Noise Suppression</code>. I&#8217;ve found that the default Speex noise suppression isn&#8217;t the best at excluding things like fans, and I use <code>Both</code>.</li>



<li>If your audio sound &#8220;crunchy&#8221; or blown out, double-check that the <code>Quality</code> and <code>Audio per packet</code> settings under <code>Audio Input > Compression</code> didn&#8217;t get set too low. I&#8217;ve found that none of my friends see any problem with <code>40.0 kb/s</code> and <code>20 ms</code>. and, since these values are in kilo<strong>bits</strong>, that&#8217;s still a per-user bandwidth load that could fit in an old dial-up Internet connection.</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"> If you experience cut-outs or voices going robotic, that indicates that packet loss is occurring between someone and the server. Identify whose connection is experiencing packet loss by right-clicking usernames and selecting <code>Information</code> and then checking the <code>Lost</code> column in the <code>UDP Network statistics</code> section.</p>



<p class="wp-block-paragraph">If they have plenty of free bandwidth but are experiencing packet loss nonetheless, that indicates a problem with someone&#8217;s network, but a short-term workaround is to have them try <code>Network > Connection > Force TCP mode</code>. (Using TCP will resend lost data, which can increase latency and bandwidth use, but, if congestion isn&#8217;t the problem, it should just appear to fix things with no noticeable downsides&#8230; I can vouch for this since a friend&#8217;s Internet being flaky was why I switched from Discord to Mumble for this feature.)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2026/07/09/setting-up-a-private-mumble-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>Tips Roll-up 2025 to Present</title>
		<link>https://blog.ssokolow.com/archives/2026/07/08/tips-roll-up-2025-to-present/</link>
					<comments>https://blog.ssokolow.com/archives/2026/07/08/tips-roll-up-2025-to-present/#respond</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 10:05:34 +0000</pubDate>
				<category><![CDATA[Geek Stuff]]></category>
		<guid isPermaLink="false">https://blog.ssokolow.com/?p=7196</guid>

					<description><![CDATA[Here are my 2025 tips too short for anywhere but Mastodon:]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Here are my 2025 tips too short for anywhere but Mastodon:</p>



<ul class="wp-block-list">
<li><strong>Short term fix for rattly GPU fans:</strong> If your 3000-series nVidia GPU&#8217;s fan has started to develop a rattling/ticking noise and you either can&#8217;t afford a replacement fan or can&#8217;t wait, try going into <code>nvidia-settings</code>, taking manual control of the fan speed, and ramping it up in 5% increments until you find a speed where it goes away and stays away. Then, leave it for a few hours before turning auto-speed back on. (I left it overnight.)<br />That shook the fan on my RTX 3060 back into idling quietly at 30% speed.<br />(<strong>UPDATE:</strong> The proper fix is to either send it in for warranty or order a replacement fan from China (<a href="https://www.gpufanreplacement.com/">1</a>, <a href="https://www.aliexpress.com/">2</a>) or to order an adapter cable from someone like <a href="https://gpuconnect.com/">gpuconnect.com</a> and perform a <a href="https://imgur.com/a/asus-rtx-3060-phoenix-v2-deshroud-VDz0wnU">deshroud mod</a> so you can swap in stock fans from someone like <a href="https://www.noctua.at/en/products/browse/fans">Noctua</a>. Depending on your card, it may be possible to swap the fan without taking the heat sink off the GPU, <a href="https://www.youtube.com/watch?v=HFG0nS7AoKw">as it is with the ASUS Phoenix RTX 3060 v2</a> that I have.)</li>



<li><strong>Windows 9x Network Backups:</strong> If you&#8217;re using Windows Backup with a network share to backup your Windows 98 SE retro PC, it&#8217;ll stop at 4GiB and insist you swap disks and won&#8217;t be appeased by moving/renaming the <code>.qic</code> file from the far end. Probably best to partition your drive into volumes of 4GiB or less for simplicity, FAT32 or not. (And leave compression on to ensure there&#8217;s enough room in the file for the backup metadata.)<br />(<strong>UPDATE:</strong> &#8230;or use a network card with a PXE ROM, like the built-in one in Intel PRO/1000 cards, and netboot into Linux to use <code>rsync</code> to do your backups. FAT&#8217;s permission bits are simple enough that <code>rsync</code> can preserve them with the right options.</li>



<li><strong>Replacement for GTK4 Zenity:</strong> For anyone who upgraded their non-GNOME *buntu and discovered that one of their scripts suddenly has a very out-of-place libadwaita-style Zenity dialog popping up, <a href="https://github.com/v1cont/yad"><code>yad</code></a> is in the package repository and only differs by the <code>--info</code>/<code>--question</code>/<code>--warning</code>/<code>--error</code> arguments according to their compatibility wrapper at <a href="https://github.com/v1cont/yad/blob/master/data/misc/zenity.sh">https://github.com/v1cont/yad/blob/master/data/misc/zenity.sh</a></li>



<li><strong>Support files for old HP consumer machines:</strong> Huh. So the fr-ca (eg. Quebecois) listing for support files for this &gt;10-year-old hand-me-down HP Pavilion is still up and in search results, despite the HP site refusing to let me into an English listing because it&#8217;s &#8220;too far out of support&#8221;.<br />&#8230;the newest UEFI they offer still doesn&#8217;t fix the refusal to POST with GeForce cards new enough to be UEFI GOP-native (i.e. 7xx-series and above), but at least now I know.<br />(<strong>UPDATE:</strong> See <a href="https://archive.org/details/gpu-fix-for-hp-ipisb-ch2-modified-bios-image">GPU fix for HP motherboards (IPISB-CH2, IPISB-CH, IPISB-CU, H-Cupertino2) [modified BIOS image]</a> on the Internet Archive for UEFI updates patched to prefer the working VBIOS support over the broken UEFI GOP support.)</li>



<li><strong>LiveUpdate Crescendo:</strong> How many people who were online in the 90s remember the LiveUpdate Crescendo MIDI player plugin? In case anyone wants it, I finally got around to sharing what I have, including the Windows Netscape variant of version 5 from one of my CD-Rs which seems to be missing from the Wayback Machine. → <a href="https://archive.org/details/liveupdate_crescendo" target="_blank" rel="noreferrer noopener">https://archive.org/details/liveupdate</a></li>



<li><strong>Opening a Mac Mini G4 <em>gently</em>:</strong> I just discovered that the instructions that turn up in searches for opening a Mac Mini G4 are unnecessarily brutal and prone to gouging or cracking plastic. Instead of prying anything, here&#8217;s the technique I intuited and used:<br />1. Use one hand to apply pressure between the back I/O shield and the outer frame (like tensioning the cylinder, if you watch lockpicking videos)<br />2. With a <strong>thin</strong> metal spudger/pry tool (eg. <a href="https://www.ifixit.com/products/jimmy">iFixIt Jimmy</a>), work your way around the edge starting at the back, pressing each clip just enough to release it.</li>



<li><strong>Generative AI:</strong> Turns out I&#8217;m not the only one who thought generative AI looks suspiciously like a procedurally generated gacha game: <a href="https://pivot-to-ai.com/2025/06/05/generative-ai-runs-on-gambling-addiction-just-one-more-prompt-bro/">Generative AI runs on gambling addiction — just one more prompt, bro!</a></li>



<li><strong>Blue Yeti PipeWire Bug:</strong> If your Blue Yeti doesn&#8217;t show up in *buntu 24.04 and was working fine in *buntu 22.04, it&#8217;s probably a bug related to the switch to Pipewire where the wireplumber state can get messed up.<br />Check that it&#8217;s present in <code>arecord -L</code> and then run <code>rm -rf ~/.local/state/wireplumber; pkill pipewire</code> to reset things. Once pipewire restarts, the Yeti should pop into your <code>pavucontrol</code> or KDE System Settings Audio panel like normal.</li>



<li><strong>Blocking Thunderbird Quick Filter Bar from Closing:</strong> Since the Thunderbird people just duped bug 1947722 (support for disabling hiding the Quick Filter bar on Esc keypresses) against bug 1922924 (disable Esc when filter settings are pinned), here&#8217;s a little python-xlib hack for the <strong>actually</strong> desired functionality by filtering events.<br /><a href="https://gist.github.com/ssokolow/74c8bda3dafc133e615e3152b815196f" target="_blank" rel="noreferrer noopener">https://gist.github.com/ssokolow/74c8bda3dafc133e615e3152b815196f</a><br />Wayland users will have to force their Thunderbird to run as an X11 app via XWayland or Wayland&#8217;s security model will prevent this from working.</li>



<li><strong>Line Boost keeps resetting:</strong> If PipeWire/WirePlumber keeps resetting ALSA mixer settings on hotplug (eg. slamming &#8220;Line Boost&#8221; to 100% whenever you plug/unplug headphones or Ctrl+Alt+# switch virtual consoles), the &#8220;Pro Audio&#8221; profile (settable via the PulseAudio compatibility layer through KDE&#8217;s System Settings → Audio or <code>pavucontrol</code>) will stop it from meddling in the ALSA mixer so you can fix things. #linux #audio #linuxaudio</li>



<li><strong>Firefox Keyword Search Frustration:</strong> If your firefox keyword search has been messing up recently, including your trigger keyword (eg. my <code>wp</code> for Wikipedia) in what&#8217;s searched for or copy-pasting the search you just did instead of the retrieved URL, try toggling <code>Settings > Search > Show search terms in the address bar on results pages</code>.<br />If you&#8217;re running into the same thing as me, the bug is a new feature that leaves the state of the address bar un-reset after you press Enter.</li>



<li><strong>Alcohol 120% PSA:</strong> The installer for Alcohol 52% Free Edition 2.1.1.2201 attempts to install a piece of malware named BrightSDK. If you have a system which is giving you the &#8220;Loading Alcohol device drivers failed!&#8221; error after a system update, keep your old version and just extract the appropriate <code>SPTDinst.exe</code> or <code>SPTD2inst.exe</code> for your system from it using 7zip.<br />(BrightSDK turns your computer into a crawler bot for AI scrapers to get around <a href="https://github.com/lord-alfred/ipranges">blocklists</a> intended to stop <code>robots.txt</code>-dodgers.)</li>



<li><strong>systemd footgun:</strong> Accidentally running <code>systemd --user</code> instead of <code>systemctl --user</code> may render your D-Bus session bus unresponsive until you log out, breaking Pipewire, XDG portals, and a lot of other things.<br />(It&#8217;s probably a good idea to add an alias or function to your bashrc or zshrc to block accidental invocation of it.)</li>



<li><strong>Force-fixing GTK Open/Save dialogs in Flatpaks:</strong> Use this command to batch-set all your installed GNOME Runtime-based Flatpak apps which don&#8217;t yet use portallized Open/Save dialogs to default to opening the dialog to <code>$PWD</code> instead of the Recent tab.<br /><code>for X in $(flatpak list --app-runtime=org.gnome.Platform --columns=application | tail +1); do flatpak run --command="gsettings" "$X" set org.gtk.Settings.FileChooser startup-mode cwd; done</code></li>



<li><strong>Wine Black Texture Bug:</strong> If you don&#8217;t want to use a Wine/Proton manager like Lutris or Bottles, the black texture bug that the game Born of Bread exhibits under the distro-provided Wine 9.0 on Ubuntu Linux 24.04 can be fixed by installing <a href="https://github.com/doitsujin/dxvk">DXVK</a>. (The last version compatible with Wine versions below 10.0 is <a href="https://github.com/doitsujin/dxvk/releases/tag/v2.7.1">DXVK 2.7.1</a>.)</li>



<li><strong>XInput Wrappers under Wine:</strong> If you want to disable controller rumble for the GOG release of Born of Bread under Wine (i.e. not system-wide) and you&#8217;re using <a href="https://github.com/KrossX/Durazno">Durazno</a> as your XInput wrapper, you need to set a <code>native, then builtin</code> DLL override for <code>xinput1_3</code> in <code>winecfg</code> and the game will look for DLLs under <code>GOG Games/Born of Bread/BornOfBread/Binaries/Win64</code>, but the <code>durazno.ini</code> is created/searched next to the top-level <code>BornOfBread.exe</code> under <code>GOG Games/Born of Bread</code>.</li>



<li><strong>Making Firefox AI Enhancements Opt-In:</strong> Firefox does allow you to configure it so future &#8220;AI Enhancements&#8221; are opt-in… it just doesn&#8217;t pop up the note that you can &#8220;unblock specific features&#8221; (eg. the on-device counterpart to Chrome&#8217;s Google Translate integration) until <em>after</em> you are committed enough to try toggling the global &#8220;Block AI enhancements&#8221; option. (under <code>Preferences &gt; AI Controls" URL: about:preferences#ai</code> )</li>



<li><strong>Opening OSTENT Wiimote Pistol Shells:</strong> If you want to open up OSTENT wiimote pistol shells to lubricate the trigger mechanism to stop it squeaking, two of the moulded plastic screw heads on the pistol grip are actually decorative plastic covers you&#8217;ll need to lever out with a push pin to reveal two more actual crews.<br />(<strong>UPDATE:</strong> This is also useful if your trigger keeps catching/sticking. You can open up the shell and shave a corner off the trigger slide with a utility knife.)</li>



<li><strong>nVidia and modelines:</strong> Modern nVidia drivers refuse manually specified modelines if you disable EDID, and it apparently hard-codes &#8220;primary = leftmost&#8221; at the <code>xorg.conf</code> level now, making <code>MetaModes</code> useless.<br />To lock your resolution, leave KScreen 2 enabled for the &#8220;primary != leftmost&#8221; fixup and patch your X server or Wayland compositor, write an <code>LD_PRELOAD</code> hook for XRandR APIs, or buy a hardware EDID emulator.<br />To prevent hot-unplug from jumbling your outputs, patch your compositor or buy a pass-through HDMI dummy plug.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2026/07/08/tips-roll-up-2025-to-present/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>A Simple &#8220;Modpack Info&#8221; Generator for SMAPI</title>
		<link>https://blog.ssokolow.com/archives/2026/07/07/a-simple-modpack-info-generator-for-smapi/</link>
					<comments>https://blog.ssokolow.com/archives/2026/07/07/a-simple-modpack-info-generator-for-smapi/#comments</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Tue, 07 Jul 2026 13:00:16 +0000</pubDate>
				<category><![CDATA[Geek Stuff]]></category>
		<guid isPermaLink="false">https://blog.ssokolow.com/?p=7185</guid>

					<description><![CDATA[I&#8217;ve been playing Stardew Valley with a few friends, with mods, and, when one of them started experiencing intermittent packet loss that messed up the Discord call, I decided to set up a private Mumble server since Mumble has a &#8230; <a href="https://blog.ssokolow.com/archives/2026/07/07/a-simple-modpack-info-generator-for-smapi/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve been playing Stardew Valley with a few friends, with mods, and, when one of them started experiencing intermittent packet loss that messed up the Discord call, I decided to set up a private <a href="https://www.mumble.info/">Mumble</a> server since Mumble has a &#8220;Force TCP&#8221; checkbox which, as expected, cleared it up.</p>



<p class="wp-block-paragraph">However, I got a little nerd-sniped and have been incrementally rediscovering the fun of webmastering a 2000s gaming guild website and the most recent thing I got carried away with was a little Python script which will take a zipped up <code>Mods</code> folder from a <a href="https://smapi.io/">SMAPI</a>-augmented Stardew Valley install and render a <code>.info.html</code> file alongside it with a pretty summation of the <code>manifest.json</code> files inside.</p>



<p class="wp-block-paragraph"><a href="https://gist.github.com/ssokolow/0fa340fa0a6f6c53cb2dac346641ad95">Here it is</a> in case anyone else wants it.</p>



<script src="https://gist.github.com/ssokolow/0fa340fa0a6f6c53cb2dac346641ad95.js"></script>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2026/07/07/a-simple-modpack-info-generator-for-smapi/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>Tips Roll-up 2023-2024</title>
		<link>https://blog.ssokolow.com/archives/2025/02/12/tips-roll-up-2023-2024/</link>
					<comments>https://blog.ssokolow.com/archives/2025/02/12/tips-roll-up-2023-2024/#respond</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Wed, 12 Feb 2025 05:09:30 +0000</pubDate>
				<category><![CDATA[Geek Stuff]]></category>
		<guid isPermaLink="false">https://blog.ssokolow.com/?p=6981</guid>

					<description><![CDATA[Here are a few things that I posted on Mastodon because they were too short for a blog post, but which I think should be cross-posted anyway for archival:]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Here are a few things that I posted on Mastodon because they were too short for a blog post, but which I think should be cross-posted anyway for archival:</p>



<ul class="wp-block-list">
<li><strong>KVM &#8220;not compatible with&#8221; Linux or Mac OS:</strong> If you have a DVI KVM switch that says its &#8220;double-tap scroll lock to switch inputs&#8221; feature is only compatible with Windows, what they probably mean is &#8220;we listen for the scroll lock LED to blink and Windows is the only OS that maps the Scroll Lock keycode to a modifier in this day and age&#8221;. Here&#8217;s a <a href="https://gist.github.com/ssokolow/01e8b9b6029f1a4c73b53b48aa5c770a">script</a> I wrote to trigger the switch on X11 and then made a taskbar icon for.</li>



<li><strong>Two-page CBZ to HTML conversion:</strong> If you&#8217;re stubborn like me and have a CBZ file containing a bunch of two-page spreads that Calibre splits and orders incorrectly when making an EPUB file, you too can work around the iOS Files app&#8217;s refusal to load subresources and turn it into a quick-and-dirty CBZ reader by embedding your pages into an HTML file using data URIs using <a href="https://gist.github.com/ssokolow/482f9277251c7fdbd907c2711109f050">this script I wrote</a>&#8230; it actually performs quite well in my testing. (&lt;2s load time for a 40MiB CBZ file)</li>



<li><strong>Sandboxing libusb:</strong> If you&#8217;re setting up systemd sandboxing for a libusb-based daemon, you&#8217;ll need to allow <code>AF_NETLINK</code> sockets (eg. <code>RestrictAddressFamilies=AF_NETLINK</code>) if you want it to work… I&#8217;m still trying to figure out a working <code>DeviceAllow</code> string for my CM19A so I can go back to the <code>DevicePolicy=closed</code> and <code>PrivateDevices=yes</code> I was using with my CM17A. You can poke at the full systemd unit file at <a href="https://github.com/ssokolow/fan_remote/">ssokolow/fan_remote</a> on GitHub.</li>



<li><strong>TekSavvy DSL, IPv6, and OPNSense:</strong> If you&#8217;re on TekSavvy DSL, following <a href="https://docs.opnsense.org/manual/how-tos/ipv6_dsl.html" target="_blank" rel="noreferrer noopener">the &#8220;IPv6 for generic DSL dialup</a>&#8220;<a href="https://docs.opnsense.org/manual/how-tos/ipv6_dsl.html" target="_blank" rel="noreferrer noopener"> guide</a> then restarting your router and disconnect/reconnect cycling LAN devices will WORK to get you IPv6 (you may need to toggle Firefox&#8217;s DoH to get fallback working on <a href="https://ipv6-test.com/" target="_blank" rel="noreferrer noopener">https://ipv6-test.com/</a> )&#8230; but it won&#8217;t get you ICMPv6. Follow <a href="https://homenetworkguy.com/how-to/configure-ipv6-opnsense-with-isp-such-as-comcast-xfinity/" target="_blank" rel="noreferrer noopener">this &#8220;How to Configure IPv6 in Your Home Network with ISP such as Comcast Xfinity&#8221; guide</a> for that but set &#8220;any&#8221; as the destination address instead of &#8220;WAN address&#8221; or it won&#8217;t work.</li>



<li><strong>86Box and Flatpak:</strong> If you&#8217;re getting strange read/write errors or &#8220;sharing violation&#8221;s when running &#8220;make boot disk&#8221; tools/batch files in 86Box and you&#8217;re using the Flatpak version, create your floppy disk images inside <code>~/.var/app/net._86box._86Box/</code> or grant a manifest permission. Apparently there&#8217;s a bug or incompleteness in the Flatpak documents portal FUSE filesystem.</li>



<li><strong>Missing CD Audio in Games:</strong> If you get an <code>MMSYSTEM262</code> error from The Incredible Toon Machine and no CD music (or just no CD music from Age of Empires in general) on Windows 9x and you have more than one CD drive (eg. physical and DAEMON Tools or Alcohol 52% Retro Edition), the fix is probably to go into <code>Control Panel → Multimedia → Devices → Media Control Devices → CD Audio Device (Media Control) → Properties → Settings</code> … and change &#8220;Default CD-ROM drive for playing CD music&#8221;.<br />I&#8217;m not sure how to do this on Windows XP since the equivalent to that last <code>Settings</code> button does nothing when clicked, so the workaround for newer Windows versions is just to go into the system management console and swap the drive letters of your optical drives. (Though that may make some badly-designed games require a reinstall to get them to look at the new drive letter.)</li>



<li><strong>Flaky iPhone:</strong> If you&#8217;ve got a hand-me-down iPhone where the flashlight or rotation lock occasional toggle without being asked, the touch sensor on the back may be too sensitive. Try turning off the &#8220;tap on the back of the phone to&#8230;&#8221; feature and see if that fixes it. (For me, it had become so sensitive it was activating <em>through</em> the Otter Box belt clip I&#8217;m using as a lens cap and the air gap below it.)</li>



<li><strong>YD-RP2040:</strong> The YD-RP2040 isn&#8217;t 100% compatible with name-brand Raspberry Pi Pico boards. If you need to build something that has it acting as a USB host, prepare for the slightly fiddly job of tacking a piece of resistor leg between the two legs of a BAT54C barrier diode facing the USB C connector to allow current from <code>Vin</code> to flow to the USB connector (I&#8217;ve contributed an annotated photo in the ps2x2pico <a href="https://github.com/No0ne/ps2x2pico/?tab=readme-ov-file#troubleshooting">README</a> &#8230; also, the <code>(VBUS)</code> and <code>(VSYS)</code> silkscreens on the bottom are wrong. <code>Vout</code> is <strong>not</strong> <code>VBUS</code>. Follow <a href="https://github.com/initdc/YD-RP2040/blob/master/YD-2040-2022-V1.1-SCH.pdf">this schematic</a>.</li>



<li><strong>Display Alignment in KDE:</strong> If snap-to-edge behaviour in KDE Display Settings is preventing you from getting the monitor alignment you want (eg. top-aligned 1280&#215;1024,1920&#215;1080,1280&#215;1024), try changing (but not applying) resolutions, then snapping, then changing them back.</li>



<li><strong>No route to host:</strong> If your client says &#8220;No route to host&#8221; on some ports but not others, double-check your server&#8217;s firewall configuration… for example, if you&#8217;re trying to use UFW and something also installed firewalld behind your back, you&#8217;re going to get very confusing symptoms that won&#8217;t be fixed by asking UFW to flush your iptables and re-create them.</li>



<li><strong>annoyingasians.mpg:</strong> If you ever wondered what the music was from an old ebaumsworld video named <code>annoyingasians.mpg</code> with no other context&#8230; searching the filename on YouTube allows Content ID to find the answer. It&#8217;s called<a href="https://www.youtube.com/watch?v=2TqoacPsq_8"> 중화반점.</a></li>



<li><strong>Firefox Smooth Scrolling:</strong> If you&#8217;re getting smooth scrolling from your scroll wheel in Firefox despite the checkbox still being unchecked and you don&#8217;t like your scrolling being slow/laggy, try going into <code>about:config</code> and toggling the <code>general.smoothScroll.mouseWheel</code> pref to also be false.</li>



<li><strong>WinSCP:</strong> If you&#8217;re using WinSCP&#8217;s <code>synchronize</code> command in a script but you don&#8217;t edit your script very often and your new exclusion pattern seems to be getting ignored, check if you&#8217;re trying to name a directory without including the trailing slash.</li>



<li><strong>Occam&#8217;s Razor:</strong> Put a pin in this for future sharing → <a href="https://www.youtube.com/watch?v=mO46CNftRDs" target="_blank" rel="noreferrer noopener">https://www.youtube.com/watch?v=mO46CNftRDs</a><br />&#8220;Actually, it&#8217;s not asteroid bacteria&#8230; we discovered that bacteria managed to evolve to eat the cleaning products we use to sterilize clean rooms&#8221; is one of the most intuitive examples I&#8217;ve seen for why people shouldn&#8217;t leap to assuming fantastic answers like UFOs or cryptids.</li>



<li><strong>Python enums:</strong> Because of how Python&#8217;s <code>enum.Enum</code> implements nominal typing and how Python imports work, it risks seemingly mundane refactorings causing <code>var == FooEnum.Bar</code> comparisons to start to mysteriously fail when PyQt and Qt Designer&#8217;s &#8220;Promote…&#8221; feature are involved. If you don&#8217;t need such strict nominal typing, using <code>enum.IntEnum</code> to relax the equality comparison will avoid that source of footguns.</li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2025/02/12/tips-roll-up-2023-2024/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>Fixing Hotplug for the ATI Remote Wonder II on X11</title>
		<link>https://blog.ssokolow.com/archives/2024/01/21/fixing-hotplug-for-the-ati-remote-wonder-ii-on-x11/</link>
					<comments>https://blog.ssokolow.com/archives/2024/01/21/fixing-hotplug-for-the-ati-remote-wonder-ii-on-x11/#comments</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Mon, 22 Jan 2024 02:03:43 +0000</pubDate>
				<category><![CDATA[Lair Improvement]]></category>
		<guid isPermaLink="false">http://blog.ssokolow.com/?p=6963</guid>

					<description><![CDATA[EDIT: It turns out hotplug wasn&#8217;t the problem. Something else is resetting the X11 keymap without it involving the device getting reset&#8230; I&#8217;m done with this nonsense. I&#8217;ll temporarily set a user cronjob to force it back to what it&#8217;s &#8230; <a href="https://blog.ssokolow.com/archives/2024/01/21/fixing-hotplug-for-the-ati-remote-wonder-ii-on-x11/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>EDIT:</strong> It turns out hotplug wasn&#8217;t the problem. Something else is resetting the X11 keymap without it involving the device getting reset&#8230; I&#8217;m done with this nonsense. I&#8217;ll temporarily set a user cronjob to force it back to what it&#8217;s supposed to be and then, when I have a moment, replace <code>xbindkeys</code> with a udev rule to loosen the security on the ATi Remote Wonder&#8217;s <code>evdev</code> node (it&#8217;s not as if I&#8217;ll ever be entering sensitive data using it) and a custom quick-and-dirty runs-in-my-X11-session daemon to listen to the raw evdev input events and react to them. (Sort of a knock-off <a href="https://lirc.org/">LIRC</a> for something the kernel driver exposes as a keyboard and mouse.)</p>



<p class="wp-block-paragraph"><strong>EDIT (The following day):</strong> Instead of going through all this mess, just bypass the nonsense. Install <a href="https://github.com/k0kubun/xremap">xremap</a>, set a udev rule like <code>SUBSYSTEMS=="usb", ATTRS{idVendor}=="0471", ATTRS{idProduct}=="0602", MODE="0664"</code>, create your mappings somewhere like <code>~/.config/xremap.yml</code>, and then add an autostart entry for your desktop that says <code>sh -c "exec xremap ~/.config/xremap.yml --watch=device --device 'ATI Remote Wonder II'"</code>. That way, you&#8217;re binding directly against the evdev symbols <em>and</em> you have the ability to keybind to things like &#8220;A, but only from the remote, not the keyboard&#8221;, which is a big hassle otherwise. Its support for application-specific keybinds even has support for Wayland if you&#8217;re using either GNOME Shell, KWin, or something wlroots-based as your compositor.</p>



<p class="wp-block-paragraph">If you&#8217;ve got an ATi Remote Wonder II and you&#8217;re using an X11-based desktop, you might have noticed that it&#8217;s a bit of a hassle to get the mappings to stick for the buttons with keycodes outside the 0-255 range that X11 supports.</p>



<p class="wp-block-paragraph">First, you need to remap them into the range the X11 core protocol supports, which isn&#8217;t <em>that</em> difficult if you&#8217;re familiar with <a href="https://wiki.archlinux.org/title/udev#About_udev_rules">writing udev rules</a>&#8230;</p>



<pre class="wp-block-code"><code># /etc/udev/rules.d/99-ati-remote-wonder-ii.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0471", ATTRS{idProduct}=="0602", RUN+="/usr/bin/setkeycodes 0x005C 28 0x015C 28 0x025C 28 0x035C 28 0x045C 28 0x0020 192 0x0120 192 0x0220 192 0x0320 192 0x0420 192 0x0021 19
3 0x0121 193 0x0221 193 0x0321 193 0x0421 193"</code></pre>



<p class="wp-block-paragraph">&#8230;but the range from 0-255 makes it kind of difficult to find keys that both <em>have</em> a default X11 keysym mapping and don&#8217;t have some kind of predefined behaviour attached to them, such as altering the volume.</p>



<p class="wp-block-paragraph">With Kubuntu Linux 20.04 LTS, the above line was enough but, when I upgraded to 22.04 LTS, something broke my mapping for a &#8220;trigger the talking clock from bed and log the time I asked&#8221; button.</p>



<p class="wp-block-paragraph">KDE lacks the ability to do what I want through the GUI, custom keymaps are practically undocumented and apparently require editing stuff under <code>/usr</code> to boot, and I couldn&#8217;t just run <code>xmodmap</code> once a minute on a cronjob, since that exacerbated a reset bug that shows up with X11+my USB-PS2 adapter+my pre-2013-layout Unicomp keyboard, so that left me with only one option: Figuring out the &#8220;in an X11 session&#8221; equivalent to <code>udev</code>&#8216;s <code>RUN+=</code> construct.</p>



<p class="wp-block-paragraph">Enter <code><a href="https://github.com/andrewshadura/inputplug">inputplug</a></code>. It&#8217;s included in the Ubuntu repos and it&#8217;s a daemon which will run a script every time the XInput hierarchy changes.</p>



<p class="wp-block-paragraph">Here&#8217;s the little script I wrote (based on the usual boilerplate template I start all my Python scripts from), to fire off an <code>xmodmap</code> every time some kind of USB hiccup resets the ATi Remote Wonder II&#8217;s key mapping:</p>



<pre class="wp-block-code"><code>#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Helper to apply xmodmap settings every time USB connectivity for the
ATi Remote Wonder II hiccups and resets them.
"""

__author__ = "Stephan Sokolow (deitarion/SSokolow)"
__appname__ = "inputplug command for ATi Remote Wonder II"
__version__ = "0.1"
__license__ = "MIT"

import logging, os, subprocess, time
log = logging.getLogger(__name__)


def main():
    """The main entry point, compatible with setuptools entry points."""
    from argparse import ArgumentParser, RawDescriptionHelpFormatter
    parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter,
      description=__doc__.replace('\r\n', '\n').split('\n--snip--\n')&#91;0])
    parser.add_argument('-V', '--version', action='version',
      version="%%(prog)s v%s" % __version__)
    parser.add_argument('-v', '--verbose', action="count",
      default=2, help="Increase the verbosity. Use twice for extra effect.")
    parser.add_argument('-q', '--quiet', action="count",
      default=0, help="Decrease the verbosity. Use twice for extra effect.")
    parser.add_argument('event_type', action="store")
    parser.add_argument('device_id', action="store")
    parser.add_argument('device_type', action="store")
    parser.add_argument('device_name', action="store")

    args = parser.parse_args()

    # Set up clean logging to stderr
    log_levels = &#91;logging.CRITICAL, logging.ERROR, logging.WARNING,
                  logging.INFO, logging.DEBUG]
    args.verbose = min(args.verbose - args.quiet, len(log_levels) - 1)
    args.verbose = max(args.verbose, 0)
    logging.basicConfig(level=logging.DEBUG,
                format='%(levelname)s: %(message)s')

    if args.device_type != 'XISlaveKeyboard':
        log.debug("Skipped event from device (type != XISlaveKeyboard): %s",
            args.device_name)
        return
    if args.device_name != 'ATI Remote Wonder II':
        log.debug("Skipped event from device (name != ATI Remote Wonder II):"
            " %s", args.device_name)
        return
    log.info("Calling xmodmap after 1-second delay")
    time.sleep(1)
    subprocess.check_call(&#91;'xmodmap', os.path.expanduser('~/.xmodmaprc')])


if __name__ == '__main__':  # pragma: nocover
    main()

# vim: set sw=4 sts=4 expandtab :</code></pre>



<p class="wp-block-paragraph">Yes, the <code>time.sleep(1)</code> is a hack, but I just don&#8217;t have time to be <em>that</em> correct about it. You run it by putting it at <code>~/bin/set_xmodmap_for_remote.py</code>, <code>chmod</code>-ing it executable, and launching <code>inputplug -0 -c ~/bin/set_xmodmap_for_remote.py</code>.</p>



<p class="wp-block-paragraph">(The <code>-0</code> makes <code>inputplug</code> act as if all input devices were hot-plugged <em>after</em> it launched, so you don&#8217;t need to pull and plug the remote&#8217;s receiver on boot to get the initial <code>xmodmap</code>.)</p>



<p class="wp-block-paragraph">Just run that on login through whatever approach your desktop prefers and you should be good.</p>



<p class="wp-block-paragraph">I&#8217;m partial to putting this into <code>~/.config/autostart/inputplug.desktop</code> rather than puttering around with the GUIs:</p>



<pre class="wp-block-code"><code>&#91;Desktop Entry]
Version=1.0
Type=Application
Name=inputplug
GenericName=XInput Hierarchy Change Handler
Comment=Restore xmodmap changes after ATi Remote Wonder hotplug
Exec=sh -c "exec inputplug -0 -c ~/bin/set_xmodmap_for_remote.py"
StartupNotify=true
Terminal=false</code></pre>



<p class="wp-block-paragraph">(The <code>sh -c "exec ..."</code> hack is needed because <code>.desktop</code> files don&#8217;t support <code>~</code> or <code>$HOME</code> otherwise and I don&#8217;t want to hard-code the path to my home dir.)</p>



<p class="wp-block-paragraph">I have noticed a weird thing in testing where the first input event from the remote after a hotplug isn&#8217;t subject to the changed settings, no matter how long I wait before trying, but I&#8217;m not sure how to diagnose it so we&#8217;ll just stop here for now.)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2024/01/21/fixing-hotplug-for-the-ati-remote-wonder-ii-on-x11/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>Fanfiction &#8211; Taylor Varga</title>
		<link>https://blog.ssokolow.com/archives/2023/11/24/fanfiction-taylor-varga/</link>
					<comments>https://blog.ssokolow.com/archives/2023/11/24/fanfiction-taylor-varga/#comments</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Fri, 24 Nov 2023 08:45:14 +0000</pubDate>
				<category><![CDATA[Fanfiction]]></category>
		<guid isPermaLink="false">http://blog.ssokolow.com/?p=6948</guid>

					<description><![CDATA[Taylor Varga by mp3.1415player Length: 2,058,592 wordsStatus: OngoingCrossover: Worm + Luna Varga (but with the assumption nobody but the author has seen Luna Varga) Today&#8217;s fic is a doozy and not just for its eye-opening length. Like the stories by &#8230; <a href="https://blog.ssokolow.com/archives/2023/11/24/fanfiction-taylor-varga/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://www.fanfiction.net/s/12404721/1/Taylor-Varga">Taylor Varga</a> by mp3.1415player</p>



<p class="wp-block-paragraph"><strong>Length:</strong> 2,058,592 words<br /><strong>Status:</strong> Ongoing<br /><strong>Crossover:</strong> Worm + <a href="https://www.anime-planet.com/anime/luna-varga">Luna Varga</a> (but with the assumption nobody but the author has seen Luna Varga)</p>



<p class="wp-block-paragraph">Today&#8217;s fic is a doozy and not just for its eye-opening length. Like the stories by mp3.1415player on my <a href="https://blog.ssokolow.com/fanfiction-review-todo-list/">review TODO list</a>, it&#8217;s excellent on its own merits. (Among other things, it feels as if at least 95% of all memorable moments in the Worm fanfiction I&#8217;ve read come from this story.)</p>



<p class="wp-block-paragraph">Being so long, it&#8217;s one of those stories where more than just the plot evolves over time&#8230; so I&#8217;ll discuss it in segments. There will be things that are <em>technically</em> spoilers but, because this fic is so much about the journey, I don&#8217;t think knowing the high-level details ruin anything.</p>



<p class="wp-block-paragraph">When things start out, it&#8217;s Yet Another Alternative Trigger Fic (Buffy the Vampire Slayer fandom has YAHF (Yet Another Halloween Fic), so I think I can make a mild commentary on the prevalence of alternative triggers). Being a Luna Varga crossover, as you might expect, Taylor winds up stuck with a tail and body-sharing with/changing into a Godzilla knock-off.</p>



<p class="wp-block-paragraph">However, that&#8217;s where things diverge. If there&#8217;s one summary that <em>would</em> fit the entire story, it&#8217;s &#8220;What would happen if you dropped an <a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/OutsideContextProblem">Outside Context Problem</a> into the Worm setting on the side of good?&#8221; &#8230;very much so. Taylor Varga is essentially a fix-fic that doesn&#8217;t feel like a fix-fic. It&#8217;s a story that could be summed up as &#8220;destiny trolls the Worm setting&#8221;. It&#8217;s a light, character-centric story that&#8217;s a lot of fun.</p>



<p class="wp-block-paragraph">Just look at what Director Piggot has to say about informing the Chief Director:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;I was really hoping to have more to tell her than &#8216;<em>I don&#8217;t know what the fuck is going on but it&#8217;s scaly and snickers a lot</em>&#8216; though. Never mind this entire damn Coil problem.&#8221;</p>
<cite>Taylor Varga, Chapter 98</cite></blockquote>



<p class="wp-block-paragraph">&#8230;and yes, them thinking that Coil is a problem is a result of Coil&#8217;s problem status being neutralized. More specifically, because Taylor is now bonded to a magic alien dinosaur demon, she doesn&#8217;t quite follow the same laws of physics anymore, which causes a <em>ton</em> of problems for any thinker abilities that would otherwise make it difficult to write a fix-fic which runs off the canon rails as gleefully as this one does over its couple-million-word run. In Coil&#8217;s case, he spends the first half of the fic hiding in his bunker, bothering nobody, as he desperately tries to figure ouy why timelines where he meddles keep ending in black voids.</p>



<p class="wp-block-paragraph">Of course, it it were <em>just</em> a Luna Varga crossover, that&#8217;d be too simple. Whatever &#8220;Greater Power&#8221; decided to hijack Taylor&#8217;s trigger event also unshackled Varga&#8217;s abilities&#8230; watch out Brockton Bay, Taylor Hebert is now an infinitely variable dinosaur (her words, not mine) with a human-form tail hidden under a magical <a href="https://hitchhikers.fandom.com/wiki/Somebody_Else%27s_Problem_Field">Somebody Else&#8217;s Problem Field</a> and a permanent new best friend with a questionable sense of appropriate humor.</p>



<p class="wp-block-paragraph">So, yes. Stage one in the story is Taylor Hebert or, more correctly, &#8220;Saurial&#8221; the anthropomorphic velociraptor girl, wandering around Brockton Bay and stopping crime she bumps into while she gets used to her changed situation&#8230; and then starting to experiment with other forms. Enter PHO. Playing into people&#8217;s preconceptions because it&#8217;s fun and/or helps keep a secret identity will be a recurring theme.</p>



<p class="wp-block-paragraph">Combine that with yet another twist on &#8220;The locker incident leads to Taylor and Danny manoeuvring Blackwell into a corner&#8221; and Taylor winds up at Arcadia where a chance encounter (Amy Dallon trips over Taylor&#8217;s invisible tail and then Taylor unknowingly gives her a glimpse at her biology when offering her a hand up) and Taylor&#8217;s ambient Outside Context Problem-ness (which will be lampshaded later) lead to a new friendship for Taylor and Panacea finally accepting the idea that she needs some &#8220;me time&#8221;.</p>



<p class="wp-block-paragraph">Throw in an incident with Taylor saving the Undersiders from Lung, and the stage is set for phase 2.</p>



<p class="wp-block-paragraph">In Phase 2, Amy Dallon gets talked into actually using her abilities and, before you know it, Ianthe (Amy) and Metis (Lisa), the reptilian exo-suits made from repurposed onion biomass, are wandering around and PHO is inadvertently helping them to build a backstory about The Family, a species of reptilian aliens from deep time who H.P. Lovecraft might have taken inspiration from.</p>



<p class="wp-block-paragraph">Phase 2 also involves a lot of &#8220;Let&#8217;s use fix-fic as a vehicle to troll the setting by way of varga magic&#8221; humour, including a supermaterial Varga can conjure up that he only knows as &#8220;the good stuff&#8221;. </p>



<p class="wp-block-paragraph">This is also a fic where Taylor is so good at math that she arrives at Vista&#8217;s powers from another direction, and then makes a &#8220;desktop R&#8217;lyeh&#8221; as a gag gift for Danny which inspires Vista to unintentionally traumatize her classmates and teammates by discovering how to create Lovecraftian &#8220;monstrous geometry&#8221; using only a pencil and paper&#8230; and one where Taylor helps Amy realize that, if she creates a bioconstruct to do it for her, she can enhance herself, including her brain, and do so without the risk of wrecking something. (Something which, combined with Taylor bringing novelty wherever she goes, makes the shards of all Taylor&#8217;s growing circle of cape friends very happy&#8230; though Lisa isn&#8217;t particularly pleased with how much she&#8217;s inadvertently taught hers to feel smug when they start to sense their presence.)</p>



<p class="wp-block-paragraph">Basically, once the story really gets going, it&#8217;s a fun character piece about three smart, wildly OP young women with offbeat senses of humour (one of whom is still clinging to the idea of being &#8220;the normal one&#8221;) slowly fixing the Worm setting with the power of trolling, confusion, unknowingly having moments of comically good luck, being genuinely good people, and being so visibly OP in their alternative identities that it completely stymies people who would plot against them.. (Gotta love stories where people are unarguably OP but it doesn&#8217;t hurt the story because &#8220;not even Superman can punch clinical depression&#8221;.)</p>



<p class="wp-block-paragraph">If you&#8217;re thinking this sounds vaguely reminiscent of stories like Make A Wish by Rorschach&#8217;s Blot which rely heavily on &#8220;humour based around a gigantic misconception and that misconception slowly becoming reality by default&#8221;, you&#8217;d be right and this <em>also</em> inspired a slew of third-party contributions. In later chapters, look forward to omakes like &#8220;Saurial is not pleased that Odin from the Marvel Cinematic Universe is claiming her old hammer (Mjolnir) to be his own work&#8221; and spin-offs like <a href="https://www.fanfiction.net/s/12959550/1/The-Long-Slow-Lizarding-of-Hermione-Granger">The Long Slow Lizarding of Hermione Granger</a>.</p>



<p class="wp-block-paragraph">So, what would I rate it? Well, it gets a bit slow around the bit when they finally go in to dig out Coil, and I do think the omakes got a bit too numerous at points, but, overall, it&#8217;s still good enough that I&#8217;d probably give it a 4.9 out of 5. Definitely would recommend.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2023/11/24/fanfiction-taylor-varga/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>Vorke V1 Plus Thermal/Fan Fix for Linux</title>
		<link>https://blog.ssokolow.com/archives/2023/11/17/vorke-v1-plus-thermal-fan-fix-for-linux/</link>
					<comments>https://blog.ssokolow.com/archives/2023/11/17/vorke-v1-plus-thermal-fan-fix-for-linux/#respond</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Fri, 17 Nov 2023 06:05:56 +0000</pubDate>
				<category><![CDATA[Geek Stuff]]></category>
		<guid isPermaLink="false">http://blog.ssokolow.com/?p=6939</guid>

					<description><![CDATA[If you have a Vorke V1 Plus that doesn&#8217;t want to drive its fan under Linux, or which doesn&#8217;t want to shut off the fan after the UEFI turns it on at boot, here&#8217;s what worked for me: As for &#8230; <a href="https://blog.ssokolow.com/archives/2023/11/17/vorke-v1-plus-thermal-fan-fix-for-linux/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you have a Vorke V1 Plus that doesn&#8217;t want to drive its fan under Linux, or which doesn&#8217;t want to shut off the fan after the UEFI turns it on at boot, here&#8217;s what worked for me:</p>



<ol class="wp-block-list">
<li>Make sure you&#8217;ve got a kernel version that allows you to manually control the fan via one of the <code>/sys/class/thermal/cooling_deviceX/cur_state</code> nodes. Debian bookworm&#8217;s default <code>6.1.0-13</code> kernel had problems with that while my Ubuntu 22.04 LTS flash drive&#8217;s <code>6.2.0-16</code> didn&#8217;t, so I wound up pulling one of the 6.5.0 kernels from Debian <a href="https://wiki.debian.org/Backports">backports</a>.)</li>



<li>Make sure <code>thermald</code> is installed. My experience is that, without it, the Vorke V1 Plus will just leave its fan on whatever the UEFI set it to, no matter how high or low the CPU temperature goes.</li>



<li>Write this configuration into <code>/etc/thermald/thermal-conf.xml</code>:<pre>&lt;?xml version="1.0"?><br />&lt;ThermalConfiguration><br />  &lt;Platform><br />    &lt;Name>Prefer fan over thermal throttling&lt;/Name><br />    &lt;ProductName>*&lt;/ProductName><br />    &lt;Preference>PERFORMANCE&lt;/Preference><br />  &lt;/Platform><br />&lt;/ThermalConfiguration></pre>As far as I can tell, <code>thermald</code> on Debian bookworm defaults to <code>&lt;Preference>QUIET&lt;/Preference></code>, which means &#8220;Thermal throttle as much as you need to in order to avoid spinning up the fan&#8221;.<br /><br />(Which <em>is</em> a neat option for things with shrill fans like the Vorke V1 Plus if I can figure out an easy way to toggle it… maybe reassign the power button from &#8220;request a clean shutdown&#8221; to &#8220;toggle cooling between performance and quiet&#8221;.)<br /><br />There&#8217;s probably some other way you&#8217;re meant to do this, and I welcome comments from people who actually know how this is supposed to work, because I found thermald to be frustratingly under-documented.</li>



<li>Run <code>systemctl edit thermald.service</code> and paste in these lines:<pre>[Service]<br />ExecStart=<br />ExecStart=/usr/sbin/thermald --no-daemon --dbus-enable --exclusive-control --config-file=/etc/thermald/thermal-conf.xml</pre>Without <code>--exclusive-control</code>, I found thermald still allowing temperatures to shoot up without enabling the fan.</li>
</ol>



<p class="wp-block-paragraph">As for <code>--config-file</code>, the manpage says <code>/etc/thermald/thermal-conf.xml</code> should be in the default search path, but, without specifying it explicitly, I was still getting no effect, despite neither of the higher-priority paths existing.</p>



<ol class="wp-block-list" start="4">
<li>Reboot (instead of just restarting thermald) to make sure all changes will persist as intended and stress-test the CPU with something like <code>stress --cpu 4</code>.</li>
</ol>



<p class="wp-block-paragraph">If you still have trouble, try toggling DPTF enable/disable in the UEFI settings. (hold Delete while powering on, and then go into <code>Advanced > Thermal</code>.)</p>



<p class="wp-block-paragraph">I don&#8217;t know if playing around with DPTF is necessary with the Vorke V1 Plus, but I also have a Vorke V1 and I needed to toggle it on that one so I could memtest86 the RAM upgrade I put in without the thing slowly overheating.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2023/11/17/vorke-v1-plus-thermal-fan-fix-for-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>How to remove pcANYWHERE32 v8.0 from Windows XP</title>
		<link>https://blog.ssokolow.com/archives/2023/09/06/how-to-remove-pcanywhere32-v8-0-from-windows-xp/</link>
					<comments>https://blog.ssokolow.com/archives/2023/09/06/how-to-remove-pcanywhere32-v8-0-from-windows-xp/#respond</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Wed, 06 Sep 2023 23:30:25 +0000</pubDate>
				<category><![CDATA[Retrocomputing]]></category>
		<guid isPermaLink="false">http://blog.ssokolow.com/?p=6863</guid>

					<description><![CDATA[…so you naively thought that continuing past the Windows XP compatibility warning and installing pcANYWHERE 8.0 would give you a working pcANYWHERE client but no server? …and you now have a machine that just boots into a black 640&#215;480 screen &#8230; <a href="https://blog.ssokolow.com/archives/2023/09/06/how-to-remove-pcanywhere32-v8-0-from-windows-xp/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">…so you naively thought that continuing past the Windows XP compatibility warning and installing pcANYWHERE 8.0 would give you a working pcANYWHERE client but no server?</p>



<p class="wp-block-paragraph">…and you now have a machine that just boots into a black 640&#215;480 screen which ignores Ctrl+Alt+Delete but does let you move the mouse?</p>



<p class="wp-block-paragraph">…even if you choose to boot into Safe Mode?</p>



<p class="wp-block-paragraph">Here&#8217;s how I recovered my Windows XP retro-machine without undue pain:</p>



<ol class="wp-block-list">
<li>Pull up the &#8220;Windows Advanced Options Menu&#8221; (Hit F8 after your BIOS hands off to Windows but before the boot logo appears… I just tap it repeatedly.)</li>



<li>Choose &#8220;Last Know Good Configuration (your most recent settings that worked)&#8221;</li>



<li>You&#8217;ll probably get a working boot with auto-login temporarily disabled. I just hit Enter with the username it pre-filled and no password.</li>



<li>Use Add/Remove Programs to uninstall pcANYWHERE.</li>



<li>To be sure you&#8217;ve gotten rid of it, go into System Restore (Start &gt; Applications &gt; Accessories &gt; System Tools &gt; System Restore) and roll your system configuration back to the most recent System Restore point.</li>
</ol>



<p class="wp-block-paragraph">That should do it.</p>



<p class="wp-block-paragraph"><strong>TIP:</strong> If you can&#8217;t get F8 to work, make sure you&#8217;re using a PS/2 keyboard, not a USB one.</p>



<p class="wp-block-paragraph">(If your BIOS doesn&#8217;t have working USB→PS/2 keyboard emulation, the Windows boot menu won&#8217;t see your input either because it happens before Windows&#8217;s own USB HID drivers get loaded. This confused me for a moment, before I realized I&#8217;d never needed to go into the BIOS setup or boot menu, or access the Windows boot options since I switched to a USB+VGA KVM switch to let it share the desk with my Power Mac G4.)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2023/09/06/how-to-remove-pcanywhere32-v8-0-from-windows-xp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>Fanfiction &#8211; That Sounds Like Work</title>
		<link>https://blog.ssokolow.com/archives/2023/09/03/fanfiction-that-sounds-like-work/</link>
					<comments>https://blog.ssokolow.com/archives/2023/09/03/fanfiction-that-sounds-like-work/#respond</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Sun, 03 Sep 2023 20:11:27 +0000</pubDate>
				<category><![CDATA[Fanfiction]]></category>
		<guid isPermaLink="false">http://blog.ssokolow.com/?p=6859</guid>

					<description><![CDATA[How does a completed Worm crackfic based around Taylor Hebert triggering with superpowered laziness sound? What about a fic with bits like this? &#8220;You let my brother hijack your body… so you don&#8217;t have to walk?&#8221; said Cherie with an &#8230; <a href="https://blog.ssokolow.com/archives/2023/09/03/fanfiction-that-sounds-like-work/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">How does a completed Worm crackfic based around Taylor Hebert triggering with superpowered laziness sound?</p>



<p class="wp-block-paragraph">What about a fic with bits like this?</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">&#8220;You let my brother hijack your body… so you don&#8217;t have to walk?&#8221; said Cherie with an incredulous tone.</p>



<p class="wp-block-paragraph">&#8220;Of course! Have you tried walking? You have to pick up your leg off the ground and everything! The worst bit is that you have to do that over and over again if you want to get anywhere. The mere fact that walking exists proves that there is no such thing as an all-loving God! Man invented the wheel thousands of years ago just so we wouldn&#8217;t have to do the devil&#8217;s work anymore!&#8221; she ranted. This girl was a nut bag. Where did Jean-Paul even find her?</p>
</blockquote>



<p class="wp-block-paragraph">If it sounds good, it&#8217;s <a href="https://forums.spacebattles.com/threads/that-sounds-like-work-au-crack-complete.641911/reader/">That Sounds Like Work</a> by Flabbyknight.</p>



<p class="wp-block-paragraph">…spoiler alert: It starts with her beating Emma by being too super-apathetic (i.e. too lazy to care), driving Emma into such fits of frustration that the Winslow staff can&#8217;t help but respond.</p>



<p class="wp-block-paragraph">In the spirit of the story&#8217;s premise, I won&#8217;t go on in more detail as I usually would (though I will say that the first chapter, as entertaining as it is, isn&#8217;t representative of the heights of crackfic-ness that it grows into) and I won&#8217;t take the time to figure out where above 4.5 it belongs on my rating scale.</p>



<p class="wp-block-paragraph">…but I will say that I loved it and It also won second place in the Crack/Humor category in /r/WormFanfic&#8217;s <a href="https://www.reddit.com/r/WormFanfic/wiki/bestof2019">Best of 2019</a> list.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2023/09/03/fanfiction-that-sounds-like-work/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
		<item>
		<title>Quick tip for RetroArch&#8217;s DOSBox-Pure core</title>
		<link>https://blog.ssokolow.com/archives/2023/08/24/quick-tip-for-retroarchs-dosbox-pure-core/</link>
					<comments>https://blog.ssokolow.com/archives/2023/08/24/quick-tip-for-retroarchs-dosbox-pure-core/#respond</comments>
		
		<dc:creator><![CDATA[Stephan Sokolow]]></dc:creator>
		<pubDate>Fri, 25 Aug 2023 02:06:40 +0000</pubDate>
				<category><![CDATA[Retrocomputing]]></category>
		<guid isPermaLink="false">http://blog.ssokolow.com/?p=6853</guid>

					<description><![CDATA[If you&#8217;re trying to set up DOS games like Jetpack in something like RetroPie or Batocera, you might run into a problem where pressing the S key (&#8220;start new game&#8221; in Jetpack) doesn&#8217;t do anything, whether through a physical keyboard &#8230; <a href="https://blog.ssokolow.com/archives/2023/08/24/quick-tip-for-retroarchs-dosbox-pure-core/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">If you&#8217;re trying to set up DOS games like <a href="https://www.adeptsoftware.com/jetpack/">Jetpack</a> in something like <a href="https://retropie.org.uk/">RetroPie</a> or <a href="https://batocera.org/">Batocera</a>, you might run into a problem where pressing the S key (&#8220;start new game&#8221; in Jetpack) doesn&#8217;t do anything, whether through a physical keyboard or through padtokey mappings.</p>



<p class="wp-block-paragraph">This is most likely because RetroArch&#8217;s <a href="https://docs.libretro.com/guides/input-and-controls/">default hotkeys</a> map S to one of the buttons on the virtual gamepad. (A decision which makes sense for consoles, where you need a gamepad and a keyboard is optional at best, but makes no sense for retro computers, where a keyboard is standard or even built-in, and a joystick is optional)</p>



<p class="wp-block-paragraph">While I don&#8217;t know about RetroPie, under Batocera, the simplest solution is to add the following lines to your <code>/userdata/system/batocera.conf</code> to disable those mappings:</p>



<pre class="wp-block-code"><code>dos.retroarch.input_player1_a=nul
dos.retroarch.input_player1_b=nul
dos.retroarch.input_player1_x=nul
dos.retroarch.input_player1_y=nul</code></pre>



<p class="wp-block-paragraph">Then, if you do need mappings for DOS games, they probably go the other way (making the gamepad fake keypresses) and can be handled via padtokey mappings.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.ssokolow.com/archives/2023/08/24/quick-tip-for-retroarchs-dosbox-pure-core/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
				<creativeCommons:license>https://creativecommons.org/licenses/by-sa/4.0/</creativeCommons:license>
	</item>
	</channel>
</rss>
