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

<channel>
	<title>Daniel L. Taylor | Taylor Design</title>
	<atom:link href="https://www.taylordesign.net/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.taylordesign.net</link>
	<description>Software Development</description>
	<lastBuildDate>Mon, 20 Sep 2021 09:12:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.2</generator>
	<item>
		<title>TextSpresso&#8217;s Future</title>
		<link>https://www.taylordesign.net/textspresso/textspressos-future/</link>
					<comments>https://www.taylordesign.net/textspresso/textspressos-future/#respond</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Fri, 18 Dec 2020 13:29:00 +0000</pubDate>
				<category><![CDATA[TextSpresso]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=4504</guid>

					<description><![CDATA[It has been a long time since I have touched the code base for TextSpresso or issued any updates. Way too long in fact. TextSpresso has become one of those projects that has sat on a shelf (so to speak) while I tell myself that I&#8217;ll get back to it any day now. And life [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>It has been a <em>long</em> time since I have touched the code base for <a href="https://www.taylordesign.net/products/textspresso/" target="_blank" rel="noopener noreferrer">TextSpresso</a> or issued any updates. Way too long in fact. TextSpresso has become one of those projects that has sat on a shelf (so to speak) while I tell myself that I&#8217;ll get back to it any day now. And life has a way of slipping by while you&#8217;re not paying attention.</p>
<p>This means that TextSpresso is not notarized to run on the latest versions of macOS. On top of that, the users who remain have reported numerous issues and glitches that seem to have popped up with age. Subtle changes in API behavior may not crash a program but can still result in quirky behavior. (Example: mouse wheel scrolling has degraded quite a bit since 2013.)</p>
<p>It has been a long time since TextSpresso has been a <em>commercially viable</em> application. Much of the need for it has dissipated as the computing world has evolved. But it&#8217;s still a project that I love and one that some people continue to benefit from.</p>
<p>Since I am torn about what direction I will take TextSpresso in version 4, I think it&#8217;s time to dust off the version 3 code base, update it, and get it notarized. I might even upgrade some of the &#8220;temporary&#8221; UI elements that I&#8217;ve never cared for after the port from <a href="https://en.wikipedia.org/wiki/Prograph" target="_blank" rel="noopener noreferrer">Prograph CPX</a> to <a href="https://www.xojo.com" target="_blank" rel="noopener noreferrer">Xojo</a>. None of which is Xojo&#8217;s fault. Simply me thinking I would get back to temporary solutions in a timely fashion.</p>
<p>So after&#8230;years&#8230;there will be a new version of TextSpresso soon. No major changes, and no expectations on my part that a v3 update will set the world on fire. But it will at least stabilize things while I move forward on v4.</p>
<p>If you&#8217;re a die hard TextSpresso user, keep your fingers crossed&#8230;.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/textspresso/textspressos-future/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Plagiarizing Save Humanity</title>
		<link>https://www.taylordesign.net/code-optimization/plagiarizing-save-humanity/</link>
					<comments>https://www.taylordesign.net/code-optimization/plagiarizing-save-humanity/#respond</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Fri, 18 Dec 2020 13:16:48 +0000</pubDate>
				<category><![CDATA[Code Optimization]]></category>
		<guid isPermaLink="false">https://www.taylordesign.net/?p=7089</guid>

					<description><![CDATA[I shouldn&#8217;t care about something so small. I really shouldn&#8217;t. The world is in the midst of a horrific pandemic which has triggered a severe economic recession. There are riots, clashes between citizens and their governments, and chaotic events occurring everywhere. And what I&#8217;m about to discuss is so small in light of everything going [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I shouldn&#8217;t care about something so small. I really shouldn&#8217;t. The world is in the midst of a horrific pandemic which has triggered a severe economic recession. There are riots, clashes between citizens and their governments, and chaotic events occurring everywhere. And what I&#8217;m about to discuss is so small in light of everything going on in the world that I really shouldn&#8217;t care.</p>
<p>And yet&#8230;I do.</p>
<p>I haven&#8217;t been doing any challenges on <a href="https://www.hackerrank.com/" target="_blank" rel="noopener noreferrer">HackerRank</a> in a while due to lack of free time. But I still login from time to time when I get an email alert about new comments in the challenge discussions. When I logged in tonight I discovered that one Shehan Jayalath had taken my <a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b8.c" target="_blank" rel="noopener noreferrer">B8 solution</a> from <a href="https://www.taylordesign.net/code-optimization/saving-humanity/" target="_blank" rel="noopener noreferrer">Saving Humanity (By Vectorizing The ALU)</a>, stripped the header, and posted it in the challenge discussion as if it was his own. Sure enough, when I looked him up on the Leaderboard he had also submitted my solution verbatim to get a free 100 points.</p>
<p>And companies wonder why they <a href="https://letterstoanewdeveloper.com/2019/08/23/the-surprising-number-of-programmers-who-cant-program/" target="_blank" rel="noopener noreferrer">struggle to find programmers who can actually program.</a></p>
<p>Shehan Jayalath&#8217;s post to the discussion forum can be found <a href="https://www.hackerrank.com/challenges/save-humanity/forum/comments/809600" target="_blank" rel="noopener noreferrer">here.</a> My reply can be found <a href="https://www.hackerrank.com/challenges/save-humanity/forum/comments/899071" target="_blank" rel="noopener noreferrer">here.</a> And if you&#8217;re logged into HackerRank you can see that Jayalath used my solution for free points <a href="https://www.hackerrank.com/rest/contests/master/challenges/save-humanity/hackers/shehanjayalath/download_solution" target="_blank" rel="noopener noreferrer">here.</a></p>
<p>Now, I&#8217;m not naive. I am aware that plenty of people copy/paste their way to points and awards on HackerRank. (If you&#8217;re a prospective employer looking at anything from HackerRank on a candidate&#8217;s resume, you should be aware of this too.) And I knew when I made my blog post that the solutions would be copy/pasted into HackerRank for free points. Some people go there to learn, some people go there to build fake points and awards. It is what it is.</p>
<p>But if you&#8217;re going to post another person&#8217;s solution in the Discussion tab, <em>have the decency to attribute it to them.</em></p>
<p>And if you&#8217;re reading <em>anything I have to say about HackerRank challenges</em> I hope you have the self respect to use my posts and code in order to learn and not to cheat. If you like my approach, try re-writing it yourself without having mine open as a reference. See what you can improve. Earn the points. Don&#8217;t just copy/paste.</p>
<p>And do not ever publicly claim anyone else&#8217;s work as your own, on HackerRank or any where else.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/code-optimization/plagiarizing-save-humanity/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Saving Humanity (By Vectorizing The ALU)</title>
		<link>https://www.taylordesign.net/code-optimization/saving-humanity/</link>
					<comments>https://www.taylordesign.net/code-optimization/saving-humanity/#respond</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Mon, 21 Jan 2019 01:13:51 +0000</pubDate>
				<category><![CDATA[Code Optimization]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[code challenges]]></category>
		<category><![CDATA[HackerRank]]></category>
		<category><![CDATA[SSE2]]></category>
		<category><![CDATA[string search]]></category>
		<category><![CDATA[vector processing]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=4469</guid>

					<description><![CDATA[The Challenge Oh!! Mankind is in trouble again. This time, it&#8217;s a deadly disease spreading at a rate never seen before. The need of the hour is to set up efficient virus detectors. You are the lead at Central Hospital and you need to find a fast and reliable way to detect the footprints of [&#8230;]]]></description>
										<content:encoded><![CDATA[<h3>The Challenge</h3>
<blockquote><p><em>Oh!! Mankind is in trouble again. This time, it&#8217;s a deadly disease spreading at a rate never seen before. The need of the hour is to set up efficient virus detectors. You are the lead at Central Hospital and you need to find a fast and reliable way to detect the footprints of the virus DNA in that of the patient.</em></p></blockquote>
<p>The HackerRank challenge <a href="https://www.hackerrank.com/challenges/save-humanity" target="_blank" rel="noopener noreferrer">Save Humanity</a> can be summarized as follows:</p>
<ul>
<li>You are given two strings of lowercase letters a-z. We&#8217;ll call them dnaP and dnaV.</li>
<li>You have to return the starting index (0-based) of every occurrence of dnaV in dnaP.</li>
<li>dnaV matches a substring in dnaP if all characters match, or if all characters but one match.</li>
</ul>
<p>This challenge is ranked as expert with a 100 point award. As of the day this post was published only 12.94% of submissions have succeeded, and the Discussion tab is filled with the laments of those who timeout on the most difficult test files.</p>
<p>I coded a solution in less than 15 minutes. (Cue the anger and wrath of anyone who is stuck on this challenge.)</p>
<p>To be fair, I did not initially code an <em>optimal</em> solution. I guessed when I read the challenge that an optimal solution would involve something like a <a href="http://www.geeksforgeeks.org/z-algorithm-linear-time-pattern-searching-algorithm/" target="_blank" rel="noopener noreferrer">z-algorithm</a>, a <a href="http://www.geeksforgeeks.org/suffix-array-set-1-introduction/" target="_blank" rel="noopener noreferrer">suffix array</a>, or <a href="https://www.google.com/search?q=tree&amp;num=30&amp;source=lnms&amp;tbm=isch" target="_blank" rel="noopener noreferrer">some form of tree</a>. But I had a hunch there was an easier way to get 100 points.</p>
<h3>First Draft</h3>
<p>With this class of challenge it&#8217;s a sure bet that a <a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b1.c" target="_blank" rel="noopener">brute force solution</a> will timeout. Since the brute force approach is trivial to code I went ahead and tried it to verify that I wasn&#8217;t missing anything about the problem, and so that I could use my hackos to purchase test files.</p>
<p>It timed out on 5 of the test files but succeeded on the others. I bought the files, ran some tests on my MBP, and confirmed my hunch.</p>
<h3>Go Big or Go Home, Brutus</h3>
<p>The obvious brute force solution is to compare each character in dnaV to each character in dnaP and stop if there&#8217;s more than one mismatch. This of course has to be done repeatedly starting at each character index in dnaP. It&#8217;s the repeat comparisons that drive the processing time up, and an optimal solution would find a way to eliminate as many repeat comparisons as possible.</p>
<p>But there&#8217;s another problem with the brute force solution: it&#8217;s comparing one character at a time on a 64-bit processor which can compare 8 characters at a time using the ALU. Situations like this are why <em><a href="https://www.taylordesign.net/wp-content/uploads/2017/04/love_c.jpg" target="_blank" rel="noopener noreferrer">I freaking love C.</a></em> I took my solution and <a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b8.c" target="_blank" rel="noopener">modified it as follows:</a></p>
<ul>
<li>Cast the char pointers dnaP and dnaV to long long pointers.</li>
<li>Compare the character arrays as arrays of long long, essentially vectorizing the ALU.</li>
<li>If there&#8217;s a mismatch, drop down into a loop which examines the 8 characters at that position to count the mismatches.</li>
</ul>
<p>In C these were trivial modifications to make and they brought the worst time down to 1.17s for test file 7, passing the challenge with time to spare. We&#8217;ll call this the B8 solution (brute force 8-byte compares) and the original solution B1 (brute force 1-byte compares).</p>
<p>Having solved the challenge I wanted to explore the solution further to see if I could make it faster than the editorial solution on the longer test files (3-9).</p>
<h3>Saving Humanity with the Vector Processor</h3>
<p>The obvious next step in improving the brute force approach is to compare more than 8 bytes per iteration. SSE2 has instructions which can compare 16 bytes at a time. Initially I tried to both compare the values and get a count of mismatches all using SSE2 instructions. However, this proved to be slower than simply performing the compare and counting the mismatches normally if the SSE2 result indicated any mismatches at all. <a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b16.c" target="_blank" rel="noopener">The B16 solution</a> is therefore the same as the B8 solution, it just compares 16-bytes at a time.</p>
<p>Test file 7 is again the worst case and the B16 solution is able to process it in 0.68 seconds. That&#8217;s roughly 1.7x faster than using the ALU.</p>
<p>Later extensions to x86-64 vector processing added support for 256-bit operations (AVX2) and 512-bit operations (AVX-512). Unfortunately my MBP processor does not support AVX-512. It does support AVX2, but using 256-bit loads and compares slowed down all test files except 8 and 9, which saw a very slight performance gain. I suspect this has something to do with the algorithm&#8217;s inherent lack of alignment on 32-byte boundaries.</p>
<h3>Beating the Editorial Solution</h3>
<p>I won&#8217;t go into detail on the editorial solution here since HackerRank hides the editorial until you either get your points or forfeit those points in order to see the solution. Suffice it to say that the editorial solution involves the use of a suffix array.</p>
<p>The editorial solution is 3-4x faster than the B16 solution on files 3-7. But on test files 8 and 9 B16 is nearly 21x faster. Even brute force using single byte compares is faster than the editorial here by a factor of 3x. What&#8217;s going on?</p>
<p>Test files 3-7 involve very long repetitions of the letter &#8216;a&#8217; with a few other characters interspersed in the text to form a pattern. Test files 8 and 9 involve long repetitions of the <em>alphabet</em> with a few other characters interspersed. The brute force solutions have to repeatedly compare a large percentage of the bytes in test files 3-7. But on test files 8 and 9, 25 out of every 26 comparisons end on the 2nd byte being compared. Here the brute force solutions aren&#8217;t comparing nearly as many bytes as the editorial solution which has to sort the suffix array for it to be useful.</p>
<p>To deal with the high character repetition in some of the test files I <a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b16r.c" target="_blank" rel="noopener">made the following modifications</a> to the B16 solution. We&#8217;ll call this version B16R.</p>
<ul>
<li>Allocate an array of integers for both dnaP and dnaV.</li>
<li>Scan the strings from end to beginning counting repeat characters and storing the counts in the arrays.</li>
<li>Now at any given character position we can look at the corresponding integer arrays and see how many times the character will repeat in both dnaP and dnaV.</li>
<li>The string matching loop can use this information to jump ahead any time it finds a suitable repetition.</li>
</ul>
<h3>Mission Accomplished</h3>

<table id="tablepress-2" class="tablepress tablepress-id-2">
<thead>
<tr class="row-1 odd">
	<th class="column-1"></th><th class="column-2">B1</th><th class="column-3">B8</th><th class="column-4">B16</th><th class="column-5">B16R</th><th class="column-6">Editorial</th><th class="column-7">B16R vs Ed</th>
</tr>
</thead>
<tbody class="row-hover">
<tr class="row-2 even">
	<td class="column-1">03</td><td class="column-2">4.576205</td><td class="column-3">0.900688</td><td class="column-4">0.515656</td><td class="column-5">0.032629</td><td class="column-6">0.164616</td><td class="column-7">5.05</td>
</tr>
<tr class="row-3 odd">
	<td class="column-1">04</td><td class="column-2">4.704736</td><td class="column-3">0.946557</td><td class="column-4">0.575980</td><td class="column-5">0.041863</td><td class="column-6">0.170677</td><td class="column-7">4.08</td>
</tr>
<tr class="row-4 even">
	<td class="column-1">05</td><td class="column-2">3.347541</td><td class="column-3">0.668534</td><td class="column-4">0.396330</td><td class="column-5">0.040929</td><td class="column-6">0.165247</td><td class="column-7">4.04</td>
</tr>
<tr class="row-5 odd">
	<td class="column-1">06</td><td class="column-2">4.699864</td><td class="column-3">0.956699</td><td class="column-4">0.588319</td><td class="column-5">0.050467</td><td class="column-6">0.162984</td><td class="column-7">3.23</td>
</tr>
<tr class="row-6 even">
	<td class="column-1">07</td><td class="column-2">5.791916</td><td class="column-3">1.167417</td><td class="column-4">0.698043</td><td class="column-5">0.063837</td><td class="column-6">0.178140</td><td class="column-7">2.79</td>
</tr>
<tr class="row-7 odd">
	<td class="column-1">08</td><td class="column-2">0.159862</td><td class="column-3">0.036540</td><td class="column-4">0.026027</td><td class="column-5">0.050608</td><td class="column-6">0.541531</td><td class="column-7">10.70</td>
</tr>
<tr class="row-8 even">
	<td class="column-1">09</td><td class="column-2">0.169632</td><td class="column-3">0.036569</td><td class="column-4">0.026848</td><td class="column-5">0.057554</td><td class="column-6">0.542238</td><td class="column-7">9.42</td>
</tr>
</tbody>
</table>
<!-- #tablepress-2 from cache -->
<p style="text-align: center;"><em>All tests: MacBook Pro Retina 15-inch Mid 2015 • 2.8 GHz i7 • Xcode 10B61 • Max Optimization • Loop Unrolling</em></p>
<p>B16R is roughly 3-5x faster than the editorial solution on files 3-7, and each of the test files completes in under 1/10th of a second. None of the long test files complete in under 1/10 of a second with the editorial solution, and two of them take a half second.</p>
<p>These changes did double the run times on test files 8 and 9. If this were a real world scenario with larger data sets it would be worth keeping track of repetition frequency while building the array for dnaV. At that point the code could decide whether or not to bother looking for repetitions in the search.</p>
<h3>Is There An Even Better Way?</h3>
<p>String matching is a well researched area of computer science. <a href="http://www-igm.univ-mlv.fr/~lecroq/string/index.html" target="_blank" rel="noopener">This web site</a> lists the major algorithms along with their strengths, weaknesses, and sample implementations in C. Most programmers will never need to implement one of these algorithms and will simply rely on library calls whenever they need to search a haystack for a needle of text. It&#8217;s still educational to look over the various approaches to a common problem and to understand how each one tried to improve performance.</p>
<p>Time permitting I hope to explore a few of these algorithms, and how well they handle this particular challenge, in a later blog post.</p>
<h3>Source Files</h3>
<ul>
<li><a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b1.c" target="_blank" rel="noopener">Solution B1</a></li>
<li><a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b8.c" target="_blank" rel="noopener">Solution B8</a></li>
<li><a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b16.c" target="_blank" rel="noopener">Solution B16</a></li>
<li><a href="https://www.taylordesign.net/downloads/code-optimization-examples/save-humanity/save_humanity_b16r.c" target="_blank" rel="noopener">Solution B16R</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/code-optimization/saving-humanity/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Restoring a Classic: The 1 GHz Titanium PowerBook G4</title>
		<link>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-1-ghz-titanium-powerbook-g4/</link>
					<comments>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-1-ghz-titanium-powerbook-g4/#comments</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Mon, 10 Apr 2017 03:24:22 +0000</pubDate>
				<category><![CDATA[Classic Macintosh]]></category>
		<category><![CDATA[Retrocomputing]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=1101</guid>

					<description><![CDATA[I had been shopping for one for a couple of months. The fastest PowerBook made that could boot Mac OS 9 without any modifications or hacks. I never saw one locally. And most of the examples on eBay had some flaw that I was unwilling to live with. Computers this old have generally been sold or passed down, and [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I had been shopping for one for a couple of months. <a href="http://www.everymac.com/systems/apple/powerbook_g4/specs/powerbook_g4_1.0.html" target="_blank" rel="noopener">The fastest PowerBook made that could boot Mac OS 9</a> without any modifications or hacks. I never saw one locally. And most of the examples on eBay had some flaw that I was unwilling to live with. Computers this old have generally been sold or passed down, and notebooks are particularly prone to rough handling by second hand owners.</p>
<p>There was of course the one that got away. A perfect example with everything intact, including the box and receipt, listed for $250 on eBay. In retrospect I should have jumped. I made a best offer that was rejected only to see the PowerBook sold at full price while I hesitated. So the search went on.</p>
<p>PowerBooks with broken hinges. PowerBooks with damaged screens. PowerBooks covered in bumper stickers. PowerBooks that were clearly not the model the eBayers thought they were. And PowerBooks that looked like their last job was at <a href="http://www.willitblend.com" target="_blank" rel="noopener">Blendtec</a>.</p>
<p><em>What does a man have to do to get a 12 year old computer any way?</em></p>
<p>And there it was, listed on eBay by a recycling center. No AC adapter, a nearly dead original battery, a dead Superdrive, and only 512MB of RAM. But otherwise in good physical condition, save a few scratches and scruffs, for a mere $50 and cheap shipping.</p>
<p>I was like a kid waiting for Christmas before that PowerBook arrived.</p>
<h3>First Impressions</h3>
<p>With the exception of the first <a href="http://lowendmac.com/1989/mac-portable/" target="_blank" rel="noopener">Mac Portable</a> Apple has generally been a step ahead of PC notebook manufacturers. The <a href="https://en.wikipedia.org/wiki/PowerBook_100_series" target="_blank" rel="noopener">first PowerBook trio</a> offered great screens, quality trackballs, and a keyboard forward design that would become standard in the world of notebooks. The <a href="https://en.wikipedia.org/wiki/PowerBook_Duo" target="_blank" rel="noopener">Duos</a> had docks that turned ultra light notebooks into full fledged desktop Macs with extra RAM, additional drives, and NuBus cards. Later on Apple would shave weight, explore new materials, and evolve their designs to the industry leading MacBooks we have today.</p>
<p>Unpacking the TiBook I could immediately appreciate both the quality of the design and the improvements Apple has made since then. The Titanium case feels very sturdy, much more so than plastic PC notebooks, but still not as solid as today&#8217;s unibody aluminum MacBooks. It&#8217;s thin and light as far as notebooks of the time period go, but heavy compared to Apple&#8217;s latest. The latching mechanism is cool if a bit delicate compared to the magnets used today. The keyboard is great. But the trackpad&#8230;the trackpad leaves a lot to be desired. Every tap click is a &#8216;thunk&#8217; and this is perhaps my one major disappointment in this model. It feels like a step back from the trackpad in a PowerBook PDQ, and pales in comparison to Apple&#8217;s best-of-class track pads today.</p>
<p>Track pad aside, this would have been the notebook to have in 2002.</p>
<p>As for my specific TiBook, the only real disappointment is that the screen has a line of light scruffs across the middle. Not too distracting. But you just cringe when you realize someone stored something between the screen and keyboard, and whatever it was had a surface rough enough to scruff the screen. <em>What are people thinking when they do stuff like this?</em> It&#8217;s just annoying enough that I might take on the task of replacing the screen with another one off eBay.</p>
<p>I can&#8217;t complain for $50. RAM is cheap, a new Superdrive is cheap, and the only thing that scares me about the screen is the possible work involved replacing it should I decide to.</p>
<h3>Initial Upgrades</h3>
<p>I didn&#8217;t order RAM when I ordered the TiBook (should have), but I did have a spare 64GB KingSpec PATA SSD on hand. At one point I tried putting this in my <a href="http://lowendmac.com/1998/pdq-powerbook-g3-series-ii/" target="_blank" rel="noopener">PowerBook PDQ,</a> but that PowerBook wasn&#8217;t happy with it for some strange reason.</p>
<p>That&#8217;s OK because the TiBook loves it. I prepared the drive on another Mac with Mac OS X Tiger and the <a href="http://macintoshgarden.org/apps/mac-os-922-system-folders" target="_blank" rel="noopener">Mac OS 9.2.2 System Folder</a> that the TiBook requires, and then installed it.</p>
<h3>Mac OS Classic Never Felt So Good</h3>
<p>Having spent a lot of time recently restoring and playing with older classic Macs I wasn&#8217;t prepared for what a TiBook on a SSD would feel like. With some caveats this machine feels as snappy and fast running Mac OS 9 as my MacBook Pro feels running Mac OS X.</p>
<p>Sometimes faster. Office 2001 launches instantly where the latest and greatest takes 3-4s on a MBP. The apps themselves also feel snappier in use. (Come on Microsoft! I realize later software has more features. But given the vast difference in hardware your latest version really shouldn&#8217;t lose this race.)</p>
<p>To Adobe&#8217;s credit their latest version of Photoshop on a MBP launches a bit faster than Photoshop 7 on the TiBook. And of course image processing is something that&#8217;s going to exercise the CPU hard, meaning a 1 GHz G4 has no chance in a race against a Core i7. Still, Photoshop 7 is very responsive, and editing an image on the TiBook isn&#8217;t terrible unless you try working with larger files.</p>
<p>The web? <a href="http://www.floodgap.com/software/classilla/" target="_blank" rel="noopener">Classilla</a>, which was a disappointment to me on the older 60x Power Macs and even the PowerBook PDQ, runs very well on the TiBook. So does <a href="http://www.floodgap.com/software/tenfourfox/" target="_blank" rel="noopener">TenFourFox</a> when booting Mac OS X. To be clear, rendering web pages is another area where the shear CPU and memory speed of a modern computer means the TiBook has no shot at winning. By comparison to a Core 2 Duo or higher the web is sluggish. But not painfully so like on the PDQ. Flash apps aside, you could actually spend the day web browsing on a TiBook and TenFourFox.</p>
<p>Heck, a student on a tight budget could do real work on this machine.</p>
<p>Part of this is no doubt thanks to the SSD. I didn&#8217;t spend much time using the TiBook with the HDD. But from what I did see the SSD made a large difference in performance despite the limitations of the IDE interface. Suffice it to say I never experienced speed like this back when Mac OS 9 was current. My fastest OS 9 machines back in the day were the Power Mac G3 and a 333 MHz Blue iMac. When I moved to a G4 I moved to OS X and never looked back until now.</p>
<h3>Those Caveats</h3>
<p>So when does the TiBook not feel fast and responsive like a modern computer?</p>
<p>I&#8217;ve already mentioned the obvious case: when the task at hand really exercises modern hardware. The smaller apps and lighter OS mean that the G4+SSD can feel as fast as a modern computer for lightweight stuff. But it&#8217;s really not and that shows with heavy processing.</p>
<p>The other caveat is that there is a single processor in the TiBook, and Mac OS 9 has cooperative multitasking. So there are hiccups and pauses of the kind which have been nearly eliminated with multiple cores and preemptive multitasking. You can be humming along and get a watch cursor for a few seconds for no apparent reason other than some programmer in the past did not yield enough time back to the OS. You almost never see this on a modern Mac, even when running Windows in a virtual machine at the same time. On a modern Mac a single program may give you the beach ball, but everything else remains very responsive.</p>
<h3>Should You Buy One?</h3>
<p>If you&#8217;re interested in running Mac OS 9 and old Macintosh applications then the 867 MHz and 1 GHz G4 TiBooks are two of the computers I recommend. Max out their RAM, drop in a SSD, and you will be hard pressed to find a faster way to run OS 9 apart from emulation. SheepShaver is good but has its own challenges and compatibility issues.</p>
<p>Another option would be a G4 tower. A dual G4 Power Macintosh scores higher on GeekBench but only because the score includes both processors. Very few classic applications can take advantage of more than one processor or core. The PowerBooks are a lot smaller, lighter, and quieter. Nothing against the G4 towers if you have the space and want one, but for most people playing around with old apps I think a PowerBook is just more convenient. Plus it can serve double duty as a second gaming machine or web browser on a trip. Granted that may seem silly at a time when every kid has a tablet, but in the TiBook&#8217;s defense it has a real keyboard.</p>
<h3>Is a SSD Worth It?</h3>
<p>If you&#8217;re going to spend any significant time on a classic Mac I think the G4 Macs are at the level where a SSD is worth it.</p>
<p>I would probably recommend an <a href="http://eshop.macsales.com/shop/SSD/OWC/Mercury_Legacy_Pro" target="_blank" rel="noopener">OWC Legacy Pro SSD</a> over a KingSpec. They are over provisioned and the SandForce controller is better at wear leveling and maintaining write speeds over time. But as you can tell from my review the KingSpec SSDs are not bad at all, and they&#8217;re a lot cheaper. I can certainly recommend them as well.</p>
<p><strong><a href="http://www.zdnet.com/article/solid-state-disks-lose-data-if-left-without-power-for-just-a-few-days/" target="_blank" rel="noopener">Keep in mind that all SSDs will eventually lose their data if powered off for a long enough period of time.</a></strong> That period of time will vary based on the drive model and storage conditions. For this reason I backup and archive all of my SSDs to external HDDs.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-1-ghz-titanium-powerbook-g4/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Of Bits &#038; Strings</title>
		<link>https://www.taylordesign.net/code-optimization/of-bits-and-strings/</link>
					<comments>https://www.taylordesign.net/code-optimization/of-bits-and-strings/#comments</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Mon, 06 Mar 2017 06:32:55 +0000</pubDate>
				<category><![CDATA[Code Optimization]]></category>
		<category><![CDATA[bit count]]></category>
		<category><![CDATA[bitwise]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[code challenges]]></category>
		<category><![CDATA[HackerRank]]></category>
		<category><![CDATA[of bits and strings]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=4066</guid>

					<description><![CDATA[Lately I&#8217;ve been addicted to solving challenges at HackerRank.com. I decided early on that I wanted to solve the majority of Algorithm challenges in C. I spend so much time in higher level languages that I&#8217;ll generally jump at the chance to work closer to the machine. Sometimes this can be frustrating because you have [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Lately I&#8217;ve been addicted to solving challenges at <a href="https://www.hackerrank.com/" target="_blank">HackerRank.com.</a> I decided early on that I wanted to solve the majority of <a href="https://www.hackerrank.com/domains/algorithms/warmup" target="_blank">Algorithm</a> challenges in C. I spend so much time in higher level languages that I&#8217;ll generally jump at the chance to work closer to the machine. Sometimes this can be frustrating because you have to do heavy lifting where a higher level language hands you the perfect class or set of functions.</p>
<p>But sometimes&#8230;sometimes it can be very rewarding.</p>
<h3>The Challenge</h3>
<p><a href="https://www.hackerrank.com/challenges/acm-icpc-team" target="_blank">The ACM ICPC Team</a> challenge starts off with two numbers. N is the number of people at a conference, and M is the number of topics that the people can know about. The input then consists of N strings with M characters in each string. Each character is a 0 or a 1. The idea is that there&#8217;s a line for each person and a character position for each topic. 1 means the person is well versed in the topic, and 0 means they are not. The goal is to find the maximum number of topics any two person team is well versed in, and the count of teams that hit the max.</p>
<p>When I read the challenge my mind ran straight to a specific solution, and I never even considered another approach. After I submitted my solution and got the points I read both the editorial and the discussion. And I was rather surprised at what I found.</p>
<h3>You Can Do Better Than O(n^3)</h3>
<p>The editorial states that this is a brute force problem with O(n^3) complexity. The C++ code example uses three nested loops to compare every character of every pair of strings, each string stored in a vector.</p>
<p>The PHP example takes advantage of the fact that you can bitwise OR two strings to eliminate a loop. But internally there&#8217;s still a character by character operation to produce a new string, followed by another character comparison of the result to count the 1&#8217;s. So this solution merely hides the O(n^3) complexity behind language functions.</p>
<p>And finally the Python example converts the strings to integers and does a bitwise OR, but then converts the result back to a string to count the 1&#8217;s. The Python code actually touches on an important point, but the potential speed gain gets lost in Python itself.</p>
<p>Surprised by the inefficiency of these solutions I clicked over to the discussions tab.</p>
<h3>Nobody Saw It?</h3>
<p>I skimmed the comments going back two years. Aside from the normal <em>&#8220;why doesn&#8217;t my code work?&#8221;</em> posts, there were numerous complaints about timeouts. And numerous code postings that squeaked in under the finish line, but took similar approaches to the editorial: O(n^3) value comparisons or counting 1&#8217;s in a string which was the result of a bitwise OR.</p>
<p>There were a handful of more creative approaches involving Java&#8217;s BitSet (slow) or a 2D array of integers (not bad, but still).</p>
<p>Right before giving up on loading more comments I came across another C solution which was comparable to mine in its approach and speed. But for all the interest expressed in the discussion about faster ways to solve the puzzle, nobody paid much attention to the post or the reason why it was insanely fast.</p>
<p>I was shocked by this point because when I wrote my solution I didn&#8217;t think of it as being unique or special. I assumed the editorial samples would include a similar approach, along with many of the user submissions.</p>
<h3>Let The CPU Do Its Job</h3>
<p>The challenge input is simply a collection of bits represented as human readable characters in the 8-bit ASCII set. Yet almost no one reduced the data to a form that naturally fits the CPU.</p>
<p>The help section mentioned bitwise OR as did people in the discussion trying to help those with code that was timing out. <em>But the majority were using bitwise OR on the individual ASCII characters from the string.</em> In some cases literally, one character pair at a time. Others applied bitwise OR to multiple characters in a single operation, but they were still using 8-bits in memory to represent a single bit of the problem.</p>
<p>By analogy, if you compare two topic characters from the string at a time you are only using 1 lane of a 64 lane highway. If you bitwise OR 8 of the topic characters at a time you&#8217;re doing better, but still only using 8 lanes of a 64 lane highway.</p>
<p><a href="https://www.taylordesign.net/downloads/code-optimization-examples/fast_acm_icpc_team_solution.txt" target="_blank">The solution I wrote?</a></p>
<ul>
<li>calloc a properly sized block of memory based on the inputs.</li>
<li>Use strtoul to convert the base 2 strings, in chunks determined by sizeof, to unsigned long ints placed into the memory block. Each 0 and 1 character becomes a single bit in memory. On 64-bit CPUs unsigned longs are 8 bytes and can store 64 topic flags.</li>
<li>Loop through the two person teams in O(n^2).</li>
</ul>
<p>The key differences?</p>
<ul>
<li>The CPU is performing bitwise OR operations at its natural word size on a data structure with no waste. For a 64-bit system that means the topics of a two person team are merged with a single instruction for every 64 topics. It also means the code which replaces the innermost loop in the brute force approach performs with a fraction of the loop overhead.</li>
<li>The data describing each person&#8217;s topics is compressed by a factor of 8 meaning the CPU has less data to move and less chance of a cache miss.</li>
<li>With a <a href="https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable" target="_blank">fairly simple algorithm</a> you can reduce the act of counting the bits to a handful of instructions for the CPU. And in Xcode at least, __builtin_popcountl implements an even faster algorithm for you.</li>
</ul>
<p>The end result? On test case 7 with 500 people and 500 topics the editorial Python solution took 0.881728 seconds, as tested on my MacBook Pro. The editorial C++ solution took 0.401785 with the same Xcode compiler settings as my solution.</p>
<p>My solution? 0.002911 seconds. 138x faster than the C++ sample. And 303x faster than the Python sample.</p>
<p>Sometimes it pays to be close to the machine.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/code-optimization/of-bits-and-strings/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Just Stop: Faceless CPU Hogs</title>
		<link>https://www.taylordesign.net/it-annoyances/just-stop-faceless-cpu-hogs/</link>
					<comments>https://www.taylordesign.net/it-annoyances/just-stop-faceless-cpu-hogs/#respond</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Sun, 26 Feb 2017 23:58:31 +0000</pubDate>
				<category><![CDATA[IT Annoyances]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=641</guid>

					<description><![CDATA[It never fails. Right when you need your notebook to perform and be trouble free the most. It could be a meeting. A client demonstration. Or you could be in a panic trying to remotely fix some server that&#8217;s down. And that&#8217;s when it starts. The fans spin up. The computer slows to a crawl. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>It never fails. Right when you need your notebook to perform and be trouble free the most. It could be a meeting. A client demonstration. Or you could be in a panic trying to remotely fix some server that&#8217;s down.</p>
<p>And that&#8217;s when it starts.</p>
<p>The fans spin up. The computer slows to a crawl. And your attention is diverted from the thing you need to be focused on to the thing you should never have to think about: a background process.</p>
<p>Some installer, updater, indexer, antivirus check, disk check, or other ridiculous piece of software decides that now is the time to shove the peddle to the metal and finish an irrelevant background task. TrustedInstaller.exe, svchost.exe, SearchIndexer.exe, and yes, even on Macs, mdsworker.</p>
<p>This post is directed at every single software engineer involved with projects that have background tasks. Especially the people behind Microsoft&#8217;s infuriating software updaters and that stubborn Google Chrome updater.</p>
<h3>Faceless Apps</h3>
<p><strong>If it&#8217;s faceless then I do not care how long it takes to complete. Period.</strong></p>
<ul>
<li>Your task should not run if the CPU is already under a medium to high load. That means I&#8217;m working.</li>
<li>You should not use more than about 20-30% of a CPU core. Not without my explicit permission.</li>
<li>Your task should generally not run when on battery power unless the user has authorized it to do so.</li>
<li>If your task is running and there is a spike in CPU usage from another process, pause your task until the CPU returns to near idle.</li>
<li>Always have an easy to find option for me to change the scheduling or turn off your background task.</li>
</ul>
<h3>In Your Face Apps</h3>
<p><strong>If it has a face then I care how long it takes to complete, but that&#8217;s no excuse to be a lazy coder.</strong></p>
<ul>
<li>Your task needs to have a pause and/or delay until later feature.</li>
<li>An updater should not prevent me from using the old version unless and until it is ready to swap in the new version, and that should take seconds. After which my work space (i.e. open windows) should be fully restored.</li>
<li>Pay attention to code efficiency. That means processor efficiency, energy efficiency, and memory footprint.</li>
</ul>
<p>I&#8217;m writing this while the Microsoft Office updater slams my fans to 6200 RPM and my CPU to 96C. There is <strong>absolutely no excuse</strong> for a file downloader to consume nearly all the resources of a dual core, 2.7 GHz i7 processor. Even checking file signatures and decompressing data should not be this intensive. I would likely fire someone for such grossly inefficient code, yet this seems to be the norm across Microsoft&#8217;s latest OSes and products.</p>
<h3>Something Better</h3>
<p>I&#8217;ve lost track of how many times I&#8217;ve forcibly shutdown some stupid background process and ripped its guts off a computer. You can imagine my fury when a few weeks later I find the same ridiculous thing back in the same place doing the same thing. (I&#8217;m looking at both the developers of the Chrome updater and the developers of the GitHub desktop tool&#8217;s background app.)</p>
<p>In the 1990&#8217;s the big issue was updating consumer OSes with memory protection so that applications could not crash one another. I think the next big issue should be modifying consumer OSes so that end users have a clear idea of what&#8217;s running on their computers and why. And so that they can explicitly set limits on the resources used by their applications, limits managed and imposed by the OS itself. I&#8217;m focusing on CPU resources in this article, but this should extend to network and data access. Should anyone in the Linux, macOS, or Windows communities decide to pursue such improvements, here&#8217;s a wish list:</p>
<ul>
<li>Cryptic background process names should not be allowed. Show a list of clear names and vendors with short descriptions and code sign verifications. An average user should immediately understand what a task is for and therefore what it needs. And they should be assured it&#8217;s not malware posing as legitimate software.</li>
<li>All&#8230;and I do mean all&#8230;scheduled and background tasks need to be presented to the end user via a single UI, and the end user needs to have full control. No hidden startup areas in the OS. (Windows is a terrible offender of this, but even on macOS you can get a process to launch outside of the areas a user might check.)</li>
<li>The user needs to be able to set explicit limits on CPU use, memory use, scheduling, data access, and network use. CPU use should include power use limitations. Again, this needs to be enforced by the OS. Right now none of the major OSes have a good way to manage CPU time. They&#8217;re preemptive, but a process can still elevate its priority to the point of freezing the machine. Most programs won&#8217;t go so far as to elevate their priority and risk freezing the machine&#8230;I could work on this blog post while the MS Office updater tried to fry an egg on my CPU&#8230;but they will consume everything they can regardless of your battery or your other work.</li>
<li>Network access that is not in response to an explicit user request needs to be visible to the user. This means all code which checks for updates or phones home. And the user should be able to block it without ill effect. Of course we can&#8217;t expect this on <a href="http://arstechnica.com/information-technology/2015/08/even-when-told-not-to-windows-10-just-cant-stop-talking-to-microsoft/" target="_blank">Windows botnet</a> any time soon, but Apple would only strengthen their reputation by making this part of their app guidelines.</li>
</ul>
<p>Governments, corporations, and engineers are becoming increasingly arrogant in how they treat user data, time, and resources. It needs to end. Let&#8217;s hope OS vendors&#8230;Apple and the Linux community at least&#8230;give us aggressive tools at the OS level to stop some of this nonsense.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/it-annoyances/just-stop-faceless-cpu-hogs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A Response To The Mythical Road Apple</title>
		<link>https://www.taylordesign.net/classic-macintosh/a-response-to-the-mythical-road-apple/</link>
					<comments>https://www.taylordesign.net/classic-macintosh/a-response-to-the-mythical-road-apple/#respond</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Thu, 03 Nov 2016 21:23:06 +0000</pubDate>
				<category><![CDATA[Classic Macintosh]]></category>
		<category><![CDATA[Retrocomputing]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Performa]]></category>
		<category><![CDATA[Power Macintosh]]></category>
		<category><![CDATA[PowerPC]]></category>
		<category><![CDATA[Vintage Computing]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=3416</guid>

					<description><![CDATA[Recently ClassicHasClass of TenFourFox fame replied to my post The Mythical Road Apple. Apparently he found my post while trying to find out who had edited the Wikipedia page about the Performa 6200. For the record, I was indeed the one who edited that page. After publishing The Mythical Road Apple I edited the x200 related pages on Wikipedia to remove [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Recently ClassicHasClass of <a href="http://www.floodgap.com/software/tenfourfox/" target="_blank">TenFourFox</a> fame <a href="http://tenfourfox.blogspot.com/2016/09/and-now-for-something-completely.html" target="_blank">replied</a> to my post <a href="https://www.taylordesign.net/classic-macintosh/the-mythical-road-apple/" target="_blank">The Mythical Road Apple.</a> Apparently he found my post while trying to find out who had edited the <a href="https://en.wikipedia.org/wiki/Power_Macintosh_6200" target="_blank">Wikipedia page about the Performa 6200.</a></p>
<p>For the record, I was indeed the one who edited that page. After publishing The Mythical Road Apple I edited the x200 related pages on Wikipedia to remove inaccurate motherboard information; add accurate text about the same; and replace <a href="http://lowendmac.com" target="_blank">Low End Mac&#8217;s</a> links with <a href="https://cdn.preterhuman.net/texts/computing/apple_hardware_devnotes/PowerMac%205200-6200.pdf" target="_blank">a link to Apple&#8217;s technical note</a> at the original location where I found it.</p>
<p>With that out of the way I&#8217;ll take a moment to respond to the <a href="http://tenfourfox.blogspot.com/2016/09/and-now-for-something-completely.html" target="_blank">post by ClassicHasClass.</a></p>
<h3>A Tale of Two Computers</h3>
<p>One thing which may have gotten lost in all the technical detail of my article is that <strong>603</strong> based x200 Macs and <strong>603e</strong> based x200 Macs behaved like completely different machines. Invariably when you read end user complaints about the x200 series the complaints are about a 603 based model.</p>
<p>The Low End Mac articles treat all of the models the same and attribute any issues to the motherboard. Discrepancies which were reported by readers back then, such as good performance with later models or higher than 9,600 baud serial port speeds, were hand waved as improvements to Mac OS.</p>
<p>Naturally ClassicHasClass does not make any of the technical errors that Low End Mac makes in their articles. The guy knows his stuff. And his technical critiques of the motherboard are valid. While the motherboard was nothing like the descriptions at Low End Mac, it was indeed &#8216;less than ideal.&#8217; A board for a 68K processor evolved to host a PowerPC.</p>
<p>The problem is he places too much emphasis on the motherboard. At the end of the day it didn&#8217;t make much difference in the performance of the 603e based models versus contemporary Power Macs. And that forces us to the conclusion that it was not the motherboard which hampered 603 based models, but the 603 itself.</p>
<p>Among other old Macs I have both <a href="https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-macintosh-performa-6300cd/" target="_blank">a fully restored 6300</a> and <a href="https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-power-macintosh-610066-dos/" target="_blank">a fully restored 6100/66 DOS</a> with the 256K L2 cache card. The Power Mac 6100 has a 64-bit path to main memory and extensive DMA support, yet it&#8217;s neither faster nor more responsive. The Performa 6300 achieves higher networking speeds even with System 7.5. The 6300 and 6100 are responsive under the same circumstances, sluggish under the same circumstances, and they freeze under the same circumstances. When sluggish or frozen the 6300 just finishes its tasks and becomes responsive again in less time.</p>
<p>The thing that ClassicHasClass spends a good deal of time discussing, controller DMA, was no panacea for Mac OS classic&#8217;s cooperative multitasking. Likewise, if a 6300 and 6100 have comparable responsiveness under load but a 6200 is worse, then the difference is not due to DMA.</p>
<h3>The Long List of Faults</h3>
<p>I was surprised to see ClassicHasClass link to Dan Knight&#8217;s <a href="http://lowendmac.com/2014/power-mac-and-performa-x200-road-apples/" target="_blank">Power Mac and Performa x200, Road Apples.</a> Mr. Knight&#8217;s article was a rehash of Mr. Barber&#8217;s flawed piece. The Mythical Road Apple was intended to completely debunk both. There is not a single factual claim in Mr. Knight&#8217;s entire article, with the possible exception of certain comm and PDS cards disabling a corresponding serial port.</p>
<p>I realize that last paragraph might seem harsh. I want to be clear that I have the utmost respect for Mr. Knight, the web site he runs, and the many informative articles he has published. (Likewise for ClassicHasClass and the <a href="http://www.floodgap.com/software/tenfourfox/" target="_blank">TenFourFox</a> project.) <a href="http://lowendmac.com" target="_blank">Low End Mac</a> has been an invaluable resource to the Apple community for years. But Mr. Barber got some bizarre misinformation about the x200 line back in the day, and that misinformation propagated throughout Low End Mac discussions about the machines.</p>
<h3>The Speed Penalty</h3>
<p><em>&#8220;A 20-25% speed penalty (his numbers), however, is not trivial and I think he underestimates how this would have made the machines feel comparatively in practice even on native code.&#8221;</em></p>
<p>The 6300 feels very much like an 8100/80 and is noticeably faster than a 6100/66. It&#8217;s fair to point out that the Performa 6300 has a 100 MHz processor yet feels like a Power Mac with an 80 MHz processor. Clearly the less than optimal motherboard design prevents the 603e from reaching its full potential. Never the less it does not feel <em>slow</em> for computers of that time period.</p>
<p>It was a consumer machine sold at a consumer price. For half the price of an 8100/80 the consumer got a machine with comparable performance along with monitor, keyboard, mouse, and software. If Apple had to recycle the 630 motherboard to make that price/performance point happen then it was worth it.</p>
<h3>DMA Support</h3>
<p><em>&#8220;His article claims that both the SCSI bus and the serial ports have DMA, but I don&#8217;t see this anywhere in the developer notes (and at least one source contradicts him).&#8221;</em></p>
<p>To the best of my knowledge the chips being used supported DMA. But Apple did not always make use of available hardware support for DMA. And it appears from ClassicHasClass&#8217;s source that they did not in this case.</p>
<p><em>&#8220;Although Daniel states that relaying traffic for an Ethernet card &#8216;would not have impacted Internet handling&#8217; based on his estimates of actual bandwidth, the real rate limiting step here is how quickly the CPU, and by extension the OS, can service the controller.&#8221;</em></p>
<p>This is true. But given the clock speed and performance of the PowerPC 603/603e servicing the controller would only be an issue under an extreme processor load. Otherwise 10 Mbps would be child&#8217;s play for these processors. Even with DMA an extreme load would affect throughput given the cooperative multitasking of Mac OS. Whatever scenario you wish to set up the ultimate problem is software, and DMA only gives you a little bit more wiggle room before throughput falls due to irregular task switching and limited interrupt handling. This is one of those places where I agree with ClassicHasClass&#8217;s critique, but disagree in regard to how much it matters in the grand scheme of things.</p>
<p>Again I&#8217;ll point out that the 6300 is not slower than comparable Power Macs when it comes to networking or the Internet. Even when running System 7.5 with MacTCP my 6300 downloads data faster than my 6100. Therefore Mr. Barber&#8217;s assertion that the x200 line had terrible performance in these areas due to lack of DMA for Ethernet and serial port transfers cannot be true. If the 6200 was slow on the Internet&#8230;and I imagine it was&#8230;it was due to L1 cache thrashing by the 68K emulator while different parts of the OS, some PowerPC and some 68K, had to be executed over and over with each data transfer.</p>
<h3>Fewer Problems?</h3>
<p><em>&#8220;Compare this design with the 9500&#8217;s full PCI bus, 64-bit interface and hardware assist: even though the 9500 was positioned at a very different market segment, and the weak 603 implementation is no comparison to the 604, that doesn&#8217;t absolve the 6200 of its other deficiencies and the 9500 ran the same operating system with considerably fewer problems&#8230;&#8221;</em></p>
<p>The issue I have with this comparison is that Power Macs with processors comparable to 5300/6300 Performas did not run Mac OS classic with considerably fewer problems. They ran it about the same despite having 64-bit buses to main memory and full DMA support. This points to faster CPUs being the main reason why later models experienced smoother operation. It may also point to improvements made when Apple moved from NuBus to a PCI architecture.</p>
<h3>Stand By Your Performa</h3>
<p>While I agree with many of ClassicHasClass&#8217;s points, I stand by my original assessment that the 603e based Performas were good consumer machines for the time. He is absolutely correct in his assessment that the motherboard was not the best it could be. But the price was also not the worst it could be. And while this resulted in a <em>slower</em> machine than otherwise could of been, it did not result in a <em>slow</em> machine relative to the Mac lineup of the time.</p>
<p>Likewise, I still say the performance issues with the 603 based models would have been almost entirely due to the 16KB L1 cache. The 603e models ran fine and there&#8217;s no other relevant physical difference between the two.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/classic-macintosh/a-response-to-the-mythical-road-apple/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Restoring a Classic: The Power Macintosh 6100/66 DOS</title>
		<link>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-power-macintosh-610066-dos/</link>
					<comments>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-power-macintosh-610066-dos/#respond</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Tue, 10 May 2016 23:44:20 +0000</pubDate>
				<category><![CDATA[Classic Macintosh]]></category>
		<category><![CDATA[Retrocomputing]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Power Macintosh]]></category>
		<category><![CDATA[PowerPC]]></category>
		<category><![CDATA[Vintage Computing]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=1099</guid>

					<description><![CDATA[&#8220;Are you interested in any other old Macs?&#8221; Upon hearing those words I knew I was in trouble. I was in a small electronics thrift store, part of a local recycling center that tries to sell whatever will still power on. I was there to pickup a Macintosh LC II advertised for $20. Normally LC II&#8217;s go [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><em>&#8220;Are you interested in any other old Macs?&#8221;</em></p>
<p>Upon hearing those words I knew I was in trouble.</p>
<p>I was in a small electronics thrift store, part of a local recycling center that tries to sell whatever will still power on. I was there to pickup a Macintosh LC II advertised for $20. Normally LC II&#8217;s go for a bit more, but they did not have the monitor adapters, keyboards, or mice required to see if the unit worked beyond the startup chime.</p>
<p>I was about to walk out with more than just an LC II.</p>
<p>The salesman brought out two Macs: a Power Mac G5 which I will cover in a later post, and a Power Macintosh 6100/66 DOS. Naturally the G5 could use a DVI monitor and USB keyboard so he showed me that it was in working condition. The 6100 was in the same spot as the LC II: all I knew was that it had a happy startup chime.</p>
<p>I pulled off the 6100 cover and found that the hard drive was gone. But the CD, floppy, RAM, L2 cache, and DOS card were all there.</p>
<p>I made an offer on all three, and walked out thinking &#8220;where am I going to put this stuff?&#8221;</p>
<h3>Rest in Peace</h3>
<p>The LC II turned out to be a bust. While it had the happy Mac chime in the store, at home it would alternate between happy chime, sad chime, and an angry machine gun sound as if to warn me against disturbing dead computers. The ADB port wouldn&#8217;t work even when the Mac managed to boot from a floppy. The hard drive appeared dead, but then worked fine when I attached it to another Mac with an older SCSI port.</p>
<p>I pulled the 80MB SCSI drive and sent this one back to the recycling center.</p>
<h3>Two Out of Three Ain&#8217;t Bad</h3>
<p>The other two worked fine. I had an old 350MB SCSI drive to put in the 6100 so I went to work on it first.</p>
<ul>
<li>I took the 16MB DIMM leftover from my <a href="https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-macintosh-performa-6300cd/" target="_blank">6300CD upgrade</a> and installed it in the DOS card.</li>
<li>I installed System 7.5 from a CD.</li>
<li>The CD did not have the components for the DOS card, so I downloaded and installed the software from <a href="http://macgui.com/" target="_blank">Mac GUI</a>.</li>
</ul>
<p>Without the special cable that lets you switch between Mac and DOS modes there was no good way to test the card. The PC Setup software reported that it was working, but I was done until I could hit <a href="http://www.ebay.com/" target="_blank">eBay</a> and <a href="http://frys.com/" target="_blank">Fry&#8217;s</a> for more upgrades. Which I of course did the next day.</p>
<ul>
<li><a href="http://frys.com/product/7852839?site=sr:SEARCH:MAIN_RSLT_PG" target="_blank">Fry&#8217;s sells a 3.6 volt lithium battery</a> that works as a PRAM battery replacement in many Macs, so that came first.</li>
<li>I got the cable I needed with a couple days <a href="http://stores.ebay.com/macdealz?_trksid=p2047675.l2563" target="_blank">thanks to a great eBayer.</a></li>
<li>With the cable I could confirm that the DOS card worked, so I downloaded DOS 6.22 and Windows 3.1 from the web and installed both.</li>
<li>I got another VGA monitor adapter so that I wouldn&#8217;t have to share the one on my 6300.</li>
<li>Next up was a Farallon 10baseT Ethernet transceiver.</li>
<li>Finally I received and installed two 128MB SIMMs for a total of 264MB of RAM (8MB is on the board). <a href="http://www.kan.org/6100/RAM.html" target="_blank">You can actually have up to 520MB of RAM in a 6100,</a> but 256MB SIMMs are rather rare and expensive even today.</li>
</ul>
<h3>6100/66 Test Drive</h3>
<p>Much like the 6300, the 6100 is surprisingly usable given the age of the equipment. System 7.5 is fairly quick. Office type applications run well. But anything Internet related ranges from unusably slow to literally unusable. Some sites are still accessible if you&#8217;re willing to wait and suffer a less than perfect rendering, but this is not a machine you can use to browse the modern web.</p>
<p>DOS and Windows 3.1 seem to run well enough. Apple&#8217;s implementation, which allows you to switch screens based on a hot key and share peripherals like the floppy drive, works flawlessly.</p>
<h3>File Sharing</h3>
<p>It&#8217;s interesting to try and get these networked Macs to see each other via AFP.</p>
<ul>
<li>My modern MacBook Pro can share files with and remote control the G5 tower.</li>
<li>The PowerBook PDQ can mount shares from the G5 tower.</li>
<li>The 6300 OS 9 partition can access the personal file sharing folder on the G5. But it cannot access any other folders that are shared.</li>
<li>The 6100 on System 7.5 can&#8217;t see anything from the G5, but can see shared folders on the PDQ.</li>
</ul>
<p>Basically the PowerBook PDQ is acting like a bridge for the 6100. I can download something from Macintosh Garden or Mac GUI on the G5; grab it on the PDQ and move it to a specific folder; then download it from the PDQ to the 6100.</p>
<h3>Should You Get One?</h3>
<p>Much like with the 6300, if you want to run classic Macintosh games and applications your best bet is to pickup a G4 PowerBook, iMac, or tower that is capable of booting OS 9. If you just want to run classic apps then a G5 with Tiger will be even faster, but beware that compatibility is not 100%, especially with games.</p>
<p>Modern virtual machines will run a lot of old Windows stuff including Windows 3.1, so if that&#8217;s your interest you may not even need an old computer, much less an old Mac with a DOS card. SheepShaver isn&#8217;t as polished as the commercial PC emulators, but it may satisfy your curiosity if you want to play with Macintosh abandonware.</p>
<p>Still the 6100/66 DOS holds a unique place in Macintosh history as one of the few classic Macs Apple shipped with a literal Windows PC inside. Macs today use Intel processors which means virtual machines can run Windows at full speed. And the Mac is so popular with so many applications that few of us even need Windows.</p>
<p>But back then there was a lot of software which was PC only. Niche categories had few or no comparable offerings on the Mac. There was SoftWindows, but it had to emulate an x86 processor. While impressive it was quite slow compared to a real PC. And it couldn&#8217;t run some software at all.</p>
<p>If you&#8217;re nostalgic for one of these machines you can still find them cheap online. The only problem is that they use what are now rare 50 pin SCSI hard drives. If you&#8217;re going to restore and play with a SCSI drive Mac from this era or earlier, make sure the unit you buy comes with a big enough drive. Another option is the <a href="http://www.codesrc.com/mediawiki/index.php?title=SCSI2SD" target="_blank">SCSI-2-SD</a> card. I&#8217;m looking to add one to this 6100 and will post a review once I do.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-power-macintosh-610066-dos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Catching Stealthy Web Site Hacks</title>
		<link>https://www.taylordesign.net/it-security/catching-stealthy-web-site-hacks/</link>
					<comments>https://www.taylordesign.net/it-security/catching-stealthy-web-site-hacks/#respond</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Wed, 04 May 2016 09:00:57 +0000</pubDate>
				<category><![CDATA[IT Security]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=1863</guid>

					<description><![CDATA[&#8220;Grab my iPad and lookup this web site.&#8221; My friend&#8217;s iPad was sitting next to me so I grabbed it, performed a quick Google search, and clicked the first link. Nothing that doesn&#8217;t happen millions of times a day. Only I didn&#8217;t land on the site we were looking for. I landed on a page with [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><em>&#8220;Grab my iPad and lookup this web site.&#8221;</em></p>
<p>My friend&#8217;s iPad was sitting next to me so I grabbed it, performed a quick Google search, and clicked the first link. Nothing that doesn&#8217;t happen millions of times a day.</p>
<p>Only I didn&#8217;t land on the site we were looking for. I landed on a page with bright, flashing graphics claiming that I had won a free iMac. It wasn&#8217;t a popup. And the URL was clearly unrelated to the one I had clicked.</p>
<p>Puzzled I went back to Google to see if I had clicked an ad link by accident. I had not. The search produced the site my friend was talking about as the first result, and I had tapped that URL. I tapped it again and landed at the site we were looking for.</p>
<p><em>This isn&#8217;t right.</em></p>
<p>I opened Safari&#8217;s history and sure enough the redirect and scam site URL were still there. If it had been a Windows PC I would have assumed that it was infected by malware. But this was an iPad that had never been jail broken. Nothing is 100% secure, but the odds of malware on iOS are slim.</p>
<p>I pulled out my phone, made sure I was on the cell network to eliminate the possibility of a compromised router, and retraced my steps. Sure enough the first time I clicked the link I landed on a scam page. This time seizure inducing graphics let me know that my Flash plugin was out of date and needed to be updated. <em>On a device that cannot run Flash.</em></p>
<p>The next day I did more testing to determine the problem and contacted the web site owners.</p>
<h3>Hackers Are Getting Creative</h3>
<p>I won&#8217;t link to the site in question because I do not want to cause them any embarrassment, and they immediately corrected the problem after I contacted them. Basically their site had been compromised with redirect code on the home page. The malware would only redirect a visitor with no prior cookies for the domain. But it would allow the legitimate code to write cookies before performing the redirect. This way a first time visitor would be redirected. But a frequent visitor, or a person who tried a second time, would get through. (It doesn&#8217;t appear that a single cookie controlled this, i.e. the redirector itself was not writing a cookie.)</p>
<p>Doing this accomplishes several things:</p>
<ul>
<li>The site owners and regular visitors are unlikely to notice that anything is wrong.</li>
<li>Most first time visitors would assume one of the following:
<ul>
<li><em>This site is a scam site.</em> These visitors would likely never return.</li>
<li><em>This site has some advertising up front.</em> These visitors would likely hit reload and ignore what happened.</li>
<li><em>My PC has an issue.</em> These users might run a virus scan, but would never think that it was the web site and not their PC. Whatever the results of their virus scan, the second attempt would get through so they would assume the problem was solved.</li>
</ul>
</li>
</ul>
<p>In any case, since it effectively only happens once per new visitor, no one is likely to be annoyed enough to investigate the issue or complain to the site owners. And that means the exploit can sit unnoticed for months or even years.</p>
<h3>Detecting the Hackers</h3>
<p>If you have a web site it&#8217;s a good idea to have your site verified on a regular schedule, both to make sure that it&#8217;s running and to make sure that it has not been modified outside of your control. There are numerous automated solutions for this, but I&#8217;m hesitant to recommend one in this blog post because the best solution really depends on the site in question.</p>
<p><strong>The thing I do want to note is this:</strong> however you verify your site, you need to make sure that the site is verified as a brand new visitor would see it. This means a clean browser with no cached files or cookies from your site, possibly on a random IP that has not visited your site before. For automated solutions this means an application or service that can emulate a visit by a new user.</p>
<p>You should also utilize more than one service or technique to verify your site. Hackers are taking steps to make sure that frequent visitors do not see their handiwork and alert web site owners. It&#8217;s no stretch to assume that they have or will take steps to make sure that automated verification services can&#8217;t see their modifications.</p>
<p><strong>And that leads to my second note:</strong> a file integrity checker that runs directly on the server should be considered an important part of your site&#8217;s security in addition to any remote verification services. Such an application cannot tell you if your site is down for other reasons like a verification service can. But it can do something those services cannot. A hacker who exploits PHP, WordPress, or something else to gain write access to a file may write malicious code that does not appear to a frequent visitor or a site verification service. But those file changes should be noticed immediately by a process running on the server itself.</p>
<p>Again, I&#8217;m going to withhold product recommendations in this blog post. I will hopefully have time to review both remote and server based verification products in the near future.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/it-security/catching-stealthy-web-site-hacks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Restoring a Classic: The Macintosh Performa 6300CD</title>
		<link>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-macintosh-performa-6300cd/</link>
					<comments>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-macintosh-performa-6300cd/#respond</comments>
		
		<dc:creator><![CDATA[Daniel L. Taylor]]></dc:creator>
		<pubDate>Mon, 02 May 2016 15:49:42 +0000</pubDate>
				<category><![CDATA[Classic Macintosh]]></category>
		<category><![CDATA[Retrocomputing]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Macintosh]]></category>
		<category><![CDATA[Performa]]></category>
		<category><![CDATA[Power Macintosh]]></category>
		<category><![CDATA[PowerPC]]></category>
		<category><![CDATA[Vintage Computing]]></category>
		<guid isPermaLink="false">http://www.taylordesign.net/?p=757</guid>

					<description><![CDATA[In the middle of researching my article on Apple&#8217;s x200 series of Power Macintosh and Performa computers something dawned on me: I never sold my old Performa 6300CD. I gave it to my mom. She used it to browse the web and exchange emails for a few years, and then it ended up in storage. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In the middle of researching my article on <a href="https://www.taylordesign.net/classic-macintosh/the-mythical-road-apple/" target="_blank">Apple&#8217;s x200 series of Power Macintosh and Performa computers</a> something dawned on me: I never sold my old Performa 6300CD. I gave it to my mom. She used it to browse the web and exchange emails for a few years, and then it ended up in storage.</p>
<p>The next time I went for a visit I asked her about it. And I found it right where she said it was, sitting in a dusty box along with the keyboard, mouse, DB15 to VGA adapter, and a Supra 56k modem.</p>
<p>I grabbed it, brought it home, and carefully cleaned it inside and out. I didn&#8217;t think that it would start up. I figured either a component would be damaged by age or that the hard drive would be useless. But when I plugged it in it came right back to life, booting Mac OS 8 and starting up EarthLink dialer and <a href="http://macintoshgarden.org/search/node/emailer" target="_blank">Claris Emailer.</a></p>
<p>15+ years have passed since that Mac got tossed aside yet it started up like it was yesterday. If only everything was this reliable.</p>
<h3>Restoring a Classic Macintosh</h3>
<p>So what does a computer nerd think about when confronted with a digital antique?</p>
<p><em>Upgrades.</em></p>
<p>First thing I did was replace the PRAM battery with a <a href="http://stores.ebay.com/68kmacstore/" target="_blank">4.5v AAA case made by eBayer polaroid_pict and sold at his 68K Mac Store.</a> I highly recommend this case for Macs that used the Rayovac 4.5 volt battery. If you do buy one of these be sure to use lithium AAA batteries or low self discharge rechargeable batteries like those sold under the Eneloop brand. You don&#8217;t want alkaline batteries to leak like a faucet, especially if the Mac gets stored away again.</p>
<p>Second was installing a <a href="http://stores.ebay.com/68kmacstore/" target="_blank">Farallon LC PDS Ethernet card</a>. I got this from the 68K Mac Store as well. These Ethernet cards work great so long as you manually configure them. (The DHCP implementation is too old for modern routers.)</p>
<p>Third was upgrading the RAM. It already had 48MB (32MB+16MB) from a previous upgrade in the 90&#8217;s, but now it&#8217;s maxed out thanks to a second 32MB 72-pin SIMM from eBay. If you ever upgrade the RAM on one of these Macs see my note on installation below.</p>
<p>I also tried a 128MB SIMM just to see what would happen, but this particular model is limited to addressing 64MB of RAM no matter what you put in. In fact larger SIMMs will cause problems. The 6300 would boot with the 128MB SIMM but immediately experienced problems with screen redraws and soon crashed.</p>
<p>Finally I replaced the 1.2GB drive with a spare 40GB Maxtor drive. I partitioned it as follows:</p>
<ul>
<li>1GB Macintosh HD 91 &#8211; HFS+ for running <a href="http://macintoshgarden.org/apps/mac-os-91-91-update" target="_blank">Mac OS 9.1.</a></li>
<li>2GB Macintosh HD 75 &#8211; HFS for running the original <a href="http://macintoshgarden.org/apps/macintosh-os-751-update-10-751-520075-performa-631cd52xx62xx6300cd" target="_blank">System 7.5 that came with this Performa.</a> I gave this partition a little more space because System 7 cannot access HFS+ partitions.</li>
<li>1GB Macintosh HD 81 &#8211; HFS+ for running <a href="http://macintoshgarden.org/apps/macintosh-system-81-mac-os-81" target="_blank">Mac OS 8.1.</a></li>
<li>1GB Macintosh HD 86 &#8211; HFS+ for running <a href="http://macintoshgarden.org/apps/mac-os-85-851-update" target="_blank">Mac OS 8.6.</a></li>
<li>35GB Mac Drive &#8211; HFS+ for storing everything that does not need to run on System 7.</li>
</ul>
<p>You&#8217;ll note that all of the OS partitions are <a href="http://lowendmac.com/mail/mb07/1210.html" target="_blank">safely within the 8GB limit</a> for the IDE controller on this generation of Mac. Also: I have not personally tested all of the disc images linked above. I actually still have old CDs with most of these versions of Mac OS.</p>
<p>None of the <a href="http://lowendmac.com/video/lc/" target="_blank">PDS video cards</a> seem all that interesting for a Power Mac, so I doubt there will be any more upgrades unless I decide to grab an old TV card.</p>
<h3>Getting The RAM To Fit</h3>
<p>SIMMs with memory chips on both sides barely fit inside the 6300CD. I assume this would be true for the Performa 6320, any of the 6200 variants, and likely the 5200/5300 models as well. You have to remove the heat sink in order to install the 2nd SIMM. But the SIMM will clear the heat sink once installed.</p>
<p><strong>Never run the computer without the heat sink,</strong> even just to test the new RAM. When you reinstall the heat sink you need to clean off the old thermal paste and replace it with a similar amount of paste. I generally use Arctic Silver. The original paste was in a nice circle in the center of the CPU. You don&#8217;t have to have a perfect circle, just a small amount of paste covering the same area. My 16MB module only had chips on one side so I didn&#8217;t run into this back in the day. But I&#8217;m not sure if there are any 32MB modules available like that now, or how rare and costly they might be.</p>
<h3>6300CD Test Drive</h3>
<p>So how does an old Power Mac compare to modern machines?</p>
<p>Surprisingly well if you ignore the web. The Mac OS 9 Finder feels a bit sluggish but is definitely usable. Mac OS 8.x feels fine and System 7.5 is actually rather fast. Messing around with old apps I was pleasantly surprised at just how responsive the 6300 felt on any of the four OS partitions. The OS and office type applications feel perfectly usable even by today&#8217;s standards.</p>
<p>As I said in my rebuttal to the Road Apple articles, I do not recall this being a bad or slow computer. My impression back then was that it was a bit quicker than a 6100/60 with the L2 cache card, and about the same as an 8100/80, two Power Macs I spent significant time on. Which is consistent with its MacBench scores. I was very pleased with this Mac during the time that I used it. Playing around with it today only reinforces my impression of where it stands in Apple history.</p>
<p>Of course any modern machine races ahead with demanding tasks. Editing a 1920&#215;1080 image in Photoshop is slower than editing DSLR photos on a current Mac. Network transfers are severely limited by the 10 Mbps Ethernet. And multimedia CDs are laughably primitive by the standards of the modern web. The programs that do run comparably well are lacking features that today&#8217;s user takes for granted, such as sophisticated auto complete.</p>
<p>Yet I can&#8217;t help but be impressed with how well a lot of every day office type applications run, as well as some of the programming tools and compilers.</p>
<h3>Surfing The Web</h3>
<p>So what is the web like on a Mac this old? <a href="http://www.keacher.com/1216/how-i-introduced-a-27-year-old-computer-to-the-web/" target="_blank">Better than on a Mac Plus</a> even if getting the web running on a Plus is infinitely cooler.</p>
<p><a href="http://www.floodgap.com/software/classilla/" target="_blank">Classilla</a> will run on a 6300, just not very well. It takes forever to launch, respond to commands, and download/render pages. I get the feeling it&#8217;s just not made for this class of machine and may work better on G3 and higher Macs with a lot more RAM.</p>
<p><a href="http://macintoshgarden.org/search/node/Internet%20explorer" target="_blank">Internet Explorer 5</a> runs much better but suffers from a now antiquated web engine. It has no hope of correctly rendering or even reaching most modern sites. JavaScript errors generally cause crashes, sometimes a system wide crash, so JavaScript is better left turned off. With scripting off it does an admirable job considering its age, at least on the sites it can reach.</p>
<p><a href="http://macintoshgarden.org/search/node/netscape" target="_blank">Netscape Communicator</a> feels about the same as IE5. But it can reach more sites and it downloads files faster. Another plus is that the JavaScript engine doesn&#8217;t crash like the one in IE5 so you can leave it on. It can&#8217;t run a lot of modern code, but it can at least run some. If you&#8217;re going to try browsing the web on an old Power Mac I think this might be your browser.</p>
<p>In all cases I gave the test browser as much RAM as I could.</p>
<p>To be clear the 6300 is not usable as a daily web browser. Browsing the web with a machine from this era is purely for the challenge. One of those things you do just to see if it can be done. 20 years have gone by since this Mac was released which is an eternity for Moore&#8217;s Law. It&#8217;s hard to overstate just how powerful our computers are today by comparison. The fact that a computer with 64 MB of RAM and a 100 MHz 603e can access and render any of today&#8217;s web is impressive.</p>
<h3>Should You Get One?</h3>
<p>If you&#8217;re interested in running classic Mac OS and old applications you could certainly do worse than a 6300. That said, you can also do better.</p>
<p>If you happen to have any of the early Power Macs, or run into one for next to nothing, don&#8217;t throw it away. At the very least clean it up, verify that it works, and sell it to someone who wants it. Even if it doesn&#8217;t work the parts can help keep another Power Mac running, so keep it away from the recycle center if possible.</p>
<p>But if you have a little cash to spend and are interested in classic Mac OS you can easily get a G4 PowerBook, iMac, or tower. (Note that <a href="http://www.everymac.com/mac-answers/mac-os-9-classic-support-faq/last-macs-to-boot-startup-macos-9.html" target="_blank">G4 Macs later then these models cannot boot OS 9.</a>) These often go for $100-$150 and, sometimes just $50. They can also dual boot into Mac OS X which gives you access to newer applications.</p>
<p>If you don&#8217;t care about running Mac OS 9 directly but do care about classic apps then a Power Mac G5 or iMac G5 may be a better bet. Mac OS 10.4.11 Tiger was the last release to support the classic layer. Compatibility in the classic layer is almost as good as running OS 9 directly, games being one notable exception, and a G5 is faster than any G4 Mac. Thanks to <a href="http://www.floodgap.com/software/tenfourfox/" target="_blank">TenFourFox</a> these machines are still usable on the modern web.</p>
<p>There&#8217;s also <a href="http://www.emaculation.com/doku.php" target="_blank">emulation</a> to consider. <a href="http://sheepshaver.cebix.net/" target="_blank">SheepShaver</a> is particular good at running a wide range of old Macintosh software, though it struggles with some games much like the OS X classic layer. There&#8217;s even a <a href="https://jamesfriend.com.au/pce-js/" target="_blank">Mac Plus emulator written in JavaScript</a> and one which runs <a href="https://www.youtube.com/watch?v=R1xJxS_kr-M" target="_blank">on a wrist watch.</a></p>
<p>Of course nostalgia need not obey reason. If you have fond memories of this machine, or want to see what this era of Power Mac was like, by all means pick one up. You can still find them on <a href="http://www.ebay.com" target="_blank">eBay</a> from time to time or on your local <a href="https://craigslist.org" target="_blank">Craigslist</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.taylordesign.net/classic-macintosh/restoring-a-classic-the-macintosh-performa-6300cd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
