<?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>blueslugs.com &#187; Software</title>
	<atom:link href="http://blueslugs.com/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://blueslugs.com</link>
	<description>Observations from a West Coast family</description>
	<lastBuildDate>Thu, 22 Dec 2011 23:01:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Bespoke services: site/redis</title>
		<link>http://blueslugs.com/2011/09/29/bespoke-services-siteredis/</link>
		<comments>http://blueslugs.com/2011/09/29/bespoke-services-siteredis/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 06:35:53 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blueslugs.com/?p=32025</guid>
		<description><![CDATA[For prototyping web applications, I have recently come to rely on having Redis handy. In various sketches or early versions, I&#8217;ve used it to store event logs, to persist a collection of simple objects, or to conveniently manage a particularly large dictionary. To make it easy to have a redis-server running on an OpenSolaris-derived system, [...]]]></description>
			<content:encoded><![CDATA[<p>For prototyping web applications, I have recently come to rely on having <a href="http://redis.io" alt="redis.io" title="redis.io">Redis</a> handy.  In various sketches or early versions, I&#8217;ve used it to store event logs, to persist a collection of simple objects, or to conveniently manage a particularly large dictionary.</p>

<p>To make it easy to have a <code>redis-server</code> running on an OpenSolaris-derived system, I&#8217;ve written an smf(5) service manifest:</p>

<ul>
<li><a href="http://blueslugs.com/~sch/manifest/redis.xml">redis.xml</a></li>
</ul>

<p>The default configuration of Redis is good enough for most prototyping scenarios, so this manifest assumes (a) that you&#8217;ve built and installed Redis to <code>/usr/local</code>, its default install location, and (b) are happy with the default configuration.  In its default configuration, <code>redis-server</code> does not daemonize, and writes a log message every 5 seconds&mdash;you&#8217;ll very much want to change the latter if you move to production.</p>

<h2>Exercises</h2>

<ol>
<li>Add a property group and property to store a configuration location, and modify the start method appropriately.  This enhancement should be on the service, such that it can be easily overridden on each instance. (*)</li>
</ol>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=32025&type=feed" alt=" Bespoke services: site/redis"  title="Bespoke services: site/redis" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2011/09/29/bespoke-services-siteredis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Irritating retrograde</title>
		<link>http://blueslugs.com/2011/07/06/retrograde/</link>
		<comments>http://blueslugs.com/2011/07/06/retrograde/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 23:28:39 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Observations]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blueslugs.com/?p=31989</guid>
		<description><![CDATA[A government agency I interact with has updated their web-based client software. The original application was a basic sequence of web forms. Its replacement? An approximately ~50MiB Silverlight-based application. In the process of the update, they discarded my original web account and password. The backend service that the application must communicate with is still slow, [...]]]></description>
			<content:encoded><![CDATA[<p>A government agency I interact with has updated their web-based client software.  The original application was a basic sequence of web forms.  Its replacement? An approximately ~50MiB Silverlight-based application.  In the process of the update, they discarded my original web account and password.  The backend service that the application must communicate with is still slow, operating costs now include the bandwidth to update cached copies (for performance reasons), and the application itself has new usability issues.  Because of the switch from standardized Web technologies to Silverlight, the majority of their customers can&#8217;t run the application on their phone or tablet.  (If it were Flash, iPads would still be excluded.)  How was this change an upgrade, again?</p>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=31989&type=feed" alt=" Irritating retrograde"  title="Irritating retrograde" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2011/07/06/retrograde/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bespoke services: site/supervisord</title>
		<link>http://blueslugs.com/2010/09/04/bespoke-services-sitesupervisor/</link>
		<comments>http://blueslugs.com/2010/09/04/bespoke-services-sitesupervisor/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 23:47:24 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[manifestly]]></category>

		<guid isPermaLink="false">http://blueslugs.com/wordpress/?p=31653</guid>
		<description><![CDATA[Recently, I&#8217;ve been experimenting with supervisor, which is a Python-based process restarter for Unix/Linux. Lincoln Loop recently offered instructions on running supervisor under upstart, which is applicable to some of the current Linux distributions. On OpenSolaris and related systems, the service management facility, smf(5), can be used to ensure your supervisors stay online. Below is [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I&#8217;ve been experimenting with <a href="http://supervisord.org">supervisor</a>, which is a Python-based process restarter for Unix/Linux.  <a href="http://lincolnloop.com/">Lincoln Loop</a> recently offered <a href="http://lincolnloop.com/blog/2010/jun/24/automatically-running-supervisord-startup/">instructions on running supervisor under upstart</a>, which is applicable to some of the current Linux distributions.  On OpenSolaris and related systems, the service management facility, smf(5), can be used to ensure your supervisors stay online.  Below is a simple manifest that starts (and restarts) supervisord after a small set of services becomes available.</p>

<ul>
<li><a href="http://blueslugs.com/~sch/manifest/supervisord.xml">supervisord.xml</a></li>
</ul>

<p>If you don&#8217;t provide a <code>supervisor.conf</code> in one of the standard locations, enabling this service instance will result in it heading immediately to the maintenance state, as the start method will fail repeatedly.  You can use <code>svcs -x</code> to perform this diagnosis:
<pre class="sh">
$ svcs -x                                                         ~
svc:/site/supervisord:default (supervisor process control system)
 State: maintenance since Sat Sep 04 16:34:14 2010
Reason: Start method failed repeatedly, last exited with status 2.
   See: http://sun.com/msg/SMF-8000-KS
   See: utmpd(1M)
   See: utmpx(4)
   See: /var/svc/log/site-supervisord:default.log
Impact: This service is not running.
</pre></p>

<p>The log file will contain a message, with some amount of repetition, like
<pre>
[ Sep  4 16:34:13 Enabled. ]
[ Sep  4 16:34:13 Rereading configuration. ]
[ Sep  4 16:34:13 Executing start method ("/usr/bin/supervisord"). ]
Error: No config file found at default paths (/usr/etc/supervisord.conf, /usr/supervisord.conf, supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf); use the -c option to specify a config file at a different path
For help, use /usr/bin/supervisord -h
[ Sep  4 16:34:13 Method "start" exited with status 2. ]
</pre></p>

<p>It&#8217;s worth noting that all of the programs run by a single instance of supervisord will be in the same process contract.  If you know the fault characteristics of your programs, you may wish to use multiple instances of <code>supervisord</code> to keep programs with &#8220;sympathetic&#8221; failure modes and frequencies.  You may also need to ignore core dumps and external signals, depending on the programs you are running; on recent systems, you can see /var/svc/manifest/network/http-apache22.xml for an example of a <code>startd</code> property group that does so.  Alternatively, you could modify your configuration to run each of the programs to be <a href="http://blueslugs.com/wordpress/2004/12/01/personal-restarters-and-ctrun1/">started in independent contracts using <code>ctrun</code>(1)</a>.</p>

<h2>Exercises</h2>

<ol>
<li>We should really provide a property group that contains the key invocation settings as properties.  I&#8217;ve omitted it here, particularly for the configuration file, because the method token expansion outlined in <code>smf_method</code>(5) lacks handling for unset property values.  (*)</li>
<li>Extend <code>supervisord</code> to understand process contracts.  This exercise would include constructing a Python module to interact with the contract filesystem.  (***)</li>
</ol>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=31653&type=feed" alt=" Bespoke services: site/supervisord"  title="Bespoke services: site/supervisord" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2010/09/04/bespoke-services-sitesupervisor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>adirent.[ch]: Adding d_type to struct dirent on OpenSolaris</title>
		<link>http://blueslugs.com/2010/06/13/adirent-ch-adding-d_type-to-struct-dirent-on-opensolaris/</link>
		<comments>http://blueslugs.com/2010/06/13/adirent-ch-adding-d_type-to-struct-dirent-on-opensolaris/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 02:47:47 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[opensolaris]]></category>

		<guid isPermaLink="false">http://blueslugs.com/wordpress/?p=31588</guid>
		<description><![CDATA[An occasional porting problem you may encounter when compiling programs for OpenSolaris is the absence of d_type in the directory entry structure returned by readdir(3C). I hit this issue when experimenting with mu as a search solution for my accumulated email. A trivial example of the failure you might see would be caused by the [...]]]></description>
			<content:encoded><![CDATA[<p>An occasional porting problem you may encounter when compiling programs for OpenSolaris is the absence of <code>d_type</code> in the directory entry structure returned by <code>readdir</code>(3C).  I  hit this issue when experimenting with <a href="http://www.djcbsoftware.nl/code/mu/">mu</a> as a search solution for my accumulated email.</p>

<p>A trivial example of the failure you might see would be caused by the following program:</p>

<pre><code>#include &lt;sys/types.h&gt;
#include &lt;dirent.h&gt;
#include &lt;err.h&gt;
#include &lt;stdio.h&gt;

int
main(int argc, char *argv[])
{
        DIR *d;
        struct dirent *e;

        if ((d = opendir("/")) == NULL)
                err(1, "opendir failed");

        for (e = readdir(d); e != NULL; e = readdir(d)) {
                    if (e-&gt;d_type != DT_UNKNOWN)
                        (void) printf("recognized filetype for '%s'\n",
                            e-&gt;d_name);
        }

        (void) closedir(d);

        return (0);
 }
</code></pre>

<p>When we attempt to compile this program with <code>gcc</code>, we get something like</p>

<pre><code>$ gcc a.c
a.c: In function `main':
a.c:16: error: structure has no member named `d_type'
a.c:16: error: `DT_UNKNOWN' undeclared (first use in this function)
a.c:16: error: (Each undeclared identifier is reported only once
a.c:16: error: for each function it appears in.)
</code></pre>

<p>Studio <code>cc</code> will give similar output:</p>

<pre><code>$ /opt/SunStudioExpress/bin/cc a.c
"a.c", line 16: undefined struct/union member: d_type
"a.c", line 16: undefined symbol: DT_UNKNOWN
cc: acomp failed for a.c
</code></pre>

<p>The addition of <code>d_type</code> to <code>struct dirent</code> came first for the BSD Unixes and was later added to Linux.  Because it&#8217;s not easy to add members to well-known structures and preserve binary compatibility, OpenSolaris and Solaris lack this field, as well as the <code>DT_*</code> constant definitions.  (If <code>d_type</code> were to become part of the Unix standards, Solaris would likely have to introduce a second family of <code>opendir()</code>/<code>readdir()</code>/<code>closedir()</code> functions and a second version of the structure, similar to how large files were introduced for 32-bit programs.)</p>

<p>Because we fail at compilation time, our workaround has to modify either the program&#8217;s source code or its build environment.  (Preloading is too late.)  It&#8217;s probably possible to combine a few definitions and a shared object that we include via <code>LD_PRELOAD</code> but it seems easier to just provide a C wrapper around <code>readdir</code>(3C) and an alternate <code>struct dirent</code>.  We develop this approach in the next section.</p>

<h2><code>DIRENT</code> and <code>READDIR</code></h2>

<p>The approach we take is</p>

<ol>
<li>Introduce <code>DIRENT</code> and <code>READDIR</code> via <code>adirent.h</code>.</li>
<li>Change the source program such that each call to <code>readdir()</code> is replaced by <code>READDIR()</code> and each use of <code>struct dirent</code> is replaced by <code>DIRENT</code>.  In each file so modified, add a <code>#include &lt;adirent.h&gt;</code>.</li>
<li>Compile adirent.c via <code>gcc -I. -O2 -c adirent.c</code> or equivalent.</li>
<li>Add <code>adirent.o</code> to the link line for each binary that includes one of the files modified in step 2.</li>
</ol>

<p>If we apply these steps to our example above, we get</p>

<pre><code>#include &lt;sys/types.h&gt;
#include &lt;adirent.h&gt;
#include &lt;err.h&gt;
#include &lt;stdio.h&gt;

int
main(int argc, char *argv[])
{
        DIR *d;
        DIRENT *e;

        if ((d = opendir("/")) == NULL)
                err(1, "opendir failed");

        for (e = READDIR(d); e != NULL; e = READDIR(d)) {
                    if (e-&gt;d_type != DT_UNKNOWN)
                        (void) printf("recognized filetype for '%s'\n",
                            e-&gt;d_name);
        }

        (void) closedir(d);

        return (0);
 }
</code></pre>

<p>with the result that compilation and execution now work</p>

<pre><code>$ gcc -O2 -I. -c adirent.c
$ gcc -I. a.c adirent.o
$ ./a.out
</code></pre>

<p>This shim function and definitions should be sufficient for most ports around this incompatibility, but there are some additional comments worth making.</p>

<p><em>Performance.</em>  Because many programs expect <code>d_type</code> to be one of <code>DT_REG</code> or <code>DT_DIR</code> to save on a <code>stat</code>(2) call, this shim will force those programs into an alleged &#8220;slow&#8221; path.  The actual impact of returning <code>DT_UNKNOWN</code> on every call will be program- and situation-dependent; it didn&#8217;t seem to affect my mail indexing.</p>

<p><em>Multithreaded programs.</em>  The current implementation does not protect the static structure defined in <code>adirent.c</code>.  Programs with multiple threads performing <code>readdir</code>(3C) calls through <code>READDIR()</code> will get unexpected results.  It should be relatively straightforward to dynamically allocate one <code>struct adirent</code> for each thread coming through <code>READDIR()</code> for the first time.</p>

<h2>Downloads</h2>

<p>I suppose these should be in a repository on Bitbucket or GitHub.  For now, they&#8217;re just simple downloads:</p>

<ul>
<li><a href="http://blueslugs.com/~sch/adirent/adirent.c" title="Function implementation">adirent.c</a></li>
<li><a href="http://blueslugs.com/~sch/adirent/adirent.h" title="Header definitions">adirent.h</a></li>
</ul>

<h2>Acknowledgments</h2>

<p>I discussed this problem with <a href="http://blogs.sun.com/dp">Dan</a>, who in particular noted that <code>DT_UNKNOWN</code> was always a legal return value for <code>d_type</code>.  <a href="http://blogs.sun.com/barts">Bart</a> looked over my shoulder and spied at least one error during the debugging phase.</p>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=31588&type=feed" alt=" adirent.[ch]: Adding d type to struct dirent on OpenSolaris"  title="adirent.[ch]: Adding d type to struct dirent on OpenSolaris" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2010/06/13/adirent-ch-adding-d_type-to-struct-dirent-on-opensolaris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>~4100MiB</title>
		<link>http://blueslugs.com/2008/04/26/4100mib/</link>
		<comments>http://blueslugs.com/2008/04/26/4100mib/#comments</comments>
		<pubDate>Sat, 26 Apr 2008 19:30:12 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Observations]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[2008.05]]></category>
		<category><![CDATA[bittorrent]]></category>
		<category><![CDATA[opensolaris]]></category>

		<guid isPermaLink="false">http://blueslugs.com/wordpress/index.php/archives/2008/04/26/4100mib/</guid>
		<description><![CDATA[I seeded the 2008.05 release candidate for about 45 hours, ultimately shipping a little over 4100 megabytes. I&#8217;m going to take a break, because I want to update my DP2-based workstation and get some work done, but, once we have new bits, I&#8217;ll getting seeding again. (I found the actual result: 4237MiB sent up, so [...]]]></description>
			<content:encoded><![CDATA[<p>I seeded the 2008.05 release candidate for about 45 hours, ultimately shipping a little over 4100 megabytes.  I&#8217;m going to take a break, because I want to update my DP2-based workstation and get some work done, but, once we have new bits, I&#8217;ll getting seeding again.</p>

<p>(I found the actual result: 4237MiB sent up, so almost 4GiB.)</p>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=501&type=feed" alt=" ~4100MiB"  title="~4100MiB" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2008/04/26/4100mib/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stopping Firefox&#039;s restore session dialog</title>
		<link>http://blueslugs.com/2007/12/06/stopping-firefoxs-restore-session-dialog/</link>
		<comments>http://blueslugs.com/2007/12/06/stopping-firefoxs-restore-session-dialog/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 17:47:43 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[efficiently]]></category>

		<guid isPermaLink="false">http://blueslugs.com/wordpress/index.php/archives/2007/12/06/stopping-firefoxs-restore-session-dialog/</guid>
		<description><![CDATA[I&#8217;m sure that there are Firefox users out there who want to restore their previous session; I never do, and so deactivating that dialog is a big timesaver. If you search, you&#8217;ll find a few writeups on how to adjust the configuration, but I want to document the minimum steps to suppress the restore session [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m sure that there are Firefox users out there who want to restore their previous session; I never do, and so deactivating that dialog is a big timesaver.  If you search, you&#8217;ll find a few writeups on how to adjust the configuration, but I want to document the minimum steps to suppress the restore session dialog.</p>

<ol>
    <li>Enter <code>about:config</code> into the URL field.</li>
    <li>Enter <code>sessionstore</code> into the displayed filter field and press Enter.</li>
    <li>Double-click the value cell of the <code>browser.sessionstore.enabled</code> row, so that the value field reads <code>False</code>.</li>
    <li>Restart Firefox.  One click saved.</li>
</ol>

<p class="tag">
[ <i>T</i>:
<a href="http://www.technorati.com/tag/Firefox" rel="tag">Firefox</a>
]
</p>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=474&type=feed" alt=" Stopping Firefox&#039;s restore session dialog"  title="Stopping Firefox&#039;s restore session dialog" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2007/12/06/stopping-firefoxs-restore-session-dialog/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenSolaris: Defect tracking relationships</title>
		<link>http://blueslugs.com/2007/05/23/opensolaris-defect-tracking-relationships/</link>
		<comments>http://blueslugs.com/2007/05/23/opensolaris-defect-tracking-relationships/#comments</comments>
		<pubDate>Thu, 24 May 2007 05:42:30 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Sun Posts]]></category>

		<guid isPermaLink="false">http://blueslugs.com/wordpress/2007/05/23/opensolaris-defect-tracking-relationships/</guid>
		<description><![CDATA[Just prior to the Board election, we ran a poll of the core contributors to get some sense of what one active subset felt were the five most pressing obstacles to open development. Dan just issued an initial Beta of a webrev-based approach, derived from his earlier experiment on http://cr.grommit.com, so that&#8217;s a starting point [...]]]></description>
			<content:encoded><![CDATA[<p>Just prior to the <a href="http://poll.opensolaris.org/2/" title="Election results">Board election</a>, we ran a <a href="http://poll.opensolaris.org/1/" title="Community priority poll results">poll of the core
contributors</a> to get some sense of what one active subset
felt were the five most pressing obstacles to open development.  <a href="http://blogs.sun.com/dp/">Dan</a>
just issued an initial Beta of a <code>webrev</code>-based approach, derived from
his earlier experiment on <a href="http://cr.grommit.com" class="broken_link">http://cr.grommit.com</a>, so that&#8217;s a starting
point for Priority 3.  The Board is tackling, in full public view on
<a href="http://http://mail.opensolaris.org/pipermail/ogb-discuss/" class="broken_link">ogb-discuss</a>, Priority 4:  there&#8217;s <a href="http://mail.opensolaris.org/pipermail/ogb-discuss/2007-April/000288.html">OGB/2007/001, <em>Project
creation enhancements</em></a>
and <a href="http://mail.opensolaris.org/pipermail/ogb-discuss/2007-April/000289.html">OGB/2007/002, <em>Community and Project
Reorganization</em></a>
as two significant chunks of a stablized reorganization.  Priority 2,
the deployment of a &#8220;request to integrate&#8221; system, is
somewhat gated on ON and sister consolidations&#8217; switch to Mercurial,
being pursued in the <a href="http://opensolaris.org/os/project/scm-migration"><code>scm-migration</code>
project</a>&mdash;it&#8217;s an
aspect of workflow that isn&#8217;t required by all of the hosted
consolidations.  Priority 5, the deployment of an
<code>opensolaris.org</code>-hosted wiki, is in a requirements gathering phase over
on
<a href="http://mail.opensolaris.org/pipermail/website-discuss/2007-April/003242.html" class="broken_link"><code>website-discuss</code></a>.</p>

<p>That leaves Priority 1, the deployment of a public bug tracking system.
Bug tracking has loomed over the OpenSolaris effort for pretty much its
entire implementation phase; we&#8217;ve known that aspects of the current bug
tracking methodologies impact many parts of Sun&#8217;s business, and that any
solution will require the identification of which entanglements are
strategic&mdash;meaning that there&#8217;s a requirement for any new
system&mdash;and which are accidental&mdash;meaning that there&#8217;s only
some transition cost, as the entangled system can be adjusted to consume
information in some designed fashion.  So, as part of getting a set of
draft requirements together for discussion, I thought I would work
through some of the issues facing defect tracking as we move to open
development.  Most of these points are about the
developer&ndash;distribution (or upstream&ndash;downstream) interface
that a defect tracking system (DTS) or defect tracking architecture
represents.</p>

<p>The primary requirement that a distribution has on their DTS is some
ability to maintain confidential data associated with each tracked
defect.  Let&#8217;s call that database a proprietary
annotation system (PAS)&mdash;the data within it capture the customer
histories associated with various defects or collections of defects
(&#8220;products&#8221;?) represented in the system.  The DTS, meanwhile, is meant
to be neutral across all participants, developers and distribution
assemblers, and unconcerned with non-technical characteristics of the
defect.</p>

<p>This contrast allows us to postulate a set of relationships among
various active DTSs and PASs for an open development community.</p>

<p>The association of confidential information with an existing defect
looks something like</p>

<p><img src="/wp-content/uploads/2007/05/23/p-simple-as.png" alt="p simple as OpenSolaris: Defect tracking relationships" title="" /></p>

<p>Of course, in the OpenSolaris case, SMI&#8217;s annotations become just one
potential PAS; other distributions may also choose to annotate
publicly known (&#8220;community tracked&#8221;) defects:</p>

<p><img src="/wp-content/uploads/2007/05/23/p-multiple-as.png" alt="p multiple as OpenSolaris: Defect tracking relationships" title="" /></p>

<p>One requirement that we&#8217;ve heard during preliminary discussions with the
various teams is there must be some ability to search the entirety of the
product-relevant portion of the DTS.  One possibility is that each
PAS operator builds a search corpus that combines the upstream DTS with
the PAS content.  A potentially more economic alternative would be to
allow the the associations to be bidirectional (so that an indexer with
authorizations allowing it to access one or more proprietary annotation
systems can present a complete defect corpus).  Making the existence of
the annotations public does not seem like a significant leak of
proprietary information, while the existence of annotations might be a
useful measure of defect significance.  (It is probably worth explicitly
stating that having a complete defect corpus for searching does not
imply that use of a single DTS is the only means of obtaining such a
corpus.)</p>

<p>These associations are more complex objects than the current See Also
links in typical monolithic DTSes, in that they carry one or more
mappings of status and responsibility between the DTS and each PAS.
Potentially, this capability could lead to more precise handling of
release readiness, in that a query involving a group of PAS-tracked
defects could indicate that one or more stoppers are blocking the
release of a certain version of the tracked product.  Of course, prior
to open development, the Solaris organization has historically managed
that fairly well for its products, so why is it worth discussing?</p>

<p>Well, for OpenSolaris today, the set of defects in our own DTS isn&#8217;t the
complete set of relevant defects for product release.  In fact, as
examples, Solaris tracks the defects, branches, and patches for GNOME,
Mozilla Firefox, and Perl, among others.  That is, Sun&#8217;s current
combined DTS/PAS, Bugster, is in the following relationships with an
upstream source</p>

<p><img src="/wp-content/uploads/2007/05/23/p-us-relns-1.png" alt="p us relns 1 OpenSolaris: Defect tracking relationships" title="" /></p>

<p>when the product is affected by an upstream-sourced component,
and</p>

<p><img src="/wp-content/uploads/2007/05/23/p-us-relns-2.png" alt="p us relns 2 OpenSolaris: Defect tracking relationships" title="" /></p>

<p>when a customer is affected by an upstream-sourced component.
There&#8217;s also an awkward local cost since upstream state is usually
tracked manually (or possibly via custom scripting).</p>

<p>We can choose to apply this tracking need to our second
defect/annotation figure above, in two ways:  we can track the
OpenSolaris consolidation defects as a peer of other upstream DTSs</p>

<p><img src="/wp-content/uploads/2007/05/23/p-full-relns-1.png" alt="p full relns 1 OpenSolaris: Defect tracking relationships" title="" /></p>

<p>or, more interestingly, we can allow community management of the
relevance of upstream defects, like the following</p>

<p><img src="/wp-content/uploads/2007/05/23/p-full-relns-2.png" alt="p full relns 2 OpenSolaris: Defect tracking relationships" title="" /></p>

<p>(A distribution may not choose to annotate the public DTS record on
an upstream bug, but may instead choose to annotate on the upstream
DTS record directly.  Ignoring the community signal when it has a
mismatch with distribution priorities seems likely; using it as a guide
when no conflicting principle exists seems like a safe course as well.)</p>

<p>I think that introducing these kinds of associations allows us to
solve a large class of defect tracking problems that are currently
impacting the OpenSolaris space.  (Obviously there are issues, too&#8211;for
instance, one could introduce association cycles (that clients must
detect).)  I would expect that the confidentiality issue impacts all of
the distributions pulling from OpenSolaris consolidations (and probably,
more generally, all groups looking at open development):  I believe
every distribution has customers of some kind.  The importance of upstream
relationships may presently be operating environment-specific, although I
know other groups are also dependent on some number of OSS components.</p>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=31271&type=feed" alt=" OpenSolaris: Defect tracking relationships"  title="OpenSolaris: Defect tracking relationships" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2007/05/23/opensolaris-defect-tracking-relationships/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Periodic reducation of email interrupt rate</title>
		<link>http://blueslugs.com/2006/10/11/periodic-reducation-of-email-interrupt-rate/</link>
		<comments>http://blueslugs.com/2006/10/11/periodic-reducation-of-email-interrupt-rate/#comments</comments>
		<pubDate>Wed, 11 Oct 2006 20:23:37 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Observations]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blueslugs.com/wordpress/?p=332</guid>
		<description><![CDATA[At work, I&#8217;ve ended up on many email aliases; since we moved to pursuing open development on opensolaris.org, my subscriptions and incoming email flow have grown tremendously, to the point where they were interfering with my ability to get work done. My present filter setup involves delivery to 56 inboxes. I&#8217;ve had a small email [...]]]></description>
			<content:encoded><![CDATA[<p>
At work, I&#8217;ve ended up on many email aliases; since we moved to pursuing
open development on <a href="http://opensolaris.org">opensolaris.org</a>, my subscriptions and
incoming email flow have grown tremendously, to the point where they
were interfering with my ability to get work done.  My present filter
setup involves delivery to 56 inboxes.
</p>

<p>
I&#8217;ve had a small email toolset built around <a href="http://www.mutt.org/">the Mutt email client</a> (or mail user
agent (MUA) in email-speak).  My <code>.muttrc</code> includes
<code>$HOME/.mailboxes</code>, which is a list of the mail inboxes into
which my <code>procmail</code> filter delivers.  The <code>m</code>
and <code>check</code> commands use <code>.mailboxes</code> to determine
where new messages have arrived.  Happily, this infrastructure can
easily give me a few hours of reduced interrupts, so that I can get some
thinking and writing done.
</p>

<p>
The idea is to strongly reduce the number of significant inboxes during
what we&#8217;ll label as &#8220;prime&#8221; work hours, between lunch and dinner on
weekdays.  Given the use of <code>.mailboxes</code> outlined above, the
solution is pretty easy:
<ol>
<li> Move <code>.mailboxes</code> to
<code>.mailboxes.offprime</code>.</li>
<li> Take a copy of <code>.mailboxes.offprime</code> as
<code>.mailboxes.prime</code>.  Prune the prime mailboxes severely.</li>
<li> Install these files in <code>$HOME</code>.  (My Makefiles do this,
and all the mailbox lists and the Makefiles are
version-controlled.)</li>
<li> Add something like the following using <code>crontab -e</code>:
<pre>
# We want to eliminate mail testing on all mailboxes during prime work
# hours.  This change means that between 12pm - 6pm, mailboxes is
# pointed to a reduced mailboxes file.
0 12 * * 1,2,3,4,5 /usr/bin/ln -sf /home/sch/.mailboxes.prime /home/sch/.mailboxes
0 18 * * 1,2,3,4,5 /usr/bin/ln -sf /home/sch/.mailboxes.offprime /home/sch/.mailboxes
</pre>
</li>
<li> Run whichever of the two <code>ln</code>(1) invocations above
correspond to the current time.</li>
</ol>

</p>

<p>
You&#8217;re now ready to relax and enjoy reduced interrupt rates, leaving you
time to focus on real work&#8230; or write blog postings about managing your
interrupt rates.
</p>

<p class="tag">
[ <i>T</i>:
<a href="http://www.technorati.com/tag/OpenSolaris" rel="tag" class="broken_link">OpenSolaris</a>
<a href="http://www.technorati.com/tag/Solaris" rel="tag">Solaris</a>
<a href="http://www.technorati.com/tag/mutt" rel="tag">mutt</a>
procmail
]
</p>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=332&type=feed" alt=" Periodic reducation of email interrupt rate"  title="Periodic reducation of email interrupt rate" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2006/10/11/periodic-reducation-of-email-interrupt-rate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Periodic reducation of email interrupt rate</title>
		<link>http://blueslugs.com/2006/10/11/periodic-reducation-of-email-interrupt-rate-2/</link>
		<comments>http://blueslugs.com/2006/10/11/periodic-reducation-of-email-interrupt-rate-2/#comments</comments>
		<pubDate>Wed, 11 Oct 2006 20:22:58 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Observations]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blueslugs.com/wordpress/index.php/archives/2006/10/11/periodic-reducation-of-email-interrupt-rate-2/</guid>
		<description><![CDATA[At work, I&#8217;ve ended up on many email aliases; since we moved to pursuing open development on opensolaris.org, my subscriptions and incoming email flow have grown tremendously, to the point where they were interfering with my ability to get work done. My present filter setup involves delivery to 56 inboxes. I&#8217;ve had a small email [...]]]></description>
			<content:encoded><![CDATA[<p>
At work, I&#8217;ve ended up on many email aliases; since we moved to pursuing
open development on <a href="http://opensolaris.org">opensolaris.org</a>, my subscriptions and
incoming email flow have grown tremendously, to the point where they
were interfering with my ability to get work done.  My present filter
setup involves delivery to 56 inboxes.

</p>

<p>
I&#8217;ve had a small email toolset built around <a href="http://www.mutt.org/">the Mutt email client</a> (or mail user
agent (MUA) in email-speak).  My <code>.muttrc</code> includes
<code>$HOME/.mailboxes</code>, which is a list of the mail inboxes into
which my <code>procmail</code> filter delivers.  The <code>m</code>
and <code>check</code> commands use <code>.mailboxes</code> to determine
where new messages have arrived.  Happily, this infrastructure can
easily give me a few hours of reduced interrupts, so that I can get some
thinking and writing done.
</p>

<p>
The idea is to strongly reduce the number of significant inboxes during
what we&#8217;ll label as &#8220;prime&#8221; work hours, between lunch and dinner on
weekdays.  Given the use of <code>.mailboxes</code> outlined above, the
solution is pretty easy:
<ol>
<li> Move <code>.mailboxes</code> to
<code>.mailboxes.offprime</code>.</li>
<li> Take a copy of <code>.mailboxes.offprime</code> as
<code>.mailboxes.prime</code>.  Prune the prime mailboxes severely.</li>
<li> Install these files in <code>$HOME</code>.  (My Makefiles do this,
and all the mailbox lists and the Makefiles are
version-controlled.)</li>
<li> Add something like the following using <code>crontab -e</code>:
<pre>
# We want to eliminate mail testing on all mailboxes during prime work
# hours.  This change means that between 12pm - 6pm, mailboxes is
# pointed to a reduced mailboxes file.
0 12 * * 1,2,3,4,5 /usr/bin/ln -sf /home/sch/.mailboxes.prime /home/sch/.mailboxes
0 18 * * 1,2,3,4,5 /usr/bin/ln -sf /home/sch/.mailboxes.offprime /home/sch/.mailboxes
</pre>
</li>
<li> Run whichever of the two <code>ln</code>(1) invocations above
correspond to the current time.</li>
</ol>

</p>

<p>
You&#8217;re now ready to relax and enjoy reduced interrupt rates, leaving you
time to focus on real work&#8230; or write blog postings about managing your
interrupt rates.
</p>

<p class="tag">
[ <i>T</i>:
<a href="http://www.technorati.com/tag/OpenSolaris" rel="tag" class="broken_link">OpenSolaris</a>
<a href="http://www.technorati.com/tag/Solaris" rel="tag">Solaris</a>
<a href="http://www.technorati.com/tag/mutt" rel="tag">mutt</a>
procmail
]
</p>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=331&type=feed" alt=" Periodic reducation of email interrupt rate"  title="Periodic reducation of email interrupt rate" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2006/10/11/periodic-reducation-of-email-interrupt-rate-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Little patch for Mediawiki external editor</title>
		<link>http://blueslugs.com/2006/06/06/little-patch-for-mediawiki-external-editor/</link>
		<comments>http://blueslugs.com/2006/06/06/little-patch-for-mediawiki-external-editor/#comments</comments>
		<pubDate>Tue, 06 Jun 2006 18:12:26 +0000</pubDate>
		<dc:creator>Stephen</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://blueslugs.com/wordpress/index.php/archives/2006/06/06/little-patch-for-mediawiki-external-editor/</guid>
		<description><![CDATA[For the OpenSolaris governance discussions, the community is using the wiki at genunix.org. The genunix team installed Mediawiki, used most famously for the Wikipedia, to support communal editing. I&#8217;m a creature of Vim, and am quite happy with the recently released Vim 7. Tying the external editor feature of Wikipedia to Vim is straightforward, if [...]]]></description>
			<content:encoded><![CDATA[<p>For the <a href="http://www.opensolaris.org">OpenSolaris</a> governance
discussions, the community is using the wiki at
<a href="http://www.genunix.org">genunix.org</a>.  The genunix team installed
Mediawiki, used most famously for the <a href="http://wikipedia.org">Wikipedia</a>, to support communal
editing.</p>

<p>I&#8217;m a creature of <a href="http://vim.sf.net">Vim</a>, and am quite happy with the
recently released Vim 7.  Tying the external editor feature of Wikipedia
to Vim is straightforward, if you install Erik MÃ¶ller&#8217;s <code>ee</code>
script&mdash;and tweak it a little.</p>

<p>Below you&#8217;ll find a modified version that respects the <code>http_proxy</code>
setting, handles the case where no matching site is present in your
<code>ee.ini</code> file, and adds a configuration option to not append the &#8220;using
an external editor&#8221; string to your article&#8217;s change summary.</p>

<ul>
<li><a href="http://blueslugs.com/wordpress/wp-content/ee.pl.txt" title="ee.pl script" class="broken_link">ee.pl</a></li>
<li><a href="http://blueslugs.com/wordpress/wp-content/ee.pl.export.txt" title="ee.pl Hg export" class="broken_link">ee.pl Hg export</a></li>
</ul>

<p class="tag">
[ <i>T</i>:
<a href="http://www.technorati.com/tag/OpenSolaris" rel="tag" class="broken_link">OpenSolaris</a>
<a href="http://www.technorati.com/tag/Solaris" rel="tag">Solaris</a>
genunix
<a href="http://www.technorati.com/tag/Mediawiki" rel="tag">Mediawiki</a>
]
</p>
<img src="http://blueslugs.com/?ak_action=api_record_view&id=257&type=feed" alt=" Little patch for Mediawiki external editor"  title="Little patch for Mediawiki external editor" />]]></content:encoded>
			<wfw:commentRss>http://blueslugs.com/2006/06/06/little-patch-for-mediawiki-external-editor/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

