fletcherpenney.netMultiMarkdown CMShttp://fletcherpenney.net/2024-03-19T06:17:12ZXML::Atom::SimpleFeedClassic Macintosh Infocom Software2024-01-01T21:22:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Classic Macintosh Infocom Software</h1><div class="date">01/01/2024 21:22:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>(While the games I mention here are long out of print, and widely available on the internet, I will not be linking directly to most of these resources to be extra safe regarding copyright issues⦠A few minutes with Google will point you in the right directions though.)</p>
<p>A few years ago, I fell down a rabbit hole <a href="/2018/02/reading_old_mac_floppy_disks">emulating classic Macintosh computers</a>. Over the holidays I was reading a book that a friend recommended, and ended up digging back into some of the games I owned from that time, which included some of the Infocom classics.</p>
<p>Previously, I was able to get my copies of Zork I and Moonmist to run, and even able to access my old save game files. No â there is no real reason for this. Yes â it was completely a waste of time. Yes â it was a lot of funâ¦</p>
<p>On a whim, I dug around and was able to find downloads that seemed to be cracked versions of Zork 2 and Zork 3 that were the same versions that I owned. They worked, and were able to load my save game files for those games as well. This leaves me short of Hitchhikerâs Guide to the Galaxy, but my disk was corrupted, so Iâm not sure that those files will ever be recovered. (I never got very far in that game, so itâs not a huge lossâ¦.)</p>
<p>Years ago, I had looked briefly into modern tools for writing interactive fiction, including Inform 6 and Inform 7. I decided to look around again, and also to look into tools related to Infocom games in particular, since large troves of files were released on the internet from one (more?) of their old hard drives. There was much exploring, but I will focus on a few key fruitful avenues of exploration:</p>
<ol>
<li>Finding old Infocom games.</li>
<li>Running old Infocom games</li>
<li>Recreating classic Macintosh versions of Infocom games that I was unable to find</li>
<li>Playing around with creating interactive fiction compatible with the old Infocom interpreters for the Macintosh</li>
</ol>
<h1 id="findingoldinfocomgames">Finding Old Infocom Games</h1>
<p>Years ago, I found a lot of sites containing Infocom games in various forms (Macintosh compatible applications, raw story files, etc.) The usual classic Mac software repositories, the Internet Archive, and the <a href="https://eblong.com/infocom/">Obsessively Complete Infocom Catalog</a> were all very helpful in finding more this go around. Especially eblong.com â I found the story files (.z3, .z5, .z6 files) for almost every version of every Infocom game released. It was impressive!</p>
<h1 id="runningoldinfocomgames">Running Old Infocom Games</h1>
<p>There is no shortage of interpreters for these story files for every OS you can imagine. But as a child of the 70s and 80s, the one that I think of as canonical is the Macintosh parser that I used for all three Zorks, Hitchhikerâs Guide, and Moonmist. (Though Moonmist was a touch more modern.) I found some versions of the games that had interpreters for classic Macintoshes, but only a small percentage compared to the total number of variations out there, and a few key versions were missing.</p>
<h1 id="rebuildingthepast">Rebuilding the Past</h1>
<p>(<strong>This section represents new knowledge â I was not able to find any information out there about this, but perhaps my Google-fu was weakâ¦</strong>)</p>
<p>What I really wanted was to be able to run some of these story files in the form that fits with my childhood, however. It just doesnât feel right playing a game from 1984 in a modern interpreter, even though they have tons of new features. I wanted to be able to check a couple out on my virtual Mac 128k, just like I experienced as a kid.</p>
<p>(BTW â There are tons of articles about the technologic innovations that went into the way Zork was built and played. If youâre a tech nerd, it is really interesting to learn about. Google away â Z-Machine, Interpreters, virtual machines, etc.)</p>
<p>Because of the way that Infocom games were built (the game file itself was bit for bit identical across machines, with different interpreters âwrappedâ around the game depending on your operating system and hardware), it seemed as though this should be possible.</p>
<p>My first attempt was to diff 2 different games with what should have been similar, if not identical, interpreters. I ended up with sources that had lots of commonalities, but lots of differences, all scattered throughout. I was hoping that one end of the app would be identical (representing the interpreter), and the other end would be different (representing the different story files.) I was wrong.</p>
<p>I then realized two things:</p>
<ol>
<li><p>The story files shared a lot of code â the early games were built by copying the previous gameâs source, and then modifying it until you had the new game. These kept much of the core vocabulary and parser intact from game to game. It would make sense for the story file to have lots of shared sections of code, interspersed with differences.</p></li>
<li><p>Classic Macintosh files (especially applications) had separate resource forks and data forks.</p></li>
</ol>
<p>These realizations allowed me to make the key âbreakthroughâ in my understanding of what was happening â the Macintosh applications contained the story file in the data fork, and the interpreter in the resource fork. It looks like one file, but is really two separate files under the hood. Yes â I understand that this is not really new information, but it hit me in a new way and let me realize that with a collection of appropriate parsers from a small subset of games, I could combine them into a much larger set of games reflecting the Infocom catalog across the years.</p>
<p>I then came up with two ways of building my own âold-schoolâ Infocom gamesâ¦</p>
<h2 id="theclassicbyhandapproach">The Classic âBy Handâ Approach</h2>
<p>Within a classic Macintosh computer, real or virtual, you can use ResEdit to swap out the resource and data forks separately to create new applications that you cannot find elsewhere.</p>
<p>Basically, you need the desired story file for a game you donât have (e.g. a .z5 file for Wishbringer), and a working copy of a different game from the same time period (basically the two game versions you are using need to both use the same format (e.g. .z3, .z5, or .z6)). Weâll assume we have a working copy of Hitchhikerâs Guide. For consistency, weâll use the Solid Gold release of both games (which uses the .z5 format).</p>
<p>Since we now have Wishbringer.z5 on our virtual Macintosh, we need to open up ResEdit.</p>
<ol>
<li>Open the HHGTTG app in ResEdit. Copy all of the resources.</li>
<li>Open Wishbringer.z5 in ResEdit. Youâll need to approve creating a new resource fork, since there was not one previously.</li>
<li>Paste the resources you copied previously. (You must have booted from a writeable disk so that ResEdit has a place to put a copy buffer. Running from a locked boot disk will not work.)</li>
<li>Save Wishbringer.z5</li>
<li>Use ResEditâs âGet File/Folder Infoâ command, and make the Type/Creator codes of Wishbringer match those of HHGTTG. Check the âHas BNDLâ and âInitedâ checkboxes for the same reason. Save your changes and quit ResEdit.</li>
<li>Remove the .z5 file extension from the file name for appearances.</li>
</ol>
<p>You should now be able to run Wishbringer. You can use the âversionâ and â$verifyâ commands to make sure things seem are correct, and off you go! Youâre playing your own hand-built replica of the Infocom version of Wishbringer! Save and Restore should work just fine, so you get the full experience.</p>
<h2 id="thebulkapproach">The Bulk Approach</h2>
<p>I started down this rabbit hole, because I was curious whether there was a way to create my own demo interactive fiction game, but to play it inside a classic Infocom interpreter on a virtual Mac. This was something I only dreamed of as a kid, and I figured it was possible. I also wanted a reliable way to easily recreate my results in the future.</p>
<p>Basically weâll do the same thing as the âBy Handâ approach, but in a way that is scriptable and happens mostly on the macOS side, rather than the classic Macintosh side. Iâll describe the basic steps.</p>
<ol>
<li>Use the same approach as above to copy the resources from a working game into a new file (it can be a blank file, the story data is not needed yet.) You also donât need to worry about type and creator codes right now.</li>
<li>Use BinHex (or something similar) to protect the file while transferring it to your macOS computer (which probably requires Xcode and the build environment.)</li>
<li>On macOS, use something similar to <code>macbinary decode -o Interpreter <filename.Bin></code> to decode the file you just downloaded.</li>
<li>Decompile the resources into a text file â <code>DeRez Interpreter > Interpreter.r</code></li>
<li>Compile the resources into a new fileâs resource fork â <code>Rez -o NewInterpreter Interpreter.r</code></li>
<li>Add the story file to the data fork â <code>cat someGame.z3 > NewInterpreter</code></li>
<li>Set the type/creator codes and BNDL bit (<code>SetFile -t APPL -c INFO -a B NewInterpreter</code>)</li>
<li>protect the file â <code>macbinary encode -o NewInterpreter.bin NewInterpreter</code></li>
<li>Send the .bin file back to your virtual machine</li>
<li>Decode it there with BinHex</li>
<li>Run your new game.</li>
</ol>
<p>(By itself, this is just a more complicated way of doing the same thing we did aboveâ¦.)</p>
<p>The reason I wanted this approach was that I wanted to be able to automate as much as possible. This can all be scripted with a simple bash script, allowing you to specify which interpreter version to use (I extracted a couple of z3 compatible interpreters and a z5 version for the Solid Gold and other more modern games). I also hand-modified the decompiled resource files so that the application creator type is now <code>YYZZ</code> and the save game file type is now <code>WWXX</code>. So far, these letter combinations have not appeared anywhere in the binary data, which allows me to then find/replace in my scripts to automatically set the creator and save game file types automatically, and modify the relevant portions of the CODE resources. I make sure this matches the creator code in the <code>SetFile</code> step, and my custom apps can have different creator codes so that the save game files donât conflict (Infocom was not good about this.) Or I can match the Infocom codes so that my game will read and write files that are compatible with the Infocom version.</p>
<p>With this technique, I was able to build Solid Gold versions of games I was otherwise unable to find, as well as put custom games created by Inform into a wrapper that runs just like the old school Infocom games on Mini vMac.</p>
<p>Figuring this was not particularly productive, but it was a lot of fun and pretty rewarding. :) My understanding of computers and how to hack things together is a lot more advanced than it was in 1986â¦</p>
<h1 id="buildingwithinform">Building With Inform</h1>
<p>I was interested in experimenting with the some of the things that can be done with modern interactive fiction. And I wanted to be able to play it on an older Mac, just for fun.</p>
<p>I figured this means I need to create a pretty compact game file, so I was interested in targeting .z3 instead of .z5. Which meant Inform 6 instead of Inform 7. I also discovered <a href="https://github.com/johanberntsson/PunyInform">PunyInform</a>, which allows the creation of smaller .z3 files while keeping the most important functionality.</p>
<p>I successfully compiled the Library of Horror demo from PunyInform into a .z3 story file, which I then combined with a z3 Infocom interpreter using the above approach, and successfully played the demo on Macintosh system 6. Whether I do anything else with this â weâll see. But it was fun to discover and experiment with! I have some ideas around procedurally generated mysteries that I want to experiment with.</p>
<h1 id="onemorediscovery">One More Discovery</h1>
<p>While looking for ways to play z3 files on classic Macs, I discovered <a href="https://github.com/icculus/mojozork">mojozork</a>. This is a very small z3 interpreter in C, written as a single file.</p>
<p>It didnât help me with the classic Macintosh goal, but it was interesting to play with to compile a simple interpreter from scratch. Itâs crazy to look at how simple the interpreter code is â itâs a relatively short file with not all that much code. Which just shows how impressive the original design of Zork was â the virtual machine handles almost everything, so that porting the game to new hardware is really easyâ¦.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2024/01/classic_macintosh_infocom_software.htmlMaking MultiMarkdown More Accessible2018-12-14T23:43:12-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Making MultiMarkdown More Accessible</h1><div class="date">12/14/2018 23:43:12</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>Over the years, one of the things that has been most satisfying to me
about my time spent working on MultiMarkdown is to see how it has been
used by people all over the world. Itâs used by people who write in
languages I canât begin to understand, and Iâve had to learn a lot in
order to fix some of the problems that arose based on my mistaken
assumptions about how MMD will be used.</p>
<p>Now, I want to put a bit more effort into continuing to expand the
circle of people for whom MMD is useful. Specifically, I want to
improve the accessibility of MultiMarkdown in two separate ways:</p>
<ol>
<li><p>I want to improve the accessibility of HTML documents created with
MMD. Ideally, the default behavior should provide compatibility with as
many accessibility guidelines as possible with little to no effort on
the part of authors. (I am open to improving other formats as well, but
it seems that HTML is probably the most important.)</p></li>
<li><p>I want to improve the accessibility of the MultiMarkdown Composer
application.</p></li>
</ol>
<p>For example, I recently had a family member suffer a small stroke that
affected vision. One of the effects was to make reading more difficult.
The description of the difficulty sounded similar in some ways to
dyslexia, and I remembered seeing fonts that were designed to improve
reading for people with dyslexia. I downloaded the <a href="http://www.opendyslexic.org/">OpenDyslexic</a> font,
and using this actually made reading a bit easier.</p>
<p>This experience reminded me of a discussion with Paul Knox about a year
ago, where he pointed out an opportunity to tweak MultiMarkdown to help
improve web-page compliance with ADA requirements. Itâs time to circle
back to that idea and see what can be done.</p>
<p>To do this, I need help. Specifically, I need:</p>
<ol>
<li><p>Ideas for improvements â what is missing from MultiMarkdown? What
can be better?</p></li>
<li><p>Ideas for resources/guidelines/validation tools/etc.</p></li>
<li><p>Help implementing â send me concrete examples of what the HTML
source should include. Send me ideas for input syntax when necessary.
Send me working code. Send me GitHub pull requests. Send me your
stories of what you struggle with but donât have a solution for. I
wonât guarantee everything gets included, but everything will get looked at.</p></li>
<li><p>Feedback â as new ideas get implemented, I need feedback as to
whether they actually work. Let me know how things can be better.</p></li>
</ol>
<p>In order to keep the ideas easily organized, please use the following
for submissions:</p>
<ul>
<li><p>Ideas for MultiMarkdown in general - <a href="http://support.fletcherpenney.net/discussions/accessibility">MMD Support</a></p></li>
<li><p>Ideas specifically for MultiMarkdown Composer - <a href="http://support.multimarkdown.com/discussions/accessibility">Composer Support</a></p></li>
</ul>
<p>Thank you!</p>
<p>Fletcher Penney</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2018/12/multimarkdown_accessibility.htmlTemplate-Based Programming2018-12-10T10:25:45-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Template-Based Programming</h1><div class="date">12/10/2018 10:25:45</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>Last year I released <a href="https://github.com/fletcher/magnum">Magnum</a>, a C implementation of the Mustache template system.</p>
<p>I initially became interested in Mustache because I thought it would be interesting to combine with MultiMarkdown in order to allow shortcuts to quickly create longer documents that contained repetitive sections based on external data. For example, if you were writing a dictionary, and had a database containing words and their definitions, you could create a template that would combine the information from the database with MultiMarkdown syntax in order to create the final document. Think of it like âmail mergeâ on steroids.</p>
<p>It quickly occurred to me, however, that the range of potential applications was much, much broader.</p>
<p>In computer programming, you often come across situations where you have multiple sections of code that are almost, but not quite, exactly the same. For example, if you are working with data stored in a SQLite database, you may want to read data from the database and create a structure in C in order to store that data. If your database contains multiple tables, you may need to create multiple structures so that one structure exists for data from each table. The tables and structures are different, but the process of converting from one to the other is very similar across them all.</p>
<p>One possibility is to write a single chunk of code that can handle all edge cases across all tables/structures. In object-oriented programming, you could create one object and then subclass is for each table/structure pair. An advantage of this is that the code code may be something that can be shared with other programmers and other projects, which is great. A disadvantage is that it can be slower to develop, and may be slower to run as well, since it will add further complexity.</p>
<p>For me, it seemed that a simpler solution would be to create Magnum-based templates that would convert an abstract definition of an âobjectâ (contained in a JSON file) into multiple files:</p>
<ul>
<li>A shell script to create a SQLite table</li>
<li>A <code>.c</code> file and <code>.h</code> header to provide C functions to allocate and free âobjectsâ as well as convert back and forth to SQLite data</li>
<li>Whatever else you need â this can be applied to any text-based programming you desire</li>
</ul>
<p>For me, this has been fantastic. I have used it to quickly prototype data structures for new ideas. I have used it to standardize repetitive parts of other projects (for example, creating the code necessary to manage settings tables in iOS applications). If I find an error in my fundamental algorithms, I can update the master template, and then immediately update all of the generated forms so that they include the fix. More importantly, if I decide that I need to change the underlying data structure, it is trivial to update all of the related files so that the changes are shared across the SQLite and C code that I use.</p>
<p>I think the âsweet spotâ of usefulness is in things that are too complex to hand write each one, but not so complex that it is worth writing a true âuniversalâ library to handle all conceivable instances. Code that typically has a lot of âboilerplateâ is likely to be a good candidate for this process.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2018/12/template-based_programming.htmlReading Old Mac Floppy Disks2018-02-23T22:58:10-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Reading Old Mac Floppy Disks</h1><div class="date">02/23/2018 22:58:10</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<div class="TOC">
<ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#brieftechnote">Brief Tech Note</a></li>
<li><a href="#theproblem">The Problem</a></li>
<li><a href="#solution">Solution</a></li>
<li><a href="#myapproach">My Approach</a></li>
<li><a href="#copyprotection">Copy Protection</a></li>
<li><a href="#obsoletefileformats">Obsolete File Formats</a></li>
<li><a href="#failuresnextsteps">Failures/Next Steps</a></li>
<li><a href="#take-homepoints">Take-home Points</a></li>
<li><a href="#update2018-02-24">Update 2018â02â24</a></li>
<li><a href="#update2023-12-27">Update 2023â12â27</a></li>
</ul>
</div>
<h2 id="introduction">Introduction</h2>
<p>My familyâs first computer was the original 128k Mac. Black and White. 512 x 342 pixels. And a floppy drive that managed to squeeze 400k onto a disk that normally holds 360k.</p>
<p>Which was great back then because swapping floppy disks back and forth was terrible. Anything that allowed one to put an extra document on the disk was great!</p>
<p>⦠until you need to try and access read those disks years later.</p>
<h2 id="brieftechnote">Brief Tech Note</h2>
<p>There are other sites that do a great job describing the technical aspects of the early Mac floppy drives (<a href="http://siber-sonic.com/mac/newmillfloppy.html">here</a> and <a href="http://lowendmac.com/2016/floppy-disk-compatibility-and-incompatibility-in-the-mac-world/">here</a>). So I wonât go into the details, but the short version is:</p>
<ul>
<li><p>400k floppy disks were formatted using the Macintosh File System (<abbr title="Macintosh File System">MFS</abbr>)</p></li>
<li><p>These disks require an Apple drive</p></li>
<li><p>800k disks were formatted using Hierarchical File System (<abbr title="Hierarchical File System">HFS</abbr>)</p></li>
<li><p>1.4 MB disks were formatted with HFS+, and <em>can</em> be read on âanyâ 3.5 inch floppy drive, not just Apple drives.</p></li>
<li><p>MFS disks could no longer be read after OS 7</p></li>
<li><p>HFS disks can still be read, but cannot be written after 10.5.8</p></li>
</ul>
<h2 id="theproblem">The Problem</h2>
<p>I still have a few of my old floppy disks sitting around. Many of them have disappeared over the years, but a few survived. A while back I tried to copy as many of my important documents to my hard drives. But a few disks didnât make it.</p>
<p>Then Mac computers stopped coming with internal floppy drives, and then I realized that I no longer had any working computers with floppy drives. So there was no longer any way to read those disks.</p>
<p>No big deal, the data wasnât that importantâ¦. Until I discovered the rabbit hole that is emulation (e.g. <a href="http://www.gryphel.com/c/minivmac/">Mini vMac</a>, <a href="https://www.qemu.org/">QEMU</a>, and of course, <a href="https://www.virtualbox.org/">VirtualBox</a>). I realized that I could restore my old Mac Plus from the dead as a virtual machine, and run the old software from my childhood.</p>
<p>Except I didnât have those disks in a readable format⦠I bought a USB floppy drive that reads PC disks and 1.4 MB disks fine, but would not read my old 400k/800k for the reasons described elsewhere.</p>
<h2 id="solution">Solution</h2>
<p>Researching online suggested that:</p>
<ul>
<li><p>There are still powerbooks to be had on eBay that have internal floppy drives.</p></li>
<li><p>Some of these machines even work</p></li>
<li><p>Working machines with MacOS 7 would allow me to read MFS disks, but newer systems would not</p></li>
</ul>
<p>This limited the number of options. But I did read that a newer machine, despite not being able to read 400k MFS disks <em>was</em> able to write a disk image to one, and that disk could then be read on an older machine.</p>
<p>So I figured all I really needed was a machine with an internal floppy drive, and some software that would allow me to image a disk, even if that computer couldnât understand it.</p>
<h2 id="myapproach">My Approach</h2>
<p>After some trial and error (eBay can be frustrating) I ended up with a working G3 âWallstreetâ Powerbook. I would have been using a 520 model and a Mac clone at this time, so it wasnât a computer I owned before.</p>
<p>After getting the machine to boot (more frustration), I found that the floppy drive did in fact work, and I was off.</p>
<ol>
<li><p>I used Appleâs Disk Copy program to image my floppy disks</p></li>
<li><p>I saved the images in the Disk Copy 4.2 format</p></li>
<li><p>I then put the images on a 1.4 MB floppy that could then be read on both the G3 and my modern desktop with a USB floppy drive</p></li>
<li><p>(I could theoretically get the G3 up on my LAN and find a way to share files, but that seemed like to much trouble at the moment.)</p></li>
<li><p>I copied the DC 4.2 image to my Mac OS X desktop.</p></li>
<li><p>I then used Mini vMac (running either OS 7.5.5 or 6.0.8) to read the disk images. I could access the files and folders on most of my disks.</p></li>
<li><p>A few disks failed to copy. After much digging around, I found reference to a program called DiskDup from âback in the dayâ. After telling it to allow a few sector errors, it was able to read the remaining disks (except for two) and convert them to DC 4.2 format</p></li>
</ol>
<h2 id="copyprotection">Copy Protection</h2>
<p>Some of these games had copy protection. Zork I, for example, limits your ability to copy the application from the disk, but imaging the entire disk worked. Zork II and Zork III, however, request that you insert the master copy (which I canât do on a Mac OS X machine, of course.)</p>
<p>Most classic abandonware games can be downloaded somewhere. There are great repositories out there:</p>
<ul>
<li><p><a href="https://www.macintoshrepository.org/">https://www.macintoshrepository.org/</a></p></li>
<li><p><a href="http://vintageapplemac.com/">http://vintageapplemac.com/</a></p></li>
<li><p><a href="https://www.info-mac.org/">https://www.info-mac.org/</a></p></li>
<li><p><a href="http://macintoshgarden.org/">http://macintoshgarden.org/</a></p></li>
<li><p><a href="http://macgui.com">http://macgui.com</a></p></li>
</ul>
<p>In the case of my games, the short version is that I wanted to try and be able
to use the save games I had on the floppies (for no real reason, I just like a
challenge sometime.) I was able to get Zork I to work, a version of Moonmist
I found elsewhere was compatible with my save games, but the versions of Zork
II/III I found are not compatible with my save game files. Iâm still working
on thatâ¦</p>
<h2 id="obsoletefileformats">Obsolete File Formats</h2>
<p>The other problem one might run into is file formats that are no longer supported (e.g. MacWrite 2.20 for example.)</p>
<p>Many old programs can be found online, or you might be able to restore them
from an old floppy. But if you can get an old version of the software running
in an emulator, you may be able to âleapfrogâ the document from an obsolete
format to a more modern one (something like MacWrite 2 -> MacWrite 5 -> Word).
Or perhaps a good translational format (such as RTF â I know, I rant about
how terrible RTF is, but this is the one valid use.) You might not get the
exact formatting, but can get it pretty close.</p>
<h2 id="failuresnextsteps">Failures/Next Steps</h2>
<p>As above, so far there are three disks (two separate games) I was unable to access:</p>
<ul>
<li><p>Hitchhikerâs Guide to the Galaxy â the app can be found elsewhere (including the Solid Gold version, no less!), but I wanted to run my copy. DiskDup is struggling to be able to image that disk, but I havenât given up hope.</p></li>
<li><p>Fahrenheit 451 â I found that game online but it wouldnât run. Disk Copy worked on the first disk, but not the second. But the image couldnât be read, so in fact neither disk has worked so far.</p></li>
</ul>
<p>My next step is to try running Copy II Mac, which seems to support more
options for corrupted disk sectors which were sometimes used as copy
protection, but it seems that program wonât run on my OS 8.5.1 laptop. Iâm
looking for a way to try it on an OS 7 machine since that might solve a few
issues.</p>
<h2 id="take-homepoints">Take-home Points</h2>
<p>The main contribution here is that you can actually gain access to 400k MFS-
formatted floppy disks with a newer computer that canât actually read those
disks using the imaging technique above. This opens up the range of vintage
macs that can be used for data recovery to include some newer (and probably
more readily available) machines.</p>
<p>Plus, it was fun to see some of the old software I had played with as a kid, whether it be commercial stuff I spent way too many hours on, or early gems from when I discovered shareware.</p>
<h2 id="update2018-02-24">Update 2018â02â24</h2>
<p>It occurred to me to try rebooting with extensions off, and that did allow Copy II Mac to run. However, it is only able to copy one floppy to another â it doesnât make disk images.</p>
<p>Which lead me to exploring the âcrackingâ tools from 30 years ago. Ended up
finding a âHow to Crackâ guide by âThe Shepherdâ, which as a walkthrough
demontrated how to use MacNosy to break the encryption on <em>Sorcerer</em>. It
appears that the master disk encryption for that game is the same as Zork II
and Zork III (they are probably the same wrapper app with different data
files). However, after making the required change, the app simply crashes a
little bit later.</p>
<p>I also stumbled across the <a href="https://www.bigmessowires.com/floppy-emu/">Floppy Emu</a>,
which appears to replace a floppy drive in old Macs with a SD card drive.<br></br>
Theoretically, if this were installed as the external drive, then Copy II Mac would be
able to copy a Copy Protected (or slightly corrupted) disk to the Floppy Emu, where
it would be stored as a disk image. This disk image, could <em>possibly</em> then be loaded
onto a virtual Mac as a floppy that may or may not work. While interesting, I donât have an old enough Mac for it to work, nor is it additional money on something I donât need to doâ¦. But it would be interesting to know if it works!</p>
<h2 id="update2023-12-27">Update 2023â12â27</h2>
<p>I am reading a book that involves some early computer game development
(Tomorrow, and Tomorrow, and Tomorrow: A novel, but Gabrielle Zevin).
It got me thinking about old Infocom games, and I remembered that I
never got Zork 2 and Zork 3 working to where I could read my old save
game files. I googled the serial numbers that I was looking for, and
found versions online that would run. And they were, in fact, compatible
with my old save game files from the early/mid 80s!</p>
<p>So, by leaving this alone for almost 6 years, the internet took care of
this problem for me⦠:) For the Zork titles, anywayâ¦.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2018/02/reading_old_mac_floppy_disks.htmlVagrant controlled Virtual Server2018-02-22T17:33:09-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Vagrant controlled Virtual Server</h1><div class="date">02/22/2018 17:33:09</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>Yesterday, I posted a
<a href="/2018/02/ubuntu_virtual_server_walkthrough">walkthrough</a> describing how to
configure a VirtualBox server that can serve as an Apache host for
<a href="https://github.com/fletcher/MultiMarkdown-CMS">MultiMarkdown-CMS</a>, among
other things.</p>
<p>Today, I explored a bit further and created an even easier approachâ¦. You
use <a href="https://www.vagrantup.com/">Vagrant</a> to configure the virtual server
automatically, which makes it easier and more consistent.</p>
<p>I created a small project that makes it super easy â <a href="https://github.com/fletcher/vagrant-mmd-cms">vagrant-mmd-
cms</a>. Simply download the
project (which consists of a couple of text files), and then run the included
scripts.</p>
<p>Within a few minutes youâll have a perfectly configured server, without having
to answer any questionsâ¦</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2018/02/vagrant_controlled_virtual_server.htmlUbuntu Virtual Server Walkthrough2018-02-21T20:48:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Ubuntu Virtual Server Walkthrough</h1><div class="date">02/21/2018 20:48:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<div class="TOC">
<ul>
<li><a href="#introduction">Introduction </a></li>
<li><a href="#caveats">Caveats </a></li>
<li><a href="#thevirtualserver">The Virtual Server </a></li>
<li><a href="#installation">Installation </a></li>
<li><a href="#basicconfiguration">Basic Configuration </a></li>
<li><a href="#apacheconfiguration">Apache Configuration </a></li>
<li><a href="#firewallconfiguration">Firewall Configuration </a></li>
<li><a href="#configureapacheforvirtualhosts">Configure Apache for Virtual Hosts </a></li>
<li><a href="#loadsamplecontenttowebsite">Load Sample Content to Web Site </a></li>
<li><a href="#configurenetworking">Configure Networking </a></li>
<li><a href="#nextsteps">Next Steps </a></li>
<li><a href="#installmultimarkdown-cmssite">Install MultiMarkdown-CMS Site </a></li>
<li><a href="#alternativeapproach">Alternative Approach </a></li>
<li><a href="#advancedgittricks">Advanced git Tricks </a></li>
</ul>
</div>
<p><em>REVISED 2018â02â22</em>: Use apt-get to install required Perl modules rather than building them via CPAN, which means we no longer need to install <code>build-essential</code>. Also, document differences if you only want to host a single site instead of multiple virtual sites.</p>
<h2 id="introduction">Introduction </h2>
<p>Everyone has their own approach to managing a website. It probably goes without saying that I want to use MultiMarkdown to manage mine. After many other workflows, I created an ultra lightweight CMS which is basically a wrapper around MMD text files (<a href="https://github.com/fletcher/MultiMarkdown-CMS">MultiMarkdown-CMS</a>).</p>
<p>I use git for revision tracking, and for allowing me to work on my desktop or laptop without messing up the production site until Iâm ready. But in order to see how my changes look, I need a staging server to try it out. I have previously used my main Mac desktop for this, but with every major macOS update, things tend to break.</p>
<p>Iâve heard rumors that Apple may be moving away from making it easy to enable âserverâ features on your Mac (e.g. Apache). This may or may not be true, but it did help prompt to consider alternatives</p>
<p>More recently, I have configured an Ubuntu virtual server using <a href="https://www.virtualbox.org/">VirtualBox</a> on my Mac. This should make it easier to maintain, and will not require any special effort whenever I update (or change) my Mac desktop. I can simply restart the virtual machine after upgrading macOS, and all is good. If I get a new machine, simply copy the files over, install VBox again, and all is good.</p>
<h2 id="caveats">Caveats </h2>
<p>I will take some knowledge for granted. You should have some experience with the command line, Apache, and Git. You should be able to find more detailed information for all steps via Google if youâre having any trouble.</p>
<p>The purpose of this guide is to provide a brief walkthrough combining different steps for the purpose of creating a web server capable of handling my workflow. Itâs not a complete guide to the many component parts involved. Your needs may vary. I donât claim this is the <em>best</em> way, simply one of many ways to configure things.</p>
<p>Itâs also a chance for me to take some notes for myself for future reference.
My needs are for a staging server on my private network, behind a firewall. If you are doing anything facing the internet, youâll want to be sure that it is secure. That is beyond the scope of this document.</p>
<h2 id="thevirtualserver">The Virtual Server </h2>
<p>You can use whichever virtualization app suits your needs. Iâll use VirtualBox because itâs free and works well enough for my needs.</p>
<p>I use Ubuntu because itâs what I have the most experience with, and seems to have a great deal of online support scattered out there. Use whatever you like.</p>
<ul>
<li><p>Ubuntu â I donât want a GUI on this machine, so I used the server version. I want it to last, so I used the LTS version (16.04 at the time I set it up).</p></li>
<li><p>RAM â I used 1 Gig. Probably overkill to be honest</p></li>
<li><p>Disk space â 15 Gigs. Also overkill, but I wanted to be able to use this same base machine for other purposes</p></li>
</ul>
<h2 id="installation">Installation </h2>
<p>Follow the installation sequence in Ubuntu. Use whatever is best for your needs, but I used:</p>
<ul>
<li><p>Guided disk partitioning with LVM (Did not use encryption because this is already âinsideâ an encrypted drive and it wasnât important to me.)</p></li>
<li><p>I <strong>DID NOT</strong> enable automatic updates â I want to manage this manually to avoid breaking things at inopportune times.</p></li>
<li><p>I selected only the OpenSSH package to start with (I did not use LAMP because I donât need MySQL or PHP), and left the âstandard system utilitiesâ selected</p></li>
</ul>
<p>Then reboot into your server.</p>
<h2 id="basicconfiguration">Basic Configuration </h2>
<p>Log in as your new user and then:</p>
<ul>
<li><p><code>sudo apt-get update</code> â update the apt-get database</p></li>
<li><p><code>sudo apt-get upgrade</code> â upgrade any installed packages to newest available versions</p></li>
<li><p><code>sudo apt-get install apache2 libcgi-session-perl libio-string-perl</code> â install Apache as well as two required Perl modules</p></li>
</ul>
<h2 id="apacheconfiguration">Apache Configuration </h2>
<ul>
<li><code>sudo a2enmod include rewrite cgi headers</code> â enable some basic Apache modules</li>
</ul>
<h2 id="firewallconfiguration">Firewall Configuration </h2>
<p>(Again, use what is right for you)</p>
<ul>
<li><p><code>sudo uwf allow OpenSSH</code> â enable SSH access through firewall</p></li>
<li><p><code>sudo uwf allow "Apache Full"</code> â enable Apache access through firewall</p></li>
<li><p><code>sudo uwf enable</code></p></li>
</ul>
<h2 id="configureapacheforvirtualhosts">Configure Apache for Virtual Hosts </h2>
<p>I wanted to be able to host multiple sites on this server, rather than creating separate virtual machines for each hosted site. If you would rather host only a single
site, you can store your files in <code>/var/www/html</code> instead of creating these directories. You will need to make a change to <code>etc/apache2/apache2.conf</code>:</p>
<pre><code><Directory /var/www>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</code></pre>
<p>should become:</p>
<pre><code><Directory /var/www>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</code></pre>
<p>If youâre only going to host a single site, you can then skip the rest of this section.</p>
<p>(I used <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts">https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts</a> to configure virtual hosts in Apache 2)</p>
<ul>
<li><p><code>cd /etc/apache2/sites-available</code></p></li>
<li><p><code>sudo cp 000-default.conf <site>.conf</code> â (where <code><site></code> is the hostname for the site, e.g. <code>staging.private</code> or <code>staging.local</code>)</p></li>
<li><p><code>sudo pico <site>.conf</code> â (use whatever editor you prefer)</p></li>
<li><p>Set <code>ServerAdmin</code> as appropriate.</p></li>
<li><p>Set <code>ServerName</code> to your desired hostname</p></li>
<li><p>Add <code>ServerAlias <site></code> for any additional hostnames you are using</p></li>
<li><p>Set <code>DocumentRoot</code> to <code>/var/www/<site>/public_html</code></p></li>
</ul>
<p>After the <code><VirtualHost></code> declaration, add:</p>
<pre><code><Directory /var/www/<site>/public_html>
AllowOverride All
</Directory>
</code></pre>
<ul>
<li><p>Save your changes</p></li>
<li><p><code>sudo a2ensite <site>.conf</code></p></li>
</ul>
<h2 id="loadsamplecontenttowebsite">Load Sample Content to Web Site </h2>
<ul>
<li><p><code>cd /var/www</code></p></li>
<li><p>If you are hosting multiple sites:</p>
<ul>
<li><p><code>sudo mkdir -p <site>/public_html</code></p></li>
<li><p><code>sudo chown -R <user>:<user> <site>/public_html</code></p></li>
<li><p><code>sudo chmod -R 755 /var/www</code></p></li>
</ul></li>
<li><p><code>pico /var/www/<site>/public_html/index.html</code> (or <code>pico /var/www/html/index.html</code> if using the single site approach) and save the following:</p>
<pre><code><html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1>Success! The example.com virtual host is working!</h1>
</body>
</html>
</code></pre></li>
</ul>
<p>At this point, shutdown your virtual machine:</p>
<p><code>sudo shutdown -r now</code></p>
<h2 id="configurenetworking">Configure Networking </h2>
<p>Your virtual machine needs to be able to communicate with your local network. In VirtualBox, I change the first Network Adapter to <code>Bridged Adapter</code> instead of <code>NAT</code>.</p>
<p>Take note of the <code>MAC Address</code> â this allows you to configure your DHCP server on your network (perhaps in your wireless base station?) to assign a consistent IP address to this particular virtual machine (using your wireless base station, etc.)</p>
<p>If you have your own DNS server, add your <code><site></code> as a hostname for the IP address you assigned to the virtual machine. Otherwise, you can use the hosts file (on Mac or *nix machines) to accomplish the same thing. (Outside the scope of this document).</p>
<h2 id="nextsteps">Next Steps </h2>
<p>Go ahead and reboot your virtual machine and log in. Upgrade the installed packages with <code>apt-get</code> if new ones are available, as above.</p>
<p>If your network configuration is working correctly, you should be able to log in with both of these:</p>
<ul>
<li><p><code>ssh <ip address></code></p></li>
<li><p><code>ssh <host name></code></p></li>
</ul>
<p>(Troubleshooting this if it doesnât work is outside the scope of this document.)</p>
<p>You should now also be able to locate the main server Apache page in a web browser at <code>http://<ip address>/</code>. (You can use <code>ifconfig</code> from the server to find itâs IP address.)</p>
<p>If you set up the DNS/hosts correctly, you should also be able to access <code>http://<site name>/</code> and see the placeholder page you created.</p>
<h2 id="installmultimarkdown-cmssite">Install MultiMarkdown-CMS Site </h2>
<p>Now that you can access the placeholder site, itâs time to install the actual web site you have previously built.</p>
<ul>
<li><p><code>cd /var/www/<site>/public_html</code> (or <code>cd /var/www/html</code> for single site)</p></li>
<li><p><code>rm index.html</code> â this directory needs to be empty</p></li>
<li><p><code>git clone <path/to/your/site> .</code> â this will clone your existing git site to the desired location (assuming you already have it configured as a git repo, otherwise move the files here however you prefer.)</p></li>
</ul>
<p>Now, when you use a browser to visit <code>http://<your hostname>/</code>, you should see the live MMD-CMS site! (<code>http://<ip address>/</code> will still show the main Apache page)</p>
<h2 id="alternativeapproach">Alternative Approach </h2>
<p>If you have not used MultiMarkdown-CMS before, you can create a new site this way:</p>
<p><code>git clone https://github.com/fletcher/MultiMarkdown-CMS.git .</code></p>
<p>I would recommend using the advanced branch( <code>git checkout advanced</code>).</p>
<p>You can now start customizing your site as desired!</p>
<h2 id="advancedgittricks">Advanced git Tricks </h2>
<p>I tend to work on my website on my desktop machine, and then push my changes to the production server via git. This requires a bit of trickery to ensure that the rest of the world sees your latest changes. The <code>post-update</code> hook below should cause git to refresh the contents of the web directory any time you push an update to the master branch in the production server.</p>
<ul>
<li><p><code>cd /var/www/<site>/public_html/.git/hooks</code></p></li>
<li><p><code>pico post-update</code></p>
<ul>
<li>Save the following to the file:
<pre><code>#!/bin/sh
cd /var/www/<site>/public_html
/usr/bin/env -i /usr/bin/git reset --hard
chmod g+s cgi/accept_comment.cgi
</code></pre></li>
</ul></li>
<li><p><code>chmod 755 post-update</code></p></li>
<li><p>Add the following to <code>.git/config</code> in order to allow you to push to it:</p>
<pre><code>[receive]
denyCurrentBranch = ignore
</code></pre></li>
</ul>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2018/02/ubuntu_virtual_server_walkthrough.htmlComposer for iOS2017-11-30T19:05:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Composer for iOS</h1><div class="date">11/30/2017 19:05:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>If I remember correctly, it was in 2012 that I had a beta version for MultiMarkdown
Composer for iOS in testing. It worked, but I was not satisfied with several
aspects. One of which was that the core engine needed to be rewritten. This
lead me to create Composer for Mac v 2. My âday jobâ became busier, and I was
unable to find the time to get back to the iOS version.</p>
<p>I ended up rewriting Composer two more times (v3 (beta only) and v4 (now on
sale)). For both of those versions, I have had a shadow build of a prototype
iOS utility to ensure that the core code can be compiled for iOS.</p>
<p>Over the last week, I have finally focused my attention back to iOS in
earnest. The protoype app was basically the contents of a single Composer
window â an editor pane and a preview pane. It was useful for testing
features, but not useful for real work.</p>
<p>As of this writing, it now has the ability to handle files, iCloud, Dropbox,
and exporting (HTML/PDF/EPUB/etc.) That said, itâs still pretty minimalist
and needs a lot of work before itâs ready for public testing, much less sale.</p>
<p>When itâs ready, Iâll ask for additional beta testers (donât tell me know â I
am not ready for beta testing and will forget who is interested). But in the
meantime, I do want to get some ideas for workflows that interest you. Iâve
probably thought of many of the ideas you will send, but I guarantee that
there are many I have not thought of.</p>
<p>Specifically, Iâd love to hear about:</p>
<ul>
<li><p>How do you want to get text <em>into</em> Composer for iOS?</p></li>
<li><p>What do you want to do with your documents once you have them in Composer for iOS?</p></li>
<li><p>What do you think the interface should include?</p></li>
<li><p>What should <em>not</em> be included?</p></li>
<li><p>I would love to keep the interface as uncluttered as possible while still maintaining functionality. I donât want to have rows and rows of buttons on top of the keyboard, leaving barely enough room for a line or two of text. I also donât want to require users to navigate through 15 screen touches just to make text bold or add a list marker. This is going to take some thought to avoid doing the same crap so many other apps do. Ideas welcome!</p></li>
</ul>
<h2 id="answerstofaq">Answers to FAQ </h2>
<ul>
<li><p>I donât have an estimated release date. I definitely wonât be ready for beta testing until 2018.</p></li>
<li><p>I donât have pricing information. I donât know if I will have multiple purchase options (e.g. Standard/Pro) or just a single version. It depends on what the final vision ends up looking like.</p></li>
<li><p>Settings files <em>can</em> be shared between the Mac and iOS devices (e.g. Themes, CSS, Key bindings files, text expansions). This will allow you to customize your configuration once and use it on multiple devices.</p></li>
<li><p>It does support hardware keyboards, and key bindings. So you can configure your keyboard commands to work just like the Mac, assuming you use a ârealâ keyboard. On screen keyboards are different and will require a different interface.</p></li>
<li><p>Keep an eye on Twitter and the <a href="http://multimarkdown.com/signup/">mailing list</a> for announcements. Once it gets ready, Iâll ask for beta testers to help troubleshoot.</p></li>
</ul>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/11/composer_for_ios.htmlThoughts on App Store Experience2017-09-17T09:39:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Thoughts on App Store Experience</h1><div class="date">09/17/2017 09:39:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>Iâve been selling software on the App Store for almost six years. Over that time, Iâve had both good and bad experiences.</p>
<h3 id="reviewprocess">Review Process </h3>
<p>First, I will say that over the last six years the review process has become much faster. I remember it taking over a week from submission to getting my first app reviewed. It was rejected, of course, but a quick resubmit within 30 minutes led to an approval later that night. Getting bug fix releases out still took another waiting period though.</p>
<p>This time, I submitted yesterday afternoon and had my first rejection within a few hours. Revise, resubmit, reject, repeat a couple of times, and finally approved early this morning.</p>
<p>Most of the rejection reasons were clearly stated, but a couple were not, leading to a wasted cycle in the revising process. Additionally, most of these could have been avoided if Xcode did better validation before submitting in the first place. These were issues related to different settings in one configuration file vs another, that would be easily caught by Xcode. Other issues are more related to the vagaries of Appleâs rules that are not entirely clear until they tell you what they donât like.</p>
<p>But in any case, the overall process was still much faster than it used to be, and that is appreciated.</p>
<h3 id="in-apppurchases">In-App Purchases </h3>
<p>Yesterday was the first time that I sold an application that made use of In-App Purchases (<abbr title="In-App Purchases">IAPs</abbr>). I did this because Apple seems to be pushing the model of using a single application, rather than multiple versions of the same App (e.g. Lite, Standard, Pro, etc.) A small app I released a few months ago was initially rejected for âspammingâ the App Store because there were three separate versions. Each had slightly different feature sets and different price points to allow people to choose the one that they needed.</p>
<p>Instead they seem to prefer that we use <abbr title="In-App Purchases">IAPs</abbr>. This allows a single app that can be upgraded as desired (allowing the âfreemiumâ model that seems to be quite popular among developers and loved/hated by users??)</p>
<p>So the latest product was released as a free app, with 2 basic <abbr title="In-App Purchases">IAPs</abbr>.</p>
<p>Testing under the old model was relatively easy. You validate that the user has a proper receipt from the App Store, and youâre on your way. The new way requires multiple validations, but is still largely the same. The overall logic for the code is the same, but implemented differently.</p>
<p>The problem I had was this:</p>
<ol>
<li><p>The app is available throughout the world</p></li>
<li><p>This is a new version of an existing app that a medium-sized group of people know and love (itâs no Angry Birds)</p></li>
<li><p>Said users were enthusiastically awaiting a new version, and some were downloading and trying to purchase within minutes of me announcing that it was available.</p></li>
<li><p>Itâs always taken longer for new releases to make it to non-US app stores, but this was not a big deal. Users tend to understand that they canât buy an app if itâs not showing up in the store.</p></li>
<li><p>This time, the app showed up in non-US regions relatively quickly, but they had difficulty trying to purchase upgrades.</p></li>
</ol>
<p>So when I start getting bug reports within an hour of release saying that people are trying to give money for a product they want, but are unable to do so, that was frustrating. My first thought, of course, was that I did something wrong in the App Store code. It worked fine for me multiple times during testing in the App Store Sandbox, but thereâs not a good way for me to test it in all regions around the world. And of course people donât start conversations off with âI am not in the USâ â fortunately a couple of email addresses were clearly in other countries leading me to confirm that it was non-US customers having trouble.</p>
<p>I reviewed the relevant code and couldnât see any obvious problems. I created a debugging version to send to a beta tester in another App Store region. And had to sit back and wait.</p>
<p>Fortunately, I began to receive reports that purchases were beginning to go through in some regions (but others seem to be slower to catch up).</p>
<p>And unfortunately, itâs difficult to troubleshoot an issue that involves the App Store, rather than your own code. When researching it, I did discover the following:</p>
<ol>
<li><p>Individual apps are marked as available or not available in different regions.</p></li>
<li><p><abbr title="In-App Purchases">IAPs</abbr> are not. According to Apple, if one can get the App, then you can get the <abbr title="In-App Purchases">IAPs</abbr>. This is partly so that you can be sure to have access to upgrades for old apps if you move to a new region.</p></li>
</ol>
<p>This made it even more confusing as to why users were having trouble.</p>
<h3 id="installationtroubles">Installation Troubles </h3>
<p>I had a new (for me) issue in the midst of all this. The app worked fine for me. I then removed and reinstalled a few times during testing.</p>
<p>At one point, the following occurred:</p>
<ol>
<li><p>Using Spotlight to search for the app, and then launching it with the return key causes an error warning that the app may be âdamaged or incomplete.â</p></li>
<li><p>Using Spotlight the same way, but hitting Cmd-Return to view the app in the Finder, and then launching it works fine.</p></li>
<li><p>Deleting and reinstalling from the App Store temporarily resolved this, but it returned after a couple of launches.</p></li>
<li><p>I have not tried rebooting because I am in the middle of too many things to reboot at the moment.</p></li>
</ol>
<p>Hopefully this is something that most userâs do not experience, since they download only once. But it is extremely frustrating when it happens, because it <em>seems</em> as though the problem is the app, not the App Store. But I control exactly <em>none</em> of the app delivery processâ¦.</p>
<h3 id="overallthoughts">Overall Thoughts </h3>
<p>Over the years, my experience with the App Store has definitely been love/hate:</p>
<ol>
<li><p>I do believe I get more âfoot trafficâ from being in the App Store than if my apps were not in it. I donât have a comparison to be able to prove this. And I donât know how big an effect this is.</p></li>
<li><p>During new releases, I usually spend more time troubleshooting App Store problems than issues with my software. Most of the time this has been, âReally â the app has been approved, but it takes a while to update the App Storeâ.</p></li>
<li><p>The In-App Purchase issue was the most frustrating Iâve had yet. Understandably, all customers see is that the download/purchase process seems broken. Itâs not immediately obvious that (as best I can tell) itâs Appleâs fault, not my fault. Not being able to troubleshoot this is frustrating, as I would like to know (not guess) that itâs not my fault. Fortunately, customers are very understanding!</p></li>
<li><p>The issues with installing the app (aside from purchasing) are very frustrating. There seems to be a drop in quality of the App Store process from my perspective, but difficult to quantify.</p></li>
</ol>
<h3 id="ideasfornexttime">Ideas for Next Time </h3>
<p>If others are releasing apps in the App Store with <abbr title="In-App Purchases">IAPs</abbr>, my advice is:</p>
<ol>
<li><p>Choose to manually release the App once approved.</p></li>
<li><p>Wait at least a day before releasing it (no data for this, just a guess) to see if that helps things propagate internationally ahead of time. Not sure that it will, but worth a shot.</p></li>
<li><p>Two options:</p>
<ol>
<li><p>Release the app in your native country first, ensure all is well for a day, and then release internationally.</p></li>
<li><p>Release internationally, but donât announce it to your users. Try to get individual users across the world to try it out before a large group tries it. Also, allow at least 12 hours, probably a day (again, guess, not data-driven) to allow things to propagate throughout all regions.</p></li>
</ol></li>
<li><p>Release at a time where you know you will be able to respond promptly to support emails. The difficulty here is that most of these issues have (for me) been in non-US regions, so they are in different timezones. Not sure when the best time would have been, but it was a long night, followed by an early morning after a couple of hours of sleepâ¦</p></li>
</ol>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/09/app_store_thoughts.htmlImproved OpenDocument Support2017-07-05T20:15:42-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Improved OpenDocument Support</h1><div class="date">07/05/2017 20:15:42</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>Continuing my theme of working on zip-based export formats, I have
pushed a commit to the development branch of <a href="https://github.com/fletcher/MultiMarkdown-6">MultiMarkdown-6</a> that
improves OpenDocument support:</p>
<ul>
<li><p>The zip-based OpenDocument (<code>odt</code>) format is now supported. This
includes packaging image assets in the document, just like EPUB and
TextBundle formats. This has been tested with <code>png</code> images, but
might not work with other image formats.</p></li>
<li><p>The Flat OpenDocument Text format (<code>fodt</code>) has been rewritten to
share code with the regular variant. All tests still seem to pass,
and this will make it easier to keep things in sync moving forward.</p></li>
<li><p>The command line arguments have been changed to reflect this â
instead of <code>odf</code>, you can now use <code>odt</code> and <code>fodt</code>.</p></li>
<li><p>The framework can be adapted readily to other OpenDocument formats.
The only one that makes sense at this time is Presentation documents.
I need to work on some default style settings, which unfortunately is
more rigid than I would have hoped (e.g. manually specifying layout
dimensions). Iâll keep playing with it.</p></li>
</ul>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/07/improved_opendocument_support.htmlTextBundle Support2017-07-02T19:36:43-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">TextBundle Support</h1><div class="date">07/02/2017 19:36:43</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="textbundlesupportaddedtomultimarkdown-6">TextBundle Support added to MultiMarkdown-6 </h2>
<p>Earlier today, I pushed a commit to the development branch of
<a href="https://github.com/fletcher/MultiMarkdown-6">MultiMarkdown 6</a> that
adds support for <a href="http://textbundle.org/">TextBundle</a> as an output format. Technically,
only the compressed variant, TextPack, is supported. This is basically
the regular TextBundle folder format compressed as a zip file.</p>
<p>Iâll add the regular version soon, but want to make sure everything
is working properly.</p>
<p>A few caveats:</p>
<ul>
<li><p>All files are transcluded prior to processing, so the resulting
TextBundle file with have a single text file inside of it.</p></li>
<li><p>A pre-converted copy of the file in HTML format is included for
convenience.</p></li>
<li><p>Just like the EPUB format, assets are embedded inside the zip.
Currently, this includes a CSS file (if the <code>css</code> metadata is used),
as well as images.</p></li>
<li><p>If MMD is compiled with libCurl support, then images located on
remote servers will also be embedded in the TextBundle.</p></li>
</ul>
<h2 id="additionalthoughts">Additional Thoughts </h2>
<p>The TextBundle format is an interesting idea, and solves a tricky
problem for a small group of technically inclined users. Because
it is very similar to the EPUB format, but simpler, it made sense
for me to add it to MMD as it wasnât too difficult.</p>
<p>That said, I donât think the TextBundle format has gained the
traction amongst users that was originally expected. I donât use
the format myself, at least not yet. So I welcome input from anyone
who does to help me fix any bugs that exist.</p>
<p>Hopefully it will be useful for some, however!!</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/07/textbundle_support.htmlA Major Announcement2017-06-30T06:49:50-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">A Major Announcement</h1><div class="date">06/30/2017 06:49:50</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="somebackground...">Some Background⦠</h2>
<p>For most of my life, my sense of time has been built around the academic year. School starts in the fall, and ends in the spring. This remained true until the third year of medical school, when âsummer breakâ narrowed to the small gap between June 30 of on year, and July 1 of the new academic year. Even this year, as an academic hospitalist (inpatient doctor for adults), my life is organized around the concept of the academic year.</p>
<p>Until now.</p>
<p>(Sort of.)</p>
<p>I have been working on software, in one way or another, for over 30 years. The early days consisted of just learning the basics and experimenting with what computers could do. I advanced through creating a really bad version of a flight simulator, creating a framework for a stock market analysis app (I couldnât afford to buy one, so started tried to build my own), and countless other small projects.</p>
<p>I even tried to sell software once about 15 years ago. It was a backup program for Mac OS X that was sort of like Time Machine before Time Machine existed. From a technical perspective it was interesting, but the user interface left much to be desired. My marketing strategy sucked. I sold exactly 0 copiesâ¦.</p>
<p>Then I created a small fork of a Perl script called Markdown. My initial goal was to implement some features that John Gruber had alluded, in the hopes he would catch up and my work would be deprecated. That never happened, and I ended up working on MultiMarkdown for the last 12 years.</p>
<p>Over that time, MultiMarkdown has gone through many iterations as new technology was available and as I learned better approaches to programming. In addition to the MultiMarkdown tool itself, I have developed several other open-source and commercial programs.</p>
<p>All of this work was done during my free time, which has become more and more limited as my âday jobâ has become increasingly demanding. Which was fine when I thought of programming more as a hobby than as a career. But over the years, I began to find myself feeling that I was unable to devote the time to software that I wanted to. Projects took longer to develop than I thought they would, and many other ideas never had the chance to develop beyond an idea on a metaphorical shelf.</p>
<p>Which brings us to todayâ¦.</p>
<h2 id="whatsnewforthecomingyear">Whatâs New for the Coming Year? </h2>
<p>After a few years of experimenting with different approaches to my work/work/life balance, Iâm trying something new this year. I am very fortunate to work with a fantastic group of physicians and teachers, and was able to work out an arrangement that will let me devote the coming year to software development, without having to entirely give up my medical practice. Effectively, I have cut back to roughly a third of the amount of medical work I used to do, allowing me time and flexibility to work differently this year. This means I will be almost âfull timeâ as a developer, as opposed to squeezing that work into nights, weekends, and vacations.</p>
<p>I plan on devoting this time to a few obvious and a few not-so-obvious projects:</p>
<ol>
<li><p>MultiMarkdown Composer v3 â v3 has been in beta for a couple of years. A great deal of work has been done during this time (including entirely rewriting MMD into version 6). In fact, over the last year I have actually been working on a âbrand new version 3â. My new schedule will allow me the time to finish work on this in order to release it for others to use.</p></li>
<li><p>Once the macOS version of Composer 3 is finished, I can devote time to an iOS version. The core engine is the same, but obviously the GUI is quite different. I had created a beta version of Composer for iOS years ago, but I never had the time to really get it to the point where it was ready for sale. I plan to change that. Along the way, as I develop the iOS codebase, there will probably be a version of MultiMarkdown Converter for iOS as well.</p></li>
<li><p>I have some other ideas for some interesting projects that are still in the brainstorming or prototyping stage. These may or may not turn into applicatins that are ready for public use, but I am happy to have the time to explore them. Iâll share more about these ideas when theyâre further along.</p></li>
<li><p>Finally, I want to take this opportunity to restructure my life. Over the years, âworkâ has taken up more and more of my life. I enjoy my work, but other things are important as well. I am going to experiment with some different strategies for time management, exercise, friends and family, etc. to make some changes to the way I live my life. And, of course, I have some ideas about how to try and create some software tools to make this easier to doâ¦.</p></li>
</ol>
<h2 id="finally...">Finally⦠</h2>
<p>Iâll post periodic updates along the way. Iâll let you know whatâs going on with Composer. If I have interesting things to say about the process of working for myself, Iâll do that. If you have questions, let me know.</p>
<p>As always, if you want to keep up with announcements and new information you can check out:</p>
<ul>
<li><a href="http://fletcherpenney.net/">This website</a> (or the <a href="http://fletcherpenney.net/atom.xml">Atom feed</a>)</li>
<li>Twitter â @MultiMarkdown</li>
<li>The MultiMarkdown Software Mailing List: http://multimarkdown.com/signup/</li>
</ul>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/06/major_announcement.htmlHow to Create an EPUB with MMD2017-03-24T09:45:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">How to Create an EPUB with MMD</h1><div class="date">03/24/2017 09:45:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p><a href="https://github.com/fletcher/MultiMarkdown-6">MMD v6</a> includes many new
features, one of which is the ability to create EPUB 3 files without any extra
tools.</p>
<p>The new workflow for creating an EPUB is:</p>
<ol>
<li><p>Write your document using MMD.</p></li>
<li><p>Convert to EPUB â <code>multimarkdown -b -t epub file.txt</code></p></li>
<li><p>There is no step 3â¦.</p></li>
</ol>
<p>Okâ¦. there is a slight bit more to know, but not much.</p>
<p>EPUB files use an identifier so that readers know when two files represent
different versions of the same book. MMD uses <a href="https://en.wikipedia.org/wiki/Universally_unique_identifier">UUID</a>âs as identifiers, and
will generate one for you randomly. If you want to be able to revise your
EPUB in the future, then you can use the <code>uuid</code> metadata key in your text.</p>
<pre><code>title: Some Title
uuid: a481c053-01d7-4426-832a-39a7a11966f6
</code></pre>
<p>MMD will look for your <code>css</code> metadata, as well as images that are used in the
document. It will include these as assets in your EPUB, and link to the
internal versions of those files.</p>
<ol>
<li><p>âLocalâ files include those that are on your computer and are referenced
using relative locations such as âfolder/fileâ or â../folder/fileâ. MMD will
find these files and include them easily.</p></li>
<li><p>âRemoteâ files are those that are referenced with full URLs, such as
âhttp://foo.com/bar.pngâ. MMD canât access these by itself, and I donât feel
like writing an entire web crawler. However, MMD does use the <a href="https://curl.haxx.se/libcurl/">libcurl</a>
library to do the downloading for you. This does require that the libcurl
library is available at the time that MMD was compiled, and on your machine.
This is easy on macOS machines, and libcurl support is included in the
binaries provided at GitHub for macOS. I donât have a way at the moment to do
this for Windows, so if you need remote file support, youâll need to compile
MMD yourself to include it.</p></li>
<li><p>Alternatively, you can always download any remote files yourself, and
modify your MMD file to reference them locally, thereby solving the problem
regardless of which OS you are using.</p></li>
</ol>
<p><strong><em>BONUS</em></strong>: My new app on the App Store for macOS, <a href="https://itunes.apple.com/us/app/multimarkdown-converter-complete/id1217667791?ls=1&mt=8">MultiMarkdown Converter
Pro</a>, includes EPUB 3 support. Just drag your MMD file to the window, and out
pops the EPUB. It couldnât be any easier!</p>
<p>If you want to see a few examples of MMD-generated EPUBâs, check out the
Github page above and look at the <code>DevelopmentNotes</code> and <code>QuickStart</code> folders.</p>
<p>Enjoy!!!</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/03/how_to_create_epub.htmlMultiMarkdown Announcements2017-03-22T22:15:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown Announcements</h1><div class="date">03/22/2017 22:15:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>I have a couple of exciting announcements for MultiMarkdown users!!</p>
<ol>
<li><p>MultiMarkdown v 6.0 is ready. I started working on it around a year ago,
and have put a lot of time into it over the last 6 months. The short version
is that itâs faster, more accurate, more reliable, and has more features.</p>
<ul>
<li>MMD v6 is available at <a href="https://github.com/fletcher/MultiMarkdown-6">Github</a></li>
<li>More information is available in the <a href="https://github.com/fletcher/MultiMarkdown-6/tree/master/QuickStart">QuitckStart guide</a></li>
<li>The Userâs Guide will still take some time to be rewritten.</li>
<li>The README has some information on biggest changes</li>
</ul></li>
<li><p>To celebreate MMD v6, I am about to release a new utility application â
MultiMarkdown Converter. Itâs a drag and drop front end that allows quick and
easy conversion of text documents into any format supported by MultiMarkdown.
Thereâs no more need to memorize terminal commands to make full use of
MultiMarkdown. Not everyone needs this, which is fine. But it makes MMD
easier to use for anyone who is unfamiliar with the Terminal, or just doesnât
want to be bothered with keeping an installation of MMD up to date.</p>
<p>MMD Converter comes in three âflavorsâ â the standard version as well as
HTML- and EPUB-specific versions. More information is available on the
<a href="http://multimarkdown.com/converter/">website</a></p></li>
</ol>
<p>As for the future, there are a few things in the worksâ¦. MMD Composer 3 is
still in development. In order to fully implement some of the features Iâm
working on, I needed to make improvements to MMD itself. This led to MMD v6.
Now that MMD 6 is out, Iâll be able to continue working on Composer. The new
engine for Composer that Iâm working on is cross-platform compatible. This
will make it (relatively) easy to migrate to not just iOS, but <em>potentially</em>
other platforms as well (no promises there!).</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/03/mmd_announcements.htmlMultiMarkdown 6 Supports EPUB 32017-03-13T18:18:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown 6 Supports EPUB 3</h1><div class="date">03/13/2017 18:18:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="intro">Intro </h2>
<p>MMD v6 now provides support for direct creation of <a href="https://en.wikipedia.org/wiki/EPUB">EPUB 3</a> files. Previously
a separate tool was required to create EPUB files from MMD. Itâs now built-
in. Currently, EPUB 3 files are built using the usual HTML 5 output. No
extra CSS is applied, so the default from the reader will be used. Images are
not yet supported, but support is planned for the future.</p>
<p>EPUB files can be highly customized with other tools, and I recommend doing
that for production quality files. For example, apparently performance is
improved when the content is divided into multiple files (e.g. one file per
chapter). MMD creates EPUB 3 files using a single file. Tools like <a href="https://sigil-ebook.com/">Sigil</a>
are useful for improving your EPUB files, and I recommend doing that.</p>
<p>Not all EPUB readers support v3 files. I donât plan on adding support for
older versions of the EPUB format, but other tools can convert to other
document formats you need. Same goes for Amazonâs ebook formats â the
<a href="https://calibre-ebook.com/">Calibre</a> program can also be used to interconvert between formats.</p>
<p><strong>NOTE</strong>: Because EPUB documents are binary files, MMD only creates them when
run in batch mode (using the <code>-b\--batch</code> options). Otherwise, it simply
outputs the HTML 5 file that would serve as the primary content for the EPUB.</p>
<pre><code>multimarkdown -b -t epub original.txt
</code></pre>
<p>Download the latest version from <a href="https://github.com/fletcher/MultiMarkdown-6/releases">Github</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/03/mmd_6_epub.htmlMultiMarkdown 6 v. 0.1.0a Released2017-03-06T18:28:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown 6 v. 0.1.0a Released</h1><div class="date">01/18/2017 22:52:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="shortversion">Short Version </h2>
<p>There is an alpha version of MultiMarkdown 6 available for experimenting.
Itâs not finished. But it should cover all regular Markdown features, and
about half of the MultiMarkdown-specific features or so.</p>
<p>Thereâs a pretty thorough basic test suite, but I want to make it better.</p>
<p>Itâs fast, but I want to make it faster.</p>
<p>Take a look!</p>
<ul>
<li><a href="https://github.com/fletcher/MultiMarkdown-6">https://github.com/fletcher/MultiMarkdown-6</a></li>
</ul>
<h2 id="longversion">Long Version </h2>
<p>Checkout the project README for information about:</p>
<ul>
<li>Project history</li>
<li>Completed and pending features</li>
<li>Strategies Iâve tried for improving performance â some that worked and some
that didnât</li>
<li>And more..</li>
</ul>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/03/mmd_6_update.htmlMultiMarkdown 6 v. 0.1.0a Released2017-01-18T22:52:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown 6 v. 0.1.0a Released</h1><div class="date">01/18/2017 22:52:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="shortversion">Short Version </h2>
<p>There is an alpha version of MultiMarkdown 6 available for experimenting.
Itâs not finished. But it should cover all regular Markdown features, and
about half of the MultiMarkdown-specific features or so.</p>
<p>Thereâs a pretty thorough basic test suite, but I want to make it better.</p>
<p>Itâs fast, but I want to make it faster.</p>
<p>Take a look!</p>
<ul>
<li><a href="https://github.com/fletcher/MultiMarkdown-6">https://github.com/fletcher/MultiMarkdown-6</a></li>
</ul>
<h2 id="longversion">Long Version </h2>
<p>Checkout the project README for information about:</p>
<ul>
<li>Project history</li>
<li>Completed and pending features</li>
<li>Strategies Iâve tried for improving performance â some that worked and some
that didnât</li>
<li>And more..</li>
</ul>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2017/01/mmd_6v0.1.0_released.htmlMultiMarkdown v. 5.4.0 Released2016-08-05T09:30:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown v. 5.4.0 Released</h1><div class="date">08/05/2016 09:30:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="whatsnew">Whatâs New? </h2>
<h2 id="5.4.0-2016-08-05"><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.4.0">5.4.0</a> - 2016â08â05</h2>
<ul>
<li>ADDED: Add email address to cpack settings (addresses #31)</li>
<li>ADDED: Move static library options to separate make target</li>
<li>CHANGED: Increase list of syntax structures that are evaluated for abbreviations (Thanks, David!)</li>
<li>CHANGED: Update README</li>
<li>FIXED: Avoids problem mentioned on github (#30), but doesnât actually solve it. Any help appreciated!</li>
<li>FIXED: Fix crash with empty table label</li>
</ul>
<h2 id="whereisit">Where is it? </h2>
<p>The MultiMarkdown v5 source is on github:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5">https://github.com/fletcher/MultiMarkdown-5</a></p>
<p>Pre-compiled binaries are available on the Github project release page:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.4.0">https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.4.0</a></p>
<p>The Userâs Guide has more information about MultiMarkdown:</p>
<p><a href="http://fletcher.github.io/MultiMarkdown-5/">http://fletcher.github.io/MultiMarkdown-5/</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2016/08/mmd_5.4.0_released.htmlMultiMarkdown v. 5.3.0 Released2016-06-08T11:19:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown v. 5.3.0 Released</h1><div class="date">06/08/2016 11:19:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="whatsnew">Whatâs New? </h2>
<h2 id="5.3.0-2016-06-08"><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.3.0">5.3.0</a> - 2016â06â08 </h2>
<ul>
<li>CHANGED: Update test suite</li>
<li>FIXED: Donât allow math spans inside strong/emph</li>
<li>FIXED: Fix additional edge case in emph/strong parser</li>
<li>FIXED: Fix slow parsing of complex strong/emph (Fixes #18)</li>
<li>FIXED: Improve accuracy and performance of strong/emph</li>
<li>FIXED: Improve performance</li>
</ul>
<h2 id="whereisit">Where is it? </h2>
<p>The MultiMarkdown v5 source is on github:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5">https://github.com/fletcher/MultiMarkdown-5</a></p>
<p>Pre-compiled binaries are available on the Github project release page:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.3.0">https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.3.0</a></p>
<p>The Userâs Guide has more information about MultiMarkdown:</p>
<p><a href="http://fletcher.github.io/MultiMarkdown-5/">http://fletcher.github.io/MultiMarkdown-5/</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2016/06/mmd_5.3.0_released.htmlMultiMarkdown v. 5.2.0 Released2016-03-16T21:11:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown v. 5.2.0 Released</h1><div class="date">03/16/2016 21:11:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="whatsnew">Whatâs New? </h2>
<h2 id="5.2.0-2016-03-16"><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.2.0">5.2.0</a> - 2016â03â16 </h2>
<ul>
<li>ADDED: Add additional test cases</li>
<li>ADDED: Add support for âHTML FOOTERâ metadata â appended at very end of HTML documents (after footnotes)</li>
<li>CHANGED: Allow nested strong/emph spans (though effect of output is not defined for all formats)</li>
<li>CHANGED: Update Math test suite</li>
<li>CHANGED: Update documentation for 5.1.0</li>
<li>CHANGED: Update documentation for HTML Footer metadata</li>
<li>CHANGED: Update test suite</li>
<li>CHANGED: recursive support for CriticMarkup syntax (e.g. an addition can be included inside a substitution).</li>
<li>FIXED: Fix bug in handling of â$â delimited math</li>
<li>FIXED: Improve accuracy of strong/emph parsing;</li>
<li>FIXED: Remove debugging statement in recent CriticMarkup changes</li>
</ul>
<h2 id="whereisit">Where is it? </h2>
<p>The MultiMarkdown v5 source is on github:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5">https://github.com/fletcher/MultiMarkdown-5</a></p>
<p>Pre-compiled binaries are available on the Github project release page:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.2.0">https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.2.0</a></p>
<p>The Userâs Guide has more information about MultiMarkdown:</p>
<p><a href="http://fletcher.github.io/MultiMarkdown-5/">http://fletcher.github.io/MultiMarkdown-5/</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2016/03/mmd_5.2.0_released.htmlMultiMarkdown v. 5.1.0 Released2016-02-22T22:21:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown v. 5.1.0 Released</h1><div class="date">02/22/2016 22:21:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="whatsnew">Whatâs New? </h2>
<h2 id="5.1.0-2016-02-22"><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.1.0">5.1.0</a> - 2016â02â22 </h2>
<ul>
<li>ADDED: Add script to build drag and drop apps on OS X</li>
<li>ADDED: Beginning code for public header file support; ADDED: Beginning configuration for OS X Bundle/Framework targets</li>
<li>ADDED: Include support for Xcode libraries to be iOS compatible</li>
<li>CHANGED: Update copyright info for 2016</li>
<li>CHANGED: Update test suite</li>
<li>FIXED: Allow ATX Headers inside lists</li>
<li>FIXED: Allow ânaturallyâ aligned table cells like MMD 2 allowed</li>
<li>FIXED: Allow metadata variables inside links (e.g. [[%foo]][bar])</li>
<li>FIXED: Allow newline inside strong/emph (Fixes #10)</li>
<li>FIXED: Change handling of version.h file for deprecated make to keep it separate from cmake alternative</li>
<li>FIXED: Donât delete src/version.h</li>
<li>FIXED: Fix problem with strong/emph matching incorrectly</li>
<li>FIXED: Fix regression in list/heading fix that was overeager</li>
<li>FIXED: Include âfakeâ version.h for make deprecate</li>
<li>FIXED: Include additional standard metadata keys in the list to <em>not</em> be included in HTML headers</li>
<li>FIXED: Remove unneeded install directive; FIXED: Fix public header install prefix (I think)</li>
<li>FIXED: Update MMD test suite for recent table alignment change</li>
<li>FIXED: fix âmake deprecateâ so that it truly doesnât require cmake</li>
<li>FIXED: Improve tight vs loose list detection with unusual setext headers</li>
<li>NOTE: Fixed git clone instructions in documentation</li>
<li>NOTE: Update test suite</li>
</ul>
<h2 id="whereisit">Where is it? </h2>
<p>The MultiMarkdown v5 source is on github:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5">https://github.com/fletcher/MultiMarkdown-5</a></p>
<p>Pre-compiled binaries are available on the Github project release page:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.1.0">https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.1.0</a></p>
<p>The Userâs Guide has more information about MultiMarkdown:</p>
<p><a href="http://fletcher.github.io/MultiMarkdown-5/">http://fletcher.github.io/MultiMarkdown-5/</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2016/02/mmd_5.1.0_released.htmlMultiMarkdown v. 5.0.1 Released2015-12-01T11:42:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown v. 5.0.1 Released</h1><div class="date">12/01/2015 11:42:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<h2 id="whatsnew">Whatâs New? </h2>
<h2 id="5.0.1-2015-12-01"><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.0.1">5.0.1</a> - 2015â12â01 </h2>
<ul>
<li>IMPORTANT: Fix major error in last Makefile! (Only in build branch for a few minutes)</li>
<li>ADDED: Improve empty list item detection in ODF output</li>
<li>CHANGED: Remove unused node creation utilities</li>
<li>CHANGED: Update documentation</li>
<li>CHANGED: Use âconstâ char * in g_string_new</li>
<li>CODE: Improve doxygen support in libMultiMarkdown.h</li>
<li>CODE: Refactor markdown_to_string() to separate parsing input text and writing output text via the intermediate node tree.</li>
<li>CODE: Use node creation shortcuts for consistency and future flexibility</li>
<li>FIX: Add 32 bit flag to older MinGW toolchain</li>
<li>FIX: Add label for 32 bit builds</li>
<li>FIX: Donât run valgrind tests unless in âmake debugâ mode</li>
<li>FIX: Donât static link when using âmake debugâ for valgrind testing</li>
<li>FIX: Fix memory leaks in transclude_source()</li>
<li>NOTE: Add developer notes to the README information</li>
<li>NOTE: Additional doxygen support</li>
<li>NOTE: Autogenerate changelog since last commit to master</li>
<li>NOTE: Begin tracking release notes in âCHANGELOG.mdâ</li>
<li>NOTE: Change empty listitem detection logic for ODF output</li>
<li>NOTE: Change whitespace for easier diffing</li>
<li>NOTE: Remove redundant developer note in README</li>
<li>NOTE: Use tab instead of leading spaces in CHANGELOG-UNRELEASED</li>
</ul>
<h2 id="whereisit">Where is it? </h2>
<p>The MultiMarkdown v5 source is on github:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5">https://github.com/fletcher/MultiMarkdown-5</a></p>
<p>Pre-compiled binaries are available on the Github project release page:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.0.1">https://github.com/fletcher/MultiMarkdown-5/releases/tag/5.0.1</a></p>
<p>The Userâs Guide has more information about MultiMarkdown:</p>
<p><a href="http://fletcher.github.io/MultiMarkdown-5/">http://fletcher.github.io/MultiMarkdown-5/</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2015/12/mmd_5.0.1_released.htmlMultiMarkdown v. 5.0 Released2015-11-15T10:48:20-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown v. 5.0 Released</h1><div class="date">11/15/2015 10:48:20</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>MultiMarkdown v5 is basically the same code as v4, but the project has been restructured:</p>
<ul>
<li>It is built using my <a href="https://github.com/fletcher/c-template">c-template</a> project boilerplate â I welcome
suggestions and ideas for improvement about this.</li>
<li>It is designed with the CMake build system, rather than just
a Makefile</li>
</ul>
<h2 id="whyswitchtocmake">Why switch to CMake? </h2>
<p>In early 2014, a user of MMD introduced me to the <a href="https://cmake.org/">CMake</a> build system. I
looked at it briefly, but didnât do anything with it. Later on, I looked
at it more in depth and created a parallel branch after 4.6. This would allow
me to experiment with CMake without breaking anything else in the <code>master</code>
branch.</p>
<p>CMake isnât perfect by any means, but it does allow for some interesting
things:</p>
<ul>
<li>Automatically generate GUI installers for OS X and Windows, as well as zip
files for *nix. I have not looked into using CMake to build <code>.deb</code>
packages, but that might be possible as well. My old system could generate
GUI installers for Windows and OS X, but it was a complex process that
required a lot of manual processing. This is much more amenable to
automation.</li>
<li>An improved organization structure for various tests, including <a href="http://valgrind.org/">Valgrind</a>
testing. The old system was getting rather messy.</li>
<li>A templating system that better allows me to synchronize version, and
other, information in code, documentation, and READMEs</li>
<li>Automatic generation of project files for Xcode, Visual Studio, and
alternative build systems beyond <code>make</code></li>
<li>An opportunity to reorganize my code directory hierarchy</li>
<li>The option to start adding unit test code to the source. This probably
wonât happen, as it would be too much work. But it is possible.</li>
</ul>
<p>The biggest <em>problem</em> is that this means that anyone wishing to compile the
source will need to install CMake. This isnât hard, but it is an extra step.</p>
<p>As a temporary measure, you can use the <code>make deprecated</code> command to use a
simplified <code>make</code> recipe to compile a binary of MultiMarkdown for the current
machine. I donât recommend this approach, but it should work in a pinch until
you can upgrade your machine to support cmake.</p>
<p>I welcome feedback on this decision, but please note â âI donât like itâ or
âbring back the old wayâ comments will be ignored. Please send meaningful
criticism or suggestions.</p>
<p>Perhaps an approach if others want to contribute will be to do the reverse of
what I did before â create a <code>make</code> branch that includes a modified Makefile
designed to be used without CMake?</p>
<p>Additionally, the old Makefile had grown over time to include some tricks that
users of various systems required. I have tested the CMake system on OS X,
Ubuntu and Debian Linux, and MinGW on Ubuntu. I welcome suggestions for
improvements to the CMake configuration.</p>
<h2 id="whereisit">Where is it? </h2>
<p>The MultiMarkdown v5 source is on github:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5">https://github.com/fletcher/MultiMarkdown-5</a></p>
<p>Pre-compiled binaries are available on the Github project release page:</p>
<p><a href="https://github.com/fletcher/MultiMarkdown-5/releases">https://github.com/fletcher/MultiMarkdown-5/releases</a></p>
<p>The Userâs Guide link is also updated to the new project:</p>
<p><a href="http://fletcher.github.io/MultiMarkdown-5/">http://fletcher.github.io/MultiMarkdown-5/</a></p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2015/11/mmd_5.0.0_released.htmlMultiMarkdown 4.7.1 Released2015-03-09T18:55:39-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown 4.7.1 Released</h1><div class="date">03/09/2015 18:55:39</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>MultiMarkdown 4.7 contains the following improvements:</p>
<h2 id="4.7.1">4.7.1 </h2>
<ul>
<li>New installers â should preserve proper owner on OS X; New format for Windows installer â please let me know if it doesnât work.</li>
<li>Fix memory leaks</li>
<li>Fix edge case in strong/emph parsing</li>
<li>custom âstrndupâ function to improve compiling on Windows (seriously, I wish Windows would join the rest of the modern worldâ¦)</li>
<li>âmarkdownâ script/batch file to run in compatibility mode</li>
<li>other slight tweaks to source code</li>
</ul>
<p>As always, download <a href="/multimarkdown/download/">here</a>.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2015/03/mmd_4.7.1_released.htmlMultiMarkdown 4.6 Released2014-09-24T08:01:00-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">MultiMarkdown 4.6 Released</h1><div class="date">09/24/2014 08:01:00</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>MultiMarkdown 4.6 contains several new features, bug fixes, and other improvements:</p>
<ul>
<li>Add <code>mmd footer</code> metadata feature</li>
<li>Add support for abbreviations</li>
<li>improve hyphen escaping in LaTeX</li>
<li>Ignore wrapping <code><></code> in reference URLs</li>
<li>Improve table alignment in LaTeX</li>
<li>Improve windows batch script paths</li>
<li>Additional error checking in file transclusion</li>
<li>memory fixes/code cleanup</li>
<li>Other small fixes</li>
<li>improve strong/emph matching</li>
<li>improve whitespace handling around fenced code blocks</li>
<li>Improve whitespace handling around headings, block quotes</li>
<li>Fix bug in tables</li>
<li>Fix YAML and OPML</li>
</ul>
<p>As always, download <a href="/multimarkdown/download/">here</a>.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2014/09/mmd_4.6_released.htmlSupport for Abbreviations Added2014-04-19T18:23:32-04:00<!--#include virtual="${Base_URL}/templates/header.html" --><h1 class="page-title">Support for Abbreviations Added</h1><div class="date">04/19/2014 18:23:32</div><!--#include virtual="${Base_URL}/cgi/tags.cgi" -->
<p>I just pushed support for abbreviations to github. The syntax is the same as that used by Michel Fortin in <a href="http://michelf.ca/projects/php-markdown/extra/#abbr">PHP Markdown Extra</a>.</p>
<p>See the userâs guide for more information:</p>
<p><a href="http://fletcher.github.io/MultiMarkdown-4/abbreviations">http://fletcher.github.io/MultiMarkdown-4/abbreviations</a></p>
<p>Once this gets some testing, it will be included in the next binary release. For now, youâll have to compile yourself.</p>
<!--#include virtual="${Base_URL}/templates/footer.html" -->http://fletcherpenney.net/2014/04/abbreviations.html