<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Get Info: #marchintosh</title>
    <description>Posts tagged “marchintosh” — Blog of independent game and app developer Matt Sephton. Featuring vintage Macintosh, game development, digital artwork, Japanese esoterica, video game reviews, hacks and tips, and much more.</description>
    <link>https://blog.gingerbeardman.com/tag/marchintosh/</link>
    <atom:link href="https://blog.gingerbeardman.com/tag/marchintosh/index.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 15 Jul 2026 17:33:15 +0000</pubDate>
    <lastBuildDate>Wed, 15 Jul 2026 17:33:15 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>

    
      
        <item>
          <title>Shark Turtle: a modern version of SameGame/MaciGame</title>
          <description>&lt;p&gt;I’m releasing an expanded version of my game Shark Turtle for macOS and Windows. Grab it at itch: &lt;a href=&quot;https://gingerbeardman.itch.io/shark-turtle-desktop/&quot;&gt;gingerbeardman.itch.io/shark-turtle-desktop/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result is a feature-rich, native desktop version of SameGame with fast calculation, animated block removal, mouse/keyboard control, incremental scoring, variable grid sizes each with their own high score table, multi-level undo, lots of options, and great music. It’s a lot of fun and ideal to play little-by-little when you have a spare moment, as you dictate the pace of the game turn-by-turn.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/sharkturtle-macos-lite.png&quot; alt=&quot;IMG&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;about-the-icon&quot;&gt;About the icon&lt;/h2&gt;

&lt;p&gt;I couldn’t find the exact licence for Google’s Emoji Kitchen, it’s either &lt;a href=&quot;https://github.com/googlefonts/noto-emoji/blob/main/LICENSE&quot;&gt;SIL as part of the Noto font&lt;/a&gt; or &lt;a href=&quot;https://developers.googleblog.com/en/updates-to-emoji-new-characters-new-animation-new-color-customization-and-more/&quot;&gt;CC BY 4.0&lt;/a&gt;. But I did find a &lt;a href=&quot;https://github.com/googlefonts/noto-emoji/issues/151#issuecomment-318418911&quot;&gt;comment&lt;/a&gt; by a Google staffer saying that it would be a good idea to draw a custom version that was less generic—I read that as unique and yours—so that’s exactly what I did. There was no choice but to do this, as I needed a vector version to generate an 1024×1024px icon. I like to think that with the raised eyebrow and slight smirk there’s a bit more personality in my version.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/sharkturtle-icon.png&quot; alt=&quot;IMG&quot; title=&quot;My vector version of Google Emoji Kitchen’s “Shark Turtle”&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;whats-in-a-name&quot;&gt;What’s in a name?&lt;/h2&gt;

&lt;p&gt;This concept was originally released as &lt;a href=&quot;https://web.archive.org/web/20230507124114/http://www.asahi-net.or.jp:80/~KY6K-MRB/chainsht.htm&quot;&gt;Chain Shot!&lt;/a&gt; in 1985 by 森辺訓章 Kuniaki Moribe “Morisuke” and went on to become very popular, mostly through a version known as さめがめ SameGame. The game was at one time &lt;a href=&quot;/2023/08/19/fake-steve-jobs-and-letters-from-bill-g/#samegame&quot;&gt;more popular than Tetris in Japan&lt;/a&gt; and even made its way onto consoles like the &lt;a href=&quot;https://retro-gamer.jp/?p=10059&quot;&gt;Super Famicom&lt;/a&gt; and even as recent as &lt;a href=&quot;https://www.mobygames.com/game/55440/pop-em-drop-em-samegame/&quot;&gt;Wii&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In English we pronounce the name as it is spelled: same game. But in Japanese it sounds just like the words “same” さめ (shark) and “game” がめ (sea turtle). A short leap from SameGame to Shark Turtle.&lt;/p&gt;

&lt;p&gt;Perhaps the most well known version of the concept, &lt;a href=&quot;/2023/05/04/macigame-user-created-graphics/&quot;&gt;MaciGame&lt;/a&gt; まきがめ also riffed on this. I’m not sure of the exact meaning, but I like to think it’s a clever double meaning of something cool in Japanese and it also being a game for Macintosh.&lt;/p&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/macigamekoma-01-usa-chan.png#pixel&quot; alt=&quot;PNG&quot; title=&quot;MaciGame’s classic default usa-chan tileset&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;recovering-tile-sets&quot;&gt;Recovering tile sets&lt;/h2&gt;

&lt;p&gt;I’d previously recovered a range of tile sets for a download pack I uploaded to &lt;a href=&quot;https://macintoshgarden.org/games/macigame&quot;&gt;Macintosh Garden&lt;/a&gt;, but that was done in the Classic Macintosh environment so I needed to redo it on modern macOS to be able to extract the images easily.&lt;/p&gt;

&lt;p&gt;MaciGame supported custom tile sets in three formats:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SameGameFormat (160×64, from the PC-98 version of the game)&lt;/li&gt;
  &lt;li&gt;SameGameFormat2 (192×64, includes additional background tiles)&lt;/li&gt;
  &lt;li&gt;MaruSameFormat (256×65, includes connected variations and alternate palettes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tile sets were popular &lt;a href=&quot;/2023/05/04/macigame-user-created-graphics/&quot;&gt;user created content&lt;/a&gt; for 1990s Macintosh fans, given how easy it was to load up a paint app or ResEdit. They were made available for free download at online repositories like &lt;a href=&quot;https://en.wikipedia.org/wiki/Nifty_Corporation&quot;&gt;NIFTY-Serve&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Info-Mac&quot;&gt;Info-Mac&lt;/a&gt;, and on magazine cover mounted media around the world. I found several unique tile sets in my &lt;a href=&quot;/2025/03/28/macintosh-magazine-media-1-million-files/&quot;&gt;Macintosh Magazine Media&lt;/a&gt; archive of vintage CD-ROMs.&lt;/p&gt;

&lt;p&gt;The main online source of these is at: &lt;a href=&quot;https://www.vector.co.jp/vpack/filearea/osx/game/puzzle/makigame/&quot;&gt;vector.co.jp/vpack/filearea/osx/game/puzzle/makigame/&lt;/a&gt; and I automated the clicking of the download buttons using a &lt;a href=&quot;https://gist.github.com/gingerbeardman/47bfd8f6b76a7f33a6262b7998994416&quot;&gt;temporary user script&lt;/a&gt; (gist) to redirect to the download page and then click the button. I use &lt;a href=&quot;https://apps.apple.com/gb/app/pageextender-for-safari/id1457557274?mt=12&quot;&gt;PageExtender&lt;/a&gt; for such things. I could have gone one level deeper by automating the clicking of all the items on the list page, but I quite like clicking through long lists.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/47bfd8f6b76a7f33a6262b7998994416&quot;&gt;user script at gist.github.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can expand these esoteric archives with &lt;a href=&quot;https://theunarchiver.com&quot;&gt;The Unarchiver&lt;/a&gt;. I needed to confirm MacOS Japanese encoding for the filenames that it was unable to heuristically determine. Read more about the madness of &lt;a href=&quot;/2022/03/31/working-with-classic-macintosh-text-encodings-in-the-age-of-unicode/&quot;&gt;classic Macintosh text encodings in the pre-Unicode age&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next we can convert the PICT resources we’re after with &lt;a href=&quot;https://github.com/jsummers/deark&quot;&gt;deark&lt;/a&gt;. Deark doesn’t have a recursive mode, so we need to wrap it in a one-liner:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;find . -type f -print0 | xargs -0 -I {} deark {} -k -od /destination/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I verified those and &lt;a href=&quot;https://discmaster.textfiles.com/search?family=image&amp;amp;widthMin=160&amp;amp;heightMin=64&amp;amp;widthMax=160&amp;amp;heightMax=64&amp;amp;dedup=dedup&amp;amp;sortBy=itemid&amp;amp;pageNum=0&quot;&gt;found&lt;/a&gt; &lt;a href=&quot;https://discmaster.textfiles.com/search?family=image&amp;amp;widthMin=192&amp;amp;heightMin=64&amp;amp;widthMax=192&amp;amp;heightMax=64&amp;amp;dedup=dedup&amp;amp;sortBy=itemid&amp;amp;pageNum=0&quot;&gt;some&lt;/a&gt; &lt;a href=&quot;https://discmaster.textfiles.com/search?family=image&amp;amp;widthMin=256&amp;amp;heightMin=65&amp;amp;widthMax=256&amp;amp;heightMax=65&amp;amp;dedup=dedup&amp;amp;sortBy=itemid&amp;amp;pageNum=0&quot;&gt;others&lt;/a&gt; &lt;a href=&quot;https://discmaster.textfiles.com/search?family=image&amp;amp;detection=PICT%2FSaMe&amp;amp;dedup=dedup&amp;amp;sortBy=itemid&amp;amp;pageNum=0&quot;&gt;using DiscMaster&lt;/a&gt;. A few stranglers found on the web brought the grand total to 320 tile sets.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;de-duplicating&quot;&gt;De-duplicating&lt;/h2&gt;

&lt;p&gt;It was obvious that there were some duplicates, so what to do? My first thought was to optimise all images equally, I used &lt;a href=&quot;https://github.com/fhanau/Efficient-Compression-Tool&quot;&gt;ect&lt;/a&gt; command line tool for this purpose. After that, still on the command line, we can do a quick de-dupe using the &lt;a href=&quot;https://github.com/adrianlopezroche/fdupes&quot;&gt;fdupes&lt;/a&gt; tool. This helped me get rid of a bunch, but there were still some hanging around.&lt;/p&gt;

&lt;p&gt;I wanted to compare files at a pixel level, so wrapped &lt;a href=&quot;https://github.com/ImageMagick/ImageMagick&quot;&gt;imagemagick&lt;/a&gt; in &lt;a href=&quot;https://gist.github.com/gingerbeardman/31c2eabf4c39ebad0ceb9c6265afd5a6&quot;&gt;a shell script&lt;/a&gt; (gist). We compare each image with every other image. I tried adding pre-checks to the script but they slowed it down and removed the ability for it to run in parallel. Keep it simple wins again.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/47bfd8f6b76a7f33a6262b7998994416&quot;&gt;shell script at gist.github.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;organising&quot;&gt;Organising&lt;/h2&gt;

&lt;p&gt;For organisation sake I wanted to verify and categorise the dimensions of each image. I created &lt;a href=&quot;https://gist.github.com/gingerbeardman/99585e86d9a6ed321a73cc5f6ab247a2&quot;&gt;a shell script to tag images of specific sizes with Finder colours&lt;/a&gt; (gist). I noticed that some converted images were one pixel wider than expected, it turns out that this is a quirk in how those specific image were composed. So I coloured them red and edited them by hand after the fact.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/47bfd8f6b76a7f33a6262b7998994416&quot;&gt;shell script at gist.github.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;all-tile-sets&quot;&gt;All tile sets&lt;/h2&gt;

&lt;p&gt;Here’s a video of my 5 tile sets plus the 320 classic user created tile sets. &lt;em&gt;Gotta catch ‘em all!&lt;/em&gt;&lt;/p&gt;

&lt;lite-youtube style=&quot;aspect-ratio: 5/3;&quot; videoid=&quot;pbWV13BNloA&quot; params=&quot;start=0&amp;amp;modestbranding=2&quot;&gt;
&lt;/lite-youtube&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;playdate&quot;&gt;Playdate&lt;/h2&gt;

&lt;p&gt;I originally wrote a version of &lt;a href=&quot;/2025/03/11/old-codes-new-releases-for-playdate/&quot;&gt;Shark Turtle for Playdate&lt;/a&gt; back in 2023 and released it earlier this month. The desktop version of the game is expanded and enhanced in the way that desktop apps can be. Those features took a bunch more work and I’ve undoubtedly been working on the platform specific stuff far more than I did on the core of the game.&lt;/p&gt;

&lt;p&gt;Buyers of the Shark Turtle for Playdate get the desktop version for free! Head to &lt;a href=&quot;https://itch.io/s/150167/shark-turtle-double-dip&quot;&gt;this bundle&lt;/a&gt;.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Tue, 01 Apr 2025 18:44:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2025/04/01/shark-turtle-a-modern-version-of-samegame-and-macigame/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2025/04/01/shark-turtle-a-modern-version-of-samegame-and-macigame/</guid>
        </item>
      
    
      
        <item>
          <title>Station: Travel Through the Four Seasons (1994)</title>
          <description>&lt;p&gt;After reaching &lt;a href=&quot;/2025/03/28/macintosh-magazine-media-1-million-files/&quot;&gt;1 million files&lt;/a&gt; in my &lt;a href=&quot;/2021/10/30/macintosh-magazine-media/&quot;&gt;Macintosh Magazine Media project&lt;/a&gt;, I thought it would be cool to post about something I found recently in those discs. I get a real buzz rediscovering something like this after more than 30 years have passed.&lt;/p&gt;

&lt;p&gt;It’s a sweet little point and click adventure game for Classic Macintosh called “&lt;em&gt;Station: Travel Through the Four Seasons&lt;/em&gt;” by Mitsuo Isaka, about taking train rides through the Japanese countryside. You meet and interact with a variety of people and explore each scene to figure out how to move on.&lt;/p&gt;

&lt;p&gt;It was found on CD2 マルチメディアチャレンジ ’94 要賞作品篥 (Multimedia Challenge ’94 Award Winning Works) of &lt;a href=&quot;https://archive.org/details/gokuraku-paradise-theater-1994-10&quot;&gt;MACLIFE Special: Gokuraku Paradise Theater 1994&lt;/a&gt;. You can download the ISO to explore that disc for yourself in an emulator or on a vintage Macintosh. I also uploaded &lt;a href=&quot;https://macintoshgarden.org/games/station&quot;&gt;just the game to Macintosh Garden&lt;/a&gt; so that you don’t need to download the whole CD for just this game.&lt;/p&gt;

&lt;h2 id=&quot;play-it-in-your-browser&quot;&gt;Play it in your browser&lt;/h2&gt;

&lt;p&gt;But if you want to try it right now you can do so in your browser thanks to the Infinite Mac website, using this link: &lt;a href=&quot;https://infinitemac.org/1996/KanjiTalk%207.5.3?cdrom=https%3A%2F%2Fdownload.macintoshgarden.org%2Fgames%2FStation.ds62.img&quot;&gt;KanjiTalk 7.5.3 with the Station disk image already mounted&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The game is in Japanese and features mostly voiceover and a little on screen text. Google Translate can probably help with its conversation (audio) and camera (visual) translation modes. &lt;em&gt;Ganbare!&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;

&lt;p&gt;In Japanese, it says:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;ここは“四季の里”といわれるとこる。昔から一両だけのディーゼル車がのんびりと走っているという。&lt;/p&gt;

  &lt;p&gt;駅は全部で四つの小さな鉄道だけれど不思議なことに、ひとつひとつの駅にそれぞれのきまった季節があるという。&lt;/p&gt;

  &lt;p&gt;ぼくは、さっそくその鉄道に乗ってみようと春の季節をもっといわれる“桜ヶ丘”という駅を訪ねることにした・・・&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Translated into English:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;This place is known as the ‘Village of the Four Seasons’. A single diesel train has been running slowly and leisurely here for a long time.&lt;/p&gt;

  &lt;p&gt;There are four stations in total on this small railway, but strangely enough, each station has its own set season.&lt;/p&gt;

  &lt;p&gt;I decided to visit a station called ‘Sakuragaoka’, which is known more for its spring season, to try out the railway…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;div class=&quot;carousel__holder&quot;&gt;
    &lt;div id=&quot;carousel0&quot; class=&quot;carousel&quot;&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel0&quot; id=&quot;0a&quot; checked=&quot;checked&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel0&quot; id=&quot;0b&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel0&quot; id=&quot;0c&quot; /&gt;
        
          &lt;input class=&quot;carousel__activator&quot; type=&quot;radio&quot; name=&quot;carousel0&quot; id=&quot;0d&quot; /&gt;
        
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;0d&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;0b&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;0a&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;0c&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;0b&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;0d&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
          
          
          
          
          &lt;div class=&quot;carousel__controls&quot;&gt;
              &lt;label class=&quot;carousel__control carousel__control--backward&quot; for=&quot;0c&quot;&gt;&lt;/label&gt;
              &lt;label class=&quot;carousel__control carousel__control--forward&quot; for=&quot;0a&quot;&gt;&lt;/label&gt;
          &lt;/div&gt;
        
        &lt;div class=&quot;carousel__track&quot;&gt;
          &lt;ul&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/station-1.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/station-1.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/station-2.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/station-2.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/station-3.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/station-3.png&quot; /&gt;&lt;/li&gt;
            
            &lt;li class=&quot;carousel__slide&quot; style=&quot;background-image: url(&apos;https://cdn.gingerbeardman.com/images/posts/station-4.png&apos;);&quot;&gt;&lt;img class=&quot;carousel__staticimage&quot; src=&quot;https://cdn.gingerbeardman.com/images/posts/station-4.png&quot; /&gt;&lt;/li&gt;
            
          &lt;/ul&gt;
        &lt;/div&gt;
        &lt;div class=&quot;carousel__indicators&quot;&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;0a&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;0b&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;0c&quot;&gt;&lt;/label&gt;
            
              &lt;label class=&quot;carousel__indicator&quot; for=&quot;0d&quot;&gt;&lt;/label&gt;
            
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
.carousel__holder {width: 100%; position: relative; padding-bottom: 75%; margin: 1rem 0 1rem;}
.carousel {
  height: 100%;
  width: 100%;
  overflow: hidden;
  text-align: center;
  position: absolute;
  padding: 0;
}
.carousel__controls,
.carousel__activator {
  display: none;
}

.carousel__activator:nth-of-type(1):checked ~ .carousel__track {
  -webkit-transform: translateX(-000%);
          transform: translateX(-000%);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__slide:nth-of-type(1) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__controls:nth-of-type(1) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(1):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(1) {
  opacity: 1;
}

.carousel__activator:nth-of-type(2):checked ~ .carousel__track {
  -webkit-transform: translateX(-100%);
          transform: translateX(-100%);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__slide:nth-of-type(2) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__controls:nth-of-type(2) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(2):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(2) {
  opacity: 1;
}

.carousel__activator:nth-of-type(3):checked ~ .carousel__track {
  -webkit-transform: translateX(-200%);
          transform: translateX(-200%);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__slide:nth-of-type(3) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__controls:nth-of-type(3) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(3):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(3) {
  opacity: 1;
}

.carousel__activator:nth-of-type(4):checked ~ .carousel__track {
  -webkit-transform: translateX(-300%);
          transform: translateX(-300%);
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__slide:nth-of-type(4) {
  transition: opacity 0.5s, -webkit-transform 0.5s;
  transition: opacity 0.5s, transform 0.5s;
  transition: opacity 0.5s, transform 0.5s, -webkit-transform 0.5s;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
  -webkit-transform: scale(1);
          transform: scale(1);
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__controls:nth-of-type(4) {
  display: block;
  opacity: 1;
}
.carousel__activator:nth-of-type(4):checked ~ .carousel__indicators .carousel__indicator:nth-of-type(4) {
  opacity: 1;
}


.carousel__control {
  height: 30px;
  width: 30px;
  margin-top: -15px;
  top: 50%;
  position: absolute;
  display: block;
  cursor: pointer;
  border-width: 5px 5px 0 0;
  border-style: solid;
  opacity: 0.35;
  opacity: 1;
  outline: 0;
  z-index: 3;
  color: #fafafa;
  mix-blend-mode: difference;
}
.carousel__control:hover {
  opacity: 1;
}
.carousel__control--backward {
  left: 20px;
  -webkit-transform: rotate(-135deg);
          transform: rotate(-135deg);
}
.carousel__control--forward {
  right: 20px;
  -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
}
.carousel__indicators {
  position: absolute;
  bottom: 20px;
  width: 100%;
  text-align: center;
}
.carousel__indicator {
  height: 10px;
  width: 10px;
  border-radius: 100%;
  display: inline-block;
  z-index: 2;
  cursor: pointer;
  opacity: 0.35;
  margin: 0 2.5px 0 2.5px;
}
.carousel__indicator:hover {
  opacity: 0.75;
}
.carousel__track {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 0;
  margin: 0;
  transition: -webkit-transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s;
  transition: transform 0.5s ease 0s, -webkit-transform 0.5s ease 0s;
}
.carousel__track .carousel__slide {
  display: block;
  top: 0;
  left: 0;
  right: 0;
  opacity: 1;
}

.carousel__track .carousel__slide:nth-of-type(1) {
  -webkit-transform: translateX(000%) translateZ(0);
          transform: translateX(000%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(2) {
  -webkit-transform: translateX(100%) translateZ(0);
          transform: translateX(100%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(3) {
  -webkit-transform: translateX(200%) translateZ(0);
          transform: translateX(200%) translateZ(0);
}

.carousel__track .carousel__slide:nth-of-type(4) {
  -webkit-transform: translateX(300%) translateZ(0);
          transform: translateX(300%) translateZ(0);
}


.carousel--scale .carousel__slide {
  -webkit-transform: scale(0);
          transform: scale(0);
}
.carousel__slide {
  height: 100%;
  position: absolute;
  opacity: 0;
  overflow: hidden;
}
.carousel__slide .overlay {height: 100%;}
.carousel--thumb .carousel__indicator {
  height: 30px;
  width: 30px;
}
.carousel__indicator {
  background-color: #fafafa;
}

.carousel__slide:nth-of-type(1),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(1 {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(2),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(2 {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(3),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(3 {
  background-size: cover;
  background-position: center;
}

.carousel__slide:nth-of-type(4),
.carousel--thumb .carousel__indicators .carousel__indicator:nth-of-type(4 {
  background-size: cover;
  background-position: center;
}

&lt;/style&gt;

&lt;script&gt;
  function isVisible(el) {
        while (el) {
            if (el === document) {
                return true;
            }

            var $style = window.getComputedStyle(el, null);

            if (!el) {
                return false;
            } else if (!$style) {
                return false;
            } else if ($style.display === &apos;none&apos;) {
                return false;
            } else if ($style.visibility === &apos;hidden&apos;) {
                return false;
            } else if (+$style.opacity === 0) {
                return false;
            } else if (($style.display === &apos;block&apos; || $style.display === &apos;inline-block&apos;) &amp;&amp;
                $style.height === &apos;0px&apos; &amp;&amp; $style.overflow === &apos;hidden&apos;) {
                return false;
            } else {
                return $style.position === &apos;fixed&apos; || isVisible(el.parentNode);
            }
        }
  }
  
  setInterval(function(){
    var j=0;
    var elements = document.querySelectorAll(&apos;#carousel0 .carousel__control--forward&apos;);
    for(i=(elements.length - 1);i&gt;-1;i--) {
      if(isVisible(elements[i])) j=i;
    }
    elements[j].click();
  },7000);
  
&lt;/script&gt;

</description>
          <author>by Matt Sephton</author>
          <pubDate>Sun, 30 Mar 2025 20:12:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2025/03/30/station-travel-through-the-four-seasons-1994/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2025/03/30/station-travel-through-the-four-seasons-1994/</guid>
        </item>
      
    
      
        <item>
          <title>Macintosh Magazine Media: 1 million files</title>
          <description>&lt;p&gt;I am proud to announce that my &lt;a href=&quot;/2021/10/30/macintosh-magazine-media/&quot;&gt;Macintosh Magazine Media project&lt;/a&gt; has surpassed my self-imposed goal of 1 million files, an achievement that fills me with both immense satisfaction and slight bewilderment. And if you were to decompress those files the total would be 30 million! Woah.&lt;/p&gt;

&lt;p&gt;If you’ve never heard of it before: it’s an archive of vintage media containing mostly Macintosh files sourced from Japanese magazines, but featuring content from all over the world. A treasure trove time capsule for vintage computer nerds like myself.&lt;/p&gt;

&lt;p&gt;Many thanks to &lt;a href=&quot;https://patreon.com/gingerbeardman&quot;&gt;my Patreon subscribers&lt;/a&gt; for their support!&lt;/p&gt;

&lt;h2 id=&quot;status-report&quot;&gt;Status report&lt;/h2&gt;

&lt;p&gt;The archive as it stands (updated March 2025):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;date range: 1991–2002&lt;/li&gt;
  &lt;li&gt;total media: 500 discs&lt;/li&gt;
  &lt;li&gt;total files: 1,086,536 files&lt;/li&gt;
&lt;/ul&gt;

&lt;!--
The archive as it stands (updated July 2024):

*   date range: 1991–2002
*   total media: 461 discs
*   total files: 998,512 files
--&gt;

&lt;p class=&quot;tofigure&quot;&gt;&lt;img src=&quot;https://cdn.gingerbeardman.com/images/posts/mmm-scatter.png&quot; alt=&quot;PNG&quot; title=&quot;Distribution of discs by month&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;new-discs&quot;&gt;New discs&lt;/h2&gt;

&lt;p&gt;Multiple new discs were added, almost all of them are Macintosh, or Hybrid Mac/Win, but there are a couple of Windows-only discs in there:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Acara Super CD (1998-12)&lt;/li&gt;
  &lt;li&gt;Acara Super CD (2000-07)&lt;/li&gt;
  &lt;li&gt;CD-ROM MACLIFE 131 (1999-07)&lt;/li&gt;
  &lt;li&gt;CD-ROM MACLIFE 132 (1999-08)&lt;/li&gt;
  &lt;li&gt;CD-ROM MACLIFE 133 (1999-09)&lt;/li&gt;
  &lt;li&gt;CD-ROM MACLIFE 141 (2000-05)&lt;/li&gt;
  &lt;li&gt;CD-ROM MACLIFE 152 (2001-04)&lt;/li&gt;
  &lt;li&gt;Create on a computer: New Year’s Card 1999&lt;/li&gt;
  &lt;li&gt;Create on your Mac: New Year’s Card 2000&lt;/li&gt;
  &lt;li&gt;Gokuraku Paradise Theater (1994-10) 2xCD&lt;/li&gt;
  &lt;li&gt;Mac Fan Internet CD-ROM (1997-12)&lt;/li&gt;
  &lt;li&gt;Mac Fan Internet CD-ROM (1999-04)&lt;/li&gt;
  &lt;li&gt;Mac Ga Ichiban! Vol. 50 (1998-11)&lt;/li&gt;
  &lt;li&gt;Mac Ga Ichiban! Vol. 59 (1998-08)&lt;/li&gt;
  &lt;li&gt;Mac100% Vol.7 (1998-07)&lt;/li&gt;
  &lt;li&gt;Mac100% (1999-01)&lt;/li&gt;
  &lt;li&gt;MacPeople (1998-02-15)&lt;/li&gt;
  &lt;li&gt;MacPeople (1998-04-15)&lt;/li&gt;
  &lt;li&gt;MacPeople (1998-06-15)&lt;/li&gt;
  &lt;li&gt;MacPeople (1998-08-01)&lt;/li&gt;
  &lt;li&gt;MacPeople (1998-08-15)&lt;/li&gt;
  &lt;li&gt;MacPeople (1998-09-15)&lt;/li&gt;
  &lt;li&gt;MacPeople (1998-10-15)&lt;/li&gt;
  &lt;li&gt;MacPeople (1999-05-15)&lt;/li&gt;
  &lt;li&gt;MacPeople (1999-06-01)&lt;/li&gt;
  &lt;li&gt;MacPeople (2000-08-01)&lt;/li&gt;
  &lt;li&gt;MacPeople (2002-03-15)&lt;/li&gt;
  &lt;li&gt;MacPeople (2003-05-01) 2xCD&lt;/li&gt;
  &lt;li&gt;TECH Win (1999-08) 2xCD&lt;/li&gt;
  &lt;li&gt;Tsukaeru ikinari dekiru homupejipasokon BOOKS 8 (1998)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also indexed the latest Japanese Macintosh magazine media from redump.&lt;/p&gt;

&lt;h2 id=&quot;the-process&quot;&gt;The process&lt;/h2&gt;

&lt;p&gt;For this many CDs we are talking multiple days of busy work to prepare them for sharing.&lt;/p&gt;

&lt;p&gt;If you’re interested in the “process” for each CD here it is:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Find the CD available for sale in Japan (they’re getting harder to find)&lt;/li&gt;
  &lt;li&gt;Purchase it with cold hard cash&lt;/li&gt;
  &lt;li&gt;Wait for delivery (I delay shipping until I have enough items to make it worthwhile)&lt;/li&gt;
  &lt;li&gt;Dump the CD using a suitable reader (fwiw &lt;a href=&quot;http://redump.org&quot;&gt;redump&lt;/a&gt; project is very specific)&lt;/li&gt;
  &lt;li&gt;Index the CD filesystem (I created my &lt;a href=&quot;/2022/03/31/working-with-classic-macintosh-text-encodings-in-the-age-of-unicode/&quot;&gt;own software stack&lt;/a&gt; for this)&lt;/li&gt;
  &lt;li&gt;Redo dump of any bad discs (there are always some!)&lt;/li&gt;
  &lt;li&gt;Scan the CD artwork&lt;/li&gt;
  &lt;li&gt;Prepare the upload and metadata .csv for &lt;a href=&quot;https://archive.org/developers/internetarchive/cli.html&quot;&gt;internetarchive cli tool&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Bulk upload (this takes an absolute age, 30–60 mins per CD)&lt;/li&gt;
  &lt;li&gt;Redo upload of any failed items (the cli is very error prone)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’m not sure I’ll buy any/many more discs, but never say never!&lt;/p&gt;

&lt;h2 id=&quot;searching-the-collection&quot;&gt;Searching the collection&lt;/h2&gt;

&lt;p&gt;All disc ISO with text listings are available for download at &lt;a href=&quot;https://archive.org/details/@gingerbeardman&quot;&gt;Internet Archive&lt;/a&gt;, but wait a minute!&lt;/p&gt;

&lt;p&gt;Using my search engine (&lt;a href=&quot;/2025/01/10/macintosh-magazine-media-search-engine-update/&quot;&gt;read more&lt;/a&gt; about that) you can search by regex for file/directory name, file type, creator code: &lt;a href=&quot;https://www.gingerbeardman.com/mmm/&quot;&gt;gingerbeardman.com/mmm/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or you can use DiscMaster to search inside content and grab individual files without having to download the whole ISO: &lt;a href=&quot;https://discmaster.textfiles.com&quot;&gt;discmaster.textfiles.com&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;interesting-finds&quot;&gt;Interesting finds&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2021/10/31/hypercard-hanafuda/&quot;&gt;HyperCard Hanafuda&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2021/10/31/mouse-controlled-super-mario-kart-clone-for-classic-macintosh/&quot;&gt;Mouse-controlled Super Mario Kart clone for classic Macintosh&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2021/11/01/roly-polys-world-tour-demo/&quot;&gt;Roly-Polys World Tour (Demo)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2021/11/20/asistantpickle-desktop-toy-for-macintosh/&quot;&gt;AsistantPickle desktop toy for Macintosh&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2023/05/17/intelligentpad-component-based-drag-and-drop-software-creator/&quot;&gt;IntelligentPad: component-based drag-and-drop software creator&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2023/07/15/the-famous-f40-vector-illustration/&quot;&gt;“The Famous F40” vector illustration by David Rumfelt&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2023/12/16/see-the-sky-thoru-yamamoto-christmas-story-for-playdate/&quot;&gt;See the sky: Thoru Yamamoto’s Christmas story&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2021/10/30/macintosh-magazine-media/&quot;&gt;I’m preserving vintage Macintosh magazine media&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2025/01/10/macintosh-magazine-media-search-engine-update/&quot;&gt;Macintosh Magazine Media: search engine update&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2022/03/31/working-with-classic-macintosh-text-encodings-in-the-age-of-unicode/&quot;&gt;Working with classic Macintosh text encodings in the age of Unicode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.gingerbeardman.com/2023/11/07/japanese-lanuage-support-on-classic-macintosh/&quot;&gt;Japanese language support on Classic Macintosh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Fri, 28 Mar 2025 16:57:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2025/03/28/macintosh-magazine-media-1-million-files/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2025/03/28/macintosh-magazine-media-1-million-files/</guid>
        </item>
      
    
      
        <item>
          <title>Working with classic Macintosh text encodings in the age of Unicode</title>
          <description>&lt;p&gt;One of my “lockdown projects” is a collection of media from vintage Japanese Apple Macintosh magazines. These are mostly CD-ROMs but there are some floppy disks too. I started the project in July 2021 and have so far collected an archive of over 250 items spanning just over a decade, uncovering many long lost classic pieces of software in the process. I call the project &lt;a href=&quot;/2021/10/30/macintosh-magazine-media/&quot;&gt;Macintosh Magazine Media&lt;/a&gt; and contributions are always welcome.&lt;/p&gt;

&lt;h2 id=&quot;the-relentless-march-of-progress&quot;&gt;The Relentless March of Progress&lt;/h2&gt;

&lt;p&gt;Accessing vintage Macintosh media from the “classic” era is more difficult than it should be. This is largely due to Apple removing support for accessing the HFS Standard format in modern macOS, since Catalina. My guess is that the feature comprised of 32-bit code and the move to 64-bit and Apple Silicon meant it would have to be rewritten, so instead they removed it completely. You can still access HFS Standard disks in Mojave, but there are problems when exotic text encodings are used.&lt;/p&gt;

&lt;h2 id=&quot;before-unicode&quot;&gt;Before Unicode&lt;/h2&gt;

&lt;p&gt;Classic Macintosh was created before the world moved to Unicode. But of course many languages existed and people speaking those languages wanted to use Macintosh computers. So Apple were forced to provide support for those languages. They did so by offering their system software in multiple languages. If you think of how embedded Unicode is in our software today, it was the same sort of thing: only repeated for each individual language!&lt;/p&gt;

&lt;p&gt;For European, Western, or Latin-based languages you’d be forgiven for not noticing the differences as most of the characters are the same. The problem comes with non-Latin languages, like Japanese.&lt;/p&gt;

&lt;h2 id=&quot;opening-pandoras-box&quot;&gt;Opening Pandora’s Box&lt;/h2&gt;

&lt;p&gt;I figured out quickly that the correct way of viewing the contents of media containing Japanese files was to use a Japanese version of Macintosh system software. It sounds obvious in hindsight, but it was not at the time! Seeing as I prefer System 7 to later versions I installed System J-7.5.3 in the BasiliskII emulator, alongside my existing systems so I can switch to it on demand. Emulation makes the whole thing so much easier by removing the friction of old, slow, possibly failing hardware.&lt;/p&gt;

&lt;p&gt;There are many apps capable of cataloguing removable media, but it took me a long time to find one that could cope with Japanese. I learned an important lesson here: if you’re dealing with Japanese look for apps made in Japan! More on that later. &lt;a href=&quot;https://macintoshgarden.org/apps/diskcatalogmaker&quot;&gt;DiskCatalogMaker&lt;/a&gt; (formerly DiskChoboMaker) was the cataloguing app that I settled on that worked for my needs. In fact, it’s still being updated today and can even import files created with much older versions, so I can copy my database from classic Mac OS to modern macOS and “it just works”, at least it does if you do that with modern macOS set to Japanese locale. That said, as good as DiskCatalogMaker is it still has problems with some filenames resulting in missing or duplicate entries, it uses a proprietary database format, it has cumbersome way of exporting plain text listings, and does not support bulk operations. I did go so far as scripting an automated bulk export solution using &lt;a href=&quot;https://www.keyboardmaestro.com&quot;&gt;Keyboard Maestro&lt;/a&gt; but that was slow and tedious to do whenever there were changes or additions to my collection.&lt;/p&gt;

&lt;h2 id=&quot;diy&quot;&gt;DIY&lt;/h2&gt;

&lt;p&gt;With no better solutions to be found the only remaining choice was to do it myself. This decision was made in October 2021.&lt;/p&gt;

&lt;p&gt;I found two apps that can be used on modern operating systems to view HFS format media, both of which seemed like good places to start. I didn’t want to reinvent the wheel:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/unsound/hfsexplorer&quot;&gt;HFSExplorer&lt;/a&gt; - a Java GUI app&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.mars.org/home/rob/proj/hfs/&quot;&gt;hfsutils&lt;/a&gt; - a command-line suite of tools&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;hfsexplorer&quot;&gt;HFSExplorer&lt;/h3&gt;

&lt;p&gt;This app opened a lot of my HFS media, but failed on others for reasons I didn’t immediately understand. &lt;a href=&quot;https://github.com/unsound/hfsexplorer/issues/15&quot;&gt;I field an issue on GitHub&lt;/a&gt; and to my surprise it was quickly resolved. This led to the discovery that the filenames on the media were in MacJapanese text encoding, so that capability was also added to HFSExplorer. Things went well for a while until certain other media failed to be read completely. Characters in certain filenames were out-of-range for MacJapanese. A &lt;a href=&quot;https://github.com/unsound/hfsexplorer/issues/26&quot;&gt;workaround&lt;/a&gt; was to read the filenames as MacJapanese and drop down to MacRoman for any filenames with out-of-range characters. This worked well enough.&lt;/p&gt;

&lt;p&gt;At this point my attention moved on to wanting to search the contents of all media. It was possible with DiskCatalogMaker but I was limited to using apps on classic Macintosh or modern macOS. Ideally I’d want the search to be web based. So I needed to generate text file listings of each disk. This was the end of the line for HFSExplorer for me, as I found no easy way of exporting full listings.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;aside-out-of-range-characters&quot;&gt;Aside: out-of-range characters&lt;/h3&gt;

  &lt;p&gt;You might be wondering: how can there be out of range characters in text of a specified encoding, and what the hell are they? Well, there are a few scenarios that cause these problem characters to appear in filenames:&lt;/p&gt;

  &lt;ol&gt;
    &lt;li&gt;Files originating on other systems that are encoded as MacRoman, Shift-JIS or some other encoding can be copied onto a computer running MacJapanese, but the filenames are not re-encoded.&lt;/li&gt;
    &lt;li&gt;Pressing forward delete key on an extended keyboard whilst renaming a file inserts an invisible DEL control character into the filename, rather than doing any actual deleting!&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;hfsutils&quot;&gt;hfsutils&lt;/h3&gt;

&lt;p&gt;Next, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hfsutils&lt;/code&gt;. It’s trivial to export the contents of a disk image as a text file—using the command line tool &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;hls&lt;/code&gt;—but I couldn’t make sense of the contents. It didn’t seem to adhere to any one encoding. I had no luck with the best text editors on classic Mac OS: BBEdit, Nisus, Tex-Edit Plus, even Japanese apps like LightWayText couldn’t deal with the text. The same can be said for a bespoke text conversation app called Cyclone Classic, but it hit the same problem as HFSExplorer when it encountered out-of-range characters.&lt;/p&gt;

&lt;p&gt;The modern tool &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iconv&lt;/code&gt; couldn’t deal with the listings as it has no support for MacJapanese. I could get by processing as Shift-JIS and forcing unsupported characters to be ignored. But it wasn’t a good enough solution: MacJapanese is not Shift-JIS.&lt;/p&gt;

&lt;p&gt;Thinking back to using Japanese apps to work with Japanese text I looked for any modern Japanese text editors for macOS. There are a handful and I eventually stumbled across a modern Japanese text editor called &lt;a href=&quot;https://coteditor.com&quot;&gt;CotEditor&lt;/a&gt; which handles old Macintosh text files with aplomb. This app is now my default text file viewer and it comes highly recommended. I can’t go so far as to use it as my work editor because it doesn’t support opening folders or projects containing  multiple files. It still has problems with my directory listings but at least it’s a modern way to view the majority of Japanese text files.&lt;/p&gt;

&lt;p&gt;At this point, I was at an impasse and couldn’t think of any way to proceed. Eventually, after ruminating in the problem for some months I had a couple of breakthroughs.&lt;/p&gt;

&lt;h3 id=&quot;scummvm&quot;&gt;ScummVM&lt;/h3&gt;

&lt;p&gt;What on earth does a point-and-click video game engine have to do with text encoding? Well it turns out that in July 2021, at the same time I was trying to solve this problem, the ScummVM team were also trying to solve it! They needed a tool to be able to handle Japanese media that contained games the wanted to run on their engine. Their solution is &lt;a href=&quot;https://github.com/einstein95/scummvm/blob/master/devtools/dumper-companion.py&quot;&gt;dumper-companion&lt;/a&gt; and once it had &lt;a href=&quot;https://github.com/scummvm/scummvm/pull/3485&quot;&gt;support for MacJapanese added&lt;/a&gt;,in the same way it had been for HFSExplorer, it was a reasonable solution. But it was far too slow, reading the whole disk image into memory at once—no mean feat for a bunch of 650MB CD-ROM images—and it also had the same problem with the out-of-range characters.&lt;/p&gt;

&lt;h3 id=&quot;tickle&quot;&gt;Tickle&lt;/h3&gt;

&lt;p&gt;From time to time I would search for possible ways to deal with MacJapanese encoding. One day in November 2021 I stumbled upon Tcl (pronounced “tickle”) which has support for a whole bunch of text encodings, including MacJapanese! What’s more &lt;a href=&quot;https://opensource.apple.com/source/tcl/tcl-10/tcl/tools/encoding/macJapan.txt&quot;&gt;the encoding maps were written by Apple&lt;/a&gt; in the mid-‘90s, so it’s likely to be as correct as can be. Note: Peter Edberg, who wrote the Tcl mappings, is still working at Apple after almost 35 years!&lt;/p&gt;

&lt;p&gt;The Tcl solution to convert from MacJapanese to Unicode is a beautiful one-liner:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;puts out.txt [encoding convertfrom macJapan [read in.txt]]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;…so much effort to arrive at this simple solution!&lt;/p&gt;

&lt;h2 id=&quot;convert2unicode&quot;&gt;convert2unicode&lt;/h2&gt;

&lt;p&gt;From here I wrapped the Tcl one-liner in a bunch more script so that it can handle both files and directories, as well as wildcards and stdin. It can also list all known encodings, and can take an argument representing the source encoding (of course it defaults to MacJapanese). Essentially, I made the one-liner into a proper command-line tool.&lt;/p&gt;

&lt;noscript&gt;&lt;p&gt;&lt;a href=&quot;https://gist.github.com/gingerbeardman/4a3b66236e018b72b32ca17953474e12&quot;&gt;View the source code as a Gist&lt;/a&gt;&lt;/p&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/gingerbeardman/4a3b66236e018b72b32ca17953474e12.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;I have a secondary &lt;a href=&quot;https://gist.github.com/gingerbeardman/892e2c92b6fe17838a1443608c111a56&quot;&gt;shell script&lt;/a&gt; that runs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;convert2unicode&lt;/code&gt; against my drive full of disk images, along with some housekeeping and maintenance functions. The whole process of listing the disks and converting the resulting text files takes less than 30 seconds for 250 items.&lt;/p&gt;

&lt;h3 id=&quot;let-there-be-search&quot;&gt;Let there be search&lt;/h3&gt;

&lt;p&gt;So, at this point I can generate text files with the contents of each disk, but to get sensible search results each filename would have to have its full path. So I rolled my sleeves up and &lt;a href=&quot;https://github.com/gingerbeardman/hfsutils&quot;&gt;forked hfsutils to add a “full” output mode&lt;/a&gt; to display the filenames in exactly  the way I needed. My C skills were really rusty so this work was quite a challenge.&lt;/p&gt;

&lt;p&gt;Finally, I created a fairly naïve &lt;a href=&quot;https://www.gingerbeardman.com/mmm/&quot;&gt;web-based search engine&lt;/a&gt; that can search through hundreds of files, totalling almost half a million lines of text, in a fraction of a second.&lt;/p&gt;

&lt;h2 id=&quot;future&quot;&gt;Future&lt;/h2&gt;

&lt;p&gt;I’d like to offer the ability for individual files to be extracted from a disk image so they can be downloaded by interested parties. This would be similar to the way Internet Archive allows individual files to be downloaded from inside ISO disk images. However, this involves further challenges with text encoding and I would also have to address potential bandwidth concerns.&lt;/p&gt;

&lt;p&gt;Whilst the Tcl solution is great, it is not quite perfect. Currently the behaviour of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;encoding convertfrom&lt;/code&gt; command silently ignores problem characters. &lt;a href=&quot;https://core.tcl-lang.org/tcl/info/535705ffffffffff&quot;&gt;Future versions of Tcl will have the option of displaying errors&lt;/a&gt;. I’ll keep an eye on that progress and upgrade my scripts when the time comes.&lt;/p&gt;
</description>
          <author>by Matt Sephton</author>
          <pubDate>Thu, 31 Mar 2022 12:34:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2022/03/31/working-with-classic-macintosh-text-encodings-in-the-age-of-unicode/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2022/03/31/working-with-classic-macintosh-text-encodings-in-the-age-of-unicode/</guid>
        </item>
      
    
      
        <item>
          <title>1-bit Woodblocks</title>
          <description>&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Classic Mac on iPad is also great in Portrait!&lt;br /&gt;&lt;br /&gt;Double height resolution scales to fit very closely.&lt;br /&gt;&lt;br /&gt;iPad Pro 12.9&amp;quot; = 2048x2732&lt;br /&gt;Macintosh Portrait @ 4x = 2048x2760&lt;br /&gt;&lt;br /&gt;Install Mini vMac on your iPad from the source on GitHub:&lt;a href=&quot;https://t.co/5t1iXBv0kc&quot;&gt;https://t.co/5t1iXBv0kc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks &lt;a href=&quot;https://twitter.com/maczydeco?ref_src=twsrc%5Etfw&quot;&gt;@maczydeco&lt;/a&gt;! &lt;a href=&quot;https://twitter.com/hashtag/MARCHintosh?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#MARCHintosh&lt;/a&gt; &lt;a href=&quot;https://t.co/yDj0MqkC5F&quot;&gt;pic.twitter.com/yDj0MqkC5F&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Sephton🎴 (@gingerbeardman) &lt;a href=&quot;https://twitter.com/gingerbeardman/status/1375215086806138885?ref_src=twsrc%5Etfw&quot;&gt;March 25, 2021&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

</description>
          <author>by Matt Sephton</author>
          <pubDate>Sat, 13 Mar 2021 00:00:00 +0000</pubDate>
          <link>https://blog.gingerbeardman.com/2021/03/13/1bit-woodblocks/</link>
          <guid isPermaLink="true">https://blog.gingerbeardman.com/2021/03/13/1bit-woodblocks/</guid>
        </item>
      
    

  </channel>
</rss>
