<?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>Joseph Spiros</title>
	<atom:link href="http://josephspiros.com/feed" rel="self" type="application/rss+xml" />
	<link>http://josephspiros.com</link>
	<description>There in the midst of it, so alive and alone, words support like bone.</description>
	<lastBuildDate>Sun, 26 Jul 2009 18:46:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Configuring Gitweb for Apache on Debian</title>
		<link>http://josephspiros.com/2009/07/26/configuring-gitweb-for-apache-on-debian</link>
		<comments>http://josephspiros.com/2009/07/26/configuring-gitweb-for-apache-on-debian#comments</comments>
		<pubDate>Sun, 26 Jul 2009 17:33:57 +0000</pubDate>
		<dc:creator>Joseph Spiros</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Servers]]></category>
		<category><![CDATA[iThink Software]]></category>

		<guid isPermaLink="false">http://josephspiros.com/?p=279</guid>
		<description><![CDATA[git.ithinksw.org is a pretty nifty site: in addition to providing Gitweb when you access it via a web browser, it also allows cloning of repositories in the same namespace. So, for example, you can visit http://git.ithinksw.org/ITFoundation.git, and receive a Gitweb-generated interface to the repository, but you can also run git clone http://git.ithinksw.org/ITFoundation.git to clone the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://git.ithinksw.org/">git.ithinksw.org</a> is a pretty nifty site: in addition to providing Gitweb when you access it via a web browser, it also allows cloning of repositories in the same namespace. So, for example, you can visit <a href="http://git.ithinksw.org/ITFoundation.git">http://git.ithinksw.org/ITFoundation.git</a>, and receive a Gitweb-generated interface to the repository, but you can also run <code>git clone http://git.ithinksw.org/ITFoundation.git</code> to clone the repository. <a href="http://tychoish.com/">tycho</a> is also a fan of Git, and was interested in setting a similar site up for his own repositories, so I&#8217;ve decided to share my configuration here.<span id="more-279"></span></p>
<h3>Goals</h3>
<p>My servers tend to run <a href="http://debian.org/">Debian GNU/Linux</a>, because I am totally in love with dpkg and APT. I generally like being able to rely on automatic updates to my software, and Gitweb should be no exception, so this configuration uses the copy of Gitweb that is maintained by dpkg.</p>
<p><a href="http://git.ithinksw.org/">git.ithinksw.org</a> also runs git-daemon to support the git:// protocol. One of the features of git-daemon is support for per-user public_git directories. Of course, Apache has the <a href="http://httpd.apache.org/docs/2.2/mod/mod_userdir.html">mod_userdir</a> module to provide a similar feature over HTTP. With a little <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> hackery, the git:// and http:// clone URLs for every repository are identical, and every repository has a Gitweb interface.</p>
<h3>The configuration</h3>
<p>This configuration relies on two things:</p>
<ol>
<li>A valid Gitweb configuration, including a directory that contains symbolic links to repositories and public_git directories for use as the Gitweb root. Unfortunately, this does require some manual maintenance, to ensure that the desired repositories and users show up in Gitweb. That said, I find this to be useful: I can &#8220;hide&#8221; repositories or users from Gitweb whilst maintaining their ability to be cloned.</li>
<li>The VirtualHost configuration in Apache.</li>
</ol>
<p>Here is an example of the layout of the server&#8217;s filesystem (paths followed by lines that begin with -> are symbolic links to the following path):<br />
<code>/home/user/public_git/repository.git<br />
/srv/git/git.ithinksw.org/ITFoundation.git<br />
/srv/www/git.ithinksw.org/gitweb/gitweb.conf<br />
/srv/www/git.ithinksw.org/gitweb/root/ITFoundation.git<br />
-> /srv/git/git.ithinksw.org/ITFoundation.git<br />
/srv/www/git.ithinksw.org/gitweb/root/\~user<br />
-> /home/user/public_git</code></p>
<p>Here is the relevant gitweb.conf:<br />
<code>$projectroot = "/srv/www/git.ithinksw.org/gitweb/root";<br />
$git_temp = "/tmp";<br />
$home_text = "indextext.html";<br />
$projects_list = $projectroot;<br />
$stylesheet = "/gitweb.css";<br />
$logo = "/git-logo.png";<br />
$favicon = "/git-favicon.png";<br />
@git_base_url_list = qw(git://git.ithinksw.org http://git.ithinksw.org);<br />
$site_name = "git.ithinksw.org";<br />
$home_link_str = "git.ithinksw.org";<br />
$projects_list_description_width = "200";<br />
$feature{'pathinfo'}{'default'} = [1];</code></p>
<p>Here is the VirtualHost configuration for Apache:<br />
<code>DocumentRoot /srv/git/git.ithinksw.org<br />
UserDir public_git<br />
UserDir enabled<br />
# gitweb<br />
SetEnv GITWEB_CONFIG /srv/www/git.ithinksw.org/gitweb/gitweb.conf<br />
Alias /gitweb.css /usr/share/gitweb/gitweb.css<br />
Alias /git-logo.png /usr/share/gitweb/git-logo.png<br />
Alias /git-favicon.png /usr/share/gitweb/git-favicon.png<br />
ScriptAlias /gitweb /usr/lib/cgi-bin/gitweb.cgi<br />
RewriteEngine on<br />
# redirect userdir listing to gitweb search<br />
RewriteRule ^/?(~[^/]+)/?$ /?s=$1 [R]<br />
# rewrite all other paths that aren't git repo internals to gitweb<br />
RewriteRule ^/$ /gitweb [PT]<br />
RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ /gitweb%{REQUEST_URI} [L,PT]</code></p>
<h3>Closing</h3>
<p>That&#8217;s all there is to it! I do hope that you&#8217;ll read the documentation for the tools I&#8217;ve employed here, so that you may fully understand what is going on. This will give you a very basic setup similar to the one at <a href="http://git.ithinksw.org/">git.ithinksw.org</a>, but you&#8217;ll need to know what&#8217;s going on to further customize or improve on what I&#8217;ve provided. Good luck, and do let me know if you improve on these beginnings or have any suggestions!</p>
]]></content:encoded>
			<wfw:commentRss>http://josephspiros.com/2009/07/26/configuring-gitweb-for-apache-on-debian/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>iThink Software goes open source</title>
		<link>http://josephspiros.com/2009/07/26/ithink-software-goes-open-source</link>
		<comments>http://josephspiros.com/2009/07/26/ithink-software-goes-open-source#comments</comments>
		<pubDate>Sun, 26 Jul 2009 17:13:10 +0000</pubDate>
		<dc:creator>Joseph Spiros</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[iThink Software]]></category>

		<guid isPermaLink="false">http://josephspiros.com/?p=266</guid>
		<description><![CDATA[Beginning in January, I&#8217;d been working to move much of the code we wrote at iThink Software to open source. I&#8217;m happy to say that I am now satisfied with the result: a redmine installation, and git repositories.
Currently, the following projects are available:

ITFoundation: GNU Lesser General Public License
ITKit: GNU Lesser General Public License
ITMac: GNU Lesser [...]]]></description>
			<content:encoded><![CDATA[<p>Beginning in January, I&#8217;d been working to move much of the code we wrote at <a href="http://ithinksw.com/">iThink Software</a> to open source. I&#8217;m happy to say that I am now satisfied with the result: <a href="http://ithinksw.org/">a redmine installation</a>, and <a href="http://git.ithinksw.org/">git repositories</a>.<span id="more-266"></span></p>
<p>Currently, the following projects are available:</p>
<ul>
<li><a href="http://ithinksw.org/projects/show/itfoundation">ITFoundation</a>: GNU Lesser General Public License</li>
<li><a href="http://ithinksw.org/projects/show/itkit">ITKit</a>: GNU Lesser General Public License</li>
<li><a href="http://ithinksw.org/projects/show/itmac">ITMac</a>: GNU Lesser General Public License</li>
<li><a href="http://ithinksw.org/projects/show/menutunes">MenuTunes</a>: GNU General Public License</li>
<li><a href="http://ithinksw.org/projects/show/growlittsw">ITTSW.growlView</a>: GNU General Public License</li>
</ul>
<p><a href="http://ithinksw.com/menuprefs">MenuPrefs</a> will be added as soon as I&#8217;ve converted the old CVS and Subversion backups of its history into a single Git repository (a process that I will be documenting at some point in the future for others looking to do the same). Otherwise, I intend to use this new platform to further maintain and develop these projects, as well as any new software that I may be developing in the future (including some of the work I&#8217;m currently doing for <a href="http://oberlin.edu/">Oberlin College</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://josephspiros.com/2009/07/26/ithink-software-goes-open-source/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My New Oberlin College Job</title>
		<link>http://josephspiros.com/2009/03/06/my-new-oberlin-college-job</link>
		<comments>http://josephspiros.com/2009/03/06/my-new-oberlin-college-job#comments</comments>
		<pubDate>Sat, 07 Mar 2009 04:15:09 +0000</pubDate>
		<dc:creator>Joseph Spiros</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://josephspiros.com/?p=178</guid>
		<description><![CDATA[On February 16th, I started my new job as Web Developer in the Oberlin College Office of Communications. The only position of its kind in the office, I am charged with maintaining and extending the CMS used by their new website, and providing the benefits of my experience in the form of suggestions and proposals [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_176" class="wp-caption alignright" style="width: 122px"><a href="http://josephspiros.com/wp-content/uploads/2009/02/workdesk-day3.jpg"><img class="size-thumbnail wp-image-176" title="My desk at work" src="http://josephspiros.com/wp-content/uploads/2009/02/workdesk-day3-112x150.jpg" alt="My desk at work" width="112" height="150" /></a><p class="wp-caption-text">My desk at work</p></div>
<p>On February 16th, I started my new job as Web Developer in the Oberlin College Office of Communications. The only position of its kind in the office, I am charged with maintaining and extending the CMS used by their <a href="http://new.oberlin.edu/">new website</a>, and providing the benefits of my experience in the form of suggestions and proposals in related technical matters.</p>
<p>This being my first proper &#8220;office job&#8221;, wherein I physically work in a shared location with my co-workers, has provided me with an interesting new experience in which I&#8217;m learning and socializing daily. I believe I&#8217;ve adapted smoothly, and I now find the change of pace considerably enjoyable. Although the bureaucratic protocol of the office environment leaves much to be desired, my co-workers are good people, and the knowledge I bring to my position seems well-suited to affecting positive change. <span id="more-178"></span></p>
<div id="attachment_177" class="wp-caption alignleft" style="width: 160px"><a href="http://josephspiros.com/wp-content/uploads/2009/02/workdesktop-day1.jpg"><img class="size-thumbnail wp-image-177" title="My desktop at work" src="http://josephspiros.com/wp-content/uploads/2009/02/workdesktop-day1-150x93.jpg" alt="My desktop at work" width="150" height="93" /></a><p class="wp-caption-text">My desktop at work</p></div>
<p>My one major workflow problem regards my now having two primary desktop computers: one at home, and one at work. Due to the lack of a satisfactory solution for synchronizing my data between the two, I&#8217;m currently remoting my home desktop on my work computer for things that are primarily stored on my home computer. It&#8217;s not the most elegant solution, so I hope to come up with something better soon. Maybe Haven?</p>
]]></content:encoded>
			<wfw:commentRss>http://josephspiros.com/2009/03/06/my-new-oberlin-college-job/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Haven Fundamentals Part Two</title>
		<link>http://josephspiros.com/2009/02/05/haven-fundamentals-part-two</link>
		<comments>http://josephspiros.com/2009/02/05/haven-fundamentals-part-two#comments</comments>
		<pubDate>Fri, 06 Feb 2009 02:56:40 +0000</pubDate>
		<dc:creator>Joseph Spiros</dc:creator>
				<category><![CDATA[Haven]]></category>

		<guid isPermaLink="false">http://josephspiros.com/?p=140</guid>
		<description><![CDATA[Haven consists of a daemon (referred to as havend) and a library for communicating with that daemon (referred to as libhaven). Individual computers will run a single instance of havend, and any other software (referred to as client software) running on those computers which requires access to the database utilizes the libhaven library to communicate [...]]]></description>
			<content:encoded><![CDATA[<p>Haven consists of a daemon (referred to as havend) and a library for communicating with that daemon (referred to as libhaven). Individual computers will run a single instance of havend, and any other software (referred to as client software) running on those computers which requires access to the database utilizes the libhaven library to communicate with the local instance of havend.<span id="more-140"></span></p>
<h3>havend</h3>
<p>havend instances manage a local database of objects, and connect to (and are connected to by) havend instances on other computers. When a libhaven client, or a remote havend instance, requests an object from the local havend instance, that instance first checks its local database, and returns any match. If it does not find any matches, or if the request was not by UUID but by a key/value query, it forwards the query on to the other havend instances known to it. It determines what havend instances are known to it by introspecting its own local database for objects that specify an appropriate reference to another havend (i.e., IP address and port). havend instances can be externally (that is, external to its introspection) configured to automatically download references from remote havend instances that connect to it, only allow connections from remote havend instances for which it has a reference, and only consider references that are signed by a particular private key. While this does allow the creation of private Haven databases with certain configurations, unconfigured havend instances will contribute to the public database.</p>
<p>When a request is made for an object that does not exist in the local havend instance&#8217;s database, and a remote havend instance provides it, the local havend instance will copy it into its local database. Depending on external (again, external to introspection) configuration, the havend instance can have such &#8220;cached&#8221; objects expire to conserve local storage for locally-generated objects, or only expire after an alloted cache size has been exceeded. This way, oft-accessed objects are replicated on many nodes, and provides redundancy against individual havend instance failures and increased access speed for the whole database. When multiple remote havend instances are capable of providing an object, the local havend instance can request pieces from each one for distributed copying. Once copied, the local havend instance becomes a provider for similar requests by remote havend instances. In this, Haven effectively duplicates the function of BitTorrent.</p>
<h3>libhaven</h3>
<p>Internally, havend instances provide the notion of &#8220;published&#8221; objects to local clients. Published objects are objects that follow the rules, and are immutable upon UUID assignment. Published objects are visible to remote havend instances, and contribute to the database. Unpublished objects do have UUIDs, but they are mutable prior to being published. The unpublished object space is provided as a &#8220;testing ground&#8221; for data structuring and relationship establishment prior to insertion into the database, and is only accessible by local libhaven clients.  Unpublished objects can be long lived, in which case their unpublished status reflects their use as a private data store. Unpublished objects can still reference published objects, and other unpublished objects, and generally appear identical to published objects.</p>
<p>libhaven provides clients with APIs for finding and accessing objects, monitoring havend-to-havend copy progress, and editing unpublished objects. libhaven provides higher-level acknowledgement of pedigree objects, and can be provided with cryptographic information such as public and private keys to automate the creation of signature objects</p>
<p>It is encouraged that libhaven be wrapped in the creation of other libraries that provide higher-level support for specific data storage needs. As an example, I plan to wrap libhaven to provide an interface to standard hierarchical filesystem calls, so that applications designed around the hierarchical filesystem metaphor can work with objects in the Haven database.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephspiros.com/2009/02/05/haven-fundamentals-part-two/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haven Fundamentals Part One</title>
		<link>http://josephspiros.com/2009/02/05/haven-fundamentals-part-one</link>
		<comments>http://josephspiros.com/2009/02/05/haven-fundamentals-part-one#comments</comments>
		<pubDate>Fri, 06 Feb 2009 00:26:12 +0000</pubDate>
		<dc:creator>Joseph Spiros</dc:creator>
				<category><![CDATA[Haven]]></category>

		<guid isPermaLink="false">http://josephspiros.com/?p=124</guid>
		<description><![CDATA[At the lowest level, Haven utilizes a document-oriented, schema-less database. I&#8217;ll use the term &#8220;object&#8221; where other systems would use &#8220;document&#8221;, to avoid connotations of &#8220;document&#8221; that are not appropriate at such a low level. Objects have a UUID to define their identity, and an arbitrary number of key/value pairs as content. Key names are [...]]]></description>
			<content:encoded><![CDATA[<p>At the lowest level, Haven utilizes a document-oriented, schema-less database. I&#8217;ll use the term &#8220;object&#8221; where other systems would use &#8220;document&#8221;, to avoid connotations of &#8220;document&#8221; that are not appropriate at such a low level. Objects have a UUID to define their identity, and an arbitrary number of key/value pairs as content. Key names are informally standardized using <a href="http://en.wikipedia.org/wiki/Reverse-DNS">reverse-DNS</a> semantics. All objects, once assigned a UUID, are immutable. The immutability of objects referenced by a given UUID allows for the Haven database to be distributed over many, perhaps distant, computers. Ideally, there is only one Haven database (or, object namespace) for all eternity.<span id="more-124"></span></p>
<h3>Object references</h3>
<p>Objects can be referenced using a URL of the form:</p>
<blockquote><p>haven:<em>UUID</em>[?<em>key</em>=<em>value</em>][#<em>fragment-key</em>]</p></blockquote>
<p>If a query string is provided, with key=value pairs, it will be used to ensure the validity of the referenced object before being returned to the referencer. This will be most useful with cryptographic hashes, which while not necessarily stored as a part of the object will be provided by havend instances upon object requisition as part of the content.</p>
<p>If the fragment-key is provided, the reference will be to the value of the specified key within the object, rather than to the entire object. This is to provide Xanadu-style <a href="http://en.wikipedia.org/wiki/Transclusion">transclusion</a>.</p>
<h3>Object contents and semantics</h3>
<p>I will be referring to the immediate objects managed by the storage system as &#8220;core&#8221; objects, and standard relationships consisting of multiple core objects which provide higher-level features as &#8220;abstract&#8221; objects. The simplicity of the core object intends to allow for future migration to new, unforeseen usage semantics. Although I will be describing what I believe to be necessary abstract features to higher level clients, by keeping the definition of the core object simple features can change in the future in a reasonably automated fashion. All of the following abstract object features will use objects that at the very least use the &#8220;haven.class&#8221; key.</p>
<h4>Signed objects</h4>
<p>One step up from a core object is the abstract &#8220;signed object&#8221;. This consists of a primary core object that contains the data to be signed, and a secondary core object (with the haven.class key set to haven.signature) that contains a reference to the primary object, as well as a cryptographic signature of the primary object.</p>
<p>A benefit of this system versus a system wherein the signatures are included as a part of the objects themselves is that the authority of a given object&#8217;s content can be validated by multiple people, not just the creator, allowing for a distributed web-of-trust.</p>
<h4>Revisioned objects</h4>
<p>One step up from a core object, again, is the abstract &#8220;revisioned object&#8221;. This consists of two primary core objects, one representing the previous revision, and another representing the next revision, and one secondary object (with the haven.class key set to haven.pedigree) that contains appropriate references to both primaries.</p>
<p>The benefit of the pedigree being stored separately from the content of the revisions themselves is that the creator of an object has no absolute control over the history represented by the database. This avoids problems where the creator of an object makes a mistake about what prior object is appropriately the progenitor.</p>
<h4>Signed and revisioned objects</h4>
<p>Both signed and revisioned object semantics can be combined to provide signed and revisioned objects. In addition to both revisions being signed, the pedigree object is signed as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephspiros.com/2009/02/05/haven-fundamentals-part-one/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prelude to Haven</title>
		<link>http://josephspiros.com/2009/02/05/prelude-to-haven</link>
		<comments>http://josephspiros.com/2009/02/05/prelude-to-haven#comments</comments>
		<pubDate>Thu, 05 Feb 2009 22:21:04 +0000</pubDate>
		<dc:creator>Joseph Spiros</dc:creator>
				<category><![CDATA[Haven]]></category>

		<guid isPermaLink="false">http://josephspiros.com/?p=110</guid>
		<description><![CDATA[I often find myself thinking about how the next great computing environment should function. Although computer hardware has advanced considerably over time, the user-oriented software that allows us access to that hardware&#8217;s potential has been stuck. We&#8217;re constantly rehashing the same tired metaphors that were developed decades ago: keyboards, mice, windows, icons, files, applications, clients, [...]]]></description>
			<content:encoded><![CDATA[<p>I often find myself thinking about how the next great computing environment should function. Although computer hardware has advanced considerably over time, the user-oriented software that allows us access to that hardware&#8217;s potential has been stuck. We&#8217;re constantly rehashing the same tired metaphors that were developed decades ago: keyboards, mice, windows, icons, files, applications, clients, servers, users, passwords, and so on. A little more than a year ago, I started thinking about how the computers of the future should store and access data. After much refactoring of my ideas and their consequences, I have settled on a system that I call <strong>Haven</strong>, which I will be describing in this and later posts. This first post will talk about the sorts of problems that I have attempted to solve.<span id="more-110"></span></p>
<p>Most general purpose computers use the standard hierarchical filesystem model. This is the system you&#8217;re all undoubtedly familiar with, where you have directories (folders), which contain files and other directories. Files are individual containers of data, wherein the data is generally stored in a use-specific format. Having used computers for more than half my life, I have accumulated hundreds of thousands of files, in tens of thousands of directories, in many different formats, and I have found this model to be unsustainable.</p>
<h3>I hate files</h3>
<p>Filesystems, as a rule, do not impose any sort of structure on the data stored within files. They are &#8220;content agnostic&#8221;. Files are mere collections of bytes. Only applications/programs designed to interpret certain file formats can accurately represent the information stored within them. Due to this, the information can become inaccessible if you do not have such an application. Furthermore, depending on the application and how it utilizes files, a given file may contain multiple discrete pieces of information.</p>
<p>As an example, the music jukebox application iTunes works with audio files stored in your filesystem, each one representing a single piece of music. In order to allow the user to see &#8220;albums&#8221; or &#8220;artists&#8221; or &#8220;playlists&#8221; as conceptual entities, and search within them, iTunes also manages an &#8220;iTunes Library&#8221; file. The &#8220;iTunes Library&#8221; file contains a database which contains metadata about and references to the audio files. Although iTunes does have settings which the user can enable to have iTunes automatically store their audio files in a standard hierarchy (in which audio files are stored in directories named after their album, and the album directories are stored within directories named after their artist), if you cease using iTunes you lose access to a lot of the data that iTunes otherwise stores in its database. Your customized playlists, ratings, comments, and play counts are all stored within the &#8220;iTunes Library&#8221; file, and you must use iTunes to store and access that data.</p>
<p>Personally, I&#8217;ll often have a friend send me a piece of music. I keep all of my friends&#8217; biographical information managed with Mac OS X&#8217;s Address Book application. That application stores all of that information in a database file, similar to the &#8220;iTunes Library&#8221; file used by iTunes except designed for managing information about people rather than pieces of music. So, let&#8217;s say that when a friend sends me a piece of music, I&#8217;d like to have my computer remember that. How can this be done? Although iTunes knows about &#8220;tracks&#8221; and &#8220;albums&#8221; and &#8220;artists&#8221; and &#8220;playlists&#8221;, it knows nothing about ordinary &#8220;people&#8221;. Apple would have to give iTunes the ability to read my Address Book database so as to allow me to select someone from my Address Book as the &#8220;Source&#8221; of a given track. And, even if that ability was added to iTunes, if I were in the Address Book looking at my friend, it would be non-trivial for me to &#8220;ask&#8221; my computer for all pieces of music sent to me by that friend unless it, too, was granted the ability to read the iTunes Library file.</p>
<p>Of course, these are problems that appear with only two applications. What if I&#8217;m using Finder (Mac OS X&#8217;s file management application) to look at a particular audio file directly, rather than using iTunes, and have the same questions? More often than not, when I receive a piece of music from a friend, it is via e-mail or instant message, mediums which inherently contain identifying information about the person I&#8217;m corresponding with. Shouldn&#8217;t my computer be able to automatically create these relationships for me, without me having to even go into iTunes and specifying a &#8220;Source&#8221; of a particular track, even if iTunes otherwise supported that feature? Well, in order to do that, my e-mail or instant messaging application would need to know about the iTunes Library and Address Book database file formats, as well as the audio file itself. Furthermore, applications such as Address Book and iTunes generally assume that they are the &#8220;owners&#8221; of their respective databases, so if another application tried to directly access their database files to modify them, things could go wrong and you may end up losing your entire database due to an error.</p>
<p>Even worse, given that iTunes and Address Book (and even my instant messaging application, iChat) are proprietary, closed-source applications, there is no technical documentation available to programmers that defines the structure of their files. As a programmer, if I wanted to create my own application that works with any of the data managed by those applications, it would be very difficult. So, I am not only limited by what a given application allows me to do with my data, but I am also limited, in many cases, to using those applications forever. If I wanted to switch to another application, there is no guarantee that my data will migrate over, and I may effectively lose it. To me, this is <strong>wrong</strong>. It is <strong>my</strong> data and should not be under the effective control of the producers of the applications that I use to manage it.</p>
<h3>I hate hierarchies</h3>
<p>Even in cases when files do represent individual pieces of information, users are often left with the directory hierarchy system as their only tool with which to conceptually relate them. Directory hierarchies provide two concepts: the concept of directories and their ability to contain both files and other directories, and the concept of directory and file names. If you&#8217;re navigating through your filesystem trying to find something, you often have only its location in the hierarchy and its name to help you. This demands that you manage your filesystem carefully, to ensure that files are named and placed well enough so that you will be able to identify them later. And, depending on your usage, you may find that no one conceptual hierarchy fits all of your needs.</p>
<p>So, as an example, I enjoy writing essays. I&#8217;ll store those essays in a directory named after the context of my essay (e.g., Metaphysics, Politics, Sociology, Psychology, etc.), which are stored in a directory named &#8220;Essays&#8221;, which is stored in a directory named &#8220;Documents&#8221;. Now, I also enjoy working with others on projects, and I&#8217;ll create directories inside a directory named &#8220;Projects&#8221;, also stored in the directory named &#8220;Documents&#8221;, to represent each project. One project that I have ongoing with a friend of mine is related to some of the political essays I&#8217;ve written. Now, let&#8217;s say that I&#8217;m looking at the project&#8217;s directory, and I want to see that. Well, by default, I cannot. I need to remember that the essays are stored in a different hierarchy, with their own classification system. Most filesystems do support a &#8220;symbolic link&#8221;, or &#8220;alias&#8221;, or &#8220;shortcut&#8221; metaphor which allows you to put a reference to a file in multiple places, but the problem there is that the file itself still needs to be stored in an original location. If I write a political essay while working on the project, should I save it in the project&#8217;s directory, and then create a link to it in my &#8220;Essays&#8221; directory? Or should I do the reverse? Also, should I name it the same thing in both directories?</p>
<p>What about keeping track of who is contributing to a given project? If I&#8217;m working with my friend, and he sends me some files related to the project we&#8217;re working on, I&#8217;ll store them in that project&#8217;s directory. But how do I remember which files he worked on, and which ones I worked on? I wouldn&#8217;t want to accidentally create a link in my &#8220;Essays&#8221; directory to an essay my friend wrote, as the &#8220;Essays&#8221; directory is supposed to be for essays that I wrote. But then, what if I do want to start storing essays written by others on my computer? Should I create a new hierarchy? Should I modify my old one? What about the earlier example with Address Book? What if I want to select a file in the project&#8217;s directory and get to my friend&#8217;s telephone number so that I can call him and talk about it?</p>
<h3>What about sharing?</h3>
<p>So far, I&#8217;ve only described some problems that an individual might encounter when managing their own files on their own computer and keeping them, at best, personally meaningful and accessible. What about sharing? If I&#8217;m using a directory hierarchy to store my data in a way that I can understand, does that guarantee that it&#8217;s the most useful hierarchy for someone else? What if I want to share my essays with someone, but they&#8217;d prefer to see them in chronological order? What if I alone want to see them in chronological order, if only temporarily? What if I used an application that allowed me to embed graphics into my essays, but the person that I&#8217;m sending them to doesn&#8217;t have an application that can read the file format my essays are in? What if the person is blind, and none of the applications available that can decode the file format support screen reading? What if I send my friend&#8217;s essay to a third friend, and they want to call them and talk to them about it? Did whatever system I set up to remember that it was my friend&#8217;s essay translate to their computer, so that they can easily figure out who to call?</p>
<h3>Solving the problems</h3>
<p>These are the sorts of problems and questions that led to the design that I will be describing in future posts, the design I refer to as <strong>Haven</strong>. I believe that I&#8217;ve come up with something that takes the best from every system of data storage and access that I&#8217;ve encountered, and which not only solves all of the problems I have with the status quo of filesystems, but is also capable of improving many other concepts, such as e-mail, instant messages, and the world wide web. Stay tuned!</p>
]]></content:encoded>
			<wfw:commentRss>http://josephspiros.com/2009/02/05/prelude-to-haven/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A platform for technological and social innovation in the public sphere</title>
		<link>http://josephspiros.com/2008/11/22/a-platform-for-technological-and-social-innovation-in-the-public-sphere</link>
		<comments>http://josephspiros.com/2008/11/22/a-platform-for-technological-and-social-innovation-in-the-public-sphere#comments</comments>
		<pubDate>Sat, 22 Nov 2008 16:02:10 +0000</pubDate>
		<dc:creator>Joseph Spiros</dc:creator>
				<category><![CDATA[Curnon]]></category>

		<guid isPermaLink="false">http://josephspiros.com/words/?p=3</guid>
		<description><![CDATA[The modern implementation of capitalism, founded upon the none-the-less sacred principles of individual liberty, stifles the great innovation needed to transform our society into one that is sustainable for the foreseeable future.
Innovation is achieved by creative individuals, who almost always work as part of for-profit institutions to implement their innovations. These institutions have their own [...]]]></description>
			<content:encoded><![CDATA[<p>The modern implementation of capitalism, founded upon the none-the-less sacred principles of individual liberty, stifles the great innovation needed to transform our society into one that is sustainable for the foreseeable future.</p>
<p>Innovation is achieved by creative individuals, who almost always work as part of for-profit institutions to implement their innovations. These institutions have their own preservation and profits, and not the well-being of human society as a whole, as their motivation. However, I believe that most individuals are socially conscious, and that they work for these institutions not for the institution&#8217;s gain, but to fulfill their very basic needs to provide for themselves financially. This reveals a lack of options for these individuals to work in an environment which can provide for them, and allow them to provide their innovations directly for the public good.</p>
<p>Government has traditionally been seen as the platform upon which public works can be implemented. This is the basis for the political system known as socialism. Unfortunately, most socialistic governments have been incompatible with the basis for capitalism, individual liberty, as they are implemented with state-owned and controlled enterprises. Such governments only exist by essentially stealing from those they govern to obtain the financial and material support needed to implement their works. The result is that the creative individuals that are the true source of innovation in society are still stifled by the government&#8217;s need to sustain itself.</p>
<p>Proposed is an alternative, a practical system for achieving ends supportive of the public good, which is compatible with the capitalistic economy that predominates.<span id="more-3"></span></p>
<p>Why not form a non-profit institution dedicated to the implementation of innovations beneficial to the public, and the support of those creative individuals doing the innovating?</p>
<p>Such an institution could be financed completely voluntarily by society as a whole, via donations from conscientious individuals, and an endowment would be created for long-term stability. The intellectual products of this institution would be offered into the public domain, or under licensing terms similar to those used by open-source/free software projects. Physical products would be manufactured by for-profit entities in the relevant industries, but offered to the public at the cost of manufacturing and distribution, with no profit motive for the institution itself. Alternatively, the price of the products could be subtly increased, with any income being diverted to the institution&#8217;s endowment. Further financial surplus would allow for public information and educational campaigns, aimed at increasing the collective intelligence and wisdom of society as a whole.</p>
<p>Ideally, anyone with a good idea and the means to contribute to the implementation of that idea as an individual would be welcomed. Additionally, skilled professionals looking for work would be hired into the pool of individuals available to work on the institution&#8217;s public work projects. All workers in this institution would make a stable living, and work in an ad-hoc fashion on the various projects that they could contribute to. This financial stability would allow them the peace of mind necessary to intuit and implement the great innovations needed for the future of society, and as I believe this is the true calling of most anyone, there is no doubt that they would do the best that they are capable of.</p>
<p>The organization and long-term plans of this institution would be transparent and open to the public. The leadership of the institution as a whole would likely be accomplished by a subset of the worker pool being elected democratically by the entire pool, preferably using a <a href="http://en.wikipedia.org/wiki/Schulze_method">Schulze method</a> voting system, to a board of governors who would then decide on future projects for the length of their term. This is the &#8220;representative democracy&#8221; model. Alternatively, the projects themselves could be decided by the worker pool in a similar process, a &#8220;direct democracy&#8221; model. Either way, a non-binding public polling system would allow the public to contribute to the decision making process in an advisory role.</p>
<p>Projects would be managed by a task force, the subset of the worker pool that primarily contribute to that particular project. If help is needed by a task force from an outside worker in the pool, the task force can nominate that worker for inclusion in the project, or request that they work on a particular individually-manageable subtask. Projects would be formally described in a mission statement that clearly outlines the goals and purpose of the project, the incidental auxiliary products of the project, and the human, material, and time resources believed to be required for implementation (i.e., a budget). Conflicts between projects and task forces due to a contradiction or overlap of goals or material requirements would be handled by the aforementioned institution-wide leadership system. Within a task force, irreconcilable differences between workers would be handled similarly, though their management would be otherwise fairly autonomous with regards to the institution as a whole, and decided upon by the task force itself. This way, larger projects can implement any larger formal systems as necessary, but smaller projects will be free to be developed by smaller task forces more intimately.</p>
<p>So, what is needed for this institution to become a productive reality? Well, workers, the money to support them, and an institutional identity.</p>
<p><strong>Enter <a href="http://curnon.org/">Curnon</a>.</strong></p>
<p>In attempting to realize the idea of this institution, we have chosen to start a public discussion around our website, <a href="http://curnon.org/">Curnon</a>. The name Curnon is derived from the Latin for &#8220;Why not?&#8221;, and we believe this accurately reflects our attitude. We are open to any and all suggestions, including rebuttals to our proposals. And, of course, we are open to donations, and notices of intent from people who would be willing to join us. Everything is on the table. Our all-encompassing goal is to make the world a better place for everyone living in it, and to do so by the most efficient and appropriate means. What those means are is what this platform will help us realize.</p>
]]></content:encoded>
			<wfw:commentRss>http://josephspiros.com/2008/11/22/a-platform-for-technological-and-social-innovation-in-the-public-sphere/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
