<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://www.foldr.org/~michaelw/log/theme/style/rss.css" type="text/css"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xml:lang="en">

	<channel>
		<title>Random Bits and Pieces :: </title>
		<link>http://www.foldr.org/~michaelw/log</link>
		<description>Michael Weber</description>
		<language>en</language>
		<lastBuildDate>Mon, 28 Jan 2008 11:17:00 GMT</lastBuildDate>
		<generator>blosxom ver.2.0</generator>


		<item>
			<title>A Multi-Core Solver for Parity Games</title>
			<link>http://www.foldr.org/~michaelw/log/science/publications/pdmc-2008-mc-small-progress</link>
			<guid isPermaLink="true">http://www.foldr.org/~michaelw/log/science/publications/pdmc-2008-mc-small-progress</guid>
			<category>http://www.foldr.org/~michaelw/log/science/publications/</category>
			<pubDate>Mon, 28 Jan 2008 11:17:00 GMT</pubDate>
			<content:encoded><![CDATA[
<img src="http://www.foldr.org/~michaelw/log/static/science/publications/pdf.png" alt="New Paper" />

<p>
  <a
  href="http://www.foldr.org/~michaelw/papers/pdmc-2008-mc-small-progress.pdf">A
  Multi-Core Solver for Parity Games</a> (accepted
  for publication
  to <a href="http://pdmc.informatik.tu-muenchen.de/PDMC08/">PDMC 2008</a>).
</p>

<h2>Abstract</h2>

<blockquote>
<p>We describe a parallel algorithm for solving parity games, with
  applications in, e.g., modal &mu;-calculus model checking with
  arbitrary alternations, and (branching) bisimulation checking.  The
  algorithm is based on Jurdzinski's Small Progress
  Measures. Actually, this is a class of algorithms, depending on a
  selection heuristics.
</p>
<p>Our algorithm operates lock-free, and mostly wait-free (except for
  infrequent termination detection), and thus allows maximum
  parallelism.  Additionally, we conserve memory by avoiding storage
  of predecessor edges for the parity graph through strictly
  forward-looking heuristics.
</p>
<p>We evaluate our multi-core implementation's behaviour on parity
  games obtained from &mu;-calculus model checking problems for a set
  of communication protocols, randomly generated problem instances,
  and parametric problem instances from the literature.
</p>
</blockquote>
]]></content:encoded>
			<comments>http://www.foldr.org/~michaelw/log/science/publications/pdmc-2008-mc-small-progress#writeback</comments>
		</item>

		<item>
			<title>Munging Data with CLAWK</title>
			<link>http://www.foldr.org/~michaelw/log/programming/lisp/clawk</link>
			<guid isPermaLink="true">http://www.foldr.org/~michaelw/log/programming/lisp/clawk</guid>
			<category>http://www.foldr.org/~michaelw/log/programming/lisp/</category>
			<pubDate>Sun, 27 Jan 2008 14:15:00 GMT</pubDate>
			<content:encoded><![CDATA[
<img src="http://www.foldr.org/~michaelw/log/static/programming/lisp/lisp.png" alt="Lisp Logo (by Conrad Barsky)" />

<p>Recently, I made good use
  of <a href="http://www.geocities.com/mparker762/">Michael
  Parker</a>'s <a
  href="http://www.geocities.com/mparker762/clawk">CLAWK</a>, a
  Lisp-embedded variant of <a
  href="http://en.wikipedia.org/wiki/AWK_(programming_language)">AWK</a>.
</p>

<p>So far, I had used the real AWK, along with perl and other parts of
  the Unix toolbox to analyze data from experiments, and munge it into
  HTML and LaTeX tables.  However, this time I expected the
  experiments to be carried out in
  a <q>run&ndash;tweak&ndash;rerun</q> fashion with several
  iterations, and I did not want to reparse several hundred megabytes
  each time, just for a change in table layout, or for adding another
  analysis.  (Also, I had not much time for lispy things recently, so
  this was a good way to sneak some Lisp back into my current C++
  hell...)
</p>

<p>
  Enter CLAWK.  The following function parses my benchmark data into
  Lisp objects:
</p>

<pre class="common-lisp"><code class="common-lisp"
><span class="paren">(</span><span class="keyword">defvar</span> <span class="variable-name">*foo-table*</span> <span class="paren">(</span>make-hash-table <span class="builtin">:test</span> 'equal<span class="paren">))</span>

<span class="paren">(</span>defawk parse-foo-benchmark <span class="paren">(</span><span class="type">&amp;aux</span> model<span class="paren">)</span>
  <span class="paren">(</span>#/^memtime/
   <span class="paren">(</span><span class="keyword">when</span> model
     <span class="paren">(</span>emit-model model *foo-table*<span class="paren">))</span>
   <span class="paren">(</span><span class="keyword">let</span> <span class="paren">((</span>path <span class="paren">(</span>parse-namestring $6<span class="paren">)))</span>
     <span class="paren">(</span>setf model <span class="paren">(</span>make-instance 'foo-model-record <span class="builtin">:filename</span> path<span class="paren">))))</span>
  <span class="paren">(</span>#/^Instantiator: Explored/
   <span class="paren">(</span>setf <span class="paren">(</span>get-states model<span class="paren">)</span> $#3
         <span class="paren">(</span>get-transitions model<span class="paren">)</span> $#6
         <span class="paren">(</span>get-bfs-levels model<span class="paren">)</span> $#9
         <span class="paren">(</span>completed? model<span class="paren">)</span> t<span class="paren">))</span>
  <span class="paren">((</span>string= $6 <span class="string">"elapsed"</span><span class="paren">)</span>
   <span class="paren">(</span>setf <span class="paren">(</span>get-generation-time model<span class="paren">)</span> $#5<span class="paren">))</span>
  <span class="paren">((</span>string= $13 <span class="string">"RSS"</span><span class="paren">)</span>
   <span class="paren">(</span>setf <span class="paren">(</span>get-generation-memory model<span class="paren">)</span> <span class="paren">(</span>parse-integer $15 <span class="builtin">:junk-allowed</span> t<span class="paren">)))</span>
  <span class="paren">(</span>END
   <span class="paren">(</span><span class="keyword">when</span> model
     <span class="paren">(</span>emit-model model *foo-table*<span class="paren">))</span>
   *foo-table*<span class="paren">))</span>
</code></pre>

<p>Parsing the bulk of my data with the above function takes about
  80&nbsp;seconds, probably slower than it would be with AWK.
  However, once parsed I have all the data available at my fingertips
  inside the Lisp image.  I can prod it with
  the <a href="http://common-lisp.net/project/slime/">SLIME</a>
  inspector, identify outliers, and play around with it in the REPL
  until I am satisfied.  In addition, I can selectively rerun parts of
  the experiments, and parse just the newly produced output to update
  the in-memory representation, again in no time flat.  Beats the Unix
  <q>everything is a byte stream</q> way every day of the week.  
</p>
<p>Rendering the results as HTML is a breeze
  with <a href="http://weitz.de/cl-who/">CL-WHO</a>.  The same holds
  for reordering columns, marking interesting entries
  programmatically, cross-referencing with other entries (or earlier
  versions of the data) and refining the analyses as much as I wish,
  with instant feedback.
</p>

<p style="margin-top:4ex;">
  Unfortunately, CLAWK has acquired some bitrot since its release in
  2002&nbsp;(?).  I needed to tweak it slightly to make it compile
  (only tested with <a href="http://www.sbcl.org/">SBCL</a>).  When I
  tried to contact Michael Parker, his email bounced, so I decided to
  put up a patched version locally until the changes are folded back
  into his distribution.  In
  addition, <a href="http://www.foldr.org/~michaelw/lisp/clawk/#clawk">CLAWK is now
  ASDF-installable</a> (along with its
  dependency, <a href="http://www.foldr.org/~michaelw/lisp/clawk/#regex">REGEX</a>),
  courtesy of
  <a href="http://www.foldr.org/~michaelw/lisp/redshank/">Redshank</a>'s ASDF Defsystem
  skeleton.
</p>

<p>If time permits, I will fix up the code some more to get rid of the
  warnings, and perhaps
  allow <a href="http://weitz.de/cl-ppcre/">CL-PPCRE</a> as
  alternative regular expression engine.  However, patches from the
  open-source fairies are very welcome, too.
</p>
]]></content:encoded>
			<comments>http://www.foldr.org/~michaelw/log/programming/lisp/clawk#writeback</comments>
		</item>

		<item>
			<title>Revisiting Resistance Speeds Up I/O-Efficient LTL Model Checking</title>
			<link>http://www.foldr.org/~michaelw/log/science/publications/tacas-2008-io-map-rr</link>
			<guid isPermaLink="true">http://www.foldr.org/~michaelw/log/science/publications/tacas-2008-io-map-rr</guid>
			<category>http://www.foldr.org/~michaelw/log/science/publications/</category>
			<pubDate>Sun, 27 Jan 2008 11:17:00 GMT</pubDate>
			<content:encoded><![CDATA[
<img src="http://www.foldr.org/~michaelw/log/static/science/publications/pdf.png" alt="New Paper" />

<p>
  <a
  href="http://www.foldr.org/~michaelw/papers/tacas-2008-io-map-rr.pdf"
>Revisiting Resistance Speeds Up I/O-Efficient LTL Model Checking</a> (accepted
  for publication
  to <a href="http://www.cs.stonybrook.edu/~tacas2008/">TACAS 2008</a>).
</p>

<h2>Abstract</h2>

<blockquote>
  <p>Revisiting resistant graph algorithms are those that can tolerate
  re-exploration of edges without yielding incorrect results.
  Revisiting resistant I/O efficient graph algorithms exhibit
  considerable speed-up in practice in comparison to non-revisiting
  resistant algorithms.  In the paper we present a new revisiting
  resistant I/O efficient LTL model checking algorithm.  We analyze
  its theoretical I/O complexity and we experimentally compare its
  performance to already existing I/O efficient LTL model checking
  algorithms.
</p>
</blockquote>
]]></content:encoded>
			<comments>http://www.foldr.org/~michaelw/log/science/publications/tacas-2008-io-map-rr#writeback</comments>
		</item>

		<item>
			<title>MacFusion Rocks</title>
			<link>http://www.foldr.org/~michaelw/log/computers/macosx/macfusion</link>
			<guid isPermaLink="true">http://www.foldr.org/~michaelw/log/computers/macosx/macfusion</guid>
			<category>http://www.foldr.org/~michaelw/log/computers/macosx/</category>
			<pubDate>Thu, 03 Jan 2008 20:17:00 GMT</pubDate>
			<content:encoded><![CDATA[
<img src="http://www.foldr.org/~michaelw/log/static/computers/macosx/macfusion-sshfs.png" alt="MacFusion SSHFS Icon" />

<p><a href="http://www.sccs.swarthmore.edu/users/08/mgorbach/MacFusionWeb/">MacFusion</a>
is a graphical user interface
for <a href="http://code.google.com/p/macfuse/">MacFUSE</a>.  In a
nutshell, it lets me mount remote file systems with a mouse click.
The FTP protocol is supported as well (finally read/write FTP on
MacOS&nbsp;X via
the <a
href="http://www.apple.com/macosx/features/finder.html">Finder</a>!),
but who wants that if SSHFS is an option?
</p>
<h3><a id="macfusion-1" class="updatetitle">UPDATE 2008-01-08: iTunesFS
</a><br /></h3>
<div><img src="http://www.foldr.org/~michaelw/log/static/computers/macosx/itunesfs-icon.png" alt="iTunesFS Icon" />
<p>While we are at
it, <a
href="http://www.mulle-kybernetik.com/software/iTunesFS/">iTunesFS</a>
is worth looking at, too.</p>
</div>

]]></content:encoded>
			<comments>http://www.foldr.org/~michaelw/log/computers/macosx/macfusion#writeback</comments>
		</item>

		<item>
			<title>MacPorts are Fatally Flawed </title>
			<link>http://www.foldr.org/~michaelw/log/computers/macosx/macports-fatally-flawed</link>
			<guid isPermaLink="true">http://www.foldr.org/~michaelw/log/computers/macosx/macports-fatally-flawed</guid>
			<category>http://www.foldr.org/~michaelw/log/computers/macosx/</category>
			<pubDate>Wed, 26 Dec 2007 19:40:00 GMT</pubDate>
			<content:encoded><![CDATA[
<img src="http://www.foldr.org/~michaelw/log/static/computers/macosx/finder-icon.png" alt="Finder Icon" />

<p><a href="http://www.macports.org/">MacPorts</a> is a package
  repository that aims to be an <q>easy-to-use system for compiling,
  installing, and upgrading [...] open-source software on
  the <a href="http://www.apple.com/macosx/">MacOS&nbsp;X</a>
  operating system</q>.  Unfortunately, it is not very good.  In fact,
  I think it sucks quite a bit, in a way that cannot be repaired
  easily without some fundamental changes.  At the end of this story,
  I will propose to let MacPorts die.  Here's why.
</p>

<h3>First Things First: Why a Package System?</h3>

<p>Here's the scenario: In order to accomplish some given task, Jane
  User wants to use a program, which is not yet installed.  The sole
  point of a package system is to get Jane to her goal (running and
  using said program) as fast and efficient as possible.  The fact
  that she has to install the program's package before using it is
  already overhead.  Minimizing this overhead will help Jane focus on
  her task, and be more efficient.
</p>

<p>With MacPorts, chances are high that instead, Jane has to handhold
  the installation, un- or reinstall packages, jump through hoops, and
  generally wait a long time before she can use the program.  Even
  worse, she quite likely has to <q>page in</q> knowledge about
  compilers, build systems, OS idiosyncrasies, etc., if something goes
  wrong.  Nothing of this is related to her original task.  All of it
  slows Jane down.
</p>

<p>In the remainder of this longish rant, I will try to highlight why
  MacPorts fails me.  I will use a
  recent <a href="http://www.gnucash.org/">GNUCash</a> installation as
  running example, but similar things happened before with other
  packages.  Notice that I am not blaming the GNUCash ports package.
  Were none of the dependencies installed already, it would have
  needed less handholding, I am sure.  (Unfortunately, it seems the
  installed dependencies are never <em>just right</em> in a production
  system...)  However, the overall experience would have been only
  slightly better.
</p>

<h3>Don't Waste My Time</h3>

<p style="float:right; width:25em; 
           border: thick solid #aaa; 
           margin:1ex 1em 0.5ex 2em; padding: 1ex 1em;
           font-family: sans-serif; font-size: 90%;">
  Apparently, I am not the only one having trouble to install GNUCash
  from MacPorts:
  <a
     href="http://jcmdev0.blogspot.com/2007/12/avahi-broken-for-evince-while-building.html">John
     had, too.</a> When the efforts to build the package reached the
     point of becoming ridiculous, I started to keep
     a <a
     href="http://www.foldr.org/~michaelw/log/static/computers/macosx/gnucash-macports-build.log">build
     log</a> of the ordeal.<br />  Much of this was trial-and-error,
     because I actually wanted to do
  <em>something else</em>.  However, there are some gems in there,
  where the package system tries quite hard to mislead me.
</p>

<p>It took me about one-and-a-half days to
  get <a href="http://www.gnucash.org/">GNUCash</a> installed with
  MacPorts.  Granted, there were long periods of waiting in between
  when the package system was busy doing whatever, and I was not near
  that computer most of the time.  But it's even worse, the whole
  process is not entirely automatic&mdash;it required interaction
  every other hour or so to help it getting unstuck.  I have better
  things to do than babysit a stretched-out installation process.
</p>

<p>Okay, GNUCash has a lot of dependencies.  Perhaps, it is the
  ultimate package system benchmark.  Good!  I applaud the developers
  for reusing whatever is possible.  Actually, I don't even care, the
  package system should shield me from having to think about this at
  all.  As a user, all I really care about is to have GNUCash
  installed.
</p>

<p>And GNUCash is not the only behemoth here, this happened before.
  Take
  <a href="http://ghc.darwinports.com/">GHC</a>, for example.  It
  takes ages to build with MacPorts.
</p>

<h3>Download Missing Pieces In One Batch</h3>

<div style="float:right; width:25em; 
            border: thick solid #aaa; 
            margin:1ex 1em 0.5ex 2em; padding: 1ex 1em;
            font-family: sans-serif; font-size: 90%;">
<p>The Debian equivalent of installing GNUCash looks like this:
</p>

<pre>% sudo time apt-get -d install gnucash
[...]
0 upgraded, 82 newly installed, 0 to remove and 171 not upgraded.Need to get 24.3MB/32.9MB of archives.
After unpacking 120MB of additional disk space will be used.
Do you want to continue [Y/n]?
[...]
Get: 65 http://ftp.de.debian.org testing/main gnucash 2.2.1-1 [1965kB]
Fetched 24.3MB in 4s (6024kB/s)
Download complete and in download only mode
1.16user 0.24system 0:30.63elapsed 4%CPU (0avgtext+0avgdata 0maxresident)k
</pre>

<p>So, I need a network connection for all of 4&nbsp;seconds to get
  everything that is needed onto my hard disk for GNUCash to run.
  Before that, I am asked whether it is okay to continue, so that I
  can intervene if needed.
</p>
</div>

<p>With a drawn-out build like GNUCash, MacPorts alternates between
  downloading a package, compiling it (which can take an arbitrary
  amount of time), installing it, and then looking at the next
  dependency.  Suck!  When I am near a fast net connection, I want the
  package system to download whatever is possibly needed to complete
  my initial installation request <em>in one go</em>.  When finished,
  I want to disconnect my machine from the net, and go hiking in the
  outback while still being able to finish the installation.  There is
  a reason why I chose a laptop as my main work horse: mobility.
</p>

<p>In other words, network access should only be needed <em>right
  after</em> the user-initiated command to install a new package.
  When all network activity is done, a clear indication of this fact
  should be given.  See
  also: <a href="http://www.debian.org/">Debian</a>'s package manager.
  (While not perfect, it gets some things right.  I'll spare you
  mentioning this in the sections hereafter.)
</p>

<h3>Don't Install Stuff I Did Not Ask For (Or Explain Why)</h3>

<div style="float:right; width:25em; border: thick solid #aaa;
           margin:1ex 1em 0.5ex 2em; padding: 1ex 1em; font-family:
           sans-serif; font-size: 90%;">
<p>No really, why would I <em>ever</em> want firefox-x11 on
  MacOS&nbsp;X, considering that I have already
  another <a href="http://www.mozilla.com/firefox/">Firefox</a>
  installed,
  and <a href="http://caminobrowser.org/">Camino</a>,
  and <a href="http://www.flock.com/">Flock</a>, not to mention
  <a href="http://www.apple.com/safari/">Safari</a>, which I actually
  use most of the time?  Oh
  right, <a href="http://yelp.darwinports.com/">yelp</a>, a help
  browser for GNOME, depends on firefox-x11.<br />
  <img src="http://www.foldr.org/~michaelw/log/static/computers/macosx/gnucash-help.png" alt="GNUCash Help" class="center" />
</p>
<pre>% port installed gnucash-docs
The following ports are currently installed:
  gnucash-docs @2.0.1_0 (active)
</pre>
</div>

<p>Why on earth does GNUCash pull in
  the <a href="http://firefox-x11.darwinports.com/">firefox-x11</a>
  package?  Not to
  mention <a href="http://evince.darwinports.com/">evince</a> and
  <a href="http://goffice.darwinports.com/">goffice</a>!  If
  other packages get pulled in because the package I requested has
  declared a dependency (perhaps by transitivity) on them, I want at
  least to be told what will be installed.  Maybe I would refine my
  installation request in light of that information.
</p>

<p>On a similar note, MacPorts tries really hard to install gcc, perl,
  and some other basic packages, completely ignoring the ones that
  ship with MacOS&nbsp;X.  This is explained in the
  <a
    href="http://trac.macports.org/projects/macports/wiki/FAQ#WhyisMacPortsusingitsownlibraries">MacPorts
    FAQ</a>: 
</p>

<blockquote>The drawbacks on this behaviour also are minimal:
  Wasting 10MB for a Python installation is next to nothing if you
  have a GB-harddisk and gain consistency all the way in return.
</blockquote>
  
<p>Right.  Except, how long does it take to build gcc, perl and python
  from source?  Long enough to make me forget what I actually wanted
  to install, and why.
</p>

<p>Anyway, some programs come bundled with heaps of documentation, or
  in different flavors.  Sometimes, I just don't care, but sometimes
  I'd like to have some influence on what gets installed.  Depending
  on the circumstances, I would like to choose from a minimal or
  a <q>batteries included</q> installation, or just the documentation,
  please.  Too much to ask?
</p>

<h3>Building from Source Considered Harmful</h3>

<p>The reason is simple: there are too many variables in the process.
  Too much can (and routinely does) go wrong, resulting in broken
  programs, or even installations.  Another war story: after a gettext
  update (which was pulled in as a dependency by some other program,
  no less), all of a sudden vital programs started to segfault: awk,
  sed, tcl, you name it.  Unnecessary to mention, MacPorts needs some of
  these programs to function.  Chicken, meet Egg.
</p>

<p>I hope nobody dares to point to the <q>installable packages</q>
  facility of MacPorts.  They are utterly lacking in comparison to,
  e.g., the Debian package manager.  Dependencies, anyone?
</p>

<p>I am really astonished that with all the emphasis on optimization,
  it is not considered odd that every installation of MacPorts repeats
  all the package compilation jobs over again.  Why not cache the work
  on download servers, and share it?  Even if package build bots are
  generally untrusted, it should only be a Small Matter Of Programming
  to provide a web of trust with cryptographically signed packages,
  right?
</p>

<h3>Build Environment and Run-time Environment Should be Separate</h3>

<dl style="float:right; width:25em; 
           border: thick solid #aaa; 
           margin:1ex 1em 0.5ex 2em; padding: 0 0em 1ex 1em;
           font-family: sans-serif; font-size: 90%;">
  <dt>Build Environment</dt>
  <dd>The <q>Build Environment</q> of a package contains the set of
    dependencies needed to successfully build that package from source
    code.  This includes external packages containing compilers,
    linkers, header files, libraries, documentation generators, OS
    settings.
  </dd>

  <dt>Run-time Environment</dt>
  <dd>The <q>Run-time Environment</q> of a package contains
    dependencies needed to use the package.  Without them present, the
    contents of the package are not functional, at least not fully.
  </dd>
</dl>

<p>The point here is that the build environment can differ
  significantly from the run-time environment, and a package system
  should acknowledge this.
</p>

<p>Extreme cases are cross-compiled packages: such packages might not
  even be usable in the build environment, but they are
  usable in the run-time environment.  A more common case is that the
  build environment has perhaps a compiler or document generation
  system like TeX installed, while the run-time environment does not
  need a compiler, but instead a <abbrev>PDF</abbrev> reader to view
  the documentation (which was not needed on the build environment).
</p>

<p>Another reason is that it is usually fine to have several versions
  of a single library installed at the same time, with the loader
  taking care of choosing the right one for the program at hand.
  However, when it comes to compiling and linking C code, one set of
  header files and one (matching) shared library should be installed
  in standard places in the build environment, such that the brittle
  mess that is <a href="http://sourceware.org/autobook/">autotools</a>
  (a fine topic for another rant) can find them without getting
  confused.  When I want to build against the newest library version,
  I do not want to touch at all the installed programs which were built
  against some older version.  They should keep working just fine.
</p>

<p>As user of the package, I do not care what was needed to get
  it to the point when I can execute the program.  Whether it was
  written in C or INTERCAL does not matter, as long as I have an
  executable to run, which works.
</p>

<p>Thus, all I need to ensure is that the run-time environment for the
  package is complete.  And fortunately, I do not have to take care
  about that myself.  If the package declares its dependencies, the
  package system can make sure that everything that is needed gets
  installed alongside the package.
</p>

<h3>Transactions and Rollback</h3>

<p>If something goes wrong during package installation, I want an easy
  way out.  I want at least the ability to get back to the point
  before I started installation.  Also, if some dependencies cannot be
  fulfilled, I want the whole transaction to fail, or possibly ask the
  user whether to proceed with a partial installation.
</p>

<h3>User Interaction</h3>

<p>Even with the ideal of a short installation time, any user
  interaction should be at the beginning (or the end) of this
  transaction, never interspersed with other activity.
</p>

<!-- <h3>Developer Perspective</h3> -->

<!-- <p>I will call <q>Developer</q> anybody who knows and is willing to go -->
<!--   through a build from source to get a program installed. -->
<!-- </p> -->

<!-- <p>Building a package from source, updating to a new upstream version -->
<!--   should be as painless as possible.  This means that it should be -->
<!--   trivially simple to create the right build environment.  Also, the -->
<!--   build environment should still be separate from the run-time -->
<!--   environment. -->
<!-- </p> -->


<h3>You Failed It</h3>

<p>How long are the BSDs around?  Is the ports system really the best
  package system that came out of this?  When I was waiting for the
  GNUCash build to finish I saw warnings scrolling by which
  effectively said that something could not be undone because
  post-remove hooks are not yet implemented.  It's 2007 for another
  couple of days, the much sneered-at Linux package systems (e.g.,
  Debian's) have had {pre,post}-{install,remove} hooks for how many
  years now?
</p>

<p>So, invoking Fred Brooks here ("Fail fast"): please, let MacPorts
  die.  It is a waste of resources.  Instead, I recommend spending
  energy on improving,
  e.g., <a href="http://www.finkproject.org/">Fink</a> packages.  At
  least, it has modern, full-featured package management tools.
  Speaking of which, I just asked fink to <kbd>selfupdate</kbd> via
  rsync.  It is still...  COMPILING?!
</p>

<p>p.s.: Another option
  is <a href="http://0install.net/">Zero-Install</a>, the package
  management nirvana.  I managed to get Zero-Install installed on
  MacOS&nbsp;X actually (which also was not a smooth process, in parts
  thanks to MacPorts).  However, before it becomes usable in
  day-to-day situations it needs a bigger user base.  I will give it a
  spin and see how far I get.
</p>

<!--
<h3>XXX Notes</h3>

<pre>Unimpressed:
mplayer build failure
ghc out of date
tex missing binaries: {sim,alt}pdflatex
extra perl packages?
pdftk: gcc34 issue?
</pre>
-->
<h3><a id="macports-fatally-flawed-1" class="updatetitle">UPDATE 2008-02-13: Et tu, Fink.
</a><br /></h3>
<div><p>Yeah, that totally worked.  Not!
</p>

<p><a href="http://finkproject.org/">Fink</a> sent me through a twisty
  maze of virtual packages, all alike (i.e., not working).
  Eventually, I caved in and let it install ghostscript and tetex,
  too, before it agreed to continue with GNUCash.  <a
  href="http://www.foldr.org/~michaelw/log/static/computers/macosx/fink-gnucash-screenshot.png">The end
  result is not very impressive</a>.
</p>

<div style="float:right; width:25em; border: thick solid #aaa;
           margin:1ex 1em 0.5ex 2em; padding: 1ex 1em; font-family:
           sans-serif; font-size: 90%;">
  <p>After the <kbd>fink selfupdate</kbd> command and <kbd>fink -b
      install gnucash</kbd>, this is what I ended up with:
  </p>

<pre>% du -sh /sw     
1.2G    /sw
</pre>

1.2&nbsp;GB worth of (mostly build-time) dependencies.
</div>

<p>On the good side, all the downloading appeared to happen at the
  beginning of the command.  Had fink not bailed out half dozen times,
  the installation process could be called almost automatic.  On the
  bad side, there was again quite some compilation involved.  Any
  number of factors could or could not be the reason that gnucash
  segfaults.
</p>

<p>When will the madness stop?
</p>
</div>

]]></content:encoded>
			<comments>http://www.foldr.org/~michaelw/log/computers/macosx/macports-fatally-flawed#writeback</comments>
		</item>

	</channel>
</rss>
