<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Benad&#39;s Blog</title>
    <link>https://benad.me/blog/</link>
    <description>Benad&#39;s Blog</description>
    <language>en-us</language>
    <lastBuildDate>Sun, 02 Aug 2026 20:14:41 -0400</lastBuildDate>
    <atom:link href="https://benad.me/blog/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Final Fantasy I, II and III</title>
      <link>https://benad.me/blog/2026/08/01/final-fantasy-i-ii-and-iii/</link>
      <pubDate>Sat, 01 Aug 2026 13:55:00 -0400</pubDate>
      
      <guid>https://benad.me/blog/2026/08/01/final-fantasy-i-ii-and-iii/</guid>
      <description>&lt;p&gt;In 2024, I bought the newly released &lt;a href=&quot;https://en.wikipedia.org/wiki/Final_Fantasy_Pixel_Remaster&quot;&gt;Final Fantasy Pixel Remaster&lt;/a&gt; bundle for Xbox Series X/S. It contains Final Fantasy I to VI, originally released on Nintendo&#39;s Family Computer (&amp;quot;Famicom&amp;quot;) and Super Famicom in Japan, with some of them translated and released on the NES and SNES in North America.&lt;/p&gt;
&lt;p&gt;I bought that collection because I don&#39;t think I had previously finished most of them. I remember finishing &lt;a href=&quot;https://finalfantasy.fandom.com/wiki/Final_Fantasy_I_%26_II:_Dawn_of_Souls&quot;&gt;Final Fantasy I &amp;amp; II: Dawn of Souls&lt;/a&gt; on the Game Boy Advance. I played IV and VI on the SNES through rentals, so I never had the time to fully finish either from start to end in a single save file. I played most of the first half of VI on the iOS port, but as it was a 32-bit iOS app it was eventually de-listed from the store.&lt;/p&gt;
&lt;p&gt;The Pixel Remaster series isn&#39;t reusing the enhanced graphics of those previous re-releases, nor does it have any of the &amp;quot;additional content&amp;quot; (in the form of optional dungeons and bosses near the end of the game) that previous re-releases added as an incentive to buy them. But then, the reworked graphics are better and still closely match the original designs, which, by the way, are bundled as extras. The remastered music is excellent, often recorded with live instruments, and while there is an option to revert to the original mixes, I really enjoyed the modern versions. The games also have &amp;quot;quality of life&amp;quot; enhancements that make those older games more accessible to modern players, like autosaves and speeding up battles.&lt;/p&gt;
&lt;p&gt;So, I started playing each Final Fantasy game in that collection, in order. I thought that only those &amp;quot;2D retro&amp;quot; entries of Final Fantasy were widely released outside of PlayStation consoles, aside from a few that were released on PC, like the FF VII version I played a &lt;a href=&quot;https://benad.me/blog/2014/12/29/final-fantasy-vii-a-late-review/&quot;&gt;long time ago in 2014&lt;/a&gt;. I didn&#39;t notice that all the single-player &amp;quot;mainline&amp;quot; Final Fantasy games were eventually ported to Xbox One in one form or another between 2016 and 2019. Even XVI was only briefly exclusive to the PlayStation 5 and was then released on Xbox Series X/S last June.&lt;/p&gt;
&lt;p&gt;Recently, there was a sale that heavily discounted all Final Fantasy games on Xbox, so I bought them all for less than what it would cost me to pre-order Grand Theft Auto VI.&lt;/p&gt;
&lt;p&gt;I&#39;ve just finished Final Fantasy V, but for this post I&#39;ll focus on the three games that were released on the Famicom.&lt;/p&gt;
&lt;h3&gt;Final Fantasy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Original Release:
&lt;ul&gt;
&lt;li&gt;Family Computer: 1987 (Japan)&lt;/li&gt;
&lt;li&gt;NES: 1990 (US)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Version Played: Final Fantasy Pixel Remaster
&lt;ul&gt;
&lt;li&gt;Xbox Series X/S: 2024&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Time Played: 14 hours&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first game in the franchise, simply named &lt;a href=&quot;https://en.wikipedia.org/wiki/Final_Fantasy_(video_game)&quot;&gt;Final Fantasy&lt;/a&gt;, is the closest to its original Dungeons &amp;amp; Dragons and Lord of the Rings roots. Like a D&amp;amp;D campaign, you have complete freedom to choose the character classes and names for your party members, but that also means that your characters don&#39;t participate much in the game&#39;s story. Speaking of which, the game&#39;s story is pretty thin, with most of it explained in &amp;quot;exposition dumps&amp;quot; near the end of the game, but it is unique (compared to Tolkien&#39;s work) and explains the game&#39;s title a little bit.&lt;/p&gt;
&lt;p&gt;Its gameplay mechanics are the simplest in the series. By contrast, each entry tends to introduce its own unique &amp;quot;gimmick&amp;quot;. Paradoxically, of the three that were translated and published by Nintendo in North America (this one, IV and VI, the latter two respectively renamed &amp;quot;II&amp;quot; and &amp;quot;III&amp;quot;), this is the most difficult one. This game was re-released dozens of times on multiple platforms, and this release, as part of the &amp;quot;Pixel Remaster&amp;quot;, brings enough quality-of-life enhancements to make the difficulty acceptable to newcomers.&lt;/p&gt;
&lt;p&gt;Even then, the game has a few annoyances. My biggest gripe is that, due to large distances to travel and unusually difficult random encounters, random exploration on the world map is almost discouraged. You can often feel stuck, not knowing where to go next or whether to dare explore around to figure it out. A rare &lt;a href=&quot;https://en.wikipedia.org/wiki/Non-player_character&quot;&gt;NPC&lt;/a&gt; in a village can give you a vague hint as to where to go next, but in the early 1990s, I simply didn&#39;t have good enough English reading skills to read all that.&lt;/p&gt;
&lt;p&gt;This game is still too early in the series to &amp;quot;feel&amp;quot; like a &amp;quot;proper&amp;quot; Final Fantasy game, at least with regard to the tropes you can expect from the series that separate it from simply mimicking D&amp;amp;D. Yet, it does introduce crystals and the main musical theme of the series, which plays during an incredible cold open that could have been the introduction to the entire franchise.&lt;/p&gt;
&lt;h3&gt;Final Fantasy II&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Original Release:
&lt;ul&gt;
&lt;li&gt;Family Computer: 1988 (Japan)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Version Played: Final Fantasy Pixel Remaster
&lt;ul&gt;
&lt;li&gt;Xbox Series X/S: 2024&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Time Played: 22 hours&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This game defined what makes a Final Fantasy game. Each entry in the series is a brand new story, while keeping some common themes from the previous games. This entry introduces a character named Cid and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Chocobo&quot;&gt;Chocobo&lt;/a&gt; animals. Your playable characters are part of the story, with their own backstories and unique characteristics.&lt;/p&gt;
&lt;p&gt;It is also the first game to introduce unique gameplay elements. When speaking with other characters, you can learn some special keywords that you can later mention to other characters to unlock new dialogue options. Some NPCs can accompany you, following you around like in &lt;a href=&quot;https://en.wikipedia.org/wiki/Dragon_Quest&quot;&gt;Dragon Quest&lt;/a&gt;, though they don&#39;t yet participate in battles.&lt;/p&gt;
&lt;p&gt;The biggest change is that it forgoes the character-wide experience-point (&amp;quot;XP&amp;quot;) system, where gaining enough XP eventually raises a character’s level, permanently improving some of their statistics. Instead, each stat must be increased on its own, and even each type of equipment and magic spell must be individually leveled up. The internal values that keep track of each stat&#39;s progression are hidden. Magic spells are the exception, as they have a clear progression bar that increases each time you use them. Even the way each stat is increased is inconsistent: maximum hit points (&amp;quot;HP&amp;quot;) and shields can be leveled up by being hit, maximum magic points (&amp;quot;MP&amp;quot;) by using any kind of magic, agility by intentionally running away from battles, and so on. Many game guides recommend repeating those actions, including having party members hit each other, on the trust that some hidden progression number increases and will eventually increase your characters&#39; statistics. I hated that gameplay mechanic. It was also used in &lt;a href=&quot;https://en.wikipedia.org/wiki/Final_Fantasy_Legend_II&quot;&gt;Final Fantasy Legend II&lt;/a&gt; on the Game Boy, and it sucked there too. Luckily, that mechanic was never used again in the series, and some of the game rebalancing that was introduced in the various remakes of this game, including the Pixel Remaster, alleviates some of that unintuitive grind.&lt;/p&gt;
&lt;h3&gt;Final Fantasy III&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Original Release:
&lt;ul&gt;
&lt;li&gt;Family Computer: 1990 (Japan)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Version Played: Final Fantasy Pixel Remaster
&lt;ul&gt;
&lt;li&gt;Xbox Series X/S: 2024&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Time Played: 18 hours&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This game introduces a job system that allows you to assign a job to each of your party&#39;s members and change it at will. Each job comes with its own unique abilities, and the job level impacts your stat progression when your character levels up. It has a strange mechanic where some jobs, beyond a certain job level, will have little to no impact on your character&#39;s stat progression when leveling up, forcing you to assign a different job to your character. While that might sound good &amp;quot;on paper&amp;quot;, this mechanic is not well explained in-game, and if you&#39;re not careful, you could end up grinding levels with no change. Planning out job assignments and character progression &lt;a href=&quot;https://gamefaqs.gamespot.com/nes/563415-final-fantasy-iii/faqs/27853&quot;&gt;using large tables and spreadsheets&lt;/a&gt; wasn&#39;t fun, to say the least.&lt;/p&gt;
&lt;p&gt;It is also infamous for its lack of save points, especially near the end of the game. This isn&#39;t too much of a concern in Pixel Remaster, because it supports a &amp;quot;quick save&amp;quot; feature that lets you save at any location, but in the original Famicom game there is a section near the end of the game that lasts well over 5 hours without a save point, even in the best of conditions.&lt;/p&gt;
&lt;p&gt;I just found the game too difficult, and its other elements, like the story, art and music, were just not good enough to compensate. It is the most difficult RPG I&#39;ve played, mostly due to poor design decisions. Unless you&#39;re compelled to finish every Final Fantasy game, you can skip this one.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Retro Oddities</title>
      <link>https://benad.me/blog/2026/04/26/retro-oddities/</link>
      <pubDate>Sun, 26 Apr 2026 13:30:00 -0400</pubDate>
      
      <guid>https://benad.me/blog/2026/04/26/retro-oddities/</guid>
      <description>&lt;h3&gt;Sprawl on HyperCard&lt;/h3&gt;
&lt;p&gt;At this point, I&#39;ve read and owned William Gibson&#39;s &lt;a href=&quot;https://en.wikipedia.org/wiki/Sprawl_trilogy&quot;&gt;Sprawl trilogy&lt;/a&gt; in multiple form factors, but none seem more time-appropriate than its release as &lt;a href=&quot;https://macintoshgarden.org/apps/neuromancer-count-zero-mona-lisa-overdrive&quot;&gt;HyperCard stacks for Macintosh&lt;/a&gt;. It may be the least convenient way to read those books though.&lt;/p&gt;
&lt;p&gt;It works well on &lt;a href=&quot;https://infinitemac.org/&quot;&gt;InfiniteMac&lt;/a&gt;&#39;s &lt;a href=&quot;https://infinitemac.org/1994/System%207.5&quot;&gt;System 7.5 virtual machine&lt;/a&gt;: You can load it in the VM using the &amp;quot;Macintosh Garden&amp;quot; tab at the bottom, and the compressed archive will show up in the path &amp;quot;The Outside World:Downloads&amp;quot;.&lt;/p&gt;
&lt;h3&gt;Stereoscopic Doom on the Nintendo 3DS&lt;/h3&gt;
&lt;p&gt;Sure, DOOM has been ported to countless platforms, but its port to the Nintendo 3DS offers a unique experience unavailable elsewhere: Playing DOOM in glass-free stereoscopic 3D.&lt;/p&gt;
&lt;p&gt;Hacking the 3DS is not too difficult if you &lt;a href=&quot;https://3ds.hacks.guide/&quot;&gt;follow this guide&lt;/a&gt;, and then you can install &lt;a href=&quot;https://github.com/Voxel9/PrBoom-Plus-3DS&quot;&gt;PrBoom-Plus-3DS&lt;/a&gt;. Performance is reasonable on the 3DS that I own, though I&#39;ve heard it is better on the &amp;quot;new 3DS&amp;quot;.&lt;/p&gt;
&lt;h3&gt;The Beatles Adventures in Pepperland&lt;/h3&gt;
&lt;p&gt;The international version of &lt;a href=&quot;https://en.wikipedia.org/wiki/Super_Mario_Bros._2&quot;&gt;Super Mario Bros. 2&lt;/a&gt; always felt oddly out of place in the Mario games, mostly due to its origins from the game &lt;a href=&quot;https://en.wikipedia.org/wiki/Super_Mario_Bros._2#Yume_K%C5%8Dj%C5%8D:_Doki_Doki_Panic&quot;&gt;Doki Doki Panic&lt;/a&gt;. But what if Doki Doki Panic, instead of being &amp;quot;reskinned&amp;quot; as a Mario game, had been transformed into an adaptation of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Yellow_Submarine_(film)&quot;&gt;Yellow Submarine movie&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;The SMB2 Rom Hack &lt;a href=&quot;https://nesdraug.tumblr.com/post/664655742277664768/the-beatles-adventures-in-pepperland-is-a-hack-for&quot;&gt;Adventures in Pepperland by Nesdraug and Shauing&lt;/a&gt; works incredibly well thematically. It delightfully adapts the Yellow Submarine worlds, characters and music into their NES equivalent. You can watch &lt;a href=&quot;https://youtu.be/lqNzOm-v4i8&quot;&gt;its announcement trailer&lt;/a&gt; or a full &lt;a href=&quot;https://youtu.be/wK2WO6jQ92Y&quot;&gt;playthrough of the game&lt;/a&gt; if you don&#39;t want to go to the trouble of setting up the ROM patch and emulation yourself. You can find more information about it on &lt;a href=&quot;https://www.romhacking.net/reviews/7908/&quot;&gt;ROMHacking.net&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Quake 64 and Quake II on Nintendo 64&lt;/h3&gt;
&lt;p&gt;I recently realized that the only versions of &lt;a href=&quot;https://quake.fandom.com/wiki/Quake_(Nintendo_64_version)&quot;&gt;Quake&lt;/a&gt; and &lt;a href=&quot;https://quake.fandom.com/wiki/Quake_II_(Nintendo_64_version)&quot;&gt;Quake II&lt;/a&gt; that I played was for the Nintendo 64 which were heavily modified from their original PC versions. Both Quake were recently re-released on modern consoles and PC in their original PC versions. It was nice to see then that both re-releases also came bundled with their Nintendo 64 ports, named &amp;quot;&lt;a href=&quot;https://quake.fandom.com/wiki/Quake_(2021_Re-Release)#Quake_64&quot;&gt;Quake 64&lt;/a&gt;&amp;quot; for Quake and as &amp;quot;Quake II 64&amp;quot; for Quake II.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Oat and AI</title>
      <link>https://benad.me/blog/2026/03/06/oat-and-ai/</link>
      <pubDate>Fri, 06 Mar 2026 14:20:00 -0500</pubDate>
      
      <guid>https://benad.me/blog/2026/03/06/oat-and-ai/</guid>
      <description>&lt;p&gt;You might now notice that this web site looks a little bit different, with the most glaring change is its support for &amp;quot;dark mode&amp;quot;. Well, that&#39;s because I switch its CSS and UI framework from &lt;a href=&quot;https://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt; to &lt;a href=&quot;https://oat.ink/&quot;&gt;Oat&lt;/a&gt;. It makes a non-cached download of a page, with all its dependencies, from about 75 kB to 15 kB. It is also far more up-to-date to newer standards, which I took as an occasion to remove older support for Internet Explorer and so on.&lt;/p&gt;
&lt;p&gt;In the past, this kind of change would have taken me a weekend of effort, if not more. Most of it would be because I strongly dislike CSS development. Instead, I &amp;quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Vibe_coding&quot;&gt;vibe coded&lt;/a&gt;&amp;quot; it with the assistance of &lt;a href=&quot;https://github.com/features/copilot/cli/&quot;&gt;GitHub Copilot CLI&lt;/a&gt;. If you look at &lt;a href=&quot;https://github.com/benad/azbenadmestatic/commits/main/&quot;&gt;this site&#39;s Git commit history&lt;/a&gt;, the initial version took me about 30 minutes to produce. I made some adjustments to the changes Copilot generated, but even then I was able to use screenshots of the older version of this site to clearly describe what I wanted.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Switching to the Steam Deck</title>
      <link>https://benad.me/blog/2026/02/22/switching-to-the-steam-deck/</link>
      <pubDate>Sun, 22 Feb 2026 14:00:00 -0500</pubDate>
      
      <guid>https://benad.me/blog/2026/02/22/switching-to-the-steam-deck/</guid>
      <description>&lt;p&gt;I&#39;m not using my Nintendo Switch anymore. Most games I want to play are simply not available for it, and I can&#39;t see myself buying a Switch 2 for the few that are available on the new console. It&#39;s sad because I really like its form factor, and I still prefer video game consoles over PC gaming. After a long day of work on a PC, I don&#39;t have the energy or the time to &amp;quot;maintain&amp;quot; yet another computer to relax and play some games.&lt;/p&gt;
&lt;p&gt;So, I bought a &lt;a href=&quot;https://store.steampowered.com/steamdeck&quot;&gt;Steam Deck&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&#39;d like to note that the first PC I bought was a &amp;quot;Steam Machine&amp;quot;, as described in &lt;a href=&quot;https://benad.me/blog/2015/1/13/alpha-my-first-pc/&quot;&gt;my blog post from 10 years ago&lt;/a&gt;. The situation was similar to this one: I want to play games from my backlog of PC games, but I want a &amp;quot;console-like&amp;quot; experience. This &lt;a href=&quot;https://web.archive.org/web/20150113173020/http://www.alienware.com/landings/alpha/&quot;&gt;Alienware Alpha&lt;/a&gt; machine was poor at both. It was an &lt;a href=&quot;https://en.wikipedia.org/wiki/Kodi_(software)&quot;&gt;XBMC&lt;/a&gt; frontend to Windows 8 using an Xbox 360 controller connected wirelessly using a dongle. There was an option to use &lt;a href=&quot;https://en.wikipedia.org/wiki/SteamOS&quot;&gt;Steam OS&lt;/a&gt;, but it was still in its infancy, supporting only games that were rebuilt to its Linux environment.&lt;/p&gt;
&lt;p&gt;A lot has happened to Steam OS since. The venerable Wine Windows API compatibility layer vastly improved since, and Steam OS packaged that and a new DirectX 11 compatible library for Linux under the name &lt;a href=&quot;https://en.wikipedia.org/wiki/Proton_(software)&quot;&gt;Proton&lt;/a&gt;. While not all Windows games work with Proton, a now substantial number do, as mentioned on the Steam store or in the site &lt;a href=&quot;https://www.protondb.com/&quot;&gt;ProtonDB&lt;/a&gt;. &lt;a href=&quot;https://protontricks.com/&quot;&gt;ProtonTricks&lt;/a&gt;, an enhanced version of &lt;a href=&quot;https://github.com/Winetricks/winetricks&quot;&gt;Winetrics&lt;/a&gt; made for Proton, and tools like &lt;a href=&quot;https://lutris.net/&quot;&gt;Lutris&lt;/a&gt; make it easy to install Windows games from other stores like &lt;a href=&quot;https://www.gog.com/&quot;&gt;GoG&lt;/a&gt;. For cloud gaming, it does support Xbox cloud gaming (see &amp;quot;&lt;a href=&quot;https://support.microsoft.com/en-us/topic/xbox-cloud-gaming-in-microsoft-edge-with-steam-deck-43dd011b-0ce8-4810-8302-965be6d53296&quot;&gt;Xbox Cloud Gaming in Microsoft Edge with Steam Deck&lt;/a&gt;&amp;quot;) and GeForce NOW (see &amp;quot;&lt;a href=&quot;https://nvidia.custhelp.com/app/answers/detail/a_id/5337/~/how-do-i-install-geforce-now-on-steam-deck%3F&quot;&gt;How do I install GeForce NOW on Steam Deck?&lt;/a&gt;&amp;quot;).&lt;/p&gt;
&lt;p&gt;Steam OS has one of the best packaging of Linux for a game console that I&#39;ve seen. The code OS is stored on a read-only file system (well, writeable only for system updates). All additional tools and software and installed &amp;quot;user-space&amp;quot; in your writeable home directory file system, be it in the form of Linux self-executables, or the well-supported &lt;a href=&quot;https://en.wikipedia.org/wiki/Flatpak&quot;&gt;Flatpak&lt;/a&gt; format. This makes it very easy to apply software updates safely, without the risk of a customization breaking the entire machine. There is a desktop mode using KDE Plasma, and with Steam running in the background the controller can be used as a mouse or display an on-screen keyboard, while also supporting &lt;a href=&quot;https://store.steampowered.com/remoteplay&quot;&gt;Steam Link&lt;/a&gt; as a form or remote desktop client. It strikes an excellent balance between a console-like experience and a stable yet modern Linux environment. In fact, if connected to a screen, mouse and keyboard using USB-C docks, it could serve as a quite pleasant and well-supported Linux PC.&lt;/p&gt;
&lt;p&gt;As for the hardware itself, it&#39;s quite good, though at this point its performance is slower than newer portable consoles and PCs of similar form factors. Its controller is superb and may be the best controller for a portable console I&#39;ve ever used. Steam allows for an insane amount of controller customization and combined with its dual trackpads it plays surprisingly well most PC games designed for a mouse and keyboard. I had a few surprises that were barely mentioned, for example that its screen is touch screen, or that the joysticks support detecting if you&#39;re merely touching them.&lt;/p&gt;
&lt;p&gt;Its &lt;a href=&quot;https://www.steamdeck.com/en/dock&quot;&gt;official dock&lt;/a&gt; mimics well the experience of the Switch&#39;s dock. A Bluetooth controller can wake the console, sending the HDMI CEC signal to start the TV. Steam&#39;s &amp;quot;big screen&amp;quot; experience truly feels like a typical game console experience. For games that, as I mentioned, were made for keyboard and mouse, you can still customize your external controller for mouse controls, including the PS4 and PS5 trackpad or for controllers that have a gyroscope.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Turning Off My Apple TV</title>
      <link>https://benad.me/blog/2025/12/28/turning-off-my-apple-tv/</link>
      <pubDate>Sun, 28 Dec 2025 14:15:00 -0500</pubDate>
      
      <guid>https://benad.me/blog/2025/12/28/turning-off-my-apple-tv/</guid>
      <description>&lt;p&gt;Early this year, I bought a Google TV Streamer, and since, I barely used my Apple TV anymore, so I reset and unplugged it.&lt;/p&gt;
&lt;p&gt;OK, let me clarify some things. By &amp;quot;Apple TV&amp;quot; I mean its original definition, being the &lt;em&gt;device&lt;/em&gt; you can plug to a TV using an HDMI cable. This is different than the &lt;em&gt;subscription service&lt;/em&gt; (used to be called &amp;quot;Apple TV+&amp;quot;) and its application (used to be part of iTunes).&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://store.google.com/ca/product/google_tv_streamer&quot;&gt;Google TV Streamer&lt;/a&gt; (what a weird name) is the long-term replacement of Google&#39;s Chromecast line of devices. It is based on Google TV (used to be called &amp;quot;Android TV&amp;quot;), which is an &amp;quot;app platform&amp;quot; that is often licensed to be used on TV, similar to Android&#39;s licensing model for cellphones.&lt;/p&gt;
&lt;p&gt;I kept plugged in my Apple TV because of its subscription service and because of my TV shows and movies collection I bought into it, both of which used to be exclusive to Apple devices (and a few very &lt;a href=&quot;https://smarttechfaqs.com/list-of-airplay-2-compatible-tvs/&quot;&gt;AirPlay compatible TVs&lt;/a&gt;). Some TV shows I purchased remain exclusive (in digital form) to Apple&#39;s store, for example in Canada the show &amp;quot;&lt;a href=&quot;https://www.justwatch.com/ca/tv-show/better-call-saul&quot;&gt;Better Call Saul&lt;/a&gt;&amp;quot; which is available only on the &lt;a href=&quot;https://tv.apple.com/ca/show/better-call-saul/umc.cmc.z783dda5nkr23g1jj2kn8x22&quot;&gt;Apple TV store&lt;/a&gt; or &lt;a href=&quot;https://www.amazon.ca/Better-Call-Saul-Complete-Bilingual/dp/B0BDMTPSS9/&quot;&gt;on Blu-ray&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In recent years, Apple made its Apple TV subscription service more widely available on non-Apple devices, and for some of those apps, they now even allow you to access your TV and movies collection. Also, since the days of iTunes, the &lt;a href=&quot;https://apps.microsoft.com/detail/9nm4t8b9jqz1&quot;&gt;Windows version of the Apple TV app&lt;/a&gt; remains the only version that allows you to purchase or rent movies and TV shows on a non-Apple device. That means, practically, you can buy a movie on the Apple TV store (on Windows) and watch it on your TV (using Google TV Streamer) without having to use any Apple device.&lt;/p&gt;
&lt;p&gt;So, after 15 years, I&#39;m not using an Apple TV (device) anymore, even though I subscribe to its streaming service and buy TV shows on it. I&#39;m happy to not use its &lt;a href=&quot;https://support.apple.com/en-us/103233&quot;&gt;terrible 1st-gen Siri remote&lt;/a&gt; that&#39;s touch-based and is recharged with a Lightning charging cable, or its crappy &lt;a href=&quot;https://en.wikipedia.org/wiki/Consumer_Electronics_Control&quot;&gt;HDMI CEC&lt;/a&gt; implementation that creates havoc with my TV and Xbox.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>gh-fetch-release and AI</title>
      <link>https://benad.me/blog/2025/10/13/gh-fetch-release-and-ai/</link>
      <pubDate>Mon, 13 Oct 2025 14:25:00 -0400</pubDate>
      
      <guid>https://benad.me/blog/2025/10/13/gh-fetch-release-and-ai/</guid>
      <description>&lt;p&gt;For some time, I needed an excuse to jump back into &lt;a href=&quot;https://www.python.org/&quot;&gt;Python&lt;/a&gt; programming, even if it&#39;s just starting with a small script. I was setting up yet another &lt;a href=&quot;https://ubuntu.com/server&quot;&gt;Ubuntu&lt;/a&gt; 24 virtual machine in &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/wsl/&quot;&gt;WSL&lt;/a&gt;, and so I brought in the various Linux CLI tools I use into &lt;code&gt;~/bin&lt;/code&gt;. Downloading and extracting each executable from various GitHub projects was getting tedious, so I looked for a tool that could do that. What I found were either yet another binary executable you&#39;d have to download from GitHub, or things that would approach package managers. So, I found my excuse to write a small Python script that would use the GitHub API to find and download Linux executables.&lt;/p&gt;
&lt;p&gt;I left active Python programming around the time of Python 3.1, so I had a lot of catching up to do. Using &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt; and its &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.pylint&quot;&gt;Pylint&lt;/a&gt; and &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance&quot;&gt;Pylance&lt;/a&gt; extensions greatly helped me avoid obvious mistakes. Static type checking came a long way since the days of Python 3.1, and in VS Code its &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-python.python&quot;&gt;Python extension&lt;/a&gt; is integrated with &lt;a href=&quot;https://microsoft.github.io/pyright/&quot;&gt;Pyright&lt;/a&gt;&#39;s type checker.&lt;/p&gt;
&lt;p&gt;One of the perks of working at Microsoft is that I can get &lt;a href=&quot;https://github.com/features/copilot&quot;&gt;GitHub Copilot&lt;/a&gt;, I guess a &amp;quot;Pro+&amp;quot; plan with some yet-to-be-public features, in my personal GitHub account (&lt;a href=&quot;https://github.com/benad&quot;&gt;github.com/benad&lt;/a&gt;). The first thing I noticed when turning that on in VS Code is its code generation, which goes far beyond simple code completion. Copilot would guess what I&#39;m trying to code, and most of the time it guessed correctly, so I just press TAB to insert that auto-generated code.&lt;/p&gt;
&lt;p&gt;While you could conceivably generate all of the code like that, or by using Copilot&#39;s &amp;quot;Agent&amp;quot; mode, I&#39;m trying to learn from that experience, and would rather make some of my own code design decisions. In that case, you can ask Copilot questions in the context of the current code, and it can answer even providing examples that fit in that code. This is far more convenient than having to describe the entire context (&amp;quot;In Python 3&amp;quot;, etc.) each time when asking the Copilot app or web site.&lt;/p&gt;
&lt;p&gt;Beyond the summaries and examples generated by Copilot, the answer also contains the sources, which more often than not point directly to the correct section of the official reference documentation, at which point I just leave the AI&#39;s answers and read the documentation. There are a few instances though where the official documentation (and even the source code) is lacking, and asking for more sample code from Copilot helps. An example is with &lt;a href=&quot;https://docs.python.org/3/library/urllib.request.html#module-urllib.request&quot;&gt;Python&#39;s urllib module&lt;/a&gt;: Even its documentation basically says: &amp;quot;Don&#39;t use this, use this other module instead&amp;quot;, which wasn&#39;t of much help since I was intentionally avoiding non built-in modules like the one proposed (the &lt;a href=&quot;https://requests.readthedocs.io/en/latest/&quot;&gt;Requests library&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;While code generated (or suggested) by Copilot is generally correct, it sometimes output sample code using an outdated approach that do not apply to newer versions of libraries or APIs, so using different models might return more up-to-date results. As an example, when adding support for GitHub API tokens in my script, it used the older HTTP header format to pass the token that isn&#39;t recommended anymore. It was &lt;em&gt;another&lt;/em&gt; instance of Copilot, this time &lt;a href=&quot;https://github.com/benad/gh-fetch-release/pull/1&quot;&gt;reviewing my pull request&lt;/a&gt;, that found that issue and &lt;a href=&quot;https://github.com/benad/gh-fetch-release/pull/1#pullrequestreview-3174612062&quot;&gt;suggested the new approach&lt;/a&gt;, in which case I found GitHub&#39;s API documentation to confirm the suggestion.&lt;/p&gt;
&lt;p&gt;The final script &lt;a href=&quot;https://github.com/benad/gh-fetch-release&quot;&gt;gh-fetch-release&lt;/a&gt; is small and simple enough that it would be possible for someone with little to no programming knowledge to &amp;quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Vibe_coding&quot;&gt;vibe code&lt;/a&gt;&amp;quot; it using only AI code generation. But beyond just my personal learning experience, there was still some value in my human input. For example, I&#39;m the one that insisted in using Object-Oriented Programming to handle the extraction of the various archive formats (see &lt;a href=&quot;https://github.com/benad/gh-fetch-release/pull/3&quot;&gt;Pull Request #3&lt;/a&gt;). While the code generator could be instructed to make use of OOP for that part of the code, adding that to the pile of small (but significant) design decisions makes the prompts closer to a full &lt;a href=&quot;https://www.subtle.so/prd-md&quot;&gt;product requirement document&lt;/a&gt; file. This is why, in my case, I get better results when the code generation happens when I started to write the code, since I find it easier to describe the code design that I want in programming language than in human language.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Git BASH: Home away from home</title>
      <link>https://benad.me/blog/2025/08/10/git-bash-home-away-from-home/</link>
      <pubDate>Sun, 10 Aug 2025 17:00:00 -0400</pubDate>
      
      <guid>https://benad.me/blog/2025/08/10/git-bash-home-away-from-home/</guid>
      <description>&lt;p&gt;As I &lt;a href=&quot;https://benad.me/blog/2021/09/18/modern-command-line-tools/&quot;&gt;mentioned&lt;/a&gt; &lt;a href=&quot;https://benad.me/blog/2022/02/12/more-modern-cli-tools/&quot;&gt;before&lt;/a&gt;, I have a few modern CLI tools I regularly use in my Linux environments. So much so that I started to miss them in Windows.&lt;/p&gt;
&lt;p&gt;To get a BASH shell, I simply install &lt;a href=&quot;https://git-scm.com/&quot;&gt;Git on Windows&lt;/a&gt;. It is packaged with some variant of &lt;a href=&quot;https://www.mingw-w64.org/&quot;&gt;mingw-w64&lt;/a&gt;, that shares some similarities and tools with &lt;a href=&quot;https://cygwin.com/&quot;&gt;Cygwin&lt;/a&gt;. When installing Git, I make sure to select the installation option to add a profile to &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/terminal/&quot;&gt;Windows Terminal&lt;/a&gt;, since mingw&#39;s terminal lacks support for modern UTF-8.&lt;/p&gt;
&lt;p&gt;Luckily for me, most of the tools I wanted are now available as Windows binaries. This means that they can be used anywhere, not constrained to only BASH (or Cygwin).&lt;/p&gt;
&lt;p&gt;Also, over time they became available through &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/package-manager/&quot;&gt;Windows&#39; Package Manager&lt;/a&gt; (&lt;code&gt;winget&lt;/code&gt;). This means I can install all of them with the following command in PowerShell:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ps1&quot;&gt;&amp;quot;Git.git&amp;quot;, &amp;quot;BurntSushi.ripgrep.MSVC&amp;quot;, &amp;quot;sharkdp.bat&amp;quot;,
&amp;quot;junegunn.fzf&amp;quot;, &amp;quot;ducaale.xh&amp;quot;, &amp;quot;dandavison.delta&amp;quot;, &amp;quot;sharkdp.fd&amp;quot;
| foreach { winget install --id $_ }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I then put the following in my &lt;code&gt;~/.bashrc&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;rgd() { command rg --json -C 2 &amp;quot;$@&amp;quot; | command delta; }
xhs() { command xh --https &amp;quot;$@&amp;quot; ; }

export BAT_STYLE=plain
export BAT_THEME=ansi
export BAT_PAGING=always
eval &amp;quot;$( fzf --bash )&amp;quot;
export FZF_DEFAULT_OPTS=&amp;quot;--walker=file,dir,follow --walker-skip .git,node_modules,target&amp;quot;
export FZF_CTRL_T_OPTS=&amp;quot;--preview &#39;bat -n --color=always {}&#39; --bind &#39;ctrl-/:change-preview-window(down|hidden|)&#39;&amp;quot;
export FZF_ALT_C_OPTS=&amp;quot;--walker=dir,follow --preview &#39;ls -1 --color=always {}&#39;&amp;quot;
export FZF_DEFAULT_COMMAND=&#39;fd --type f --color=never -H --exclude .git --exclude node_modules&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here&#39;s a quick overview of those tools:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sharkdp/bat&quot;&gt;bat&lt;/a&gt; is a &lt;a href=&quot;https://en.wikipedia.org/wiki/Terminal_pager&quot;&gt;terminal pager&lt;/a&gt; that supports file syntax coloring and many more options. I&#39;ve set some environment variables to change it&#39;s default style to be more compatible and to always run paging even when the terminal&#39;s size is big enough to display the entire input&#39;s contents.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dandavison.github.io/delta/&quot;&gt;delta&lt;/a&gt; is another terminal pager specialized to show file differences, like &lt;code&gt;diff&lt;/code&gt;. I&#39;ve set up Git to use &lt;code&gt;delta&lt;/code&gt; as the default pager, with the &lt;a href=&quot;https://dandavison.github.io/delta/side-by-side-view.html&quot;&gt;side-by-side view&lt;/a&gt;, like this: &lt;code&gt;git config set --global core.pager &amp;quot;delta -s&amp;quot;&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/BurntSushi/ripgrep&quot;&gt;ripgrep&lt;/a&gt; is a fast replacement for &lt;code&gt;grep -r&lt;/code&gt;. I&#39;ve made an alias &lt;code&gt;rgd&lt;/code&gt; that pipes ripgrep&#39;s output to &lt;code&gt;delta&lt;/code&gt; but with 2 lines of &amp;quot;context&amp;quot;, giving a chance for delta to add file-specific syntax coloring to its output.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/sharkdp/fd&quot;&gt;fd&lt;/a&gt;, also called &lt;code&gt;fdfind&lt;/code&gt; in some package managers, is a simpler, more modern alternative to the old &lt;code&gt;find&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://junegunn.github.io/fzf/&quot;&gt;fzf&lt;/a&gt; is a &amp;quot;fuzzy finder&amp;quot;. I&#39;ve set it up so that by default it lists the output of a &lt;code&gt;fd&lt;/code&gt; command that excludes folders named &lt;code&gt;.git&lt;/code&gt; and &lt;code&gt;node_modules&lt;/code&gt;. In BASH, it enhances the Control-r history search command, adds the Control-t command to insert a file argument to a command, and adds Alt-c to fuzzy search and change to a directory. I&#39;ve customized it to use &lt;code&gt;bat&lt;/code&gt; or &lt;code&gt;ls&lt;/code&gt; to show a live preview. See &lt;a href=&quot;https://junegunn.github.io/fzf/shell-integration/&quot;&gt;Shell Integration&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ducaale/xh&quot;&gt;xh&lt;/a&gt; is an alternative to Curl designed for REST-like HTTP services. I&#39;ve aliased &lt;code&gt;xhs&lt;/code&gt; to make it assume HTTPS by default: For example, &lt;code&gt;xhs httpbun.org/post a=b&lt;/code&gt; will use &lt;code&gt;https://httpbun.org/post&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Of course there are more tools that can be installed in the same manner, for example &lt;code&gt;jq&lt;/code&gt;, but this is enough to make Windows feel like my &amp;quot;home away from home&amp;quot;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Ripping CDs Like It&#39;s 2000</title>
      <link>https://benad.me/blog/2025/04/13/ripping-cds-like-its-2000/</link>
      <pubDate>Sun, 13 Apr 2025 16:00:00 -0400</pubDate>
      
      <guid>https://benad.me/blog/2025/04/13/ripping-cds-like-its-2000/</guid>
      <description>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Ripping&quot;&gt;Ripping&lt;/a&gt; audio CDs in 2025 is rather uncommon. Maybe you bought a &amp;quot;collector&#39;s edition&amp;quot; disk, maybe you prefer having a compression-less copy of an album that doesn&#39;t rely on a subscription service or any kind of online account, or maybe you just have very old CDs that never made the transition to streaming services. Whatever is the reason, ripping CDs in 2025 can be considerably more difficult than in 2000.&lt;/p&gt;
&lt;p&gt;The first obvious obstacle is the lack of CD drives in most modern computers. They are still sold, and external &amp;quot;slim&amp;quot; USB-3 drives are still commonplace and convenient, as they can be used with laptops (unlike internal drives). Many require an external power supply, though mine is &amp;quot;self-powered&amp;quot; if connected on 2 USB ports.&lt;/p&gt;
&lt;p&gt;But what about the software? In the past I used &lt;a href=&quot;https://www.apple.com/itunes/&quot;&gt;iTunes&lt;/a&gt;, but now it is limited to podcasts and audio books. Its replacement, the app for &lt;a href=&quot;https://www.apple.com/apple-music/&quot;&gt;Apple Music&lt;/a&gt;, doesn&#39;t support CDs anymore. Technically, ripping CDs is still possible in iTunes, but it assumes you&#39;re ripping an audio book CD, so it behaves a bit strangely.&lt;/p&gt;
&lt;p&gt;I tried a few CD ripping software for Windows, and I ended up using &lt;a href=&quot;https://www.foobar2000.org/&quot;&gt;foobar2000&lt;/a&gt;. What I wanted was to rip the CD, match it against some online track info data, encode it in MP4 AAC (or something close to what iTunes used to do), be able to add some cover images to the MP4 files, and then import the result in my music libraries.&lt;/p&gt;
&lt;p&gt;foobar2000 can make use of Apple&#39;s own AAC encoder, as long as you install Apple Music and then the &amp;quot;&lt;a href=&quot;https://www.foobar2000.org/encoderpack&quot;&gt;foobar2000 Free Encoder Pack&lt;/a&gt;&amp;quot;. The &lt;a href=&quot;https://github.com/nu774/qaac&quot;&gt;qaac tool&lt;/a&gt; used by foobar2000 will then be able to make use of the libraries from Apple Music. It should be noted that the &amp;quot;CBR&amp;quot; mode can corrupt audio, so you should use &amp;quot;Constrained VBR&amp;quot; instead (which is exactly what iTunes used). There are few good AAC alternatives (that also can be used by foobar2000), though another one I tried is &lt;a href=&quot;https://github.com/tmkk/fhgaacenc&quot;&gt;fhgaacenc&lt;/a&gt; which makes use of the old &lt;a href=&quot;https://www.winamparchive.org/&quot;&gt;Winamp&lt;/a&gt;, be it by installing Winamp first or by &lt;a href=&quot;https://wiki.hydrogenaud.io/index.php?title=Fhgaacenc&quot;&gt;extracting a few specific files from its installer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once the audio tracks are ripped, you can use foobar2000 to set a cover image on all the track files at once. I use either the images found on &lt;a href=&quot;https://www.discogs.com/&quot;&gt;Discogs&lt;/a&gt; or using &lt;a href=&quot;https://www.bing.com/images&quot;&gt;Bing&#39;s image search&lt;/a&gt; (I work at Microsoft, so I&#39;m biased about my choice of web search engines).&lt;/p&gt;
&lt;p&gt;At that point, I copy the files over to Apple Music, which uploads them to my cloud-based music library using &lt;a href=&quot;https://support.apple.com/en-us/108935&quot;&gt;iTunes Match&lt;/a&gt;. I talked about &lt;a href=&quot;https://benad.me/blog/2012/1/4/itunes-match-is-it-worth-it/&quot;&gt;iTunes Match a long time ago&lt;/a&gt;, and it still works well. Its subscription is independent than Apple Music&#39;s own subscription, and now that Apple Music is &lt;a href=&quot;https://apps.microsoft.com/detail/9pfhdd62mxs1?hl=en-CA&amp;amp;gl=CA&quot;&gt;available on Windows&lt;/a&gt;, &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.apple.android.music&quot;&gt;Android&lt;/a&gt; and even &lt;a href=&quot;https://music.apple.com/&quot;&gt;on the web&lt;/a&gt;, my collection isn&#39;t restricted to Apple devices anymore. Another option is to use &lt;a href=&quot;https://www.youtube.com/musicpremium&quot;&gt;YouTube Music Premium&lt;/a&gt; and then &lt;a href=&quot;https://support.google.com/youtubemusic/answer/9716522?hl=en&quot;&gt;upload your music files&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Cloud Gaming Returns</title>
      <link>https://benad.me/blog/2025/01/19/cloud-gaming-returns/</link>
      <pubDate>Sun, 19 Jan 2025 13:15:00 -0500</pubDate>
      
      <guid>https://benad.me/blog/2025/01/19/cloud-gaming-returns/</guid>
      <description>&lt;p&gt;When I heard that &lt;a href=&quot;https://en.wikipedia.org/wiki/Google_Stadia&quot;&gt;Google Statia&lt;/a&gt;  was &lt;a href=&quot;https://www.theverge.com/2022/9/29/23378713/google-stadia-shutting-down-game-streaming-january-2023&quot;&gt;shutting down&lt;/a&gt;, I thought that this whole idea of &amp;quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Cloud_gaming&quot;&gt;Cloud Gaming&lt;/a&gt;&amp;quot; that started with &lt;a href=&quot;https://en.wikipedia.org/wiki/OnLive&quot;&gt;OnLive&lt;/a&gt; is finished. I thought that if Google couldn&#39;t do it, then it&#39;s unlikely that it has any future.&lt;/p&gt;
&lt;p&gt;But then, I recently opened my web browser and navigated to Netflix to watch a movie, when I was offered to &lt;a href=&quot;https://www.theverge.com/2023/8/14/23829262/netflix-cloud-gaming-testing-tv-web&quot;&gt;stream some video games&lt;/a&gt;? They ran pretty well, and worked with a joystick, a mouse of even by touch controls (though I admit few PC laptops have touch screens).&lt;/p&gt;
&lt;p&gt;And then, I recently bought &lt;a href=&quot;https://www.xbox.com/en-CA/games/store/final-fantasy/9P20JCF7BV93/0010&quot;&gt;Final Fantasy I&lt;/a&gt; and &lt;a href=&quot;https://www.xbox.com/en-ca/games/store/final-fantasy-ii/9p8s1mn4066k&quot;&gt;Final Fantasy II for Xbox&lt;/a&gt;. (Disclaimer: I work at Microsoft.) I was already surprised that with their &lt;a href=&quot;https://www.xbox.com/en-CA/games/xbox-play-anywhere&quot;&gt;Xbox Play Anywhere&lt;/a&gt; support, I was able to also play them on my PC laptop (in addition to my Xbox), but I also discovered that I could play them from my iPhone using &lt;a href=&quot;https://news.xbox.com/en-us/2024/11/20/stream-your-own-game-xbox-cloud-gaming-beta/&quot;&gt;Xbox Cloud Gaming&lt;/a&gt;? They also have customized touch controls for phones and tablets, so they pleasantly reminded me of when I played &lt;a href=&quot;https://fr.wikipedia.org/wiki/Final_Fantasy_I_and_II:_Dawn_of_Souls&quot;&gt;Final Fantasy Dawn of Souls&lt;/a&gt; on the Gameboy Advance.&lt;/p&gt;
&lt;p&gt;Or what about how I sometimes play some old arcade and console games on &lt;a href=&quot;https://www.antstream.com/&quot;&gt;Antstream Arcade&lt;/a&gt;? Sure, it feels weird that a mere few seconds of the video stream takes more bytes than most of those games&#39; ROMs, but regardless of that bandwidth &amp;quot;waste&amp;quot; it&#39;s quite responsive.&lt;/p&gt;
&lt;p&gt;So, what happened? There&#39;s also &lt;a href=&quot;https://luna.amazon.ca/&quot;&gt;Amazon Luna&lt;/a&gt;, &lt;a href=&quot;https://www.nvidia.com/en-us/geforce-now/&quot;&gt;GeForce Now&lt;/a&gt; and &lt;a href=&quot;https://blog.playstation.com/2023/10/11/ps5-cloud-streaming-launches-this-month-for-playstation-plus-premium-members/&quot;&gt;PlayStation Plus&#39; own cloud gaming&lt;/a&gt;. Why would one find today&#39;s offering of cloud gaming services acceptable compared to Google&#39;s own?&lt;/p&gt;
&lt;p&gt;My first guess is that some services aren&#39;t as &amp;quot;locked in&amp;quot; as Stadia. They can connect to other gaming libraries so games you bought outside of the cloud service are playable both inside and outside the cloud service. For example, GeForce Now uses your Steam library, and Luna can use your Ubisoft or GOG library. Even if not all games of those libraries are supported, at least the games you purchased won&#39;t vanish if the cloud service closes, like what happened with Stadia.&lt;/p&gt;
&lt;p&gt;My second guess is that some of them also are seen as a &amp;quot;bonus&amp;quot; to another, already existing service. It comes bundled with Netflix (in all plans), Xbox Game Pass Ultimate and PlayStation Plus Premium. So, the risk is low: If the cloud gaming aspect of those services were to shut down, the rest of what is offered in the subscription is still good enough.&lt;/p&gt;
&lt;p&gt;My last guess is that, like physical media, the idea of buying a game console, let alone a far more expensive gaming PC, is becoming less popular. It&#39;s more convenient to simply use the phone you already have with some game controller or use some cheap laptop and not worry about its performance.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Change Directory and List</title>
      <link>https://benad.me/blog/2024/09/29/change-directory-and-list/</link>
      <pubDate>Sun, 29 Sep 2024 11:15:00 -0400</pubDate>
      
      <guid>https://benad.me/blog/2024/09/29/change-directory-and-list/</guid>
      <description>&lt;p&gt;On my Linux systems, I use &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;cd&lt;/code&gt; all the time. Sure, use can use some variations of those commands, like &lt;code&gt;ll&lt;/code&gt; on Debian systems, which does &lt;code&gt;ls -alF --color=auto&lt;/code&gt; (for &lt;a href=&quot;https://www.gnu.org/software/coreutils/&quot;&gt;GNU Coreutils&lt;/a&gt;), and defining your own functions that perform a &lt;code&gt;cd&lt;/code&gt; command to your favorite locations. You could even define your own &amp;quot;cd then ls&amp;quot; command.&lt;/p&gt;
&lt;p&gt;Even then, my main issue is about &lt;em&gt;navigation&lt;/em&gt;. I would often navigate to some location by examining the available directories at one location, and then changing my directory there, incrementally, until I get to the full path I desired. While this can be done with a combination of &lt;code&gt;ls&lt;/code&gt; and &lt;code&gt;cd&lt;/code&gt; commands, some shells like &lt;a href=&quot;https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29&quot;&gt;BASH&lt;/a&gt; support path completion for any command-line argument: Pressing TAB completes the path item&#39;s name, and if ambiguous (up to a point in the item name), a second press of TAB shows the available disambiguation. This process of path completion can be annoying: It is case sensitive, requires knowing the path element names by prefix, and each ambiguous completion results in a cacophony of &amp;quot;bell&amp;quot; sounds (or some stroboscopic &amp;quot;visual bell&amp;quot;).&lt;/p&gt;
&lt;p&gt;Surely there has to be a better way.&lt;/p&gt;
&lt;h3&gt;Fuzzy Searching with &lt;code&gt;fzf&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/junegunn/fzf&quot;&gt;fzf&lt;/a&gt; is a &amp;quot;fuzzy finder&amp;quot; that can search for files in real time as you type part of their paths. It can also be used for looking for directories, or to search matching lines from any input.&lt;/p&gt;
&lt;p&gt;In some shells like BASH, fzf can &lt;a href=&quot;https://junegunn.github.io/fzf/shell-integration/&quot;&gt;add a few useful keyboard shortcuts&lt;/a&gt;. &lt;code&gt;alt-c&lt;/code&gt; is a replacement for &lt;code&gt;cd&lt;/code&gt;. &lt;code&gt;control-t&lt;/code&gt; can be used to insert one or more paths that were found using &lt;code&gt;fzf&lt;/code&gt; on the current command-line. Due to its support for searching in any input text, &lt;code&gt;control-r&lt;/code&gt; replaces BASH&#39;s built-in history search with fuzzy search, which is incredibly useful if you can&#39;t exactly remember a command from your command history.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fzf&lt;/code&gt; also supports showing a preview pane for the currently selected entry. For example, this can be used to show the output of the &lt;code&gt;ls&lt;/code&gt; command of the selected directory when you use &lt;code&gt;alt-c&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;export FZF_ALT_C_OPTS=&amp;quot;--preview &#39;ls {}&#39;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;fzf&lt;/code&gt; can be used with any other process&#39; output. For example, &lt;a href=&quot;https://github.com/junegunn/fzf-git.sh&quot;&gt;fzf-git&lt;/a&gt;, from the same author, supports fuzzy searching for Git objects, like branch names or file paths known to Git, and inserts the result on the command-line.&lt;/p&gt;
&lt;h3&gt;The n&lt;sup&gt;3&lt;/sup&gt; File Manager&lt;/h3&gt;
&lt;p&gt;So, while &lt;code&gt;fzf&lt;/code&gt; helps with finding specific files, it isn&#39;t a replacement for file system navigation. You still need to display the files in the current directory, and performing file operation across multiple directories lacks visualization.&lt;/p&gt;
&lt;p&gt;There has been file managers in a command-line environments for a &lt;em&gt;long&lt;/em&gt; time. For &lt;a href=&quot;https://en.wikipedia.org/wiki/DOS&quot;&gt;DOS&lt;/a&gt; there were quite a few text-based graphical file managers, like &lt;a href=&quot;https://en.wikipedia.org/wiki/Midnight_Commander&quot;&gt;Midnight Commander&lt;/a&gt; or &lt;a href=&quot;https://en.wikipedia.org/wiki/DOS_Shell&quot;&gt;DOS Shell&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A more modern file manager I use is &lt;a href=&quot;https://github.com/jarun/nnn&quot;&gt;n&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt;, named &lt;code&gt;nnn&lt;/code&gt; on the command-line. It differs from what are called &lt;a href=&quot;https://en.wikipedia.org/wiki/File_manager#Orthodox_file_managers&quot;&gt;&amp;quot;orthodox&amp;quot; file managers&lt;/a&gt;, in that it displays only one directory at a time, and generally avoids using &amp;quot;graphical&amp;quot; display. It keeps track of up to 4 different contexts, which are either a directory or a list of files that was output by another process or from its extensive support for plugins.&lt;/p&gt;
&lt;p&gt;Navigation in n&lt;sup&gt;3&lt;/sup&gt; is as simple as using the arrow keys, and it supports &lt;a href=&quot;https://github.com/jarun/nnn/blob/master/misc/quitcd/quitcd.bash_sh_zsh&quot;&gt;changing the current directory on exit&lt;/a&gt;. Its interface is light, but it displays a handy keyboard shortcut reference when pressing &lt;code&gt;?&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It can also be used as a &amp;quot;file picker&amp;quot; &lt;a href=&quot;https://github.com/jarun/nnn/wiki/Basic-use-cases#file-picker&quot;&gt;using the &lt;code&gt;-p&lt;/code&gt; option&lt;/a&gt;, acting in a way as an alternative to &lt;code&gt;fzf&lt;/code&gt;.&lt;/p&gt;
</description>
    </item>
    
    
  </channel>
</rss>