<?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>Thought bucket</title>
	<atom:link href="http://www.alandmoore.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alandmoore.com/blog</link>
	<description>A place to empty my head</description>
	<lastBuildDate>Fri, 24 May 2013 19:29:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Better window splitting in Emacs</title>
		<link>http://www.alandmoore.com/blog/2013/05/01/better-window-splitting-in-emacs/</link>
		<comments>http://www.alandmoore.com/blog/2013/05/01/better-window-splitting-in-emacs/#comments</comments>
		<pubDate>Wed, 01 May 2013 19:27:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[elisp]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[instructional]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=785</guid>
		<description><![CDATA[The author describes an improvement to window splitting in Emacs]]></description>
				<content:encoded><![CDATA[<p>Emacs&#8217; window-splitting functionality is an ergonomic way to view multiple files at once without having to deal with shuffling around floating windows or clicking between tabs.  Anyone who does much with Emacs probably knows already that they can use C-x 2 or C-x 3 to split the window vertically or horizontally.
</p>
<p>
What always bothered me about this feature was that the newly-created window defaulted to the current buffer, which in layspeak means you had the same file or content open in both your new window and the old.  The was almost (but not quite) <i>never</i> the behavior I wanted, since usually you split the window to have multiple buffers on screen at once. Typically, I would do this right after opening a new file or buffer to compare with whatever I already had open, so that I would have the old buffer in one window and the new buffer in another.
</p>
<p>
This is where having an extensible editor rocks; because in Emacs, if you get tired enough of a behavior, you start hacking elisp and fix it&hellip;
</p>
<p><span id="more-785"></span></p>
<p>
The fix is simply a matter of writing some custom elisp functions and overriding the default keybindings with the new functions, and adding it all to your .emacs file.  Here&#8217;s the code:
</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
<span style="color: #808080; font-style: italic;">;; Custom splitting functions ;;</span>
<span style="color: #808080; font-style: italic;">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> vsplit-last-buffer <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>split-window-vertically<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>other-window <span style="color: #cc66cc;">1</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>switch-to-next-buffer<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> hsplit-last-buffer <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>split-window-horizontally<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>other-window <span style="color: #cc66cc;">1</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>switch-to-next-buffer<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-x 2&quot;</span><span style="color: #66cc66;">&#41;</span> 'vsplit-last-buffer<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-x 3&quot;</span><span style="color: #66cc66;">&#41;</span> 'hsplit-last-buffer<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
What each of these functions does is perform the regular vertical/horizontal split, then switches to the newly-created window and performs &#8220;switch-to-next-buffer&#8221;.  &#8220;Next buffer&#8221; is the buffer you&#8217;d get if you did a &#8220;switch-buffer&#8221; (C-x b) and just accepted the default.  Obviously, Emacs can&#8217;t (yet) read your mind and open the buffer you want every time, but &#8220;next-buffer&#8221; is most likely to be the buffer you want (at least, much more likely than the current buffer, which you already have open in another window).
</p>
<p>
Copy this code into ~/.emacs, evaluate the buffer (or just the functions), and you&#8217;re ready to roll.
</p>
<p>
I&#8217;m going to try this change for a while and see if it sticks, I&#8217;ll keep this post updated with changes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/05/01/better-window-splitting-in-emacs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WCGBrowser update: http_proxy and more</title>
		<link>http://www.alandmoore.com/blog/2013/04/17/wcgbrowser-update-http_proxy-and-more/</link>
		<comments>http://www.alandmoore.com/blog/2013/04/17/wcgbrowser-update-http_proxy-and-more/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 21:44:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[FLOSS]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[qt]]></category>
		<category><![CDATA[software projects]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=777</guid>
		<description><![CDATA[Updates to WCGBrowser]]></description>
				<content:encoded><![CDATA[<p>For users of WCGBrowser&hellip;
</p>
<p>
In the last few days I&#8217;ve added a few features:
</p>
<ul>
<li>Firstly, proxy server settings.  Several people requested this, though none wanted to sponsor development (I only asked $100 US).  Turns out I needed it for something I was doing myself, so happy birthday everyone, you get this for free.  Proxy settings can be set from the CLI, config file, or environment variables (common on many Linuxes).
</li>
<li>Secondly, stylesheets.  Not that there&#8217;s much to style on WCGBrowser (the navigation bar, mostly), but you can now do it with QSS style sheets.  A (really tasteless) example stylesheet is included.
</li>
</ul>
<p>
Latest code can of course be downloaded from <a href="http://github.com/alandmoore/wcgbrowser">the wcgbrowser github page</a>, or just do a &#8220;git pull&#8221; if you cloned it from there in the first place.
</p>
<p>
Enjoy! <img src='http://www.alandmoore.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/04/17/wcgbrowser-update-http_proxy-and-more/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Porteus</title>
		<link>http://www.alandmoore.com/blog/2013/03/27/porteus/</link>
		<comments>http://www.alandmoore.com/blog/2013/03/27/porteus/#comments</comments>
		<pubDate>Thu, 28 Mar 2013 03:40:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[Old computers]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[old computers]]></category>
		<category><![CDATA[Reviews]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=705</guid>
		<description><![CDATA[The author investigates porteus linux]]></description>
				<content:encoded><![CDATA[<p>As I&#8217;ve chronicled in <a href="http://www.alandmoore.com/blog/2012/12/14/replacing-windows-98-and-other-seemingly-impossible-tasks/" title="Replacing Windows 98, and other seemingly impossible tasks">&#8220;Replacing Windows 98&hellip;&#8221;</a> and previous posts, I&#8217;m always interested in new tools that promise to imbue my mountain of mouldering beige boxen with a glorious desktop experience usable by the modern user.  A commenter on that post suggested trying out <a href="http://porteus.org">Porteus</a>, so I&#8217;ve been playing with it some this evening.  While I haven&#8217;t time to work up a serious review, I thought I&#8217;d share my impressions of Porteus as a distro for rescuing older computers. </p>
<p>   <span id="more-705"></span>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">The scenario</h2>
<div class="outline-text-2" id="text-1">    </div>
<div id="outline-container-1-1" class="outline-3">
<h3 id="sec-1-1">Hardware</h3>
<div class="outline-text-3" id="text-1-1">
<p> My &#8220;beater rig&#8221; that I use for testing is an 800MHz Celeron Coppermine system with 256 MB of RAM, which a gracious coworker gave me for free several months ago.  Believe it or not, this system originally shipped with Windows XP Home (RTM), and was still running it when I received it.  It currently runs Vector Linux 7.0 lite with a custom 3.7 kernel and Awesome WM. </p>
</p></div>
</p></div>
<div id="outline-container-1-2" class="outline-3">
<h3 id="sec-1-2">Software</h3>
<div class="outline-text-3" id="text-1-2">
<p> I downloaded Porteus 2.0, 32bit XFCE edition.  The &#8220;Standard&#8221; 32 bit edition uses Razor-qt, which seemed to me from past testing to be a bit heavier than XFCE, so I went for the safer choice.   </p>
</p></div>
</p></div>
</p></div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">Porteus</h2>
<div class="outline-text-2" id="text-2">    </div>
<div id="outline-container-2-1" class="outline-3">
<h3 id="sec-2-1">Brief overview</h3>
<div class="outline-text-3" id="text-2-1">
<p> Porteus is a Slackware derivative, based on Slack version 14.  It&#8217;s not merely a respin, however, as it boasts some custom configuration tools and its own package format.  Porteus is also designed specifically for live media booting, with a design similar to TinyCore Linux where the core OS boots from compressed files and changes (including package installations) are stored in a separate directory or file.  A boot menu option allows you to do a &#8220;fresh boot&#8221; (ignoring the recorded changes), making it always easy to keep a running system even if you muck it up completely. </p>
</p></div>
</p></div>
<div id="outline-container-2-2" class="outline-3">
<h3 id="sec-2-2">Apps and desktop</h3>
<div class="outline-text-3" id="text-2-2">
<p> The Porteus XFCE desktop is pretty conventional; it defaults to a panel-on-the-top layout but is otherwise pretty conventional.  The default look is simple yet attractive with some nice touches over the conventional XFCE desktop look.  XFCE is at version 4.10, which is nice considering that even now many distros ship 4.8. </p>
<p> The application selection is pretty typical of a lightweight Linux desktop: </p>
<ul>
<li>Firefox (v.18) browser </li>
<li>Pidgin instant messenger </li>
<li>Abiword for documents </li>
<li>Gnumeric spreadsheet </li>
<li>Gnome Mplayer and Audacious for multimedia playback </li>
<li>XFCE applications (Mousepad, thunar, Orage, etc) for most of the rest </li>
</ul>
<p> Curiously, both XFCE4-terminal and LXTerminal were installed, and LXTerminal was default.  The Porteus toolset includes a settings tool, a system information tool, and the Porteus package manager. </p>
</p></div>
</p></div>
<div id="outline-container-2-3" class="outline-3">
<h3 id="sec-2-3">Noteworthy features</h3>
<div class="outline-text-3" id="text-2-3">    </div>
<div id="outline-container-2-3-1" class="outline-4">
<h4 id="sec-2-3-1">Porteus package manager</h4>
<div class="outline-text-4" id="text-2-3-1">
<p> The Porteus package manager is just doggone cool.  It&#8217;s actually six package managers tied up in one click-friendly front-end, allowing you to install packages not just from the Porteus repos, but also slackware packages, slackbuilds, Salix packages, RPMs, and Debian packages.  Unfortunately my Internet connection on the test machine was down (not Porteus&#8217;s fault), so I couldn&#8217;t test this feature.   </p>
</p></div>
</p></div>
<div id="outline-container-2-3-2" class="outline-4">
<h4 id="sec-2-3-2">PXE server boot option</h4>
<div class="outline-text-4" id="text-2-3-2">
<p> There&#8217;s an option to boot Porteus as a PXE terminal server, so that other systems on the same network could use it to also boot Porteus.  I can&#8217;t say that any practical application of this features comes to mind (&#8220;QUICK!  We have only minutes to turn all these hard-drive-less computers into a computer lab!  What will we do???&#8221;), but I love PXE booting and I just think it&#8217;s cool.  I think back in the day Knoppix had this feature too. </p>
</p></div>
</p></div>
<div id="outline-container-2-3-3" class="outline-4">
<h4 id="sec-2-3-3">Run from RAM</h4>
<div class="outline-text-4" id="text-2-3-3">
<p> Another boot-time feature allows you to copy the Porteus core to RAM.  It requires 320 Mb of RAM for the 32-bit edition, which makes it a no-go for my hardware, or probably for anyone with less than a gigabyte who expects to actually do anything after the system is booted.  Still, for making a RAM-endowed system run fast, seems quite useful. </p>
</p></div>
</p></div>
</p></div>
<div id="outline-container-2-4" class="outline-3">
<h3 id="sec-2-4">Performance on my hardware</h3>
<div class="outline-text-3" id="text-2-4">
<p> Porteus did OK running from my hardware; I ran it as a live system, which is what it&#8217;s designed for.  Compared to Vector Linux lite, it&#8217;s a bit more sluggish, but that&#8217;s probably due to XFCE more than anything else.  With IceWM or Awesome installed, performance would probably be comparable to VLL.  Overall I&#8217;d subjectively put it as heavier than Slitaz, Puppy, and TinyCore, but definitely lighter than any Ubuntu respin. </p>
<p> The only recommended/supported install method for Porteus is a &#8220;frugal install&#8221;, which effectively makes it a live session running from the hard drive &ndash; in other words, the core files remain compressed and monolithic on disk, and changes are only written to a separate location.  I&#8217;m slightly curious to know how this performs over the long-haul as the system changes more and more.   </p>
</p></div>
</p></div>
</p></div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">Conclusions</h2>
<div class="outline-text-2" id="text-3">
<p> Is Porteus the long-sought hope for Pentium II relics?  No, I think we can rule that application out.  For those who want to have a portable install with persistence, it seems like a heavier, yet less squalid, alternative to TinyCore or Puppy. </p>
<p> For those wanting to resurrect old machines, Porteus seems best suited to an 8 to 10 year old machine, maybe that Pentium IV or Athlon XP with 512 to 1024 MB of RAM.  There&#8217;s a lot of competition in that space (including most mainstream distributions if you pick the right desktop environment), and it wouldn&#8217;t be my go-to distro if I had such a piece of hardware to work with. </p>
<p> But in either scenario, the package manager looks to be the real killer feature of this distro; I&#8217;d like to spend some time testing it out and seeing what mixing various packages does to the stability, but if it does what it claims, it may just replace Vector on my Coppermine box. </p>
</p></div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/03/27/porteus/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Building a Linux system for a Child, part 4: a wishlist</title>
		<link>http://www.alandmoore.com/blog/2013/03/18/building-a-linux-system-for-a-child-part-4-a-wishlist/</link>
		<comments>http://www.alandmoore.com/blog/2013/03/18/building-a-linux-system-for-a-child-part-4-a-wishlist/#comments</comments>
		<pubDate>Mon, 18 Mar 2013 21:42:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[FLOSS]]></category>
		<category><![CDATA[Geek parenting]]></category>
		<category><![CDATA[kids]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Practical tech]]></category>
		<category><![CDATA[series]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=695</guid>
		<description><![CDATA[Alan explores the art and adventure of setting up a Linux-based system for young people.]]></description>
				<content:encoded><![CDATA[<p>The <a href="http://www.alandmoore.com/blog/2013/02/13/building-a-linux-system-for-a-child-part-3-security-concerns/">previous articles</a> in this series helped you set up a Linux-based system for a child, and explored some of the great educational and kid-friendly software available.  I&#8217;ve based this on almost eight years of experience in setting up GNU/Linux on computers for my own kids, and for their friends.  So, based on that experience, what things do I wish the Free software community could come up with to make Linux a better experience for kids (and their parents!)?
</p>
<p><span id="more-695"></span></p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">Better Parental Controls</h2>
<div class="outline-text-2" id="text-1">
<p>
I discussed this to death in previous articles; so, not to put too sharp a point on it, but we (parents) could really use some better and friendlier controls in Linux.  My ideal &#8220;parental control&#8221; tool would have at least:
</p>
<ul>
<li>A front end for Dansguardian, with per-user transparent proxying.
</li>
<li>Something like timekpr, to restrict login times and the amount of time a user can be logged on.
</li>
<li>A way to restrict who can run which programs
</li>
<li>A way to restrict certain programs from accessing the network
</li>
<li>No dependencies on a specific distro or desktop
</li>
</ul>
<p>
I know enough about the guts of some of these things to know that this is a tall order (if it weren&#8217;t I&#8217;d have coded it myself); but here&#8217;s hoping that some commercial Linux vendor or big community project will see a need for these tools.
</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">More stories</h2>
<div class="outline-text-2" id="text-2">
<p>
Humans love story; even a bad story (witness daytime television), but most games for kids on Linux are just flat activities centered around math, matching, or logic (i.e., things that are easy to program).  Probably the single biggest thing that makes many commercial games &ndash; including some ancient ones we have for Windows 98 or our old PowerMac 6500 &ndash; more appealing to my kids than the FLOSS games is the presence of a story line.  The graphics may be old, pixelated, and 2-D, but the fact that they tell a story puts them ahead of hi-res OpenGL hardware-accelerated graphics that don&#8217;t (at least for my kids).
</p>
<p>
Look, no kid is going to do math facts for an hour just to get a higher score; but they will do a surprising amount of math if it means finding out &#8220;what happens next&#8221; in a story<sup><a class="footref" name="fnr-.1" href="#fn-.1">1</a></sup>.  I would love to see authors of educational games for Linux will start to tap into this power and work at least a rudimentary story line into whatever game or activity they&#8217;re writing.
</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">Multimedia and better artwork</h2>
<div class="outline-text-2" id="text-3">
<p>
Anyone remember <i>Myst</i>?  I don&#8217;t know about you, but for me playing <i>Myst</i> for the first time was the moment I realized computer games could be art.  If games from the 90&#8242;s could have immersive artwork, music, and cutscenes, I don&#8217;t see why modern open source games can&#8217;t do these things as well.  In fact, I know they can because I can think of a few that /already do/<sup><a class="footref" name="fnr-.2" href="#fn-.2">2</a></sup>  Unfortunately none of them are educational games, or even kid-friendly.  We seem to have no difficulty making multimedia-rich combat games full of carnage, so why do kids games seem to get stuck with artwork from OpenClipart.org or some ham-fisted programmer art hastily drawn in GIMP?  And why do you make a game aimed at pre-literate-pre-schoolers that requires them to READ INSTRUCTIONS?
</p>
<p>
I think sometimes that part of what we should be doing as FLOSS programmers is not programming actual games, but rather frameworks to make it easy for people with skills in art, music, design, and story to create games.  The programming in most commercial child-oriented &amp; educational games is rarely ground-breaking or complex; it&#8217;s a delivery mechanism for the artwork.
</p>
</div>
</div>
<div id="outline-container-4" class="outline-2">
<h2 id="sec-4">More literature, history, and humanities</h2>
<div class="outline-text-2" id="text-4">
<p>
When it comes to children&#8217;s games on Linux, arithmetic is pretty well covered.  Computer science, programming, astronomy, and logic exercises are also decently well covered.  Granted, there&#8217;s always room for a novel approach to these topics, but if you want to contribute something truly new and compelling to the world of FLOSS educational software, take a look at the humanities.  Can you find some creative way to teach history, literature, art, language, world cultures, and other non-STEM subjects using software<sup><a class="footref" name="fnr-.3" href="#fn-.3">3</a></sup>?
</p>
</div>
</div>
<div id="outline-container-5" class="outline-2">
<h2 id="sec-5">More special needs software</h2>
<div class="outline-text-2" id="text-5">
<p>
Helping kids with autism and similar disorders is near and dear to my heart since, well, I have a child with autism.  There is an alarmingly huge number of children with autism and ASDs, and the number is growing.  There&#8217;s a lot of expensive, proprietary software out there designed to help people with autism, as well as a lot of software on proprietary platforms like iOS.  Linux and FLOSS falls short here, unfortunately.
</p>
<p>
Some ideas for applications would include:
</p>
<ul>
<li>visual scheduling tools
</li>
<li>social interaction simulations
</li>
<li>facial expression/body language modeling
</li>
<li><a href="http://www.autismspeaks.org/what-autism/treatment/applied-behavior-analysis-aba">ABA</a> tools
</li>
<li>Language development games
</li>
<li>Story sequencing activities
</li>
<li>&#8220;Life skills&#8221; development activities
</li>
</ul>
<p>
Obviously this could be a whole topic unto itself, but it&#8217;s well worth investigating if you&#8217;re looking for a good idea for a coding project.
</p>
</div>
</div>
<div id="outline-container-6" class="outline-2">
<h2 id="sec-6">What about you?</h2>
<div class="outline-text-2" id="text-6">
<p>
  I&#8217;d love to hear your thoughts on how Linux has done for your kids, and what you think can be improved upon.  Leave a comment and let me know!
</p>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<p class="footnote"><sup><a class="footnum" name="fn-.1" href="#fnr-.1">1</a></sup> case in point: SupertTuxKart.  Version 0.8 introduced &#8220;story mode&#8221;, which simply added a cutscene at the beginning, and changed the way feature-unlocking and track selection worked to enhance the storyline aspect of it.  Actual gameplay wasn&#8217;t really changed, and most of the tracks were identical.  Nevertheless, the story mode actually inspired my kids to play it all over again just to finish out the story.  Now imagine this sort of thing with an <i>educational</i> program&hellip;
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.2" href="#fnr-.2">2</a></sup> Have you played Warzone 2100 lately??
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.3" href="#fnr-.3">3</a></sup> Granted, doing this requires a certain amount of knowledge about these subjects, which is probably not a given among people who love programming enough to do it recreationally.
</p>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/03/18/building-a-linux-system-for-a-child-part-4-a-wishlist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Five reasons why I choose PostgreSQL</title>
		<link>http://www.alandmoore.com/blog/2013/02/28/five-reasons-why-i-choose-postgresql/</link>
		<comments>http://www.alandmoore.com/blog/2013/02/28/five-reasons-why-i-choose-postgresql/#comments</comments>
		<pubDate>Fri, 01 Mar 2013 05:59:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[FLOSS]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=679</guid>
		<description><![CDATA[The blogger ruminates on why PostgreSQL rocks.]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve worked with most of the major SQL databases over the last several years, including Oracle, MS SQLserver, MySQL, and PostgreSQL, both as an admin and (more often) as a developer.  They&#8217;ve all got their ups and downs (some more of one than the other&hellip;), but when it comes to choosing a database for my own projects, my choice these days is nearly always PostgreSQL.  This amazing, powerful server is unfortunately one of the hidden gems of the relational database world, so I thought I&#8217;d share a few reasons why it&#8217;s my personal favorite.
</p>
<p><span id="more-679"></span></p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">Elegant SQL syntax</h2>
<div class="outline-text-2" id="text-1">
<p>
There&#8217;s just something about SQL itself that seems very throwback; maybe it&#8217;s just the convention of typing commands in caps, its odd rules about quotes and character escaping, or just the sometimes-convoluted approaches to problem solving its declarative syntax forces you to take.  Every time I start typing &#8220;SELECT &hellip;&#8221; I feel a little like I&#8217;m trying to hack the MCP or talk WOPR out of launching nukes.  Especially if I&#8217;m forced to use some byzantine implementation of SQL like, say, Oracle.
</p>
<p>
So any little bit of syntactic sugar that streamlines the process and makes creating SQL queries a bit more elegant is greatly appreciated.  PostgreSQL&#8217;s dialect of SQL is full of little bits of niceness here.  PostgreSQL&#8217;s typecasting syntax is a great example; instead of having to type some verbose nonsense like:
</p>
<pre class="brush: sql; light: true; title: ; notranslate">

SELECT CAST (mycolumn AS VARCHAR(30)), 
    CAST (myothercolumn AS DATE) FROM mytable;

</pre>
<p>
&hellip;or, worse, some ridiculously specific function like &#8220;TO CHAR()&#8221;, PostgreSQL allows you to typecast like so:
</p>
<pre class="brush: sql; light: true; title: ; notranslate">

SELECT mycolumn::VARCHAR(30), myothercolumn::DATE FROM mytable;

</pre>
<p>
Another example of nice PostgreSQL syntax: dollar-sign quoted strings.
</p>
<p>
In most SQL databases, string literals can <i>only</i> be delimited with single quotes.  This is a bit of an annoyance, given that the single quote also happens to be the apostrophe &ndash; a rather popular bit of punctuation in the English language.  Dollar quoting lets you use double dollar signs ($$) (with an optional tag in between the dollar signs) to delimit a string.  This is awesome if you need to quote a long piece of text (e.g. a crosstab query) and don&#8217;t want to worry about escaping all the single quotes; to my knowledge, PostgreSQL is one of the only databases to offer an alternate string delimiter.
</p>
<p>
Or, take the way PostgreSQL does case-insensitive string comparisons.  If you want this in SQL Server, the correct way is to specify a case-insensitive collation for the query; if you want it in Oracle or MySQL, you&#8217;d do something like:
</p>
<pre class="brush: sql; light: true; title: ; notranslate">

SELECT * FROM sometable WHERE UPPER(somefield) LIKE UPPER('searchterm');

</pre>
<p>
In PostgreSQL, you get the &#8220;ILIKE&#8221; operator &ndash; exactly like &#8220;LIKE&#8221;, but case-insensitive, so the query becomes:
</p>
<pre class="brush: sql; light: true; title: ; notranslate">

SELECT * FROM sometable WHERE somefield ILIKE 'searchterm';

</pre>
<p>
Things like the &#8220;::&#8221; operator, dollar-sign quoting, or ILIKE don&#8217;t seem that big of a deal; but when you get into writing 3-page SQL queries with complex conditions, cross-tabs, and other such things, these little niceties add up to a far cleaner piece of code.
</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">Many useful data types</h2>
<div class="outline-text-2" id="text-2">
<p>
Most databases give you various types of character, number, date, and binary data types.  PostgreSQL gives you this, plus several interesting and cool data types that you may not have considered before:
</p>
<ul>
<li>Enumerated types (for an arbitrary list of fixed values)
</li>
<li>Network address types (IP, CIDR, MAC)
</li>
<li>Geometric/Spatial types (points, lines, polygons, etc.)
</li>
<li>XML and JSON types
</li>
<li>BOOLEAN (yes, <b>some</b> very expensive and over-hyped databases still don&#8217;t have these&hellip;)
</li>
</ul>
<p>
Sure, some of these things can be represented with more conventional data types, but having them already built in gives you a standard representation, data type enforcement, and a battery of supporting functions and operators<sup><a class="footref" name="fnr-.1" href="#fn-.1">1</a></sup>.
</p>
<p>
And unlike some other databases, these data types are well supported and sanely implemented.  Take the ENUM type for example; while MySQL also has the ENUM type, it&#8217;s implementation is awkward:  simply getting a list of possible ENUM values from the database (which you&#8217;d want for, say, populating a drop-down list in the application) requires querying the information_schema for a column description and using a regex on the results<sup><a class="footref" name="fnr-.2" href="#fn-.2">2</a></sup>.  PostgreSQL, on the other hand, has a built-in function to do this.
</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">Arrays</h2>
<div class="outline-text-2" id="text-3">
<p>
One of the best data types that PostgreSQL adds to the mix is the <b>array</b> type, which lets you have arrays of any other type of data in a single field.  Now, you might think having an array inside a database column is redundant, if not flat out dangerous; but I can assure you that, used sparingly, arrays in a SQL database are pretty amazingly useful.
</p>
<p>
Consider a situation where you want to flatten a couple of tables with a many-to-one relationship; for instance, you have an HR application where you want to flatten the &#8220;Departments&#8221; and &#8220;Employees&#8221; tables to a table containing the department name in one column and a list of employees in the other.  In most databases, about all you can do is either (a) create a table with the department in one column and one employee per row in the next, then aggregate the employees in your application code, or (b) aggregate the employees to a string delimited by commas or somesuch.  In PostgreSQL, you could aggregate the employees to a VARCHAR array; if you&#8217;re using a decent driver (like Python&#8217;s PsycoPG driver), the array will come into your application as a native array/list/vector/etc.  Very convenient.
</p>
<p>
Arrays are also useful when you may need multiple values in a field, but it doesn&#8217;t quite justify yet another table join.
</p>
<p>
PostgreSQL features a pretty robust set of operators and functions for testing, comparing, manipulating, and converting arrays.  It does take a bit of mental gymnastics now and then to figure out how to get an array into the format you need to accomplish various things, but used correctly and sparingly they&#8217;re an awesome tool.
</p>
</div>
</div>
<div id="outline-container-4" class="outline-2">
<h2 id="sec-4">Stored procedures: pick your language</h2>
<div class="outline-text-2" id="text-4">
<p>
All the database engines I&#8217;ve been talking about have some form of &#8220;stored procedure&#8221;, or the ability to create custom functions stored in the database itself.  This is quite useful if, for example, you&#8217;ve got a complex database schema and want to abstract some common read or write operations that are otherwise a real pain to do in raw SQL, or to create custom data-manipulation functions that are specific to your data.
</p>
<p>
In MySQL, your only option for writing these is plain old SQL, which means a stored procedure is more of a &#8220;named query&#8221;.  It&#8217;s useful, but not all that powerful.
</p>
<p>
Oracle gives you its own PL/SQL, an extension of SQL that adds procedural logic constructs like flow control and variables.  If you can imagine the unholy union of SQL and COBOL, you&#8217;ve got a good picture of PL/SQL.  Ugly and archaic though it may appear, PL/SQL does make a lot of procedures possible that mere SQL cannot accomplish.  SQL Server&#8217;s TSQL dialect contains similar procedural constructs that are available when creating user functions or stored procedures<sup><a class="footref" name="fnr-.3" href="#fn-.3">3</a></sup>.
</p>
<p>
What PostgreSQL does here is a little unique.  Instead of restricting you to a single procedural language when defining stored procedures, it offers support for a variety of popular languages; out-of-the-box it supports Python, Perl, Tcl, and PL/pgSQL<sup><a class="footref" name="fnr-.4" href="#fn-.4">4</a></sup>, but there are optional modules for Java, R, PHP, Ruby, Scheme, and Unix shell.  This means that you can construct your procedural logic in a syntax that you&#8217;re comfortable with, or that best lends itself to your task.
</p>
<p>
Now, I&#8217;m not a huge fan of putting tons of application logic into the database; but there are times when it just fits, and being able to do it in the same language as the actual application is takes a bit of mental overhead out of the equation.
</p>
</div>
</div>
<div id="outline-container-5" class="outline-2">
<h2 id="sec-5">Excellent clients</h2>
<div class="outline-text-2" id="text-5">
<p>
If I had to pick a database GUI toolset that was the most powerful yet easy to use, I&#8217;d have to concede that to SQL Server Management Studio.  After that, PostgreSQL&#8217;s PGAdmin tool is pretty awesome and fairly complete when it comes to configuring and interacting with your server(s).  To be fair, PostgreSQL is just a simpler database system<sup><a class="footref" name="fnr-.5" href="#fn-.5">5</a></sup>, and doesn&#8217;t need a complex configuration tool a la SSMS; I can&#8217;t think of too many things PostgreSQL is capable of that you <i>can&#8217;t</i> do in PGAdmin<sup><a class="footref" name="fnr-.6" href="#fn-.6">6</a></sup>.  As a bonus for developers like me who run a non-Windows OS on the desktop, PGAdmin is available for most major platforms.
</p>
<p>
If you prefer a web-based client, there&#8217;s also phppgadmin, which is not quite as powerful but lets you get the most common jobs done in a browser.
</p>
<p>
Of course, if you&#8217;re old-school like me and prefer to dig into the command-line now and then, PostgreSQL is a winner here.  The psql command-line client has nice features like readline support, piping, and tab completion that make it very comfortable to anyone who uses modern unixy operating systems.  Contrast this to Oracle&#8217;s sqlplus client, which likes to barf out weird code sequences whenever you hit the arrow or tab keys and has no facility to edit the previously typed line; or with sqlcmd, which only runs in the Windows cmd shell and thus inherits its many limitations.
</p>
</div>
</div>
<div id="outline-container-6" class="outline-2">
<h2 id="sec-6">The Perfect database?</h2>
<div class="outline-text-2" id="text-6">
<p>
Is PostgreSQL the perfect database?  Probably not, and I&#8217;m not holding my breath for the .NET ISVs of the world to suddenly embrace it.  But if you&#8217;re a developer whose always eyed it with uncertainty since it lacked the hype of MySQL, the marketing dollars of SQL Server, or the sheer veneration of Oracle, it&#8217;s time to get past that and check it out.
</p>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<p class="footnote"><sup><a class="footnum" name="fn-.1" href="#fnr-.1">1</a></sup> I just gotta say, it&#8217;s nice to be able to sort IP addresses properly, so that for example 192.168.2.0 comes before 192.168.100.0.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.2" href="#fnr-.2">2</a></sup> <a href="http://stackoverflow.com/questions/4644220/mysql-select-enum-values">http://stackoverflow.com/questions/4644220/mysql-select-enum-values</a>
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.3" href="#fnr-.3">3</a></sup> SQL Server distinguishes between &#8220;user functions&#8221; and &#8220;stored procedures&#8221;; the difference isn&#8217;t important here, they&#8217;re just different methods of storing custom code in the database.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.4" href="#fnr-.4">4</a></sup> this is PostgreSQL&#8217;s take on PL/SQL, which is pretty similar to Oracle&#8217;s and TSQL&#8217;s
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.5" href="#fnr-.5">5</a></sup> For example, it doesn&#8217;t have its own job scheduling or email systems, probably because it&#8217;s typically run on unix-like systems that normally have a perfectly good job scheduler and MTA built into the OS.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.6" href="#fnr-.6">6</a></sup> most of what I <i>can</i> think of is of interest to DBAs more than devepers, and this post is speaking from a developer perspective.
</p>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/02/28/five-reasons-why-i-choose-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a Linux system for a Child, part 3: Security concerns</title>
		<link>http://www.alandmoore.com/blog/2013/02/13/building-a-linux-system-for-a-child-part-3-security-concerns/</link>
		<comments>http://www.alandmoore.com/blog/2013/02/13/building-a-linux-system-for-a-child-part-3-security-concerns/#comments</comments>
		<pubDate>Thu, 14 Feb 2013 04:30:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Old computers]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[FLOSS]]></category>
		<category><![CDATA[Geek parenting]]></category>
		<category><![CDATA[instructional]]></category>
		<category><![CDATA[kids]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Practical tech]]></category>
		<category><![CDATA[series]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=667</guid>
		<description><![CDATA[Alan explores the art and adventure of setting up a Linux-based system for young people.]]></description>
				<content:encoded><![CDATA[<p>By now you&#8217;ve got that old computer purring along like a panther with your new favorite distribution of Linux, loaded to the brim with educational software, ready to propel your child to the heights of intellectual stimulation.  But before we launch this starship, let&#8217;s take a bit to make sure the safety equipment is in order and reign in some potential problems. </p>
<p><span id="more-667"></span></p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">Parental Controls, filtering, etc</h2>
<div class="outline-text-2" id="text-1">
<p> I&#8217;ve mentioned before that a lack of easy parental controls is one of the downsides of using Linux for a child.  The frustrating thing here is that nearly all the basic groundwork for these things already exists in Linux, and has been there for years; but nobody has successfully pulled them together into a simple centralized interface for mainstream use.  History is littered with projects that attempted to do this (gnome-nanny, timekpr, Ubuntu Christian-Edition&#8217;s parental controls), but were subsequently abandoned, obsoleted by developments in desktop environments, or never released to more than a single distro.  Some of these things <b>might</b> still work for you depending on the distribution you use, but even if they don&#8217;t, there are some things you can do. </p>
</p></div>
<div id="outline-container-1-1" class="outline-3">
<h3 id="sec-1-1">Web content filtering</h3>
<div class="outline-text-3" id="text-1-1">
<ul>
<li><b>Dansguardian</b>, in concert with <b>Squid</b>, can make for a really top-notch content filtering system, and setting it up isn&#8217;t really that hard if you&#8217;re up to some reading and able to do the config-file thing.  You can set this up on a separate box (this is what I do), or install it right on the child&#8217;s computer.  This, plus a little iptables magic to force web traffic to the proxy, works well for keeping the web safe.  A quick search for &#8220;dansguardian howto&#8221; should turn up some decent instructions for your distro of choice.  </li>
<li>For the less intrepid, <b>OpenDNS</b> is a third-party DNS service that offers some filtering solutions at the DNS level<sup><a class="footref" name="fnr-.1" href="#fn-.1">1</a></sup>.  Check them out at <a href="http://www.opendns.com">http://www.opendns.com</a>.  </li>
<li>Some browser plugins, such as <b>Procon Latte</b> for Firefox, provide content filtering and whitelisting in the browser itself.  The only downsides are that (a) it only works for the browser you install it on, and (b) it has to be configured per-account (for those of you with multiple kids).  </li>
<li>The Linux Mint family of distributions features <b>MintNanny</b>, which is billed as a parental control, but is basically a web domain blacklisting utility.  Unfortunately it can&#8217;t whitelist as of this writing, so it&#8217;s utility for sanitizing the Internet is a little limited.  If you just need to block a few problematic websites, this might be adequate. </li>
</ul></div>
</p></div>
<div id="outline-container-1-2" class="outline-3">
<h3 id="sec-1-2">Time restrictions</h3>
<div class="outline-text-3" id="text-1-2">
<ul>
<li>The /etc/security directory on many distributions (Ubuntu, Debian, etc) allows for easy (well, compared to PAM) configuration of certain types of user-based restrictions.  Probably /etc/security/time.conf is the most actually useful to parents, because it lets you limit when a given user can be logged in.  The other files are probably too low-level to be of much use in restricting kids, but it&#8217;s worth a look to see what&#8217;s there. </li>
</ul></div>
</p></div>
<div id="outline-container-1-3" class="outline-3">
<h3 id="sec-1-3">Application restrictions</h3>
<div class="outline-text-3" id="text-1-3">
<ul>
<li>The simplest ways to restrict what applications a child can run are simply (a) don&#8217;t install them in the first place, or (b) use a desktop environment where you can explicitly configure what applications show up in the menu.  Many programs intended for kiosk use, or just old-school environments that lack automated or graphical configuration features, are quite suitable in this application.  </li>
<li>If your distribution ships AppArmor, you can use it to restrict whether or not a program can use the network or not.  Writing AppArmor profiles is not the most entertaining thing in the world (though it beats working with SELinux), but well within the ken of most long-time Linux geeks.  If you&#8217;re really clever, there&#8217;s probably a way to do this per-user using pam_apparmor rules; but this bit is beyond me. </li>
</ul></div>
</p></div>
<div id="outline-container-1-4" class="outline-3">
<h3 id="sec-1-4">Do we need Parental Controls?</h3>
<div class="outline-text-3" id="text-1-4">
<p> Parental controls seem to be a contentious issue in some segments of the Linux community; whenever I&#8217;ve see the issue come up on community forums and the like, there is always a vocal group of people who seem to have a problem with anything that limits or restricts a user of the system, and they don&#8217;t see the need for such things to exist in Linux.  Others just feel parental controls are ineffective and pointless. </p>
<p> As a parent, I don&#8217;t agree.  &#8220;Parental Controls&#8221; are not about magically turning the computer, or the Internet, into a kid-friendly wonderland.  They&#8217;re about having tools to enforce the rules, and a means of drawing some clear boundaries with the help of technology, if only to help my children from unwittingly stumbling into things they are better off avoiding, or keeping the &#8220;honest child honest&#8221;.  And frankly, anyone who thinks you can effectively parent a child without limiting his freedom now and then is living in a fantasy world. </p>
</p></div>
</p></div>
</p></div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">Network access outside the browser</h2>
<div class="outline-text-2" id="text-2">
<p> Protecting kids from online harassment, predators, and inappropriate content is no small issue for parents in these sorry days, and simply filtering the web browser is not enough.  Many games (open source or otherwise) can now be played on the Internet using public servers, and allow kids to download content and communicate with people all over the world.  If you (or the parents of the child getting the computer) don&#8217;t feel the child is ready to deal with this interaction responsibly, it&#8217;s imperative to make sure that any &#8220;Net-enabled&#8221; games installed are suitably blocked or disabled from going online. </p>
<p> Here&#8217;s a short, and very incomplete, list of network-related problems I&#8217;ve run into or heard about: </p>
<ul>
<li>Some games I&#8217;ve seen that let you connect to public online servers and chat with other players include <b>minetest</b>, <b>netpanzer</b>, <b>frozen bubble</b>, and <b>hedgewars</b>.  </li>
<li>Ubuntu&#8217;s Unity desktop as of 12.10 returns search results from Amazon.com when you type into the dash search.  The results are <b>not</b> filtered in any way, and examples have been reported of decidedly non-kid-friendly results popping up for pretty innocuous searches (or even system commands).  This feature can be disabled or removed, and probably should be for a child&#8217;s computer.  </li>
<li>KDE&#8217;s &#8220;get hot new stuff&#8221; functionality (now known as DXS, where you can get new widgets/wallpapers/themes directly inside the configuration tools) pulls content directly from freedesktop.org.  Once in a rare while, someone posts something that is unfit for little eyes, and it isn&#8217;t really moderated as far as I can tell.  It&#8217;s not clear to me whether this feature respects your proxy settings, or whether its content would be filtered in any case.  You may have to look about for a fix, block freedesktop.org, or (tragically) just not use KDE.  </li>
<li>Desktop Environments sometimes come with their own web browser, like Konqueror, reKonq, or Epiphany, which nobody really uses (kidding, devs!), and thus tends to get overlooked when setting up (e.g.) proxy settings.  If you aren&#8217;t doing global proxy settings, enforcing proxy settings at the router, or forcing all web traffic to the proxy with iptables rules, then you need to take careful stock of the installed browsers and make sure they&#8217;re all appropriately secured.  </li>
<li>IRC is a very popular way to do support on a lot of distributions, and most desktop distros (including some of the &#8220;for kids ones&#8221;) ship with an IRC client (XChat, Konversation, etc), and some popular instant-messenger programs (pidgin, e.g.) support IRC.  Often these are pre-configured to point to a free IRC server like freenode, and don&#8217;t require an account or login. </li>
</ul></div>
</p></div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">Potentially offensive stuff</h2>
<div class="outline-text-2" id="text-3">
<p> The free software community has deep roots in 80&#8242;s hacker culture, a counter-culture movement whose members are often iconoclastic, anti-establishment, and rather libertine.  I&#8217;m not saying it&#8217;s a cesspool of indecency, but now and then things filter through that are probably not going to find favor with most parents. </p>
<p> Often this takes the form of inappropriate references in program names, profanity in games or documentation, or just images that may confuse those not familiar with the cultural background.  For example, the utility for connecting to network services in XFCE is called &#8220;gigolo&#8221;, which I&#8217;m sure was a hilarious pun for the person who wrote it; but I&#8217;m not giving a neighbor child a desktop with a program called &#8220;gigolo&#8221;, no matter how innocent its functionality is.  And then there&#8217;s &#8220;Chuckie&#8221;, the FreeBSD mascot, who is depicted as a red devil with horns and a pitchfork.  He shows up in several child-oriented games (including GCompris and SuperTuxKart).  Nothing malicious or &#8220;Satanic&#8221; is intended by his presence (just a shoutout to FreeBSD, really), but for parents who aren&#8217;t familiar with FreeBSD or what this character represents, a devil with a pitchfork randomly showing up in a children&#8217;s game is a bit of an eyebrow-raiser<sup><a class="footref" name="fnr-.2" href="#fn-.2">2</a></sup>. </p>
<p> If you&#8217;re setting up a system for someone else&#8217;s child, check the things you install for &#8220;eyebrow raisers&#8221;.  These may be different depending on your culture, the parents/guardians involved, and the child(ren)&#8217;s unique sensitivities, but you can&#8217;t just trust everything you find in a software repo to be kid-friendly (or at least, friendly to every kid). </p>
</p></div>
</p></div>
<div id="outline-container-4" class="outline-2">
<h2 id="sec-4">Root access?</h2>
<div class="outline-text-2" id="text-4">
<p> Now here&#8217;s a question to ponder; do you give your child root (or sudo) access?  If this is not your child we&#8217;re talking about, that&#8217;s probably a decision you should discuss with the child&#8217;s parent or guardian.  In doing so, one has to consider the ramifications of this decision: </p>
<ul>
<li>The child can potentially mess up the system with careless tinkering </li>
<li>The child can pretty much defeat any sort of restrictions placed on the machine (filtering, time limits, etc), assuming (s)he&#8217;s intelligent enough </li>
<li>The child can install any software in the repositories, some of which may be inappropriate for kids </li>
<li>The child can view (and edit&hellip; and delete) all other files on the system (if it&#8217;s a shared system) </li>
</ul>
<p> I&#8217;ve been comfortable with my older children having root, but I&#8217;ve reserved the right to take it from them if I find it&#8217;s been abused.  Of course, if the computer is not being shared and not connected to the internet, there&#8217;s probably not much the child will end up doing with root access, so it&#8217;s kind of moot. </p>
</p></div>
</p></div>
<div id="outline-container-5" class="outline-2">
<h2 id="sec-5">Conclusion</h2>
<div class="outline-text-2" id="text-5">
<p> I&#8217;ve given you a bit to ponder here, and probably haven&#8217;t touched on everything you need to consider when it comes to keeping kids safe on the computer;  but I hope you get some of the state of mind you have to take when assessing possible issues in your system&#8217;s configuration and applications.  When you give a child a computer, you give them a powerful tool; it&#8217;s naive to think that power can only be used positively and safely.  Whatever you do to configure the computer for safety, make sure you configure the <b>child</b> for safety as well.  Set rules, and enforce them.  Communicate with your child about his computer use, and guide him into healthy choices. </p>
<p> In the next article, I&#8217;ll talk about some wishes I have for the future of Free computing for kids. </p>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<p class="footnote"><sup><a class="footnum" name="fn-.1" href="#fnr-.1">1</a></sup> &#8220;DNS&#8221; is the service that translates domain names (like alandmoore.com) into IP addresses.  If there isn&#8217;t an IP for a site, you can&#8217;t go there.  DNS-level filtering means that OpenDNS has a huge database of &#8220;bad&#8221; sites, for which it can (optionally) return no IP.  This approach has some limitations, of course, but it&#8217;s better than nothing for keeping kids away from dodgy websites. </p>
<p class="footnote"><sup><a class="footnum" name="fn-.2" href="#fnr-.2">2</a></sup> Dear non-parents, please take a moment appreciate what we parents are dealing with these days, and why we often reject some <i>really cool things</i> for what may seem to you like silly, arbitrary, illogical reasons. </p>
<p> When I was a kid, the TV had five channels on a sunny day; the video games had 8-bit (or less) graphics; movies were watched in the theater with my parents; and the &#8220;information superhighway&#8221; was the road you took to the public library.  It was a time when using the word &#8220;sex&#8221; in a pop song caused a scandal, Hollywood still made (and promoted) &#8220;G&#8221; movies, sitcoms were about happy middle-class families, and nobody on TV <i>ever</i> got brutally murdered before 9 p.m. &ndash; not even in cop shows (and even then, you didn&#8217;t actually <i>see</i> it). </p>
<p> Our kids are bombarded by media from all directions everywhere they turn.  Never mind what TV and pop music have become, the Internet alone brings movies, pictures, songs, games, and words from all kinds of people all over the world and puts them all a few clicks away.  Unfortunately much of it is made by people who just don&#8217;t grasp what is appropriate to put in front of children, or by well-intentioned people whose cultural values are simply at odds with our own.  There is no way we can thoroughly and objectively evaluate the sheer volume of readily-available media before they consume it.  I can&#8217;t read every comment on every wiki, watch every cut-scene in every game, or test every hyperlink on every website they want to visit.  About all we <i>can</i> do is make the best evaluation possible based on a quick once-over and occasional observation, and err on the side of caution. </p>
<p> It&#8217;s not always a question of finding grossly offensive things worthy of feet-stamping and congressman-calling, but often just small &#8220;red flags&#8221; that indicate a potential problem with what the authors of this content consider acceptable for children.  Yes, we may jump to conclusions and get it wrong now and then; we may wrongly reject something really cool over a dumb misunderstanding.  Frankly, though, our children have no shortage of safe, healthy, and productive ways to entertain themselves and expand their worlds; so unless it&#8217;s something that has enough &#8220;awesome factor&#8221; to warrant careful examination, there&#8217;s no reason to waste time with things that contain more than a couple of &#8220;eyebrow-raisers&#8221;. </p>
</div></div>
</p></div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/02/13/building-a-linux-system-for-a-child-part-3-security-concerns/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>From PHP to Python: things I wish I&#8217;d known</title>
		<link>http://www.alandmoore.com/blog/2013/02/02/from-php-to-python-things-i-wish-id-known/</link>
		<comments>http://www.alandmoore.com/blog/2013/02/02/from-php-to-python-things-i-wish-id-known/#comments</comments>
		<pubDate>Sat, 02 Feb 2013 21:00:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[instructional]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=657</guid>
		<description><![CDATA[The story so far&#8230; Back around 2005 I took my first leap into the world of writing useful programs armed only with my laptop, a Pentium II running Debian, and a fat book on PHP5. Though I&#8217;d taken a few classes on C++ and tinkered with BASIC on a few different platforms over the years, [...]]]></description>
				<content:encoded><![CDATA[<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">The story so far&hellip;</h2>
<div class="outline-text-2" id="text-1">
<p>
  Back around 2005 I took my first leap into the world of writing useful programs armed only with my laptop, a Pentium II running Debian, and a fat book on PHP5.  Though I&#8217;d taken a few classes on C++ and tinkered with BASIC on a few different platforms over the years, I&#8217;d never managed to produce anything that actually did anything practical (or, did it very well, at any rate); with PHP, though, it didn&#8217;t take long to spread my coding wings and take to the air as a novice web developer.
</p>
<p>
Before long, my skills proved useful in some critical situations at work, and my place as a web developer was cemented.  My PHP code became more mature as I learned hard lessons of experience and combined them with the programming theory and computer science I was avidly consuming on the web.
</p>
<p>
Around the same time, I got interested in Python when I saw a coworker using it to build powerful desktop applications quickly and effortlessly; I wanted to round out my programming skills with a &#8220;desktop stack&#8221; as quick and simple as PHP, and Python turned out to be a good choice.
</p>
<p>
So for a few years now I&#8217;ve written mainly in these two languages, PHP for the web and Python for the desktop.  As my applications have grown bigger and more complex, I began to develop a growing discontentment with PHP on a number of levels.  So when people started talking about doing web development in Python, I had to see if I could make the switch.
</p>
</div>
<p><span id="more-657"></span>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">What &#8220;they&#8221; say</h2>
<div class="outline-text-2" id="text-2">
<p>
Programmers who like to be vocal about things on the Internet often like to be vocal about PHP; it seems every so often someone will write an <a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/">epic diatribe</a> on <a href="http://www.codinghorror.com/blog/2008/05/php-sucks-but-it-doesnt-matter.html">what&#8217;s wrong with PHP</a> and why everyone should avoid it. They will tell you to instead use Java, or Ruby, or Python, or whatever &ndash; just not PHP.  And while I can&#8217;t bring myself to completely denounce PHP, when I&#8217;ve been waist-deep in a hacked-up PHP codebase for a while, words like &#8220;elegant&#8221;, &#8220;expressive&#8221; and &#8220;truly object oriented&#8221; stir something in me that PHP&#8217;s clumsy and inconsistent attempts at bettering itself just don&#8217;t answer.
</p>
<p>
Yet when I finally vaulted the fence in search of the greener grass, I found, predictably, that paradise has a few bald spots of its own. More importantly, though, I found that there is a significant paradigm shift that a PHP developer has to make before embracing other languages.  Since nobody ever really talked about this shift, I decided to write this article to help others with the journey.
</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">What is PHP anyway?</h2>
<div class="outline-text-2" id="text-3">
<p>
If your web development story, like mine, begins with PHP, you probably have a similarly skewed idea of what developing a web application is really all about.  Correcting that perspective starts with understanding what PHP really is.
</p>
</div>
<div id="outline-container-3-1" class="outline-3">
<h3 id="sec-3-1">A templating system</h3>
<div class="outline-text-3" id="text-3-1">
<p>
At its heart, PHP is a templating system &ndash; a templating system, mind you, that&#8217;s been bitten by a radioactive web spider and mutated into a massive, object-oriented language &ndash; but still fundamentally a templating system.  What I mean by this is best explained by describing what happens when a PHP document is accessed in a browser:
</p>
<ul>
<li>The web server (Apache, e.g.) receives a request for a PHP document.
</li>
<li>The web server runs PHP, passing in the requested file and some details about the request
</li>
<li>PHP processes the requested file, dumping in any &#8220;required&#8221; or &#8220;included&#8221; files, and evaluating the &#8220;&lt;?php ?&gt;&#8221; bits wherever they occur.
</li>
<li>PHP returns the evaluated document (now pure HTML/XML/CSS/etc) to the web server, which sends it to the browser.
</li>
</ul>
<p>
This is why you can stick HTML directly in a PHP file (outside the tags), and it will work just fine:  a PHP file fundamentally <b>is</b> an HTML file (even if there&#8217;s no raw HTML in it), just one that is marked for some pre-processing<sup><a class="footref" name="fnr-.1" href="#fn-.1">1</a></sup> before it&#8217;s served.
</p>
</div>
</div>
<div id="outline-container-3-2" class="outline-3">
<h3 id="sec-3-2">A framework</h3>
<div class="outline-text-3" id="text-3-2">
<p>
PHP is also a kind of minimal framework.  It does a few nice things for you (such as parsing HTTP requests into nice arrays like $_GET and $_POST), and exposes a huge library of optional functionality like database connectivity and image processing.
</p>
<p>
It&#8217;s important to recognize this, because you need to understand that PHP by itself (apart from any third-party add-ons or abstraction layers) has solved a lot of problems for the web developer out-of-the-box.  They way it solves these problems is sometimes good, and sometimes not; but in either case, it&#8217;s rarely the only way to solve them.  It&#8217;s easy to take for granted that the way PHP has done something is the only, or canonical, way.  Get used to the idea that it is not.
</p>
</div>
</div>
<div id="outline-container-3-3" class="outline-3">
<h3 id="sec-3-3">Bad, but no so bad</h3>
<div class="outline-text-3" id="text-3-3">
<p>
As I&#8217;ve said, people will bash PHP incessantly, and you can be sure they will continue to.  If you can read all the way through &#8220;<a href="http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/">PHP: a fractal of bad design</a>&#8220;<sup><a class="footref" name="fnr-.2" href="#fn-.2">2</a></sup> and still feel completely good and happy about coding in PHP &ndash; well, you&#8217;ve got resolve anyway.  PHP clearly has problems, ranging from niggling warts to major structural issues.
</p>
<p>
But in the end, what really matters is <i>you</i>, <i>your software</i>, and the <i>people</i> who use your software.  PHP&#8217;s alleged shortcomings are meaningless academic drivel until they start to impact these things; and I&#8217;d guess that in a lot of cases, they don&#8217;t.  Not everyone is trying to build the next big Web 3.0 killer-app-in-a-browser; some people just want to automate some things on a personal website, or build a basic CRUD system for a set of data they use at work.  Don&#8217;t get caught up in the PHP hate and throw away a perfectly good tool that has solved these problems in a decently usable way out-of-the-box.
</p>
</div>
</div>
</div>
<div id="outline-container-4" class="outline-2">
<h2 id="sec-4">What is Python, and how do you build a web application with it?</h2>
<div class="outline-text-2" id="text-4">
<p>
Python is a general-purpose programming language.  It has a huge set of libraries to make it useful for a wide variety of tasks, but fundamentally it&#8217;s a programming language that wasn&#8217;t designed for any specific use.
</p>
<p>
It&#8217;s also an absolutely awesome language to work with.
</p>
<p>
It&#8217;s not, however, a web framework (not even a minimal one) or a templating system; so if you intend to use it for web development on a level similar to PHP, you&#8217;ll need to add these things to Python.
</p>
<p>
I mention this because in the PHP world, there are also frameworks and templating systems &ndash; Zend Framework or CakePHP for example.  Personally, I used CodeIgniter for two or three major (for me) projects, and found it very helpful&hellip; at first.  After maintaining the code (and keeping CI upgraded) for a couple of years, I got disenchanted with the framework thing.  I found that most of what I really wanted from a framework could be answered with a couple hundred lines of convenience functions and some careful class structure planning.  So to me, &#8220;framework&#8221; initially conjured up a big bloated can of overkill.
</p>
<p>
If you feel the same way, understand that in the Python world you will <b>need to use a framework</b> &ndash; at least a minimal one &ndash; because (you&#8217;ll recall) you were already using a minimal framework called PHP.
</p>
<p>
The same goes for a templating system.  I originally thought, &#8220;meh, why bother with a templating system?&#8221;; but really, unless you like having big non-syntax-highlighted blobs of HTML in your logic code (you shouldn&#8217;t like this!), you will want a templating system.
</p>
<p>
So, understanding this, let&#8217;s look at some frameworks and templating systems.
</p>
</div>
</div>
<div id="outline-container-5" class="outline-2">
<h2 id="sec-5">Python Web Frameworks</h2>
<div class="outline-text-2" id="text-5">
<p>
Venturing into the world of Python frameworks will immediately have you staring down the keen double-edged blade of choice.  There are <a href="http://wiki.python.org/moin/WebFrameworks">dozens of them</a>, ranging from minimal and low-level to massively abstracted software suites with more gadgets than Batman&#8217;s utility belt.  I have only worked with a few, so I&#8217;m going to stick with what I know here, in roughly the order that I tried them.
</p>
</div>
<div id="outline-container-5-1" class="outline-3">
<h3 id="sec-5-1">mod_python and python server pages</h3>
<div class="outline-text-3" id="text-5-1">
<p>
Before I really &#8220;got&#8221; python web development, I of course went to it with the mindset of a PHP developer; this sent me straight into the arms of mod_python and python server pages (PSP).  This setup allows you to do with Python pretty much what you do with PHP:  you write a python script, and Apache executes it in-place whenever it gets a GET or POST request for the script.  The script in question can either be pure python, or an html file with PSP embedded (PSP is basically a templating system; to use it, you just drop in tags (delimited by &lt;% %&gt;) much like you do with PHP).
</p>
<p>
At first this seems pretty cool; but after a while, you realize that you haven&#8217;t really improved the structure or security of your application over PHP, and you&#8217;ve traded away all the really nice web-oriented conveniences of PHP just to get a language with slightly (OK vastly) better syntax.  It seems kind of a wash, and in the end I never saw much incentive to switch based on mod_python.
</p>
<p>
Apparently, the Python &amp; Apache communities concur, because as of 2010 the mod_python project was abandoned.  No great loss, as far as I can tell.
</p>
</div>
</div>
<div id="outline-container-5-2" class="outline-3">
<h3 id="sec-5-2">Django</h3>
<div class="outline-text-3" id="text-5-2">
<p>
If you say &#8220;Python Web Framework?&#8221; in a room full of people, chances are they&#8217;ll just look at you funny; but if anyone actually does respond, they&#8217;ll probably say &#8220;Django&#8221;.  Some consider it to be the one-and-only Python web framework worth talking about, and the banner under which all such development should rally.
</p>
<p>
Django is what you&#8217;d call a full framework; it&#8217;s got pretty much everything built-in and ready to roll: templating, database abstraction/ORM, sessions &amp; security, and even its own web server.
</p>
<p>
Despite the features and popularity, Django didn&#8217;t really get traction with me for a few reasons:
</p>
<p>
First, because it&#8217;s not really my style to use tools that are &#8220;everything you could ever possibly need right out of the box&#8221;; I tend to prefer more minimal, modular tools that I can build on easily.
</p>
<p>
Second, because it&#8217;s one of those frameworks that has you start out a project by running a special &#8220;init&#8221; command which flomps out a tree full of generated code, into the midst of which you&#8217;re to write your application.  I could be wrong, but in my previous experiences, this sort of thing means painful upgrades down the road as you surgically inject code updates into your app.
</p>
<p>
Finally, (and I could be wrong here), it seemed to me that Django wanted to be in charge of the database layout and code, and wouldn&#8217;t work well with an existing database.  Since I am very often tasked with writing alternate front-ends or reporting tools for existing (and often read-only) databases, this doesn&#8217;t work for me.
</p>
<p>
I decided to give up on Django after a few days of tinkering, and went back to PHP.
</p>
</div>
</div>
<div id="outline-container-5-3" class="outline-3">
<h3 id="sec-5-3">CherryPy</h3>
<div class="outline-text-3" id="text-5-3">
<p>
After Django, I was attracted to CherryPy on a couple of counts.  First, it doesn&#8217;t generate a big tree of boilerplate code &ndash; it&#8217;s just a library that you import.  More importantly, it isn&#8217;t attached to a particular templating system or database layer, so you can use whatever you want (or nothing at all).  I was still in the &#8220;I don&#8217;t need no stinkin&#8217; template system&#8221; mindset when I tried it, and the project I wanted to do didn&#8217;t talk to a database at all; so this minimal framework was ideal for me.
</p>
<p>
I managed to produce a nice utility which we still use at my work, but my experience was somewhat mixed.  Chalk it up to my inexperience with Python web development, but I had basically two problems with my CherryPy project:
</p>
<ul>
<li>There were at least two or three ways to do certain things, like setting configuration options, and the documentation would mix and match them.  The same method didn&#8217;t always work for me, either; this made my code feel inconsistent.
</li>
<li>Many things in the program require some automagical combination of function and variable names, such as session authentication.  I had a lot of trouble getting these to work properly, and the debugging messages were not helpful.
</li>
</ul>
<p>
Maybe with more time and experience, and longer study of the documentation, I could get along with CherryPy; but at the time, I had work to do and PHP was ready to roll up its sleeves.
</p>
</div>
</div>
<div id="outline-container-5-4" class="outline-3">
<h3 id="sec-5-4">Flask</h3>
<div class="outline-text-3" id="text-5-4">
<p>
Lately I&#8217;ve discovered Flask.  Like CherryPy, it&#8217;s also a simple library that just has to be imported, and allows you to use whichever templating system or database layer you like (though it seems well-integrated with jinja2).  So far I get along pretty well with Flask; it feels a little more straightforward than CherryPy, without a lot of the automagical things based on function or variable names.  I&#8217;ve had some problems with the way it parses complex form data (doesn&#8217;t like nested arrays, apparently<sup><a class="footref" name="fnr-.3" href="#fn-.3">3</a></sup>).  It&#8217;s also helped me realize my need for a templating language, and I learned pretty much all I needed to learn about Jinja2 in roughly ten minutes.
</p>
<p>
Granted, I don&#8217;t have any Flask-based code in production at this point<sup><a class="footref" name="fnr-.4" href="#fn-.4">4</a></sup>, so I may still be on the hype curve.  I&#8217;m working on my second Flask-based app right now, and still pretty pleased.
</p>
</div>
</div>
</div>
<div id="outline-container-6" class="outline-2">
<h2 id="sec-6">Python Templating systems</h2>
<div class="outline-text-2" id="text-6">
<p>
I don&#8217;t have a ton to say about templating systems, because I&#8217;ve only used Jinja2 so far; but I will say this for the benefit of PHP developers like me who think they don&#8217;t need a templating system:  do yourself a favor and use a templating system.  Remember that PHP <b>is</b> a templating system, so it isn&#8217;t as if you haven&#8217;t already been using one (you probably just didn&#8217;t realize it).  Don&#8217;t do what I did in my CherryPy project and just put your HTML in strings and use printf()-style substitution.  Yeah, it works, but it&#8217;s ugly, you don&#8217;t get proper syntax highlighting, and it mixes presentation with logic.
</p>
<p>
Don&#8217;t stress about which one to use, either.  They&#8217;re all pretty much the same, just different syntax.  I picked Jinja2 because it&#8217;s well integrated with Flask and purported to be fast.  But really, there&#8217;s no wrong answer here; it takes about 30 minutes tops to figure out a new templating system.
</p>
<p>
One nice aspect I found with Jinja2 (and others probably have similar features) was the ability for templates to inherit from other templates.  So I can create a basic template for all pages with some named blocks, then have specific other templates inherit that template and only add to the specific blocks they need to change.  This is a nice change from the way I usually did it in PHP, where I&#8217;d have functions or class methods to produce various parts of the page (header, navigation, content, etc).
</p>
</div>
</div>
<div id="outline-container-7" class="outline-2">
<h2 id="sec-7">Some general notions you need to get familiar with</h2>
<div class="outline-text-2" id="text-7">
<p>
So you&#8217;ve got your framework and templating system picked out, but there are now some concepts you&#8217;ll want to get used to and some bad habits you&#8217;ll want to break in order to produce a Python web application.
</p>
</div>
<div id="outline-container-7-1" class="outline-3">
<h3 id="sec-7-1">The web page is not STDOUT</h3>
<div class="outline-text-3" id="text-7-1">
<p>
In PHP, if you want to put something on the web page, you just <b>echo</b> it.  Since we&#8217;re just pre-processing a document in-place, anything PHP spits out ends up on the resulting page.  This isn&#8217;t the <i>best</i> style of PHP coding, but now and then it&#8217;s how you solve a coding problem, and admittedly a lot of us PHP coders debug this way (using echo or var_dump() at any arbitrary points in the code to see what&#8217;s going on).
</p>
<p>
Python frameworks like Flask and CherryPy don&#8217;t operate this way; instead, you write functions that return a chunk of HTML, which the framework packages into an HTTP response.  So unlike PHP, if you just &#8220;print&#8221; something, it won&#8217;t end up on the resulting web page.  Instead, it ends up wherever STDOUT has been directed<sup><a class="footref" name="fnr-.5" href="#fn-.5">5</a></sup>
</p>
<p>
This wasn&#8217;t so much of an adjustment for me, because this is generally how I wrote PHP applications anyway:  as a set of functions that returned chunks of HTML.  For some PHP coders, who may be accustomed to just echoing data as they get it, this is a very foreign approach.
</p>
</div>
</div>
<div id="outline-container-7-2" class="outline-3">
<h3 id="sec-7-2">Routing</h3>
<div class="outline-text-3" id="text-7-2">
<p>
Earlier I described how a web server goes about handling a request to a PHP file; basically, if I browse to <a href="http://example.com/lib/docs/help">http://example.com/lib/docs/help</a>, the web server would look for &lt;webroot&gt;/lib/docs/help/index.(something).  If that &#8220;something&#8221; happens to be &#8220;php&#8221;<sup><a class="footref" name="fnr-.6" href="#fn-.6">6</a></sup>, then PHP gets the file, does its thing, and we&#8217;re all happy. If there isn&#8217;t an appropriate index file there, you get a 404 or maybe 403 error.  Bottom line, if you want to make the URL available with PHP, then (short of doing some magic in the web server configuration, e.g. mod_rewrite), you need to create a PHP file at that URL.
</p>
<p>
With modern Python frameworks, it&#8217;s not like this.  Making a particular URL on the server return a page of HTML doesn&#8217;t require that actual files exist at the path; rather, the framework has a system to map URLs to functions or classes in your program.  This is generally called &#8220;routing&#8221;.
</p>
<p>
So, in the example above, making that URL work on a Python-framework site would not require you to create any files under /lib/docs/help, or even create those directories under the webroot.  It just requires that your code maps the path &#8216;/lib/docs/help&#8217; to a function or class that returns a valid response (a chunk of HTML, or an HTTP response object, e.g.).
</p>
<p>
Some PHP frameworks or applications let you do something like routing (a.k.a. &#8220;pretty/simplified/clean URLS&#8221;), usually by using mod_rewrite to hide a request for some actual php file.
</p>
</div>
</div>
<div id="outline-container-7-3" class="outline-3">
<h3 id="sec-7-3">HTTP</h3>
<div class="outline-text-3" id="text-7-3">
<p>
Before I got into doing web applications with Python, I confess that I didn&#8217;t really understand HTTP all that well.  If you only work with PHP, you probably know that information can be sent to the server as a &#8220;GET&#8221; or &#8220;POST&#8221;, and you know the difference in terms of how it looks in the URL bar.  It turns out there&#8217;s a good bit more to HTTP than just GET and POST, and if you&#8217;re working with a Python framework there&#8217;s a lot of benefit in understanding it all.
</p>
<p>
It&#8217;s not that Python frameworks don&#8217;t abstract HTTP; it&#8217;s that they abstract it differently than PHP does &ndash; and frankly, I think they abstract it in a cleaner and more natural way.  For instance, while PHP makes the contents of an HTTP request available to your script through a series of global arrays (e.g. $_GET, $_SERVER, etc) or function calls (e.g. getallheaders()), Python frameworks tend to give you some kind of request object that encapsulates the entire HTTP request.
</p>
<p>
If you consider the fact that your Python framework and application are handling many of the things that PHP just let the web server handle, it makes sense that you&#8217;re going to be living a little closer to HTTP; don&#8217;t let this scare you though.  The more I&#8217;ve learned the more I start to think that HTTP itself is actually simpler than the mess that PHP abstracts it into.
</p>
</div>
</div>
<div id="outline-container-7-4" class="outline-3">
<h3 id="sec-7-4">MVC</h3>
<div class="outline-text-3" id="text-7-4">
<p>
If you&#8217;ve used one of the more well-known PHP frameworks (like CodeIgniter, e.g.) you&#8217;ve probably come across the term &#8220;MVC&#8221;<sup><a class="footref" name="fnr-.7" href="#fn-.7">7</a></sup>.  MVC is a software design strategy that cleanly divides your application into three parts:
</p>
<ul>
<li>The Model, which is your data model and handles all read/write operations to the database or data store
</li>
<li>The View, which is the interface the end user actually sees and interacts with
</li>
<li>The Controller, which manages interactions between the View and the Model
</li>
</ul>
<p>
If you haven&#8217;t used a framework, or disciplined yourself to using the MVC pattern already<sup><a class="footref" name="fnr-.8" href="#fn-.8">8</a></sup>, you&#8217;re in for a shock.  Python frameworks, so far as I have seen, all pretty much enforce the idea of MVC on one level or another.  This is ultimately a good thing for your code, and without patterns like this it gets difficult to scale to a real application; but it&#8217;s a real learning curve if your usual MO is to sandwich database queries and business logic between large chunks of HTML ad-hoc.
</p>
</div>
</div>
<div id="outline-container-7-5" class="outline-3">
<h3 id="sec-7-5">Planning and design</h3>
<div class="outline-text-3" id="text-7-5">
<p>
OK, the &#8220;real programmer&#8221; crowd out there may sneer a bit at this point, but if you&#8217;re going to move off PHP you need to prepare to do a little more planning when you create a web app.  If PHP excels at anything, it&#8217;s in allowing you to just sort of hop in and code by the seat of your pants and build something huge without a lot of advanced planning, sticking code wherever it seems to fit to get the job done.
</p>
<p>
The python frameworks I&#8217;ve encountered enforce a bit more rigidity than this.  Unlike PHP, you aren&#8217;t just tromping through a script from top to bottom, so you can&#8217;t just define things willy-nilly and expect them to be in scope when you need them.  Similarly, your templating language is merely a templating language, not a full-blown programming language; so you can&#8217;t just stick a bunch of function calls and variable assignments in your template because it feels good.
</p>
<p>
In addition, frameworks like Flask use a lot of design patterns and abstract constructs whose application isn&#8217;t immediately obvious to people who don&#8217;t get deep into software design theory.  Properly applying these constructs takes some contemplation about what your application is doing on a more abstract level.
</p>
<p>
This is ultimately good for you, because it forces you to design a better and cleaner application than you might have done in another language.  It absolutely requires a different mindset and approach, though.
</p>
</div>
</div>
</div>
<div id="outline-container-8" class="outline-2">
<h2 id="sec-8">Downsides to Python</h2>
<div class="outline-text-2" id="text-8">
<p>
In addition to the need to navigate the paradigm shifts I mentioned, there are some downsides and pitfalls to using Python for web development, and I think it&#8217;s fair to mention them.
</p>
</div>
<div id="outline-container-8-1" class="outline-3">
<h3 id="sec-8-1">Deployment</h3>
<div class="outline-text-3" id="text-8-1">
<p>
Deploying your PHP application is as simple as dumping your .php files into a folder under the webroot<sup><a class="footref" name="fnr-.9" href="#fn-.9">9</a></sup>.  Deploying a Python web application is a little more involved, and there are multiple ways of doing it each with its own pros and cons to weigh.
</p>
<p>
And of course, your web host may not support Python, Flask, or any of the other Python libraries you need to run your application; I can almost guarantee that the company who hosts this website doesn&#8217;t.  If you were thinking of writing a CMS in CherryPy for people to use on their $1.99/mo shared web host, you&#8217;re wasting your time.
</p>
</div>
</div>
<div id="outline-container-8-2" class="outline-3">
<h3 id="sec-8-2">Database access</h3>
<div class="outline-text-3" id="text-8-2">
<p>
If you&#8217;re into high-level abstractions that take all the icky SQL out of your code and replace it with objects and method calls, Python has you covered well with ORM layers like SQLAlchemy.  If you&#8217;re like me, and you actually prefer to write your own SQL, the situation is a little different.
</p>
<p>
PHP has a nice database abstraction layer called PDO, and if you aren&#8217;t using it, you need to quit typing &#8220;mysql_&#8221; and start using PDO.  PDO is a single library with consistent classes, methods, and properties no matter what database driver you&#8217;re using.
</p>
<p>
Python, on the other hand, has the DB-API, which is a specification for writing database libraries for Python.  Instead of one library with drivers for different databases, Python gives you product-specific libraries that (mostly) adhere to the DB-API.  In theory, this should be as nice as PDO, but in practice it&#8217;s more chaotic.  Some libraries extend DB-API with extra functions, and within the spec there is flexibility in how certain things are implemented (e.g., parameter style for parameterized queries).  I found this problematic when (for example) I ported a Flask application written for psycopg2 (a popular PostgreSQL library) to cx_Oracle (the one and only Oracle DB-API library) and had to adjust a lot of code<sup><a class="footref" name="fnr-.10" href="#fn-.10">10</a></sup> due to differences in interpretation of the spec.
</p>
<p>
Of course, someone out there is screaming at me now to use ORM, but I&#8217;m just not there yet.
</p>
</div>
</div>
<div id="outline-container-8-3" class="outline-3">
<h3 id="sec-8-3">Application focus</h3>
<div class="outline-text-3" id="text-8-3">
<p>
Frameworks like Flask or CherryPy seem to assume that you are actually writing an <i>application</i>, not just an arbitrary collection of unrelated web content.  This is great if you actually <i>are</i> writing an application, but not everyone is.  Sometimes you&#8217;re just creating a page that needs to do a little computational work before it displays, or a form that needs some simple processing on submission.
</p>
<p>
If you have a website like, say alandmoore.com, which contains several subsections of marginally-related content, much of which is legacy and doesn&#8217;t need to be touched, using PHP is pretty frictionless.  If I want to add a new page which has nothing to do with the rest of the site, but which needs to do some special processing before it displays (like, say, scanning a directory of MP3 files and displaying ID3 information), this is as simple as writing a new .php file and dropping it into a directory.
</p>
<p>
If my website were handled by a Python application, this would get trickier.  I&#8217;d either have to write and deploy a new WSGI application (which seems a lot of work and overhead for a single page), or I&#8217;d have to add a new function to my existing application (complicating and potentially destabilizing my whole site).
</p>
</div>
</div>
<div id="outline-container-8-4" class="outline-3">
<h3 id="sec-8-4">Python 2/3</h3>
<div class="outline-text-3" id="text-8-4">
<p>
The current curse of the Python universe is this whole Python 2 to Python 3 transition that&#8217;s been going on for the last few years.  In the web development space, there are <i>many</i> popular libraries and frameworks that don&#8217;t yet support Python 3; Notably Flask, Python Imaging Library, and Django<sup><a class="footref" name="fnr-.11" href="#fn-.11">11</a></sup>, though hopefully this will change soon.
</p>
<p>
What this means for new Python coders is that you need to keep coding in Python 2, but you need to do so in a way that will be easily portable to Python 3 in the future.  Which basically means you need to learn both versions.  Eek.  If you&#8217;re not already invested in Python, this can be a deterrent.
</p>
</div>
</div>
</div>
<div id="outline-container-9" class="outline-2">
<h2 id="sec-9">Do you need to switch?</h2>
<div class="outline-text-2" id="text-9">
<p>
I&#8217;m not going to be one of those bloggers who insists that you <i>need</i> to switch away from PHP to Python or anything else.  PHP isn&#8217;t going away any time soon, and for a lot of applications it&#8217;s perfectly adequate and easy to ideate.  I will say, however, that taking the time and effort to embrace a language like Python and the disciplines of the more popular frameworks is beneficial to any web programmer.
</p>
<p>
What really motivated <i>me</i> to get into Python was when I started using AJAX more and more, and found my applications moving from a set of dynamic web pages to Javascript applications that occasionally talked to a web service to read &amp; write data.  In other words, when my server-side code was more about exposing a large range of read/write database operations to AJAX calls than generating full pages of formatted HTML, the Python frameworks did this with a lot less fuss and a lot less data-shuffling.
</p>
<p>
I&#8217;d suggest sticking with PHP in the following scenarios:
</p>
<ul>
<li>Your pages are mostly HTML with just a little bit of dynamic content here and there
</li>
<li>Your work needs to be deployed on cheap shared web-hosting
</li>
<li>You don&#8217;t think of what you&#8217;re writing as an &#8220;application&#8221;, just &#8220;web pages&#8221;
</li>
</ul>
<p>
If you&#8217;re doing serious web development work, and you have control over the production server, then I think it&#8217;s well worth the effort to use Python for your next big project.  I will most likely continue to do a lot of work with PHP for legacy projects at work and for clients; but as much as possible, I&#8217;ll be moving to Python from here on out.
</p>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<p class="footnote"><sup><a class="footnum" name="fn-.1" href="#fnr-.1">1</a></sup> Note the official PHP backronym is &#8220;PHP Hypertext Preprocessor.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.2" href="#fnr-.2">2</a></sup> I mention this rant a few times because it&#8217;s made waves in the web development community over the last year or so, and makes a lot of good points.  For the record, I don&#8217;t agree with everything in it (some points seem a little contrived or unfair), but a lot of the criticism is spot on (like the inconsistencies in naming and parameter ordering) and convinced me to try harder at branching out.  I think any PHP developer should read that rant with an open mind.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.3" href="#fnr-.3">3</a></sup> To be fair, I fixed this issue with about 10 lines of python.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.4" href="#fnr-.4">4</a></sup> This isn&#8217;t Flask&#8217;s fault, I have a reporting application ported from PHP mostly done, but held up by one of our vertical app vendors.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.5" href="#fnr-.5">5</a></sup> Which, when you&#8217;re using the built-in development server, is usually to the terminal from which you ran the application.  Which is pretty wizard, really.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.6" href="#fnr-.6">6</a></sup> or any other extension which the web server is configured to interpret as PHP
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.7" href="#fnr-.7">7</a></sup> Model View Controller
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.8" href="#fnr-.8">8</a></sup> Read: &#8220;If your code is haphazardly littered with calls to mysql_query()&hellip;&#8221;
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.9" href="#fnr-.9">9</a></sup> Assuming PHP is already set up and configured, which is pretty trivial in these days of cheap web hosts and easy Linux distributions.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.10" href="#fnr-.10">10</a></sup> I mean Python code; it&#8217;d be natural and expected to have to adjust SQL code between products, of course.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.11" href="#fnr-.11">11</a></sup> Python 3 support is currently experimental
</p>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/02/02/from-php-to-python-things-i-wish-id-known/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a Linux system for a Child, part2: Distros and software</title>
		<link>http://www.alandmoore.com/blog/2013/01/31/building-a-linux-system-for-a-child-part2-distros-and-software/</link>
		<comments>http://www.alandmoore.com/blog/2013/01/31/building-a-linux-system-for-a-child-part2-distros-and-software/#comments</comments>
		<pubDate>Thu, 31 Jan 2013 22:42:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Old computers]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[instructional]]></category>
		<category><![CDATA[kids]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Practical tech]]></category>
		<category><![CDATA[series]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=653</guid>
		<description><![CDATA[Alan explores the art and adventure of setting up a Linux-based system for young people.]]></description>
				<content:encoded><![CDATA[<p>The <a href="http://www.alandmoore.com/blog/2013/01/07/building-a-linux-system-for-a-child-part-1-what-and-why/">last article in this series</a> described some of the more general realities of running Linux on a child&#8217;s computer.  Now that I&#8217;ve (surely) convinced you to go ahead an put GNU/Linux on your child&#8217;s computer, it&#8217;s time to get down to nuts and bolts: which distribution, and what software?
</p>
<p><span id="more-653"></span></p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">Ready-made distributions for kids</h2>
<div class="outline-text-2" id="text-1">
<p>
There are a few distributions out there which attempt to deliver a child-friendly desktop right out of the box.  These might be useful to you if you&#8217;re not very experienced with Linux, but even if you are, they can be a good introduction to what&#8217;s available for kids.
</p>
</div>
<div id="outline-container-1-1" class="outline-3">
<h3 id="sec-1-1">DouDouLinux</h3>
<div class="outline-text-3" id="text-1-1">
<p>
This Debian derivative from France is aimed at very young children.   The interface is colorful and simple, and they&#8217;ve done some clever things to make the login menu act like an application menu, so that the child can just boot the PC and click (for example) &#8220;tuxpaint&#8221; and be in tuxpaint without all that tedious logging in and starting a desktop environment.
</p>
<p>
There&#8217;s also the option for them to log in to a desktop environment &ndash; specifically LXDE with LXLauncher running (so it&#8217;s kind of like the original eeePC interface, with tabs and big icons for stuff).  The fact that it&#8217;s LXDE means it can run well on your old computer, and I had good luck installing DouDouLinux on a k6-2 laptop with 256 Mb of RAM (we use that particular unit to teach patience&hellip;).
</p>
<p>
If you plan to let the kids surf the web, DouDouLinux comes with content filtering already configured and enabled right out of the box.  As far as I know, it&#8217;s the only distribution that does this, and for this reason alone is pretty sweet.
</p>
<p>
The program selection and graphics pretty much target younger grade-school children; your preteen will probably not appreciate all the teddy-bears and kitty-cats and whatnot.
</p>
</div>
</div>
<div id="outline-container-1-2" class="outline-3">
<h3 id="sec-1-2">Qimo</h3>
<div class="outline-text-3" id="text-1-2">
<p>
Qimo (sometimes called Qimo4Kids)is an Ubuntu respin with an XFCE desktop.  It looks really nice, includes all the usual software suspects, and (since it&#8217;s XFCE) works reasonably well on older systems.  Unfortunately the project hasn&#8217;t been updated in nearly 3 years, and there aren&#8217;t any signs of life at the website as of this writing.  If you&#8217;ve got the bandwidth and media to spare, though, booting to a Qimo live CD might give you some good ideas, if nothing else&hellip;.
</p>
</div>
</div>
<div id="outline-container-1-3" class="outline-3">
<h3 id="sec-1-3">SkoleLinux</h3>
<div class="outline-text-3" id="text-1-3">
<p>
SkoleLinux is basically the Debian-edu project&#8217;s Debian respin; it&#8217;s designed for deployment in schools using Linux Terminal Services, but you can still use it to set up a standalone desktop.  It comes pre-loaded with a good selection of educational titles (mostly STEM-heavy stuff aimed at classroom use) on a simple KDE desktop.
</p>
<p>
SkoleLinux&#8217;s default configuration isn&#8217;t visually exciting or inspiring, but it&#8217;s a nice way to discover some programs you might not otherwise find.  It&#8217;s pure Debian, so you can easily reconfigure it (lighter desktop environment, e.g.) after installation.
</p>
</div>
</div>
<div id="outline-container-1-4" class="outline-3">
<h3 id="sec-1-4">Edubuntu</h3>
<div class="outline-text-3" id="text-1-4">
<p>
Edubuntu is basically Ubuntu&#8217;s take on SkoleLinux; like SL, it&#8217;s designed for network deployment at schools, but can also be used on a single standalone desktop.  It features Ubuntu&#8217;s Unity desktop along with just about every educational program available in the repositories, so it might be a good shortcut to try if you were just going to install Ubuntu in the first place.
</p>
<p>
The Unity desktop makes it a poor choice for older computers though, so if your computer is actually older than the child, you might be better off with one of the other options.
</p>
</div>
</div>
<div id="outline-container-1-5" class="outline-3">
<h3 id="sec-1-5">Are ready made distributions worth it?</h3>
<div class="outline-text-3" id="text-1-5">
<p>
Projects aiming to create the perfect desktop for kids come and go; no doubt there will be more to come.  From my perspective, they&#8217;re mostly just different ways to deliver the same set of programs and maybe some kid-friendly artwork.  DouDou has a few twists to offer, but I found that my kids outgrew it quickly and just wanted a desktop environment.
</p>
<p>
If you&#8217;re committed to doing this Linux thing, I&#8217;d recommend getting your hands dirty with a general-purpose distribution and just configuring it to your child&#8217;s needs, because more than likely none of these distros are going to be exactly what you need right out-of-the-box anyway.  If you choose Debian, Ubuntu, or a derivative of either, all the SkoleLinux/Edubuntu packages are already available to you anyway, and you won&#8217;t be locked into a specific desktop environment or burdened with software that isn&#8217;t age-appropriate for your child.
</p>
</div>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">General purpose distributions</h2>
<div class="outline-text-2" id="text-2">
<p>
Since I&#8217;m recommending going with a general-purpose distribution, you may well ask, &#8220;Which one?&#8221;.  If you have a favorite Linux distribution already, skip this section<sup><a class="footref" name="fnr-.1" href="#fn-.1">1</a></sup>.  If you&#8217;re new to GNU/Linux and aren&#8217;t sure which distribution to choose for your child&#8217;s computer, here&#8217;s a quick-n-dirty assessment of distributions I&#8217;ve used.
</p>
<ul>
<li>I prefer anything derived from <b>Debian</b>.  This includes <b>Ubuntu</b> (any flavor), <b>Linux Mint</b>, <b>Mepis</b>, and many many more.  Mostly this is because a huge amount of software can be installed very easily in Debian-based distributions.
</li>
<li><b>Ubuntu</b> and its spin-offs are nice if you&#8217;re new and want some easy installation and configuration tools. If you object to the commercial stuff or desktop environment of Ubuntu, try <b>Kubuntu</b> for a newer computer or <b>Xubuntu</b> for an older computer.  If both of those are too slow, try <b>Lubuntu</b>.
</li>
<li>Stick to the <b>LTS</b> (long term support) releases of K/X/L/Ubuntu.  They get security &amp; bugfix support for 3-5 years.  Currently this is 12.04, and the next will be 14.04.  Otherwise you&#8217;ll have to deal with a catastrophically massive upgrade every six months.
</li>
<li>If you&#8217;re less interested in hand-holding and want slightly better performance, try <b>Debian</b>.  Software in Debian&#8217;s <b>stable</b> release is usually a few releases behind Ubuntu, but very solid and bug-free.  New stable releases only come about every 2-3 years.  Stick with stable unless you&#8217;re willing to deal with random breakage now and then.
</li>
<li>If you like Debian stable but want a little friendlier install &amp; configuration, and some of the applications to be more up-to-date, there are several derivatives that do this sort of thing.  My favorite for a long time was <b>Mepis</b>, which comes pre-configured with a nice KDE desktop like Kubuntu; if you&#8217;re not into KDE, you might prefer <b>SolusOS</b> or one of the <b>Linux Mint</b> Debian editions too.
</li>
<li>If you really hate the idea of using Debian (or derivatives), want a huge selection of software in bleeding-edge versions, and aren&#8217;t afraid to do a sizeable amount of learning to set up and maintain the system, go with <b>Arch Linux</b>.  But don&#8217;t say I didn&#8217;t warn you&hellip;
</li>
</ul>
<p>
These aren&#8217;t the only choices, but their the ones I&#8217;ve personally worked with and can attest positively to.  I&#8217;m sure if you ask your nearest Linux geek, you&#8217;ll get some strong opinions one way or another.
</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">Software for kids</h2>
<div class="outline-text-2" id="text-3">
<p>
Few things are more tedious to read, or prone to becoming stale, than an exhaustive list of software; so rather than listing every child-oriented package available for Linux, I&#8217;ve picked a few standouts &ndash; that my kids have actually <i>used</i> and <i>enjoyed</i> &ndash; to recommend.  These are mostly educational (I could write a book on the non-educational things we&#8217;ve played over the years), but some are just really quality games or apps that have been our favorites.
</p>
</div>
<div id="outline-container-3-1" class="outline-3">
<h3 id="sec-3-1">Recommended for young children (pre-k through 2nd grade)</h3>
<div class="outline-text-3" id="text-3-1">
<ul>
<li><b>GCompris</b>:  a massive collection of small, educational activities for kids that covers a wide variety of subject matter, from core things like numbers and letters to obscurities like how a lock and dam works or how to pilot a submarine.  Most of my kids have found at least a handful of GCompris activities enjoyable and educational, if only for a few years around first grade.  After that they kind of lost interest.
</li>
<li><b>Tuxpaint</b>:  this is a really fun paint program with tons of cool stuff like stamps and special effects.  Every one of my kids has enjoyed tuxpaint at some point, and even my oldest occasionally tinkers around in it.  Heck, even I get caught up in it now and then&hellip;
</li>
<li><b>Childsplay</b>:  a smaller and less-polished attempt at the GCompris idea, childsplay nevertheless has a few activities that some of my kids really liked for a long time.  The animal/letter flashcards are useful on a variety of levels.
</li>
<li><b>Tux-typing/Tux-math</b>:  These two games used to be very different, but kind of merged together at some point so that they are basically the same games except that in one you type and in the other you do arithmetic.  My kids didn&#8217;t play these a huge amount<sup><a class="footref" name="fnr-.2" href="#fn-.2">2</a></sup>, but these games are really well done, and might be a little more fun for drilling typing or math than some more sterile options.
</li>
<li><b>Supertux</b>: Not exactly an educational pick, but this one has been number one on the charts with my kids for <i>years</i>.  The killer feature for my kids was never the game itself, though, but the level editor.  This and other games with level editors have been instrumental in helping my kids see that computers are <b>creative tools</b> and not just consumption devices.
</li>
<li><b>Ktuberling</b>: This started out as a &#8220;Potato-head&#8221; program where you could drop facial features on a picture of a potato, but over the years has morphed into a 2-d playground application where you can build robots, make a pizza, or design a butterfly, among other things.  My younger ones enjoy playing with this and telling stories as they build a picture.
</li>
</ul>
</div>
</div>
<div id="outline-container-3-2" class="outline-3">
<h3 id="sec-3-2">Recommended for slightly older children (2nd &#8211; 6th grade)</h3>
<div class="outline-text-3" id="text-3-2">
<ul>
<li><b>FreeCol</b>: This is a turn-based strategy game set in the Colonial age, and while it&#8217;s not strict to history it&#8217;s had some educational value in giving my kids a feel for the period and an interest in learning more about the 16th thru 18th centuries.
</li>
<li><b>Phun</b>: this is a cool little &#8220;playground&#8221; for 2-d physics simulation.  You can create objects, springs, wheels, gears, water, and other simulations and combine them together to build simple machines.  Our favorite use of Phun is building 2-dimensional seige engines to knock down block walls.
</li>
<li><b>Celestia</b>: if you have a child going through an &#8220;Outer Space is awesome&#8221; phase, Celestia is paradise.  It&#8217;s a 3D simulation of the known universe that uses (whenever possible) authentic image overlays to be as realistic as possible.  So you can fly off to Jupiter and watch its moons go round and round, or explore a comet at close proximity.
</li>
<li><b>SuperTuxKart</b>: This game isn&#8217;t at all educational, but dad-gumball it&#8217;s fun.  Just had to give a shoutout.
</li>
<li><b>Ri-Li</b>:  This is a &#8220;realtime puzzle&#8221; sort of game where you have to guide a toy train around a track so that it picks up cars and doesn&#8217;t crash (kind of a spin on classic snake games, I guess).  Good for cognitive development, I suppose, and great for boys who are going through the &#8220;train phase&#8221;.
</li>
<li><b>Fish Fillets</b>:  This is an old logic game, in which you have to move objects around the screen and arrange them in a certain way so that your two fish characters can escape.  I put it in this category because my kids started enjoying it as early as 2nd grade, but many of the actual puzzles are pretty challenging even for very intelligent adults.  You&#8217;ll probably have to help your kids with these, but they&#8217;re a good way to teach logic and logical sequencing.
</li>
</ul>
</div>
</div>
<div id="outline-container-3-3" class="outline-3">
<h3 id="sec-3-3">Recommended for older children (6th grade and up)</h3>
<div class="outline-text-3" id="text-3-3">
<ul>
<li><b>Scratch</b>:  This is awesome software for kids interested in computers; scratch is a graphical, drag-and-drop programming environment for kids<sup><a class="footref" name="fnr-.3" href="#fn-.3">3</a></sup>.  I downloaded it intending to use it as a tool to teach programming basics, but after turning my son loose on it for a day or two I found him writing his own simple games and doing stop-motion animation with his legos all on his own.  My two oldest still really enjoy working in Scratch, and it helped them both immensely when we studied Python.
</li>
<li><b>Minetest</b>:  You can think of minetest as a block-based 3D &#8220;sandbox&#8221; game&hellip; or more realistically as a free knockoff of MineCraft.  Keep an eye on your kids with this one, though, because (just like MineCraft) it&#8217;s insanely addictive.
</li>
<li><b>OpenTTD</b>:  My oldest loves this game; it&#8217;s a simulation game about building up a transportation business.  Teaches lots of good ideas about business, economics, urban planning, civil engineering, etc.
</li>
<li><b>KSudoku</b>:  There are many sudoku applications out there for Linux, but our favorite is KSudoku.  It&#8217;s visually compelling and has some very thoughtful features.
</li>
<li><b>Laby</b>: This is a game for your programmer child; You have to write short programs to move an ant through a maze of spider webs.  Unfortunately this game is currently very short, but it might puzzle your little professor for a few days.
</li>
<li><b>StopMotion</b>:  This is a cool program for making stop-motion videos, and very easy to use.  Stopmotion + cheap webcam + Lego collection + too much free time can easily yield some awesome and hilarious stuff.
</li>
<li><b>LMMS</b>: My kids aren&#8217;t nearly as interested in music as you might think, given that I&#8217;m an ex-recording artist/composer/producer; but they&#8217;ve been wondering about how to make music for some of their Scratch projects and stop-motion films.  LMMS is a nice, simple package for composing electronic music with software synthesizers and samples; it takes a little bit of basic orientation to get going, but it&#8217;s much more accessible than tools like <b>Ardour</b>, <b>Rosegarden</b>, or the like.
</li>
<li><b>KDE edu</b>: The KDE project has some nice educational tools, mostly useful for older kids and adults.  They aren&#8217;t necessarily cool programs your kid will launch into every day, but more like resources for helping with schoolwork (particularly if you homeschool like we do).  For example, Kalzium (an interactive periodic table) was really useful when we did chemistry; &#8220;kbruch&#8221; is nice for teaching fractions, and &#8220;kgeography&#8221; is awesome for showing you how little you know about world geography.
</li>
</ul>
</div>
</div>
<div id="outline-container-3-4" class="outline-3">
<h3 id="sec-3-4">Other software to consider</h3>
<div class="outline-text-3" id="text-3-4">
<ul>
<li><b>Google Earth</b>:  I wish we&#8217;d had Google Earth when I was a kid.  I still find it amazing we have such a thing available to us; my kids don&#8217;t appreciate it as much as I wish they did, but we can still while away an hour or two finding cool or familiar places on Google Earth.
</li>
<li><b>Text editor</b>: If kids can type, sometimes they just want to type stuff.  Make sure there&#8217;s a good, simple text editor like leafpad, gEdit, or Kwrite available on the system.  Yeah, you can give them a word processor too, but sometimes it&#8217;s nice to just focus on the text.  For younger kids, preset the font to be nice and big.  If you want something a little more free-form, that also allows drawing on the page, check out <b>Xournal</b>.
</li>
<li><b>DOSbox</b>:  There is a lot of freeware, shareware, and abandonware out there in the wild for DOS; and while it doesn&#8217;t boast the latest graphics and multimedia goodies, I can attest that much of it still has educational or entertainment value for kids.  There are other classic emulators out there to, for various systems from Sega, Nintendo, and Sony; but I mention DOSbox in particular because there <i>are</i> programs for DOS with educational value (surely you&#8217;ve got a copy of <i>Oregon Trail</i> kicking around somewhere?).
</li>
<li><b>Bibletime</b>:  We are a Christian family, and Bible study is an important part of our lives; there are a few Bible programs out there for Linux, but I highly recommend Bibletime.  It has some KDE dependencies, so if you just must have a GTK program try <b>Xiphos</b>; but if you care more about functionality and usability try Bibletime.
</li>
<li><b>PlayOnLinux</b>:  This is a graphical front-end to Wine that makes it dead-easy to install supported software on Linux.  If you happen to have some old discs of kid-friendly games for long-gone versions of Windows, and you&#8217;re going to have a go at making them work in Wine, try PlayOnLinux first.  It might just save you a lot of work.
</li>
</ul>
</div>
</div>
<div id="outline-container-3-5" class="outline-3">
<h3 id="sec-3-5">Which Desktop Environment?</h3>
<div class="outline-text-3" id="text-3-5">
<p>
With the smorgasbord of desktop environments now available on Linux, it&#8217;s worth asking: which one is best for kids?  Well, we haven&#8217;t used them all at my house, but of the ones we&#8217;ve tried, here are my thoughts:
</p>
<ul>
<li><b>KDE</b>:  Since we started out with MEPIS years ago, KDE 3 was our favorite desktop environment for the longest time.  KDE 4 lost us for a bit in the early days, but now that it&#8217;s stable and performant we&#8217;re back on it.  The &#8220;search and launch&#8221; desktop, with a bit of setup, makes a very nice desktop for kids, and there are lots of fun themes and plasma widgets you can install to make the desktop special and cool.  Biggest problems we&#8217;ve had with KDE were some content issues with the &#8220;Get Hot New Stuff&#8221; functionality<sup><a class="footref" name="fnr-.4" href="#fn-.4">4</a></sup>, and that the kids would destroy the desktop beyond functionality by loading it with lots of pointless widgets (another set of Xeyes?  Sure why not, I&#8217;ve only got 10!) and removing important ones (like the launcher menu).  Once we got past this, KDE 4 is great.
</li>
<li><b>Unity</b>:  When we got our latest set of computers for the kids, I showed my oldest the four major flavors of Ubuntu and let him pick the desktop he wanted.  He chose default Ubuntu with Unity.  They all do pretty well with it, though for the younger ones there&#8217;s a real discoverability problem.  They often don&#8217;t know a program they want is installed, or how to find it.  Once we&#8217;ve pinned their favorite programs to the dash, they&#8217;re ok; but Unity&#8217;s focus on keyboard control is not so good for little ones.
</li>
<li><b>XFCE</b>: Always a solid choice for kids, especially on slower systems.  It doesn&#8217;t do terribly fancy themes<sup><a class="footref" name="fnr-.5" href="#fn-.5">5</a></sup>, but it&#8217;s still packed with features and has flexible layout options.  This is my go-to DE when setting up computers for people outside the family, since it&#8217;s really hard to mess it up beyond repair.
</li>
<li><b>LXDE</b>: We used this when the kids were stuck with really slow systems for a while; works great, very simple to use, and very fast.  You can use LXLauncher with it too so that it has a full-screen menu &ndash; very kid-friendly if you tweak it some.  LXDE seems to lack a little when it comes to organizing programs automatically on the menu, meaning that the bulk of your programs tend to end up on one big huge submenu under &#8220;Other&#8221;.  This can be a detriment to discoverability for kids.
</li>
</ul>
<p>
Don&#8217;t ask me why, but we never got into Gnome or its spin-offs (not counting Unity); <b>GNOME 3</b>, with its focus on stark simplicity, may be a good choice for kids, and <b>Enlightenment 17</b> looks rather compelling.  Of course, if you&#8217;re so inclined, you can cobble together a kid-friendly desktop from parts<sup><a class="footref" name="fnr-.6" href="#fn-.6">6</a></sup>.
</p>
<p>
The bottom line is that it&#8217;s hard to go too wrong with a desktop environment.  If you&#8217;re really unsure, I&#8217;d say go with XFCE as the &#8220;safe option&#8221;.
</p>
</div>
</div>
</div>
<div id="outline-container-4" class="outline-2">
<h2 id="sec-4">Conclusion</h2>
<div class="outline-text-2" id="text-4">
<p>
As you can see, you have a lot of options when it comes to setting up a Linux environment for your kids; hopefully by now you have some ideas about how to proceed.  In the next article, I&#8217;ll talk about some important safety considerations, tackle the &#8220;parental controls&#8221; mess, and I&#8217;ll offer a few &#8220;wishlist&#8221; items of my own.
</p>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<p class="footnote"><sup><a class="footnum" name="fn-.1" href="#fnr-.1">1</a></sup> No, really; skip it.  You&#8217;re almost inevitably going to disagree with something I say here and and make a bunch of useless fanboy comments.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.2" href="#fnr-.2">2</a></sup> Math is math, no matter how many cool lasers, explosions, meteorites, and other stuff you surround it with.  Kids smart enough to do it can see through it eventually.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.3" href="#fnr-.3">3</a></sup> Incidentally, check out this really great talk by one of the creators of Scratch about teaching kids to code:  <a href="http://www.ted.com/talks/mitch_resnick_let_s_teach_kids_to_code.html">http://www.ted.com/talks/mitch\_resnick\_let\_s\_teach\_kids\_to\_code.html</a>
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.4" href="#fnr-.4">4</a></sup> More about this in the next article.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.5" href="#fnr-.5">5</a></sup> So, for example, the awesome TRON-inspired theme we created in KDE isn&#8217;t doable in XFCE.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.6" href="#fnr-.6">6</a></sup> I made a very simple &#8220;desktop environment&#8221; for my little ones using OpenBox, Tint2, and my own KiLauncher project.
</p>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/01/31/building-a-linux-system-for-a-child-part2-distros-and-software/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Building a Linux system for a Child, part 1: What and Why</title>
		<link>http://www.alandmoore.com/blog/2013/01/07/building-a-linux-system-for-a-child-part-1-what-and-why/</link>
		<comments>http://www.alandmoore.com/blog/2013/01/07/building-a-linux-system-for-a-child-part-1-what-and-why/#comments</comments>
		<pubDate>Mon, 07 Jan 2013 22:42:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[Old computers]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Geek parenting]]></category>
		<category><![CDATA[kids]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Practical tech]]></category>
		<category><![CDATA[series]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=643</guid>
		<description><![CDATA[Alan explores the art and adventure of setting up a Linux-based system for young people.]]></description>
				<content:encoded><![CDATA[<p>
One of the common suggested uses for old computers is to install GNU/Linux on it and give it to your kids.  I have five children, ranging in age from pre-teen to infant, and all but the youngest (naturally) regularly enjoy the use of computers running some variant of GNU/Linux.  We&#8217;ve been using it at home since about 2005, and over the last eight years I&#8217;ve gained a reasonable amount of experience setting up Linux on computers for my children or their friends.  This series of articles will cover some of my insights on setting up a Linux computer for kids.
</p>
<p><span id="more-643"></span></p>
<div id="outline-container-1" class="outline-2">
<h2 id="sec-1">Why do you give a child a computer?</h2>
<div class="outline-text-2" id="text-1">
<p>
Ever since I was a child back in the 80&#8242;s, there has been this notion that giving a child access to a computer is an unquestionable good which all-but-guarantees his success in later life.  Organizations public and private have worked hard to place computer technology into the hands of children here and abroad, and unfortunately they seem to have done a good job of it.
</p>
<p>
Yes, unfortunately; because today&#8217;s children spend as much as nine hours a day in front of screens; and for the most part, they aren&#8217;t reading scholarly articles, composing master works, or exploring the world of science and technology.  They&#8217;re more likely fraggin&#8217; virtual bad guys, socializing on facebook, or probing into the seedier corners of human nature.
</p>
<p>
Not that I&#8217;m against kids having computers; far from it.  But I think it behooves a responsible parent to consider how best to direct a child&#8217;s use of the computer so that its possession will be a net positive.  A computer can be many things to a child:
</p>
<ul>
<li>A general education tool, for researching and learning about non-computery things like science, history, geography, literature, etc.
</li>
<li>A computer education tool, for learning about computer technology itself.
</li>
<li>A multimedia device, for enjoying music and movies (educational or otherwise).
</li>
<li>A communications device, for email, chat, social networking, video chat, etc.
</li>
<li>A creative tool, to aid in authoring music, video, pictures, text, etc.
</li>
<li>An entertainment device, for games and recreational web surfing.
</li>
</ul>
<p>
Taking your child&#8217;s age, interests, abilities, and other circumstances into consideration, you&#8217;ll want to decide which of these uses you consider more important, and which (if any) you consider inappropriate or unnecessary.  With this information in hand, we can steer the child&#8217;s computing experience in such a way that it <i>just might</i> end up being something like the great thing we all thought it could be once upon a time.
</p>
<p>
My personal goals for my kids with computers are:
</p>
<ul>
<li>to teach them about computer technology, including computer science and programming
</li>
<li>to learn to use a computer in other creative and productive pursuits
</li>
<li>to enhance their general education when possible
</li>
<li>within limits, to unwind and have some fun
</li>
</ul>
<p>
Your goals may differ, and you&#8217;ll have to keep that into account as you consider how to set up your child&#8217;s computer.
</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">Using Linux for a child&#8217;s computer</h2>
<div class="outline-text-2" id="text-2">
<p>
The computer you&#8217;re giving to your child very likely <i>had</i> some kind of operating system on it, and very likely that OS was (at least initially) some version of Microsoft Windows.  Before we talk about putting a Linux distribution on it, I think it&#8217;s worth counting the cost.  You <i>will</i> be surrendering some potentially positive things, and subjecting yourself to potential difficulties in exchanging Windows for GNU/Linux, so it&#8217;s worth considering if this move really meets your goals.  Let&#8217;s start by clearing the air and getting the negative out of the way:
</p>
</div>
<div id="outline-container-2-1" class="outline-3">
<h3 id="sec-2-1">What you give up by using Linux</h3>
<div class="outline-text-3" id="text-2-1">
<p>
First, there&#8217;s the software.  There&#8217;s no shortage of high-quality software for children on Windows, much of it featuring popular TV and movie characters, ready to help your child learn and play.  These games are rarely compatible with Linux<sup><a class="footref" name="fnr-.1" href="#fn-.1">1</a></sup>.  Apart from games, your kids might need to run Microsoft Office or some proprietary educational software for school. Basically, there&#8217;s just no guarantee that any random product you want (or need) to purchase and install for your kids is going to work.
</p>
<p>
The incompatibility extends to the Internet as well.  You&#8217;d think in 2013 we would be done with the whole &#8220;you need Windows to use this website&#8221; nonsense, what with everyone toting about Android/iOS tablets; but sadly there are still a few holdouts entrenched in the proprietary browser plugin mentality who might leave your kids staring at a &#8220;missing plugin&#8221; error instead of a cool new online game or favorite video.  Silverlight, Unity web player, Shockwave (sadly, people still use this), and even ActiveX (people still use this too) can mean no-go for some online games and activities.
</p>
<p>
Another shortcoming on many of the current popular Linux distributions, as I&#8217;ll discuss later, is the lack of simple parental controls (as such).  This isn&#8217;t to say we can&#8217;t accomplish many of the things that parental controls are meant to accomplish, but it&#8217;s not as straightforward as you&#8217;d wish.
</p>
<p>
Finally, on a less concrete note, we&#8217;re taking from the child the chance to see and experience the operating system that the vast majority of people use to do business and personal computing.  They will be missing out on a shared cultural experience, and will be unfamiliar with tools that many people might take for granted<sup><a class="footref" name="fnr-.2" href="#fn-.2">2</a></sup>.
</p>
</div>
</div>
<div id="outline-container-2-2" class="outline-3">
<h3 id="sec-2-2">What we gain</h3>
<div class="outline-text-3" id="text-2-2">
<p>
So now that I&#8217;ve almost talked you out of it, let&#8217;s look at what makes it worthwhile to give a child a computer running GNU/Linux:
</p>
</div>
<div id="outline-container-2-2-1" class="outline-4">
<h4 id="sec-2-2-1">Saving Money</h4>
<div class="outline-text-4" id="text-2-2-1">
<p>
You will save money running Linux.  Not at first, naturally; if you already own a Windows license for this computer, you aren&#8217;t immediately out of pocket for anything.  But in the long run, we&#8217;ve found over the last eight years that the cost of home computing has been much lower for us, for a few reasons:
</p>
<ul>
<li>We never need to buy things like anti-virus or anti-malware
</li>
<li>The things we need are usually readily available for free in the software repositories.
</li>
<li>Many things that we <i>might have</i> bought (games, e.g.), we didn&#8217;t buy because it wasn&#8217;t compatible.  We were fine without these things.
</li>
<li>We could extend the life of our hardware while still running the latest releases of the operating system
</li>
</ul>
<p>
One could argue, of course, that freeware and open-source software (much of the <i>same</i> open-source software) exists for Windows as well, and if we were going to restrict ourselves to that we could as well do it on Windows.  That may be, but I think it&#8217;s a lot different when you have to proactively go out and find, vet, test, and maintain this software; on Linux, you open the package manager and install what&#8217;s recommended.
</p>
</div>
</div>
<div id="outline-container-2-2-2" class="outline-4">
<h4 id="sec-2-2-2">No Malware</h4>
<div class="outline-text-4" id="text-2-2-2">
<p>
Kids have a knack for finding malware; I&#8217;ve been paid to reload Windows on enough teenager-operated laptops to know it.  In my experience, no amount of anti-this or anti-that software will completely mitigate the threat &ndash; on <i>Windows</i>.  Running Linux, your child&#8217;s system will simply not get malware<sup><a class="footref" name="fnr-.3" href="#fn-.3">3</a></sup>.
</p>
<p>
This is awesome, not only because malware is a pain to remove (sometimes requiring reloading the OS), but also because some of it can put some pretty nasty stuff up on the screen.  You do not want this happening on your computer, and you certainly don&#8217;t want it on the computer you set up for your niece, younger brother, or the neighbor&#8217;s kids.
</p>
</div>
</div>
<div id="outline-container-2-2-3" class="outline-4">
<h4 id="sec-2-2-3">A custom experience</h4>
<div class="outline-text-4" id="text-2-2-3">
<p>
When it comes to customizing a system &ndash; whether for looks, performance, special needs, or just for the heck of it &ndash; nothing beats Linux.  Yeah, I know, there are hacks and tweaks and third-party shells for Windows; but if you&#8217;ve spent much time with Linux you know that it offers deep customization in spades.  There is no &#8220;officially blessed&#8221; distribution, desktop, or configuration; so all the various options are equal citizens on this platform.
</p>
<p>
This is really a great benefit when you have to work with old hardware, when your kids have special needs, when you want to build a system for specific limited purposes, or for locking down the system for only a few select tasks.  Even if you don&#8217;t feel like tinkering with config files, the current crop of Linux distributions ship with any of a dozen different desktop environments configured for a variety of tastes and needs.
</p>
</div>
</div>
<div id="outline-container-2-2-4" class="outline-4">
<h4 id="sec-2-2-4">A broader experience</h4>
<div class="outline-text-4" id="text-2-2-4">
<p>
I&#8217;ll never forget a situation years back where I walked into an office to see a panic-stricken woman staring at the screen of a Mac, frantically asking,  &#8220;How do I launch Internet Explorer on this thing?&#8221;.  Well, at our house we change desktop environments like some people change hair styles, and everyone has his preferred browser.  My kids understand that they don&#8217;t need &#8220;Internet Explorer&#8221;, or even &#8220;Firefox&#8221; to surf the web; they just need a &#8220;web browser&#8221;.  They don&#8217;t panic if there isn&#8217;t a &#8220;start&#8221; button in the lower left corner; they just click around until they find something that looks like a menu (or command input).
</p>
<p>
This may not seem like a really compelling point, but I think there&#8217;s some real value in this over the long-run.  When I was a kid, most &#8220;real-world computing&#8221; was done on green-screen Unix terminals or DOS PCs.  Throughout my educational and early professional career, getting my work done required me to interact with multiple Unices, VAX VMS, multiple DOSes, MacOS (classic and OSX), and Windows (9.x &amp; NT) &ndash; and that&#8217;s only <i>before</i> I went into IT.
</p>
<p>
There&#8217;s no telling what sort of as-of-yet-unimagined computing paradigms your child will be faced with in the decades to come.  If you want them to be prepared, teaching them that a computer can look and act in a variety of ways is a good start.
</p>
</div>
</div>
<div id="outline-container-2-2-5" class="outline-4">
<h4 id="sec-2-2-5">Real insight into how computers work</h4>
<div class="outline-text-4" id="text-2-2-5">
<p>
When I learned Windows, I learned how Windows works.  When I learned Linux, I learned how an operating system works.  Yes, even in 2013, being an avid and regular Linux user may require you to dig into the guts of the system and learn about things like kernels, software libraries, GPUs, or how to write a script.  Many see this as a weakness, but as a parent with an educational mindset, I see it as an opportunity.
</p>
<p>
Even when things are working fine, GNU/Linux is just a system that encourages exploration and discovery; there are no proprietary patented secrets locked away in encrypted binary files.  The community encourages this too, and asking a few questions about how something works will usually get you several detailed responses.
</p>
</div>
</div>
<div id="outline-container-2-2-6" class="outline-4">
<h4 id="sec-2-2-6">Better performance</h4>
<div class="outline-text-4" id="text-2-2-6">
<p>
No, Ubuntu&#8217;s latest flagship release will <i>not</i> run faster than Windows XP SP1 on a ten-year-old computer.  But there are <a href="http://www.alandmoore.com/blog/2011/09/10/reviving-your-old-pc-with-linux-part-iv-fully-lightweight-distros/">distros that will</a>, without a doubt; and unlike your old copy of XP Home first edition, they&#8217;re full-featured operating systems, fully-patched and fully-supported with modern apps readily available.
</p>
<p>
My wife currently runs the latest Kubuntu LTS on a Vista-era laptop; it&#8217;s smooth and quick, much more so than the now six-year-old OS that came with the device.  My kids run Ubuntu and Kubuntu on stock Dell workstations (originally designed for XP SP3) without problems.  In fact, none of the systems we use at home are less than five years old (some considerably older), and we typically have no problems running &#8220;heavyweight&#8221; desktop environments when we choose to.  When a system can&#8217;t handle KDE or Unity, we switch it down to LXDE or XFCE and keep running.
</p>
<p>
I&#8217;ll let a system run an obsolete version of MacOS or Windows when I have to, but we never run outdated Linux.  There&#8217;s never a need!
</p>
</div>
</div>
<div id="outline-container-2-2-7" class="outline-4">
<h4 id="sec-2-2-7">More consistency</h4>
<div class="outline-text-4" id="text-2-2-7">
<p>
You know how you go out and buy a new scanner, and it comes with bundled scanning software that&#8217;s totally different from the scanning software that came with your last scanner?  Or the same scenario with your wireless card, printer, camera, optical drive, multimedia keyboard, or particle accelerator?
</p>
<p>
On Linux, there are built-in tools for this kind of thing that work with a wide range of supported peripherals.  The upshot is that no matter how many times you go through hardware devices (we&#8217;re on like our 4th scanner in 10 years), you don&#8217;t have to learn new software.  This is especially nice for kids.
</p>
<p>
Of course desktop environments change and evolve over time, but there is no shortage of conservative choices for those who want consistency first.
</p>
</div>
</div>
<div id="outline-container-2-2-8" class="outline-4">
<h4 id="sec-2-2-8">Simpler maintenance</h4>
<div class="outline-text-4" id="text-2-2-8">
<p>
If you&#8217;ve never touched Linux before, I&#8217;ll grant you the idea of doing maintenance on it can be daunting.  But it&#8217;s really, really simple once you get the hang of it (i.e. once you get past the <i>OMG IT&#8217;S NOTHING LIKE WINDOWS</i> stage).  Keep the packages updated, clear out the old kernels and package cache, and that&#8217;s about it<sup><a class="footref" name="fnr-.4" href="#fn-.4">4</a></sup>.  No defragging, no antivirus/antimalware updates or scans, no calling the OS vendor to re-activate because the OS suddenly decides it&#8217;s not legal anymore<sup><a class="footref" name="fnr-.5" href="#fn-.5">5</a></sup>.
</p>
<p>
The package manager thing is really the killer feature here.  I don&#8217;t have to go to all our half-a-dozen machines and figure out whose Java or Flash or browser is out-of-date and needs patching.  I just run a package manager update and BAM! done. I can schedule it even.  It won&#8217;t even nag you to reboot every ten minutes because the web browser was updated (yeah I&#8217;m looking at you Internet Explorer).
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">Ready to go?</h2>
<div class="outline-text-2" id="text-3">
<p>
At this point you&#8217;re either champing at the bit to start installing Linux on your child&#8217;s computer, or ready to run screaming the other way.  If you&#8217;re in the first catagory, the next article in this series will look at some of the distributions and software available for kids, with some personal input from my own experiences.
</p>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<p class="footnote"><sup><a class="footnum" name="fn-.1" href="#fnr-.1">1</a></sup> <i>Sometimes</i> you can get them to work in WINE, but in general I find WINE too inconsistent to be a practical solution.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.2" href="#fnr-.2">2</a></sup> Yes, there are many, many arguments one could make against this point, and I very likely personally agree with yours.  But I list it because it&#8217;s a common objection whenever people talk about giving non-Windows computers to kids.  In any case, if your goal as a parent is to teach your child about desktop computers as they&#8217;re normally used by most people, installing anything but Windows won&#8217;t help you achieve it.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.3" href="#fnr-.3">3</a></sup> Yes, I know that people say malware may come to Linux someday, or that Linux systems can be hacked.  But to suggest that Linux distros are (or will be, in the foreseeable future) threatened with malware in the same way that Windows systems are is just not reality.  You can argue about hypothetical situations all you want, but I personally don&#8217;t live in a hypothetical world.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.4" href="#fnr-.4">4</a></sup> If that sounds complicated, it comes down to a few clicks in a GUI application, or 3-4 commands in a terminal, whichever you prefer.
</p>
<p class="footnote"><sup><a class="footnum" name="fn-.5" href="#fnr-.5">5</a></sup> Yes, I&#8217;ve had to do this.  Multiple times.
</p>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2013/01/07/building-a-linux-system-for-a-child-part-1-what-and-why/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Replacing Windows 98, and other seemingly impossible tasks</title>
		<link>http://www.alandmoore.com/blog/2012/12/14/replacing-windows-98-and-other-seemingly-impossible-tasks/</link>
		<comments>http://www.alandmoore.com/blog/2012/12/14/replacing-windows-98-and-other-seemingly-impossible-tasks/#comments</comments>
		<pubDate>Sat, 15 Dec 2012 05:42:00 +0000</pubDate>
		<dc:creator>Alan</dc:creator>
				<category><![CDATA[Fixing stuff]]></category>
		<category><![CDATA[Free/Libre Open Source Software]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Old computers]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Alternative Operating systems]]></category>
		<category><![CDATA[AROS]]></category>
		<category><![CDATA[FLOSS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[my computers]]></category>
		<category><![CDATA[old computers]]></category>
		<category><![CDATA[pointless geekery]]></category>

		<guid isPermaLink="false">http://www.alandmoore.com/blog/?p=621</guid>
		<description><![CDATA[Can we find something to replace Windows 98 on contemporary hardware?  Find out in this episode&#8230;]]></description>
				<content:encoded><![CDATA[<p>Sometime during the last decade, I managed to get a reputation as the guy to whom you can donate your old, dusty computer when you don&#8217;t want it any more; and while I must confess that I don&#8217;t mind in the least (keep it coming folks – I do have a major weakness for free computer hardware, as well as a profound satisfaction in making &#8220;trash&#8221; useful again), it&#8217;s often a challenge to actually make use of a lot of it.</p>
<p><span id="more-621"></span></p>
<p>The idea, always in the back of my head, is to use a combination of spare parts, technical know-how, and a whole heap of open-source goodness to turn these doorstops into something useful for a family, child, non-profit, or other deserving individual who can&#8217;t afford a computer; simultaneously helping a person in need and keeping a functioning device out of the landfill. That&#8217;s the theory.</p>
<p>Making this reality is harder than it sounds; I&#8217;m admittedly better at working with tech than connecting with people, especially people who actually <i>need</i> a computer badly enough to use one of my Franken-modded antiques. So here I sit, with a small but growing collection of mostly pristine, fully-functioning computers that are just as capable of computing as they were when they sat next to the box of AOL CDROMS in CompUSA proudly displaying the pipes screensaver beneath signs assuring us they were &#8220;Y2K Ready&#8221;.</p>
<div class="outline-2" id="outline-container-1">
<h2 id="sec-1">OLD. I mean OLD</h2>
<div class="outline-text-2" id="text-1">
<p>I always get a little chuckle when I see someone on a Linux forum proudly talking about how he revitalized his <i>ancient</i> desktop – maybe a Pentium D with <i>only</i> 2 GB of RAM! – using Lubuntu or Xubuntu or somesuch. OK, so, good for them; I guess I&#8217;m showing my age, but it&#8217;s hard to think of a system less than 7 years old as &#8220;ancient&#8221;. To me, &#8220;ancient&#8221; means (at least) a beige box with a floppy drive and turbo button. Remember when the only thing &#8220;Giga&#8221; was the voltage required to power the flux capacitor?</p>
<p>But nostalgia aside, my real issue is that I&#8217;m awash in machines that were all designed for Windows 98; and if my experiences are indicative, the world is itself awash in these machines. They sit in basements, attics, spare bedrooms, and closets all over America, just waiting to be improperly disposed of. In case you weren&#8217;t alive or old enough to care 15 years ago when Windows 98 was all the rage, let me give you an idea of the average specs of a Windows 98 computer:</p>
<ul>
<li>Processor: Pentium II or AMD K6-2, 350 MHz to 800 MHz</li>
<li>RAM: PC-100 or PC-133 SDRAM, 64 or 128 Mb on average. Maybe 256 if you&#8217;re lucky.</li>
<li>Hard Drive: 6 Gb to 20 Gb IDE drive, though 4 GB not unheard of.</li>
<li>Video Chip: 2, 4, or 8 Mb Video card made by someone like SiS, S3, Via, or Matrox who has long since found more profitable pursuits.</li>
<li>Drives: 3.5&#8243; floppy and a CDROM (non-writer).</li>
</ul>
<p>Those may seem like laughable specs to some of you kids out there, but I can assure you that great things were done on such machines (and certainly, on much older machines as well) once upon a time. On such machines I made music, discovered the Internet, published newsletters, wrote term papers, learned to code, and wasted untold chunks of life playing Age of Empires.</p>
</div>
</div>
<div class="outline-2" id="outline-container-2">
<h2 id="sec-2">Windows 98</h2>
<div class="outline-text-2" id="text-2">
<p>In 2003 when I started working in tech support, our network (even that late) was about 50% Windows 98 machines. I learned to <i>hate</i> Windows 98 very quickly. I could write books on what I found to hate about Windows 98, but in a nutshell it seemed to me that it had been designed to self-destruct about once every six months if used for anything more than playing solitaire or running Word. I was overjoyed when we finally instituted a policy of &#8220;Windows XP or we confiscate your network cable&#8221;.</p>
<p>This is probably a large part of the reason I feel compelled, when one of my newly-acquired &#8220;treasures&#8221; presents the Windows 98 boot-splash, to immediately <a href="http://www.dban.org">DBAN</a> the hard drive and install… <i>anything else</i>.</p>
<p>The problem lately has been coming up with an &#8220;anything else&#8221; whose overall superiority and fitness I can assert with genuine honesty. For all its many, many, <i>many</i> failings in a modern context, Windows 98 (I must admit) does a pretty admirable job of making a Pentium II with 64 Mb of RAM into a usable desktop. There&#8217;s no lack of applications out there for it, if you know where to find them. So I swallow my FLOSS-loving pride and start to wonder… maybe I&#8217;m doing a disservice to the potential inheritor of this device by removing it? Hrmmm… let&#8217;s think logically.</p>
<p>Good things about Windows 98:</p>
<ul>
<li>People know how to use it. Well, old people, anyway.</li>
<li>It runs pretty well on these machines.</li>
<li>Lots of old-but-still-useful software out there for it.</li>
<li>It says &#8220;Windows&#8221; and that seems to make people happy. Or at least not scared.</li>
</ul>
<p>Bad things about Windows 98:</p>
<ul>
<li>Old, dead, unsupported OS. Kind of smells a little bad.</li>
<li>Once the target of malware authors everywhere, may still be at significant risk.</li>
<li>No security whatsoever. Like, NONE. Not even a little.</li>
<li>Comes with old, horrid versions of IE and Outlook Express that users might be tempted to use.</li>
<li>Can&#8217;t update it any more; Windows Update won&#8217;t talk to it any more, so you can&#8217;t even get it to the level of semi-bug-fixedness that it had in its heyday.</li>
<li>Requires a license key, which probably got lost with the install media or ripped off the chassis ten years ago.</li>
<li>It&#8217;s Microsoft. OK, sorry, fanboy moment, but Microsoft products (with the exception of <i>Age of Empires</i> sequels and spinoffs) just give me an icky feeling.</li>
<li>It&#8217;s the easy way out…</li>
</ul>
<p>So I&#8217;ve grabbed one of my latest acquisitions – a Compaq Presario 5142 featuring a K6-2 processor, 64 Mb of RAM, and Windows 98 first edition – and I&#8217;m off to find a suitable alternative…</p>
</div>
</div>
<div class="outline-2" id="outline-container-3">
<h2 id="sec-3">Save me, Tux!</h2>
<div class="outline-text-2" id="text-3">
<p>Naturally, <a title="Reviving your old PC with Linux, Part I: Defining Expectations" href="http://www.alandmoore.com/blog/2011/08/21/reviving-your-old-pc-with-linux-part-i-defining-expectations/">we start with Linux</a>, and since every third distro in existence claims to be a &#8220;lightweight distro for older computers&#8221;, it would seem this is just too easy. The problem is that the vast majority of these distros are basically Debian, Ubuntu, or Arch Linux with a <del>feature-poor</del> <b>lightweight</b> window manager and Abiword. Not that these are all bad; they&#8217;ll make your new hardware fly like an iced cannonball, your last computer run almost-like-new, and your second-hand netbook tolerably usable. But on that double-digits-old beige box from the Clinton administration? Your average Ubuntu respin won&#8217;t even boot; even if they do, running modern Xorg on 64 Mb of RAM is miserable.</p>
<p>This is where we have to get into <a title="Reviving your old PC with Linux, Part IV:  Fully Lightweight Distros" href="http://www.alandmoore.com/blog/2011/09/10/reviving-your-old-pc-with-linux-part-iv-fully-lightweight-distros/">really light distros</a> like Tinycore, Slitaz, and Puppy. I tried these three on the Compaq, and here are the results:</p>
<ul>
<li>TinyCore (Coreplus 4.7) boots, and boots fast. It gives me a desktop, and it&#8217;s pretty snappy – even running from the CD. Unfortunately it ships with no actual software. This might not be a problem if the system had a network card, so maybe some sort of tinycore-based solution might be the ticket; in the meantime, it&#8217;s just nice to know it works.</li>
<li>Slitaz (v 4.0) has more features, but I couldn&#8217;t get X11 to start. Maybe I need the &#8220;loram&#8221; variety, but I was running out of blank CDs and the Compaq won&#8217;t boot from USB.</li>
<li>Puppy (Wary 5.3) actually booted and gave me a desktop; and unlike the others, it ships with a decent selection of local applications that could actually constitute a useful system out-of-the-box. Now, I&#8217;ve never been a Puppy Linux fan for two reasons: (1) I always thought the overall look and feel of the OS and included tools was just ugly, and (2) the whole log-in-as-root thing. However, compared to Windows 98, it seems not so bad in either respect. Unfortunately, I&#8217;d be lying if I said it performed better than Windows 98 on the Compaq. Even installed to the hard drive (full install), it was choppy and sluggish; and when I made the mistake of clicking the browser icon (possibly moot because, like I said, no Internet), the system just ground the hard drive for about 5 minutes before I finally gave up and pulled the plug.</li>
</ul>
</div>
</div>
<div class="outline-2" id="outline-container-4">
<h2 id="sec-4">Try some Haiku-fu?</h2>
<div class="outline-text-2" id="text-4">
<p><a href="http://www.haiku-os.org">Haiku OS</a>, if you haven&#8217;t heard of it, is a project designed to recreate BeOS, an OS from the late 90&#8242;s that was designed from the ground-up for great multimedia support. Haiku is completely open-source, not in the least bit Linux, and totally designed to be a desktop OS (as opposed to a server, super-computer, phone, embedded device, toaster OS). It&#8217;s also pretty fast and lightweight on older systems.</p>
<p>Haiku isn&#8217;t really done yet; it lacks a lot of things, though it does have a fairly functional WebKit-based browser, a media player of sorts, an email client, and some games (mostly ported from Linux), so it&#8217;s not entirely useless. It&#8217;s also compatible with all those BeOS programs you bought back in the day when… oh, you weren&#8217;t one of those five people? Pity.</p>
<p>Development is a little slow right now, with alphas being released about once every 12-18 months; I predict it will hit a stable release just as desktop computers are being obsoleted by sentient robots and cybernetic implants. The alphas have been reasonably stable, at least…</p>
<p>I&#8217;d like to say I&#8217;ve revived the old K6-2 system using Haiku, but so far I can&#8217;t even get the disc to boot. I end up with a lot of disc activity, but nothing to show except a set of color bars in the upper left corner of the screen. In fact, this is what I get on pretty much any system of that vintage with Haiku. To be fair, Haiku <i>is</i> still in Alpha, and probably (hopefully?) targets newer and better hardware; but in any case, it doesn&#8217;t seem to be an option here.</p>
</div>
</div>
<div class="outline-2" id="outline-container-5">
<h2 id="sec-5">Hola, Amiga!</h2>
<div class="outline-text-2" id="text-5">
<p>On the topic of open-source remakes of long-gone desktop operating systems, there is always the possibility of AROS working on these boxes. <a href="http://aros.sourceforge.net">AROS</a> is a remake of the Amiga operating system, and with a bit of m68k cpu emulation it can run all your classic Amiga software. <a href="http://vmwaros.blogspot.com/">Icaros</a> is probably the leading distribution of this OS, and <a title="Icaros Desktop 1.4" href="http://www.alandmoore.com/blog/2012/04/21/icaros-desktop-1-4/">I&#8217;ve checked it out in the past.</a></p>
<p>Although the Amiga was a good generation or three before Windows 98 came along, and its pricing made it something of a niche product, access to the Amiga software catalog is still a compelling enough asset. The AROS community has also ported over a number of FOSS projects and produced a few original apps of its own. So AROS could be quite a contender if the performance is comparable.</p>
<p>On the Compaq, the Icaros boot CD started off in a promising way, and brought me to what looked like a desktop at least as quickly as Windows 98 did from hard disk. Unfortunately, what &#8220;looked like a desktop&#8221; was actually frozen up and not functional, so I couldn&#8217;t even get as far as installing it. Perhaps I&#8217;ll have to try on some different hardware…</p>
</div>
</div>
<div class="outline-2" id="outline-container-6">
<h2 id="sec-6">Syllable</h2>
<div class="outline-text-2" id="text-6">
<p><a href="http://www.syllable.org">Syllable OS</a> is another FLOSS OS aimed squarely at desktop usage; it takes inspiration from Amiga and BeOS, but is not a recreation of either. It&#8217;s a totally new OS with its roots in AtheOS. Its minimum hardware specs are a lowly Pentium I with 32 MB of RAM (!), so it&#8217;s clearly a candidate for replacing Windows 98!</p>
<p>Syllable has a live CD, which is (annoyingly) both separate from and a version behind the actual installer CD. I chose the live CD for testing on my K6-2 system; this may have been a mistake, as – while I could boot very quickly to a Syllable desktop – attempting to run just about anything resulted in an unresponsive system.</p>
<p>Syllable may well bear further scrutiny; there&#8217;s some promising working being done on it, such as a recent port of Enlightenment Desktop Environment. What leaves me uninspired at the moment is an <a href="http://web.syllable.org/Syllable/applications.html">almost complete lack of actual software</a> for the system. There&#8217;s a (WebKit) web browser, of course; and a text editor, some games ported from Linux, and a few random utilities. That&#8217;s about it as far as I can tell. Nothing that really screams &#8220;Wipe your Hard Drive now and install ME!!&#8221;</p>
</div>
</div>
<div class="outline-2" id="outline-container-7">
<h2 id="sec-7">Uno DOS?</h2>
<div class="outline-text-2" id="text-7">
<p>Contrary to popular belief, DOS is not dead! The FreeDOS project has kept it going, creating a 100% open-source DOS fully compatible with the MSDOS 6.x. The main distribution even ships with a load of software (much of it ported from *nix, like Emacs and Vim) as well as the OpenGEM desktop environment – a desktop famously shipped with the Atari ST, which is great [for understanding why Atari failed in the desktop computing market]. There are a few projects aiming to give FreeDOS a more attractive and modern GUI, such as LightDOS and DOSCore; but none of them appear to be distributing a stable product just yet.</p>
<p>Full DOS compatibility gives you the ability to run the virtual treasure trove of classic DOS games and… and… er… whatever else you can think of that might make resurrecting DOS worthwhile.</p>
<p>But just think – if we could give these machines a DOS kernel and a decently familiar desktop environment that didn&#8217;t look 8-bit, we&#8217;d almost have… oh nuts.. Windows 98. Except without the Windows compatibility part. But at least it&#8217;d be open source?</p>
</div>
</div>
<div class="outline-2" id="outline-container-8">
<h2 id="sec-8">Odds and ends…</h2>
<div class="outline-text-2" id="text-8">
<p>This is certainly not the end of the list of small desktop operating systems, so here&#8217;s a few more potential candidates that I haven&#8217;t gotten around to yet, or probably won&#8217;t get around to until there&#8217;s a major project update:</p>
<ul>
<li><a href="http://www.minix3.org" target="_blank">Minix</a>, <a href="http://www.bsd.org" target="_blank">BSD</a>, <a href="http://puredarwin.org" target="_blank">Darwin</a>, and <a title="So totally &quot;other&quot;..." href="http://plan9.bell-labs.com/plan9/" target="_blank">other</a> <a href="http://www.openindiana.org" target="_blank">unix</a>-likes: Some of these systems promise to be faster and smaller than Linux, but so far they all involve a far more complex install and offer a subset of the desktop-oriented stuff for Linux. When I&#8217;m in the mood to learn yet another packaging-system-that-we-assure-you-is-better-than-APT, and when I see anything that indicates these systems might perform better that Linux on teenage hardware, I&#8217;ll get around to testing some of them.</li>
<li><i>Your</i> favorite lightweight Linux: Yeah, there are more than three lightweight Linux distributions out there; I could spend a million years testing them all. If you can tell me that you genuinely revived a Windows 98 machine – not a Pentium 4 with 1 Gb of RAM, or even an Athlon with 512 Mb, but a real honest-to-Jakers Windows 98 machine – with distro XYZ, please let me know.</li>
<li><a href="http://www.menuetos.net" target="_blank">Menuet</a> and <a href="http://kolibrios.org" target="_blank">KolibriOS</a>: these two OS, one is a fork of the other, are both written in assembly and fit on a floppy. They&#8217;re brilliantly fast, surprisingly nice for their size, and utterly devoid of any useful applications that would make them worth running for more than the time it takes to admire how much can be done in 1.44 megabytes if only developers didn&#8217;t need silly nonsense like high-level languages.</li>
<li><a href="http://www.android-x86.org">Android for x86</a>: Now this might be something, if it could work on such old hardware and run android apps. People could use that. I haven&#8217;t had a chance to test it, but it seems the downloadable ISOs are hardware-specific. Not sure I&#8217;m committed enough to compile the OS for K6-2.</li>
<li>ReactOS: This would be an interesting choice, if it were more stable and developed. ReactOS is aiming to be a fully Windows-compatible OS, so this would take care of the software catalog issue. Not sure if it promises performance on old hardware at this point, though.</li>
</ul>
</div>
</div>
<div class="outline-2" id="outline-container-9">
<h2 id="sec-9">What have we learned today, kids?</h2>
<div class="outline-text-2" id="text-9">
<p>The goal of my quest was to find an operating system compelling enough to install over Windows 98 on old hardware, bringing the potential owner of the system both into the twenty-first century and the world of open source software. While working alternatives exist, nothing has yet raised its hand and twisted in its seat like a third-grader who needs a bathroom break to say &#8220;hey, install this!&#8221;. Even so, there are some valuable insights to be gained from this experience:</p>
<ul>
<li><b>Desktops are easy. Applications are hard.</b>: Building an OS that will boot to a desktop on old hardware is apparently quite doable for free software developers. Stocking said OS with genuinely useful applications is, on the other hand, a monumental work that typically takes many developers many years. Making these useful applications run on minimal hardware is even more monumental.</li>
<li><b>Hardware support is the bane of all alternative OS</b>: It&#8217;s not just Linux, folks; any time you run [Not Windows] on a machine designed for Windows, hardware support becomes a problem.</li>
<li><b>There is nothing simple about web browsing</b>: People talk about &#8220;simple web browsing&#8221; as though surfing the web is akin to editing ASCII text or doing arithmetic. Browsing the modern web, with all its CSS, HTML5, JavaScript, images, and multimedia content is <b>not</b> simple. Just <i>launching</i> a modern browser sends a Pentium II-era cpu into hysterics, never mind rendering an actual page. Computers may have been browsing the web for almost 20 years, but this isn&#8217;t 1995&#8242;s web. Fortunately, though…</li>
<li><b>Everyone has a WebKit browser</b>: Basically, you&#8217;re not an OS if you don&#8217;t. <img src='http://www.alandmoore.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><b>We used to be a lot more patient</b>: I said Windows 98 ran admirably on this old hardware, but that&#8217;s only in comparison to other (more modern) things I&#8217;ve tried. Truthfully, it amazes me how slow it is to boot and launch large programs. It brought back vague recollections of recording some tracks years back at a friend&#8217;s studio running Cubase on a Pentium II with Windows 98; every so often the system would lock and we&#8217;d have to reboot, which meant coffee break time (I don&#8217;t mean &#8220;refill your mug and get back to work&#8221; coffee break; more like, &#8220;start brewing a pot of coffee, have a nice chat while it brewed, pour everyone a cup, make tea for the guy who didn&#8217;t drink coffee, let the guy who didn&#8217;t drink coffee or tea run to the quickie-mart for a coke, drink beverages while having a nice chat, take bathroom breaks, and then go back and find the computer was almost done booting&#8221; coffee break).</li>
<li><b>Computers actually are doing more for us</b>: You know those people who say things like &#8220;Computers are a zillion times more powerful now but don&#8217;t run any faster or do any more than they used to&#8221;? Those people are wrong. It turns out that at some point between the time you were jammin&#8217; Stone Temple Pilots in your Doc Martins and the time you were watching American Idol in your Snuggie, your computer started managing your collection of 20 megapixel photos and 320 kbps MP3 files, rendering media-rich web pages, and playing full-screen 1080p movies from Hulu. Somewhere along the way, you started expecting it to boot in under a minute and load programs in under two seconds. It turns out that &#8220;using a computer&#8221; has steadily been redefined as a task that requires some major computing horsepower, and those old systems – even running the OS they were designed for – can&#8217;t keep up.</li>
</ul>
<p>Even with all these unfortunate realities, I still have to believe there is a way to make these systems useful to somebody. I still see some possibilities, at least for a machine with more than the average amount of RAM. The really truly exciting options still seem a little beyond the horizon, but perhaps someday, before their disks lock up and capacitors corrode, these machines may find a way to be useful again. Your ideas are welcome…</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.alandmoore.com/blog/2012/12/14/replacing-windows-98-and-other-seemingly-impossible-tasks/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
