<?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/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Can Has Biz? &#187; mindlace</title>
	<atom:link href="http://canhas.biz/author/mindlace/feed/" rel="self" type="application/rss+xml" />
	<link>http://canhas.biz</link>
	<description>internets robots and games oh my</description>
	<lastBuildDate>Sat, 26 Jun 2010 14:13:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<!-- podcast_generator="podPress/8.8" - maintenance_release="8.8.4" -->
		<copyright>2006-2007 </copyright>
		<managingEditor>info@canhas.biz (Can Has Biz?)</managingEditor>
		<webMaster>info@canhas.biz (Can Has Biz?)</webMaster>
		<category>posts</category>
		<itunes:keywords></itunes:keywords>
		<itunes:subtitle></itunes:subtitle>
		<itunes:summary>Just another WordPress weblog</itunes:summary>
		<itunes:author>Can Has Biz?</itunes:author>
		<itunes:category text="Society &amp; Culture"/>
		<itunes:owner>
			<itunes:name>Can Has Biz?</itunes:name>
			<itunes:email>info@canhas.biz</itunes:email>
		</itunes:owner>
		<itunes:block>No</itunes:block>
		<itunes:explicit>no</itunes:explicit>
		<itunes:image href="http://canhas.biz/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<image>
			<url>http://canhas.biz/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
			<title>Can Has Biz?</title>
			<link>http://canhas.biz</link>
			<width>144</width>
			<height>144</height>
		</image>
		<item>
		<title>The Economics of iOS software</title>
		<link>http://canhas.biz/2010/06/26/the-economics-of-ios-software/</link>
		<comments>http://canhas.biz/2010/06/26/the-economics-of-ios-software/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 14:11:08 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=75</guid>
		<description><![CDATA[There have been a number of posts recently in the iOS (née iPhone) development community about the shocking fact that app-store purchases follow a Pareto distribution. I assume this is shocking because developers don&#8217;t study economics, but I guess I had assumed that everyone in the internets had at least read shirky&#8217;s analysis of the [...]]]></description>
			<content:encoded><![CDATA[<p>There have been a number of posts recently in the iOS (née iPhone) development community about the shocking fact that app-store purchases follow a <a href="http://en.wikipedia.org/wiki/Pareto_distribution">Pareto distribution</a>. I assume this is shocking because developers don&#8217;t study economics, but I guess I had assumed that everyone in the internets had at least read <a title="Power Laws, Weblogs, and Inequality" href="http://www.shirky.com/writings/powerlaw_weblog.html">shirky&#8217;s analysis of the same phenomena</a> as regards weblog popularity.</p>
<p>From the perspective of the prospective iOS developer, the relevant question is: is it possible to make a living in the iOS space?</p>
<h2>Sturgeon&#8217;s Law: 90% of everything is crud.</h2>
<p>The first fallacy in analysis of the iOS market is that people take the market gross and divide by the number of apps and say &#8220;The average app makes $1,634 a year!&#8221; (or something to that effect).  This is not meaningful for an app developer, because it both includes the &#8220;superstars&#8221; that are making millions in a day, and the whole of the long tail.</p>
<p>So more intelligent analysts tend to cut off the top 1% or so. Unfortunately, this just makes the analysis worse. However, there is an additional fact that presents a more reasonable picture, and that is that 90% of everything is crud.</p>
<p>Now if we assume that iOS consumers are providing a loosely-coupled assessment of the cruddiness of a piece of software when they make a purchase, the iOS market starts to look a lot more reasonable.</p>
<p>In the simplest case, where the frequency of purchase is linearly associated with the cruddiness of the software, we can discard the bottom 90% of the app-store purchases from consideration. After all, you&#8217;re not going to make cruddy software, right? <img src='http://canhas.biz/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Now the graph starts to look a little better. We&#8217;ve discarded the top 1% of the sales chart and the bottom 90% of the sales chart.</p>
<p>The graph that results is a much more linear graph, with the top app in this zone selling a few thousand a day and the bottom selling several hundred to a thousand a day.  You can jigger the numbers to suit your preferences- for example, you could decide that some significant percentage of people have poor taste or don&#8217;t recognize quality &#8211; but most of the variants I came up with still amount to a survivable to comfortable revenue stream for a 3-5 person company.</p>
<p>This analysis is relatively simplistic. More advanced assessments would be based on revenue-per-app as opposed to sales-per-app.</p>
<p>Of course, you still have to make an app that isn&#8217;t judged as &#8220;crud&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2010/06/26/the-economics-of-ios-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jquery.poll &#8211; a periodic polling plugin for jquery.</title>
		<link>http://canhas.biz/2010/01/10/jquery-poll/</link>
		<comments>http://canhas.biz/2010/01/10/jquery-poll/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 19:10:45 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=45</guid>
		<description><![CDATA[I needed to poll the server for another project we&#8217;re working on (to be announced soon). I started off using the PeriodicalUpdater from enfranchised mind, but I ran into some limitations that were problematic enough that I implemented a new version from scratch. The problem that made me re-implement was that I was polling for [...]]]></description>
			<content:encoded><![CDATA[<p>I needed to poll the server for another project we&#8217;re working on (to be announced soon). I started off using the <a href="http://enfranchisedmind.com/blog/posts/jquery-periodicalupdater-ajax-polling/">PeriodicalUpdater from enfranchised mind</a>, but I ran into some limitations that were problematic enough that I implemented a new version from scratch.</p>
<p>The problem that made me re-implement was that I was polling for new posts, and if the user made a new post I wanted the wait between poll attempts to go back to the minimum.</p>
<p>The main improvements of this version over the enfranchised mind version are:</p>
<ul>
<li>Multiple active polls</li>
<li>Ability to modify the ajax settings after the poll has started</li>
<li>Can make a one-time change to the current polling interval.</li>
</ul>
<p>You can download or contribute from the <a href="https://launchpad.net/jquery.poll">project page</a>.</p>
<h4>Usage:</h4>
<pre class="brush:javascript">//All poll options are optional.
var pollopts = {
  //A random name will be assigned if you don't assign one
  name: 'name-of-poll',
  //minimum wait between calls in msec
  min_wait: 6000, // default: 1000
  //maximum wait between calls in msec
  max_wait: 12000, // default: 30000
  // amount to multiply the wait by if the data is unchanged.
  wait_multiplier: 4, // default: 2
  // log poll events to console.log
  doLog: false, // default true
  // A function that overrides the default calculation
  // for how to change the wait if nothing has changed.
  // Should return an integer
  adjustWait: function(xhr, textStatus, current_wait) { ... }, .
};
// simplest way to start polling.
// ajaxopts are defined as per
// http://docs.jquery.com/Ajax/jQuery.ajax#toptions
var mypoll = $.poll(ajaxopts);
// start polling with custom poll options
var mypoll = $.poll(ajaxopts,pollopts);
// get a poll object, but don't start polling
var mypoll = $.poll(ajaxopts,pollopts,true);
// can also do $.poll(ajaxopts,null,true);
// stop the poll
mypoll.stop = true;
// make a one-time change to the poll wait interval
mypoll.setWait(500);
// change the ajax options for the live poll
mypoll.setAjaxOptions(ajaxopts);</pre>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2010/01/10/jquery-poll/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>who can has i be?</title>
		<link>http://canhas.biz/2009/11/10/who-can-has-i-be/</link>
		<comments>http://canhas.biz/2009/11/10/who-can-has-i-be/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 08:37:30 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[It Together]]></category>
		<category><![CDATA[human interaction]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=39</guid>
		<description><![CDATA[Every multi-user piece of software has an obligation to represent its users in some fashion; to provide for them a digital identity. Furthermore, as the de facto global communication system, the internet ultimately is the system that must represent everyone. The present internet does not provide an identity system that can represent everyone&#8217;s identity. To [...]]]></description>
			<content:encoded><![CDATA[<p>Every multi-user piece of software has an obligation to represent its users in some fashion; to provide for them a digital identity. Furthermore, as the de facto global communication system, the internet ultimately is the system that must represent everyone. The present internet does not provide an identity system that can represent everyone&#8217;s identity. To try to uncover one, this essay examines the extant notions of identity, and outlines a the characteristics a genuinely global identity system would require.</p>
<p><span id="more-39"></span></p>
<h3>Social identity</h3>
<p>Social identity &#8211; the kind of identity that exists between people independent of any technology &#8211; is the bedrock of &#8216;who we are&#8217; to each other.  Social identity is clearly an innate, evolved system; we can tell this because it is clear that social identity exists in other social animals, and is absent from asocial animals. Humans have a fairly elaborate system of identity that is strongly cultural, although it generally has significant biological components; gender, heredity, and genes (i.e. beauty) are some examples.</p>
<p>Another indicator of the &#8220;built-in&#8221; nature of our social ability is the fact that is constrained. Estimates vary, but most studies suggest that we can maintain a (self-constructed) awareness of the relationships between a few hundred other social identities, and even then the knowledge is contextual and thus we cannot be aware of the full set of relationships, but rather given a particular identity we can be aware of its relations to others.</p>
<p>There is quite a lot of scope for disagreement with this estimate, but unless this estimate is off by more than five orders of magnitude, it is impossible for an individual human to have a model of all the relationships between all humans presently on earth. It seems reasonable to suggest that even on the scale of most present human settlements, most individuals have no awareness of all the identities in their settlement. This suggests that a global system of identity would need to provide technological assistance to people in order to allow them to assess relationships at larger scales.</p>
<p>One thing that is consistent across all cultural notions of identity is is that they are not unique, persistent, or immutable. In a certain social context, a person may be the &#8216;life of the party&#8217;; in another the &#8216;diligent worker&#8217;, in yet another the &#8216;enemy&#8217;. Social identities are fabricated from within the context of social interaction, and as such they have a scope and persistence that is inextricably associated with the participants in and circumstances of any particular social process. A successful system of identity must take these characteristics into account.</p>
<h3>Supersocial identity and the rise of the Individual</h3>
<p>Human societies long ago outstripped the capacity of individual humans to hold them in their heads. As a result, the social organizations that formed around large groupings of people developed technological extensions of identity to allow them to work on a larger scale.</p>
<p>For thousands of years, it was sufficient for societies to reify social identity as distinct from digital identity. A simple encapsulation of this type of identity is the expression &#8220;The king is dead: Long live the king.&#8221;  Caste, class, and other &#8216;type&#8217; identities were used by to reduce the number and complexity of social relationships that had to be considered when &#8216;innate&#8217; social ability was insufficient. A peasant and lord may have never met before, but when they do their reified social identity provides them a framework of interaction that doesn&#8217;t depend on their knowledge of each other.</p>
<p>Despite these reified social identities, the &#8216;individual&#8217; identity remained essentially the same as it had for the prior five million years; determined by actual interactions with specific other individuals. A detailed review of the emergence of &#8220;technologies of individuality&#8221; is beyond the scope of this essay, but for our purposes we can consider them to have begun with the census. The example familiar to english speakers is the Domesday Book, which contains the results of a survey commissioned by William the Conqueror to figure out exactly what he had conquered. In England, at least, this was the first time that many people acquired a second (last) name, so that they could be differentiated from others in the survey. These surveys eventually led to systematic registries of individuals, independent of their participation in significant events (birth, death, marriage, etc.) Only then did the average person begin to acquire an &#8220;identity&#8221; at the superorganization level.</p>
<p>These individual registries became the bedrock of greater participation of individuals in the supersociety; with these identities in society, individuals rather than families or other associations could own property, have formal relationships through written contracts, and the like. Ultimately they established a supersocial notion of a human as possessing a unique, persistent, and immutable identity that is the same in all contexts.</p>
<p>At the same time, these systems of individualization were applied to reified social identities. The primary example of this is corporate charters; in the beginning, someone with strong type identity &#8211; usually the king or queen &#8211; created an individual identity and granted it some of her characteristics. In english, at least, the basic words we use illuminate this origin: an organization is &#8216;incorporated&#8217;, that is, given a body and made real. Today, corporations have a supersocial identity that is stronger than that of actual humans.</p>
<p>The pre-internet supersocial identity helped humans cooperate on scales heretofore unseen, and simultaneously created a new class of individual &#8211; the corporation. It also enabled dehumanization on a scale never before seen, finding its nadir in mass war and systematic genocide.</p>
<h3>Digital identity</h3>
<p>The digital world has largely failed to provide a substantial innovation on either social identity or supersocial identity. For the most part, distinguished strings are the extent of identity. An email address has served as the defacto &#8216;unique identifier&#8217; for internet users &#8211; a (username)@(domainname) tuple &#8211; and some more advanced internet users have associated themselves with a domain under their control. The mass proliferation of email accounts and the rise of popularity of the social web has pushed identity closer towards being associated with usernames at particular sites (e.g. facebook) and the data associated with that name.</p>
<p>A reason for the success of this relatively simplistic approach is that it maintains the properties of social identity: its meaning is constructed by those who interact with it, and it may or may not have associations with other digital, social, and supersocial identities.</p>
<p>These identities in some ways are more liberating than standard social identities, because the individuals or groups creating them have much more control over what they elect to disclose about their identity, and the digital identity need not be associated with the supersocial individual.  However, much like  primary social interaction contains many &#8216;involuntary tells&#8217; &#8211; expression, clothing, accent, etc &#8211; that allow participants to glean information about each other even if the other does not wish to share it, the name/data identities tend to have digital &#8216;involuntary tells&#8217; that allow interested third parties to make inferences about the identity. These tells include unencrypted communications, visible ip addresses, domain name registrations, access patterns, and the like.</p>
<p>Just like the social world, the relationships between an individual&#8217;s identities can be explicit (use of your legal name on a website, explicit links to your accounts on other sites) or implicit (google for a username).  However, in social life there is always the explicit association of your body with particular identities, which serves as the ultimate, or primary association between an individual and their identity. Even modern supersocial individualization depends on biometric data, though corporations are more free from this constraint than people.</p>
<p>The association of identity and body is is hard to fake in the real world &#8211; disguises and plastic surgery are some examples of attempts to do so. The primary method for divorcing body and identity, throughout time, has been to simply re-associate one&#8217;s body with a new collection of people, so that a new identity may form. In contrast, name/data identities are extremely easy to disturb in ways that are more difficult for social identities.</p>
<p>One can create accounts on websites with the same username in use elsewhere on the internet, deliberately or involuntarily, and thus confuse the identity for any third party. This confuses the association of identity with username, and the methods for disambiguating them are more challenging than those for confused identity in the real world. Usurpation of identity is also easier in the digital world than the real world; if someone&#8217;s credentials are hacked, it is extremely difficult to differentiate the compromised identity from the &#8216;real&#8217; one.</p>
<p>So the increased social freedom of constructible identity comes, in the current implementation, with the increased vulnerability to usurpation and pollution. A better system of identity should prevent allow disambiguation, and provide methods at least as robust as those present in human society for detecting forgery and usurpation.</p>
<h3>The way forward</h3>
<p>Cryptographic keys have existed as a stronger form of identity for some time. The limited computational capacities of the early internet and the peculiar ideology of the Cold War kept cryptography out of the early implementation of the internet, which severely constrained the ability of technology to aid identity. For a variety of social reasons beyond the scope of this essay, when cryptography did start to be used widely on the internet it was highly centralized and used primarily for securing specific communications.</p>
<p>Cryptography can help identity in several ways:</p>
<ul>
<li>It can be used to ensure that you are engaging in communication with the identity you mean to communicate, and not another.</li>
<li>Digital artifacts can be proven to have been signed by a particular identity.</li>
<li>Identities can be proven to be distinct.</li>
</ul>
<p>The common internet user only encounters cryptographic identities during secure web use, where an asymmetrical cipher is used to allow the communication to be secure. The keys used in this system are generated via a hierarchical system, where a small number of &#8216;absolutely trusted&#8217; keys are used to sign, or validate, keys used elsewhere. Despite efforts to make these keys serve as a form of identity, the fact that the absolute trust pool is maintained by technology implementers means that the identity granted has never taken on much social or supersocial relevance.</p>
<h3>Early adopters</h3>
<p>The people that develop the internet were the first to require a stronger form of identity, and sufficiently motivated to implement one and participate in sometimes-difficult rituals to maintain them. In the open-source world, this has taken the form of cryptographic keys, generally associated with tokens relevant to supersocial identity (i.e. real name) as well as some &#8216;unique&#8217; string (email address). Because no central signing authority is trusted, individuals sign each other&#8217;s key to indicate validation of their identity. The social practice is to engage in these key-signing activities only during an in-person meeting. In this way, the identity of the key is associated with the corporeal identity of the user.</p>
<p>This practice works well, and has allowed distributed, non-hierarchical cooperative behaviour on a scale previously unseen. Its current limitations are its requirements for a moderate to high degree of technical skill, and the lack of internet-scale standards and implementations for perusing the webs of trust the users have generated.</p>
<h3>A graduated approach</h3>
<p>A way forward would be to associate keys with all actors on the internet, be they software, organizations, corporations or people. Since &#8220;having a key&#8221; is a necessary prerequisite to any more advanced identity use, the keys must be generated on-demand, and with no validation requirements.</p>
<p>So everyone would have keys, everyone could sign things, and everyone could encrypt things.</p>
<p>The in-person key-signing of early adopters has an important purpose, however: it allows you to definitely associate an identity token &#8211; the key &#8211; with an actual identity &#8211; a person you met at a gathering.  By inference, it allows others to also infer identity, even for keys operated by people they have never met, because they know the identity of one or more signatories of a given key.</p>
<p>Therefore the replacement system must have a way of taking these profligately distributed keys and associating them more strongly with an identity.</p>
<h3>Automated key association</h3>
<p>There are some automated mechanisms for strengthening the identity associated with a key. Some of them significantly impair the multiplicitous, ephemeral, and mutable properties of normal social identity, and so have limited application to keys we wish to associate with human identities.</p>
<p>The primary mechanism for identity strengthening would be a globally accessible system for recording the activities associated with a key. That is, when a key is used for a communication tranasaction, or signs a file, that event could be recorded. The set of events associated with a particular key provide an identity that is substantially more substantive, and in many cases quite sufficient.  Care must be taken when deciding which properties of events should be included in the record, as excessive detail would make it easier to determine ways to usurp or subvert the keys.  For example, this suggests that transport layer details (ip address, mac address, OS, software version, etc) should not be included in any record.</p>
<p>For software identities &#8211; keys used to identify a particular instance of running software &#8211; recording how well particular keys conformed to accepted interactions would provide sufficient information to determine whether a given piece of software &#8216;should&#8217; be trusted to perform specific actions.</p>
<h3>Generating identity through social interaction</h3>
<p>For actual humans, the situation is more complex. Meeting the requirements of disambiguation and usurpation prevention while simultaneously preserving the ability for social identities to be mutable, ephemeral, and multiplicitous is an interesting challenge. The early adopters of key-based digital identity have not tried to address these use cases at all. In particular, the focus has been on identifying an original <strong>uniquely</strong>, and while there exists support for changing keys, this support exists to maintain an immutable identity in the face of key loss or compromise.</p>
<p>Therefore, a new approach is required. If we consider what remains of identity when we strip it of type &#8211; class, race, creed, etc &#8211; it seems what remains is a pattern of interactions between people.  The simplest form of identity interaction is generally a declaration of an identifier; &#8220;Hello, my name is Ethan. What&#8217;s yours?&#8221;. The voluntary association of a social identifier (name) with the physical identifier of one&#8217;s body is the beginning of creating a social identity within a group.</p>
<p>Attestations &#8211; written, signed, and countersigned, then stored in a public repository &#8211; are widely considered to be ways to formally assert statements about oneself. One could argue that all contracts &#8211; though they are usually not exclusively descriptive of the signers &#8211; contain some level of identity assertion.</p>
<p>Therefore, an improved system could differentiate the quality of a human identity by specifying particular declarations to be made using a key. A structured textual statement that certain pieces of information (a name, a hobby, whatever) are associated with this key would be the most basic form of declaration. An audio recording of the key&#8217;s owner, declaring that they are the owner of the key, could be another. A video could be a third.</p>
<p>All of these attestations create the risk of involuntarily associating an individual with a key immutably. Therefore the system must provide a way for these attestations to be made and verified without allowing global access to the attestations.</p>
<p>This system would also support, at each level, signing of these attestations by others. This would provide a similar purpose to the in-person key signings, but would allow the development of the web of trust independent of the capacity of the participants to meet physically.</p>
<h3>Associating identity with social groups.</h3>
<p>Social groups in human societies are fluid; they form without notice or even, perhaps, the awareness of their participants. There are also relatively rigid, long lasting social groupings. Any better identity system should support these disparate groups.</p>
<p>A way to address fluid social groupings is to treat any set of mutually co-signing identities as having an identity, and thus generate an appropriate key for that group. All members would be given the ability to act using that key.</p>
<p>Since this implies creating new keys any time set membership changes (or at least every time set membership decreases), this would not address the need for persistent social groups who retain identity in the face of membership changes.</p>
<p>This, like the &#8216;level&#8217; of identity outlined for individuals above, should be a graduated thing. The first step would be to name a given set-key; this would allow its identity to persist in the face of key changes.</p>
<p>For whatever reason, many existing social organizations choose to limit the number of members who are allowed to act as the organization, and further to constrain the extent, or the area, in which a member may act as the organization. To support this kind of organization, the system either must allow all-party keys to be &#8216;downgraded&#8217; to a key where only a subset of the members have access to the private key, or it must allow the creation of such keys &#8216;de novo&#8217;. A later post will discuss ways to enable this feature.</p>
<p>Since group keys are identical to individual keys in functionality, &#8216;specialized keys&#8217; for an organization may be generated simply by associating different groups with each other &#8211; that is, organizational keys can sign each other to cause a superorganization to exist, and optionally name them.</p>
<h3>Further steps</h3>
<p>It seems clear that public key cryptography offers the technological basis for identity. By automatically and dynamically creating individual and group identifiers we support the fluidity of social identity, and through signed attestations and keys we can create webs of trust.</p>
<p>In later posts we will discuss the implementation details of the identity system outlined above.</p>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2009/11/10/who-can-has-i-be/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Version control in offline mode.</title>
		<link>http://canhas.biz/2009/10/27/version-control-in-offline-mode/</link>
		<comments>http://canhas.biz/2009/10/27/version-control-in-offline-mode/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 07:50:43 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[It Together]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=34</guid>
		<description><![CDATA[Having successfully built a pyxpcom xulrunner, I am in doubt whether it&#8217;s the way to proceed. it&#8217;s heavy &#8211; like 50mb! writing for it is not like writing a web app, though it has similarities. Basically I think it won&#8217;t help us much with the &#8220;degraded&#8221; scenario &#8211; where someone has &#8220;only&#8221; a browser to [...]]]></description>
			<content:encoded><![CDATA[<p>Having successfully built a pyxpcom xulrunner, I am in doubt whether it&#8217;s the way to proceed.</p>
<ul>
<li>it&#8217;s heavy &#8211; like 50mb!</li>
<li>writing for it is not like writing a web app, though it has similarities.</li>
</ul>
<p>Basically I think it won&#8217;t help us much with the &#8220;degraded&#8221; scenario &#8211; where someone has &#8220;only&#8221; a browser to interact with the system &#8211; and that&#8217;s kind of a non-starter.</p>
<p>So I started to think about what we *really* need on the local system.</p>
<p>Basically the only issue with being just a web app is that we need access to the local version control install. For the most part, this could be addressed by having &#8220;whatever we install locally&#8221; be itself a server. That seems like a good strategy, because then the remote/local difference is pretty arbitrary.</p>
<p>The user experience issue would be how we interact with external editors.  The only way around the security restrictions I see is for the local server to actually do the open-file-in-editor, and the web app just issues said instruction to the local app.</p>
<p>There are a bunch of value-adds to this &#8211; the &#8220;server&#8221; could be any of these &#8220;vcs in a bottle&#8221; systems that is nearby, while the &#8220;client&#8221; could be your phone or whatever.</p>
<p>So I think this is the approach we&#8217;ll take.</p>
<p>I&#8217;m now investigating <a href="http://mercurial.selenic.com/wiki/Mercurial">mercurial</a> instead of git (<a href="http://mercurial.berkwood.com/">windows/mac installers are available</a>) because it plays nicer with the use-cases I&#8217;m interested in supporting and it has more of an &#8220;API&#8221; &#8211; plus it&#8217;s in python so I can grok it.</p>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2009/10/27/version-control-in-offline-mode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>what&#8217;s the difference?</title>
		<link>http://canhas.biz/2009/10/22/whats-the-difference/</link>
		<comments>http://canhas.biz/2009/10/22/whats-the-difference/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 06:16:27 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[It Together]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=27</guid>
		<description><![CDATA[One of the problems with using a real VCS for normal-human-being content management is that nobody understands diffs. Even if they do, the standard line-based differencing algorithms are useless or problematic, even for diff-comprehending folk, for most of the valuable use cases. Here I do a brief survey of the options for these use cases. [...]]]></description>
			<content:encoded><![CDATA[<p>One of the problems with using a real VCS for normal-human-being content management is that nobody understands diffs. Even if they do, the standard line-based differencing algorithms are useless or problematic, even for diff-comprehending folk, for most of the valuable use cases. Here I do a brief survey of the options for these use cases.</p>
<ul>
<li>XML/XHTML differencing. <a href="http://code.google.com/p/daisydiff/">DaisyDiff</a> seems to address this problem. XML dialects rule structured documents these days, but line-comparison gives you bad results and often malformed documents. This <a href="http://www.scribd.com/doc/14482474/XML-diff-survey">good survey of XML differencing</a> got me to DaisyDiff, and it links to other relevant issues.</li>
<li>Image differencing. <a href="http://sourceforge.net/projects/pdiff/">Perceptual Diff</a> compares raster images. <a href="http://www.phpied.com/image-diff/">Image diff</a> is a nicely simple php image differencer. I can find nothing on higher-level image raster differencing ( comparing layers and whatnot ) and nothing at all about comparing vector images (though SVG might be amenable to xml differencing).</li>
<li>Video differencing. Not much here. Some papers, no open-source software I can find (not a surprise, as most of what I can find is related to digital restriction management and copyright enforcement). Current takeaway is if the video collection isn&#8217;t in the same format, you&#8217;ve not a prayer.
<ul>
<li>A paper on <a href="http://www.fxpal.com/publications/FXPAL-PR-01-020.pdf">scene boundary detection</a> presents some algorithmic method for finding scene ends in a video, which could be used as a starting point.</li>
<li>More papers I haven&#8217;t read through yet:
<ul>
<li><a href="http://portal.acm.org/citation.cfm?id=312268&amp;dl=GUIDE&amp;coll=GUIDE&amp;CFID=58995219&amp;CFTOKEN=20185910">Identifying distinctive subsequences in multivariate time series by clustering</a></li>
<li><a href="http://portal.acm.org/citation.cfm?id=1026711.1026721&amp;coll=ACM&amp;dl=ACM&amp;CFID=1082542&amp;CFTOKEN=70674382">Clip-based similarity measure for hierarchical video retrieval</a></li>
</ul>
</li>
</ul>
</li>
<li>PDF differencing. Adobe <a href="http://www.adobe.com/products/acrobatproextended/features/?chapter=0&amp;subchapter=7">offers pdf differencing</a>. Not clear if it can readily be used in a server environment. Other tools I could find were windows only, and not geared towards generating the differences as a product itself.</li>
<li>&#8220;Office document&#8221; differencing. There are some <a href="http://people.warp.es/~xtor/blog/?p=166">scripts for open-office doc differencing</a>. I suspect that using a good xml differ would be sufficient.</li>
</ul>
<p>General differencing</p>
<ul>
<li><a href="http://code.google.com/p/google-diff-match-patch/">diff-match-patch</a> is google&#8217;s differ.</li>
<li><a href="http://www.semanticdesigns.com/Products/SmartDifferencer/">Smart Differencer</a> attempts to compare semantic differences between code at a &#8220;language construct&#8221; level.</li>
</ul>
<p>Current Conclusion</p>
<ul>
<li>Biggest takeaway: constrain differencing to supported formats. I&#8217;m pretty close to convinced that we should not offer the ability to manage documents in unsupported formats at all, given how much the user experience of version control degrades when no differencing ability is present. Transcoding all input into supported formats for purpose of differencing is another option.</li>
<li>Most of the rich document comparison that chit (can has it together) should do can be done via xml. The devil, as it were, is in making meaningful user interfaces to the difference files thus generated.</li>
<li>PDF differencing can be bought, but no good OSS solution appears to exist. UI issues would still apply.</li>
<li>Video differencing is a rough field. Probably possible to buy algorithm engines for a big chunk o&#8217; change. UI an issue that I haven&#8217;t seen addressed anywhere.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2009/10/22/whats-the-difference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gittish stuff</title>
		<link>http://canhas.biz/2009/10/20/gittish-stuff/</link>
		<comments>http://canhas.biz/2009/10/20/gittish-stuff/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 15:38:58 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[It Together]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=24</guid>
		<description><![CDATA[This is a brief run-down of projects using git for something other than code management. Gitit &#8211; wiki using git/darcs as backend. Written in haskell, and super not for mortals (still have to use CLI) Theoretical discussion of using git for cms versioning Is git more than a version control system? &#8211; doing exactly kind [...]]]></description>
			<content:encoded><![CDATA[<p>This is a brief run-down of projects using git for something other than code management.</p>
<ul>
<li><a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/gitit">Gitit</a> &#8211; wiki using git/darcs as backend. Written in haskell, and super not for mortals (still have to use CLI)</li>
<li>Theoretical discussion of <a href="http://richardhulse.blogspot.com/2008/08/using-git-to-manage-rollback-on-dynamic.html">using git for cms versioning</a></li>
<li><a href="http://www.ordecon.com/2009/04/22/is-git-more-than-just-a-version-control-system/">Is git more than a version control system?</a> &#8211; doing exactly kind of what I&#8217;ve been thinking of, using git / spidermonkey /bash to make a couchdb-alike</li>
</ul>
<p>Anyway, either nobody really has anything production ready or it&#8217;s swamped by the number of CMS/document management systems that use Git for their source code management.</p>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2009/10/20/gittish-stuff/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>No can has internets (offline use)</title>
		<link>http://canhas.biz/2009/10/20/no-can-has-internets-offline-use/</link>
		<comments>http://canhas.biz/2009/10/20/no-can-has-internets-offline-use/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 15:22:57 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[It Together]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=13</guid>
		<description><![CDATA[One of the issues with a distributed application is that you invariably need offline usage capability. There are many use cases for this, but I&#8217;ll enumerate them, starting from &#8216;mostly connected&#8217; to &#8216;mostly disconnected&#8217;: Server/peer availability &#8211; in a distributed system, many computers will be participating in server roles. They won&#8217;t all have high availability, [...]]]></description>
			<content:encoded><![CDATA[<p>One of the issues with a distributed application is that you invariably need offline usage capability.</p>
<p>There are many use cases for this, but I&#8217;ll enumerate them, starting from &#8216;mostly connected&#8217; to &#8216;mostly disconnected&#8217;:</p>
<ul>
<li>Server/peer availability &#8211; in a distributed system, many computers will be participating in server roles. They won&#8217;t all have high availability, so being &#8220;offline&#8221; from one or more peer as you seek a new one needs to be not disruptive.</li>
<li>Transient connectivity quality &#8211; Even a highly connected individual experiences moments where their bandwidth is limited and/or expensive, and so &#8216;offline&#8217; behaviour in those circumstances is helpful.</li>
<li>Intermittent outages &#8211; Many people do not have an &#8216;always on&#8217; connection through a cell modem or something similar. These people frequently have decent access, but there are valuable periods where they are completely without bandwidth.</li>
<li>Frequent/predominant outages &#8211; There are many environments where transient connections are the norm. In these cases, offline use is predominant.</li>
</ul>
<p>In all cases, what has to be addressed is not only the &#8216;simple&#8217; technical requirement of maintaining a responsive UI and preserving state locally, but also the question of synchronizing the data when connectivity is restored. That issue is for a later post.</p>
<h4>Offline options:</h4>
<ul>
<li><a href="http://www.whatwg.org/specs/web-apps/current-work/#offline">HTML5</a> offers a standards-based approach for offline usage that is supported by the latest browsers IE 8(!).</li>
<li><a href="http://gears.google.com/">Google Gears</a> offers offline storage as a plugin for older browsers, and it is built into Chrome.</li>
<li>The Pre, iPhone, and Android support the offline features of HTML5.</li>
</ul>
<h4>The data models provided</h4>
<ul>
<li><a href="http://dev.w3.org/html5/webstorage/#storage-0">Web Storage</a> allows for the preservation of key/value data, and offers &#8216;real&#8217; session support. Keys are strings, and &#8220;Values can be any data type supported by the structured clone algorithm.&#8221;</li>
<li>A <a href="http://www.w3.org/TR/offline-webapps/">SQL storage</a> . Basically in-browser SQLite.</li>
</ul>
<h4>Initial Use</h4>
<p>The main thing we want to use it for to begin with is storing cryptographic keys for the user.</p>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2009/10/20/no-can-has-internets-offline-use/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XulRunner &#8211; application target?</title>
		<link>http://canhas.biz/2009/10/20/xulrunner-application-target/</link>
		<comments>http://canhas.biz/2009/10/20/xulrunner-application-target/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 09:06:37 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[It Together]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=18</guid>
		<description><![CDATA[It is going to be very difficult to offer a &#8220;full&#8221; peer through &#8216;just&#8217; a browser. There are bascic cryptography issues that need to be addressed. Additionally, the offline storage capabilities are fine for actual offline experience, but conflict resolution requires a more advanced approach that is unlikely to be performant within javascript. However, at [...]]]></description>
			<content:encoded><![CDATA[<p>It is going to be very difficult to offer a &#8220;full&#8221; peer through &#8216;just&#8217; a browser. There are bascic cryptography issues that need to be addressed. Additionally, the offline storage capabilities are fine for actual offline experience, but conflict resolution requires a more advanced approach that is unlikely to be performant within javascript.</p>
<p>However, at long last, <a href="https://developer.mozilla.org/en/XULRunner/What_XULRunner_Provides">XulRunner</a> is on the 3.x firefox codebase, so it seems like this would be a great target for the application. It can be built for <a href="https://wiki.mozilla.org/Mobile/Build">some smartphones</a>.</p>
<p>So that would suggest that either we could get XulRunner to compile on iPhone/Android, or we could get the extra components we need (likely git, CouchDb, GnuPG) running on those platforms separately.</p>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2009/10/20/xulrunner-application-target/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>In-browser encryption</title>
		<link>http://canhas.biz/2009/10/20/in-browser-encryption/</link>
		<comments>http://canhas.biz/2009/10/20/in-browser-encryption/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 08:52:56 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[It Together]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=16</guid>
		<description><![CDATA[Encrypting information is key to the effective use of a distributed system. For a variety of reasons, stream-based encryption is rarely helpful for ensuring the security of data in a distributed system. What is important is for the endpoints (consumers/producers) of data in a distributed system encrypt the data they care about. To achieve this [...]]]></description>
			<content:encoded><![CDATA[<p>Encrypting information is key to the effective use of a distributed system. For a variety of reasons, stream-based encryption is rarely helpful for ensuring the security of data in a distributed system. What is important is for the endpoints (consumers/producers) of data in a distributed system encrypt the data they care about.</p>
<p>To achieve this in the browser, we must have a way of performing standard cryptographic techniques on data. Most of the existing cryptographic support in browsers is built around the Public Key Infrastructure, which basically boils down to &#8220;trust the corps that have root certificates&#8221;. Furthermore, it is entirely concerned with stream based encryption, and doesn&#8217;t help content-encryption.</p>
<ul>
<li><a href="http://www.fourmilab.ch/javascrypt/">JavaScrypt</a> &#8211; an implementation of AES in javascript.</li>
<li><a href="http://enigform.mozdev.org/">Enigform</a> and <a href="http://getfiregpg.org/s/home">FireGPG</a> provide a firefox exension that allows GPG-based encryption of http content, as well as digital signatures, etc. This is essentially the feature requirement we&#8217;re looking for, but Firefox/Moz only.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2009/10/20/in-browser-encryption/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can has it together?</title>
		<link>http://canhas.biz/2009/10/20/can-has-it-together/</link>
		<comments>http://canhas.biz/2009/10/20/can-has-it-together/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 08:02:48 +0000</pubDate>
		<dc:creator>mindlace</dc:creator>
				<category><![CDATA[It Together]]></category>

		<guid isPermaLink="false">http://canhas.biz/?p=11</guid>
		<description><![CDATA[So another project we&#8217;re in the incubation stage on is Can Has It Together. We&#8217;re  trying to make a distributed system that supports ad-hoc, on the fly collaboration as well as more persistent patterns of intentional activity. For the moment, I&#8217;ll mostly be writing about technologies and issues that are germane to our implementation; it [...]]]></description>
			<content:encoded><![CDATA[<p>So another project we&#8217;re in the incubation stage on is <a href="http://we.canhas.biz/projects/it-together/wiki/StartPage">Can Has It Together</a>. We&#8217;re  trying to make a distributed system that supports ad-hoc, on the fly collaboration as well as more persistent patterns of intentional activity.</p>
<p>For the moment, I&#8217;ll mostly be writing about technologies and issues that are germane to our implementation; it will probably be about a year before there&#8217;s much for the end user (sorry).</p>
]]></content:encoded>
			<wfw:commentRss>http://canhas.biz/2009/10/20/can-has-it-together/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
