<?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>bloovis.com &#187; software</title>
	<atom:link href="http://www.bloovis.com/wordpress/?feed=rss2&#038;cat=8" rel="self" type="application/rss+xml" />
	<link>http://www.bloovis.com/wordpress</link>
	<description>another geek blog</description>
	<lastBuildDate>Wed, 30 Jun 2010 11:56:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sharing a VPN connection on Linux</title>
		<link>http://www.bloovis.com/wordpress/?p=219</link>
		<comments>http://www.bloovis.com/wordpress/?p=219#comments</comments>
		<pubDate>Wed, 02 Jun 2010 15:19:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=219</guid>
		<description><![CDATA[My employer&#8217;s VPN system doesn&#8217;t allow more than one login at a time.  But there are occasions when I&#8217;d like to be able to use the VPN from two different laptops simultaneously.  The solution, most of which I found here, is to use iptables on the machine running the VPN to forward packets [...]]]></description>
			<content:encoded><![CDATA[<p>My employer&#8217;s VPN system doesn&#8217;t allow more than one login at a time.  But there are occasions when I&#8217;d like to be able to use the VPN from two different laptops simultaneously.  The solution, most of which I found <a href="http://www.sharms.org/blog/2008/11/03/how-to-share-a-vpn-connection-in-ubuntu-intrepid-ibex/">here</a>, is to use iptables on the machine running the VPN to forward packets from the machine not running the VPN.</p>
<p>In my case, the Juniper VPN software (ncsvc) sets up a connection on the net device <code>tun0</code>, and the network address is 10.0.0.0.  So after I start the VPN on one machine, I run the following script on that machine:</p>
<pre>
#!/bin/sh
# Share the VPN connection with other machines on the local net.
# The assumption here is the the VPN network is 10.0.0.0.
if [ `id -u` -ne 0 ] ; then
   echo "You are not root.  Rerunning with sudo..."
   sudo $0
else
   echo "1" > /proc/sys/net/ipv4/ip_forward
   iptables -A FORWARD -i eth0 -d 10.0.0.0/8 -j ACCEPT
   iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
   sysctl net.netfilter.nf_conntrack_acct=1
fi
</pre>
<p>Be sure to replace the network address (<code>10.0.0.0</code>), VPN net device (<code>tun0</code>) and local net device (<code>eth0</code>) with the correct values for your system.</p>
<p>Then on the machine that is not running the VPN, I run the following script:</p>
<pre>
#!/bin/sh
sudo route add -net 10.0.0.0 netmask 255.0.0.0 gw VPNHOST
sudo cp /etc/resolv.conf.vpn /etc/resolv.conf
</pre>
<p>In this script, replace VPNHOST with the hostname of the machine that is running the VPN (i.e., the name of the machine that is running the first script above).  I use static IP addresses on all of my machines, and have added entries for these addresses to <code>/etc/hosts</code> on all machines.  I&#8217;m not sure how this would work with dynamic IP addresses (DHCP).</p>
<p>The last line of this script is the one new thing I&#8217;m doing differently from the scripts at the aforementioned link.  It makes the non-VPN machine&#8217;s name resolution configuration file identical to that of the VPN machine.  This allows the non-VPN machine to resolve hostnames residing on the VPN. In order for this to work, I had earlier copied <code>/etc/resolv.conf</code> from the machine running the VPN to the non-VPN machine, and renamed it to <code>/etc/resolv.conf.vpn</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=219</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The impoverished state of Android Apps</title>
		<link>http://www.bloovis.com/wordpress/?p=199</link>
		<comments>http://www.bloovis.com/wordpress/?p=199#comments</comments>
		<pubDate>Thu, 25 Mar 2010 13:31:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[centro]]></category>
		<category><![CDATA[nexus one]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[treo]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=199</guid>
		<description><![CDATA[One of the reasons why I decided to buy an Android device was to investigate the possibility of writing applications for that platform.  After spending a couple of days with Android, it&#8217;s pretty clear there are huge voids in the app space waiting to be filled.  The transition from Palm OS is going [...]]]></description>
			<content:encoded><![CDATA[<p>One of the reasons why I decided to buy an Android device was to investigate the possibility of writing applications for that platform.  After spending a couple of days with Android, it&#8217;s pretty clear there are huge voids in the app space waiting to be filled.  The transition from Palm OS is going to be painful because the following apps have no equivalent on Android:</p>
<ul>
<li><a href="http://www.adarian.com/">Adarian Money</a>.  This is lovely little financial app that I&#8217;ve used for several years to track every penny I spend.  The Android checkbook apps do not come close; the best-selling one doesn&#8217;t even track expense accounts, let alone support double-entry accounting.  Clearly, a lightweight version of <a href="http://www.gnucash.org/">GnuCash</a> is needed here.</li>
<li><a href="http://www.pimlicosoftware.com/index.htm">DateBk</a>.  I&#8217;ve used this program for nearly ten years in its various incarnations, from DateBk+ on a Handspring Visor, to DateBk5 on a Centro.  It&#8217;s the king of calendar apps and nothing on the iPhone or Android comes close.  The Google Calendar app does sync with the web version, but is otherwise very minimal.  It also has a serious bug: its ringtone reminders do not work when the screen is turned off, so you&#8217;ll miss appointments and meetings constantly.  Pimlico has hinted that they might be porting DateBk to other platforms, but who knows when or if Android will ever be supported.</li>
<li><a href="http://www.iliumsoft.com/site/lp/listpro.php">ListPro</a>.  This is a checklist app on steroids, almost a mini-database.  I use this for packing lists, lists of items lent out to other people, notes on things to look up when I get home, to-do lists, etc.  The Android apps are the usual mix: either seriously broken or only supporting a tiny subset of ListPro&#8217;s features.</li>
</ul>
<p>If I didn&#8217;t have a full-time job, I&#8217;d start working on filling these gaps myself.  I may do that anyway as a rainy-day weekend hobby.  The prospect of writing in Java is not pleasant, so I may start working on the algorithms and data structures (or Models and Controllers, in newspeak) in Ruby, and hope that <a href="http://kenai.com/projects/duby">Duby</a> is usable on Android by the time I need to start thinking about the UI (or View in newspeak).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=199</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solving pilot-xfer sync problem on Ubuntu Jaunty / Linux Mint 7</title>
		<link>http://www.bloovis.com/wordpress/?p=184</link>
		<comments>http://www.bloovis.com/wordpress/?p=184#comments</comments>
		<pubDate>Fri, 19 Mar 2010 13:25:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[centro]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[linux mint]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[treo]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=184</guid>
		<description><![CDATA[I use pilot-xfer (part of the pilot-link package) to back up the data on my Palm Centro, and occasionally to install files on the Centro.  It&#8217;s always worked fine on Linux Mint 6.  The only thing I needed to do before running pilot-xfer was load the visor kernel module using this command:

sudo modprobe [...]]]></description>
			<content:encoded><![CDATA[<p>I use pilot-xfer (part of the pilot-link package) to back up the data on my Palm Centro, and occasionally to install files on the Centro.  It&#8217;s always worked fine on Linux Mint 6.  The only thing I needed to do before running pilot-xfer was load the visor kernel module using this command:</p>
<pre>
sudo modprobe visor
</pre>
<p>But when I switched to a different laptop running Linux Mint 7, pilot-xfer never seemed to be able to connect with the Centro for the second and subsequent attempts after a reboot.  Some poking around revealed that the problem is apparently due to the visor module setting up an incorrect symbolic link for the device <code>/dev/pilot</code>.  Normally, after you connect the Centro to the computer with a USB cable and press the hotsync button, <code>/dev/pilot</code> should become a symlink that points to <code>ttyUSB1</code>.  But I was seeing it point to <code>ttyUSB0</code>, which is the wrong device file for the Centro.</p>
<p>I couldn&#8217;t find an elegant way to fix the problem, so I was forced to come up with a brute force method: before connecting the Centro with the USB cable, remove the visor module and the device symlink:</p>
<pre>
sudo rmmod visor
sudo rm /dev/pilot
</pre>
<p>Then after connecting the Centro, load the visor module again:</p>
<pre>
sudo modprobe visor
</pre>
<p>Note 1: Immediately after you load the visor module, <code>/dev/pilot</code> will point to <code>ttyUSB0</code>.  That&#8217;s OK.  After you press the hotsync button, the visor module should change the symlink to point to <code>ttyUSB1</code>.  If it doesn&#8217;t, you&#8217;ll have to use the brute force &#8220;unplug and unload&#8221; method I described above.</p>
<p>Note 2: You should always press the hotsync button on the Centro <em>before</em> running pilot-xfer.</p>
<p>Note 3: You can eliminate the need to use the -p option with pilot-xfer by setting the environment variable PILOTPORT to <code>/dev/pilot</code>.  Putting this line in your <code>~/.bashrc</code> (if your shell is bash) will do the trick:</p>
<pre>
export PILOTPORT=/dev/pilot
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=184</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Replacing postfix and procmail with maildrop</title>
		<link>http://www.bloovis.com/wordpress/?p=176</link>
		<comments>http://www.bloovis.com/wordpress/?p=176#comments</comments>
		<pubDate>Tue, 16 Mar 2010 12:16:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[linux mint]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=176</guid>
		<description><![CDATA[In the previous post, I wrote about how I solved a problem with fetchmail connecting to the postfix mail server.  I also have postfix configured to transfer mail to procmail, which does some filtering for me using some rules I&#8217;ve written in ~/.procmailrc.  But postfix+procmail is really overkill for a laptop or any [...]]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://www.bloovis.com/wordpress/?p=172">previous post</a>, I wrote about how I solved a problem with fetchmail connecting to the postfix mail server.  I also have postfix configured to transfer mail to procmail, which does some filtering for me using some rules I&#8217;ve written in <code>~/.procmailrc</code>.  But postfix+procmail is really overkill for a laptop or any other machine that is not going to be used as a mail server.  Both of these programs can be replaced by maildrop, which delivers mail to your local mailbox or maildir, and which has a much more readable filtering language than procmail.</p>
<p>To get started with maildrop on Linux Mint or Ubuntu, install the maildrop and courier-authdaemon packages.  It&#8217;s not strictly necessary, but for safety you can also disable postfix by doing this:</p>
<pre>
sudo service postfix stop
sudo chkconfig postfix off
</pre>
<p>Now you need to configure fetchmail to use maildrop.  Simply add the following line to your <code>~.fetchmailrc</code>:</p>
<pre>
mda "/usr/bin/maildrop"
</pre>
<p>The quotes aren&#8217;t necessary; I had them there because I had been experimenting with passing options to maildrop.  The fetchmail man page recommends the options &#8220;-d %T&#8221;, but these aren&#8217;t required in this simple, single-user setup.</p>
<p>The next step is to write some mail filtering rules for maildrop.  These go into the file <code>~/.mailfilter</code>.  The mailfilter man page describes the filtering language, but doesn&#8217;t give many examples.  Here&#8217;s my <code>~/.mailfilter</code> (with a bogus address replacing a real one):</p>
<pre>
DEFAULT="$HOME/Maildir/inbox"
LINUS="$HOME/Maildir/linus"
WOTD="$HOME/Maildir/wotd"

logfile "$HOME/maildrop.log"

if (/^From:.*torvalds@linux\.com/)
{
  to $LINUS
}

if (/^From:.*word@m-w\.com/)
{
  to $WOTD
}

to $DEFAULT
</pre>
<p>In this example, I&#8217;m filtering mail to three different maildir directories; all messages that aren&#8217;t caught by the two filters get delivered to the default maildir.  If these directories didn&#8217;t already exist, they would need to be created with the maildirmake program.  maildrop also allows delivering mail to mbox files, but I consider mbox evil and don&#8217;t use it any more.</p>
<p>Now whenever you run fetchmail, it should hand off the mail to maildrop for delivery.  Check the log file, <code>~/maildrop.log</code>, to make sure your filtering works as expected.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=176</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fixing &#8220;connection refused&#8221; error in fetchmail on Ubuntu Jaunty / Linux Mint 7</title>
		<link>http://www.bloovis.com/wordpress/?p=172</link>
		<comments>http://www.bloovis.com/wordpress/?p=172#comments</comments>
		<pubDate>Mon, 15 Mar 2010 01:30:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[linux mint]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=172</guid>
		<description><![CDATA[Today I installed fetchmail on Linux Mint 7, which also brought in postfix as the mail transfer agent.  I&#8217;d used this combination on Linux Mint 6 with no problems, but on Mint 7 (which is based on Ubuntu Jaunty), fetchmail printed this error message:
fetchmail: connection to localhost:smtp [::1/25] failed: Connection refused.

The error was caused [...]]]></description>
			<content:encoded><![CDATA[<p>Today I installed fetchmail on Linux Mint 7, which also brought in postfix as the mail transfer agent.  I&#8217;d used this combination on Linux Mint 6 with no problems, but on Mint 7 (which is based on Ubuntu Jaunty), fetchmail printed this error message:</p>
<p><code>fetchmail: connection to localhost:smtp [::1/25] failed: Connection refused.<br />
</code></p>
<p>The error was caused by fetchmail attempting to make an IPV6 connection to postfix on the local machine.  Postfix refused the connection, so fetchmail then attempted an IPV4 connection, which was successful.  The mail was delivered, but the error message was annoying.</p>
<p>As usual, I tried several solutions I found with Google, including an attempt to disable IPV6 on a system-wide basis.  The thing that finally worked was to comment out the following line in <code>/etc/hosts</code>:</p>
<p><code>#::1     localhost ip6-localhost ip6-loopback<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=172</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Improving fonts in Ubuntu/Linux Mint</title>
		<link>http://www.bloovis.com/wordpress/?p=158</link>
		<comments>http://www.bloovis.com/wordpress/?p=158#comments</comments>
		<pubDate>Wed, 30 Dec 2009 04:27:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[linux mint]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=158</guid>
		<description><![CDATA[By default, Linux Mint 6 and 7 (and presumably, Ubuntu 8.10 and 9.04) come with a minimal set of somewhat ugly fonts.  There are two things that can be done to improve the situation.
First, install the Microsoft TrueType fonts:
sudo aptitude install msttcorefonts
Then, if you are using an LCD monitor (e.g., a laptop), enable anti-aliasing [...]]]></description>
			<content:encoded><![CDATA[<p>By default, Linux Mint 6 and 7 (and presumably, Ubuntu 8.10 and 9.04) come with a minimal set of somewhat ugly fonts.  There are two things that can be done to improve the situation.</p>
<p>First, install the Microsoft TrueType fonts:</p>
<p><code>sudo aptitude install msttcorefonts</code></p>
<p>Then, if you are using an LCD monitor (e.g., a laptop), enable anti-aliasing (smoothing).  On Linux Mint, start the Control Center from the main menu, then select Appearance.  (On Ubuntu, I believe this is done using System > Preferences > Appearance.)  Click the Font tab, and under Rendering, select Subpixel Smoothing.</p>
<p>You&#8217;ll see an immediate change in all fonts used in Gnome, but you may need to restart Firefox get it to see the new fonts and use smoothing.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=158</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatic data loss on Windows</title>
		<link>http://www.bloovis.com/wordpress/?p=138</link>
		<comments>http://www.bloovis.com/wordpress/?p=138#comments</comments>
		<pubDate>Tue, 13 Oct 2009 17:21:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=138</guid>
		<description><![CDATA[My employers have given me a Windows XP-64 machine, which sits 3000 miles away on the opposite coast.  Operating it remotely using TightVNC isn&#8217;t anywhere near as fast or convenient as ssh, but at least it works.
The machine seemed to be working fine when I disconnected from it on Saturday night.  When I [...]]]></description>
			<content:encoded><![CDATA[<p>My employers have given me a Windows XP-64 machine, which sits 3000 miles away on the opposite coast.  Operating it remotely using TightVNC isn&#8217;t anywhere near as fast or convenient as ssh, but at least it works.</p>
<p>The machine seemed to be working fine when I disconnected from it on Saturday night.  When I reconnected on Sunday morning, my session with all of its terminal windows was gone, and the login screen was showing.  Today, after poking around with the Event Log GUI (nothing so easy as <code>sudo less /var/log/messages</code>), I figured out what went wrong.  A process called the Windows Update Agent started running at 3 AM Sunday morning, and after five minutes it rebooted the machine.  So apparently Windows has an automatic data loss feature that is built in and enabled by default.</p>
<p>A Google search turned up <a href="http://blogs.msdn.com/tim_rains/archive/2004/11/15/257877.aspx">this article</a>, which says that the way to fix the automatic reboot is to edit the registry at <code>HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\Auto Update</code> and create an entry called <code>NoAutoRebootWithLoggedOnUsers</code> with the value 1.  I also found <a href="http://www.geeked.info/disabling-windows-update-auto-reboot/">this article</a>, which shows how to use a GUI to disable the feature; this is the method I used, though I don&#8217;t know if it actually works.  Either way, you have to wade through many levels of settings to find the right one, something that would be almost impossible without Google. And people think editing plain-text configuration files on Linux is hard!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=138</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Printing USPS Click-N-Ship labels in Firefox on Linux</title>
		<link>http://www.bloovis.com/wordpress/?p=101</link>
		<comments>http://www.bloovis.com/wordpress/?p=101#comments</comments>
		<pubDate>Thu, 11 Jun 2009 21:05:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=101</guid>
		<description><![CDATA[I use the USPS web site to print shipping labels, and each time I upgrade to a new version of Firefox or LInux, I always run into the same problem: printing labels doesn&#8217;t work.  As soon as I click the Pay and Print button, Firefox goes into some kind of infinite loop reading data [...]]]></description>
			<content:encoded><![CDATA[<p>I use the USPS web site to print shipping labels, and each time I upgrade to a new version of Firefox or LInux, I always run into the same problem: printing labels doesn&#8217;t work.  As soon as I click the Pay and Print button, Firefox goes into some kind of infinite loop reading data from the USPS web site, and the PDF file containing the label is never seen.</p>
<p>The fix is to change how PDFs are handled by Firefox so that Adobe Reader is started as a separate process, rather than as an embedded window inside Firefox.  Here&#8217;s how to do that in version 3.0 of Firefox:</p>
<p>Open Edit / Preferences, then click on the Applications tab.  Enter PDF in the search box; a single entry with Content Type of &#8220;PDF document&#8221; should be displayed.  Change the Action to &#8220;Use Adobe Reader&#8221;; make sure you don&#8217;t select &#8220;Use Adobe Reader (in Firefox)&#8221; accidentally.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=101</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Human-sized software</title>
		<link>http://www.bloovis.com/wordpress/?p=20</link>
		<comments>http://www.bloovis.com/wordpress/?p=20#comments</comments>
		<pubDate>Thu, 20 Nov 2008 18:55:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=20</guid>
		<description><![CDATA[The piece of software that I&#8217;m most proud of is a tiny real-time kernel that I wrote for the Intel 8080 back in 1979. The 8080 was a very early predecessor to the now-ubiquitous Pentium.  It had specs that seem laughable now: 8-bit data, 16-bit addressing, 2 MHz clock speed.  Obviously, with a [...]]]></description>
			<content:encoded><![CDATA[<p>The piece of software that I&#8217;m most proud of is a tiny real-time kernel that I wrote for the Intel 8080 back in 1979. The 8080 was a very early predecessor to the now-ubiquitous Pentium.  It had specs that seem laughable now: 8-bit data, 16-bit addressing, 2 MHz clock speed.  Obviously, with a chip this slow, efficiency was the name of the game in software.  So I wrote the scheduler and interrupt handler in assembly language, based on the design (but obviously not the actual code) of Intel&#8217;s own RMX-80 kernel.  I don&#8217;t have the source code to this kernel, but I recall that it amounted to less than 2K of assembled code.</p>
<p>It seems almost pathetic that I should still be this fond of something I wrote almost thirty years ago, and which, like most software, has been thrown away.  But the fact is that software has grown nearly as fast as the hardware it runs on, doubling in size every couple of years and consuming all available resources.  The result is that it is nearly impossible now for one developer to completely understand a typical piece of personal computer software.</p>
<p>Sure, one can &#8220;own&#8221; a tiny piece of one these monsters, and understand just that one piece.  That&#8217;s really the only approach that makes sense, and that&#8217;s what at I do at my current employer, which has several thousand developers working on software packages whose binary downloads weigh in at over 100 megabytes.  But I miss being able to work on something that is all mine, whose every nook and cranny is known to me, and which is perhaps directly useful to me in some way.</p>
<p>I can imagine that other developers would regard this desire as unrealistic, nostalgic, and egotistical.  But to me it is no different from the desire of a woodworker to produce a single object of beauty in his own woodshop at night, after installing drywall in a mobile home factory all day.  To that end, I&#8217;ve resumed work on a 20 year old personal project that satisfies this desire; more about this later.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=20</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convert tabs to spaces in one line of Ruby</title>
		<link>http://www.bloovis.com/wordpress/?p=19</link>
		<comments>http://www.bloovis.com/wordpress/?p=19#comments</comments>
		<pubDate>Wed, 19 Nov 2008 00:41:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.bloovis.com/wordpress/?p=19</guid>
		<description><![CDATA[Here&#8217;s a one-liner Ruby script that converts tabs to spaces:

ruby -pe 'gsub(/([^\t]*)(\t)/) { $1 + " " * (8 - $1.length % 8) }'
I&#8217;m in the early stages of rewriting a tiny editor, MicroEMACS, in Ruby, and needed a tab converter.  I was sure I&#8217;d seen this somewhere before, but couldn&#8217;t find it with [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a one-liner Ruby script that converts tabs to spaces:</p>
<pre>
ruby -pe 'gsub(/([^\t]*)(\t)/) { $1 + " " * (8 - $1.length % 8) }'</pre>
<p>I&#8217;m in the early stages of rewriting a tiny editor, MicroEMACS, in Ruby, and needed a tab converter.  I was sure I&#8217;d seen this somewhere before, but couldn&#8217;t find it with Google, so rewrote it from scratch.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bloovis.com/wordpress/?feed=rss2&amp;p=19</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
