<?xml version="1.0" encoding="iso-8859-1"?>
<!-- name="generator" content="pyblosxom/1.2 3/25/2005" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
<channel>
<title>Russ Nelson : opensource   </title>
<link>http://blog.russnelson.com/opensource/index.rss</link>
<description>Russ Nelson's personal blog</description>
<language>en</language>
<item>
    <title>Fixing RSS</title>
    <link>http://blog.russnelson.com/opensource/fixing-rss.html</link>
    <description>
&lt;p&gt;RSS is a great technology, with a flaw.  Currently, the way RSS works is
that you have a URL pointing to an RSS feed.  This feed dynamically changes
to contain new entries as they&apos;re posted and removes old ones off the end as
they age out.  But the &quot;feed&quot; is a complete XML document.  So in order to get
updates, you need to fetch the entire document and examine it for entries
newer than the last time you fetched the document.&lt;/p&gt;

&lt;p&gt;In  other words, polling.&lt;/p&gt;

&lt;p&gt;The problem with polling is that it consumes resources.  Much better to
set up a communication point where the receipient (RSS client) waits for
the sender to post new items.  In other words, streaming RSS, or SRSS.
Streaming XML is not a new concept.  Jabber has been doing streaming XML for
years now.  The problem with following that concept is that Jabber is
one-to-one communications.  RSS is one-to-many.  For small values of &quot;many&quot;
a standard HTTP server will work fine.&lt;/p&gt;

&lt;p&gt;But think of Britney Spears&apos; RSSer feed.  She&apos;ll have millions of followers,
all of whom want to hold a TCP session open.  This simply doesn&apos;t scale using
a general-purpose TCP/IP stack.&lt;/p&gt;

&lt;p&gt;So, imagine a TCP/IP stack designed for streaming RSS.  It would be able
to hold open literally millions of TCP sessions at the same time.  Since it&apos;s
sending out the same content to many different recipients, each session just
needs a pointer into the content that has been sent so far, plus the remote
IP address and TCP port, and maybe a retransmission timer or two.&lt;/p&gt;

&lt;p&gt;When she posts something to her feed, it will be sent out using just two
packets: one with the data, and another one ACKing the data.  And yes, some
of the TCP sessions will be dangling and will send a TCP RST.  But the rest
will receive their feed in  real time, or as near as you can get there with 5 million TCP sessions to feed.&lt;/p&gt;

&lt;p&gt;Now, all RSS clients will need to be modified to use SRSS.  But the key here
is that even if they don&apos;t, they&apos;ll still be able to fall back to RSS. As
long as the server can understand an appended ?streaming=yes on its feed URL,
the clients can be modified at whatever rate the author desires.&lt;/P&gt;

&lt;p&gt;Been thinking about this for years, but I was prompted to write this up
by a posting by Dave Winer suggesting that we could &lt;a href=&quot;http://scripting.com/stories/2010/09/22/rebootingRssInterlude.html&quot;&gt;distribute the functionality of Twitter&lt;/a&gt; using an RSS client and people&apos;s individual RSS feeds. This is a great idea at that level of the IP stack, but
when you go down one level to try to implement it, fetching a full RSS file
every time you check for news is incredibly inefficient and slow.  Much
better to use SRSS so that when somebody posts to their RSSer feed, it 
appears immediately.&lt;/p&gt;

</description>
  </item>
<item>
    <title>Open Data</title>
    <link>http://blog.russnelson.com/opensource/open-data.html</link>
    <description>
&lt;p&gt;Are you not a coder? Or are your coding skills rusty, having moved
on?  No matter! You can still contribute to open source. Open source
is only one part of a program. The other part is open data. I&apos;m
encouraging people to contribute to OpenStreetMap. We&apos;re running &lt;a
href=&quot;http://community.cloudmade.com/event&quot;&gt;OpenStreetMap mapping
parties&lt;/a&gt; all over the world. All skills taught!  What&apos;s important
is your willingness to contribute to an Open Data project, and
location, location, location. We can only map where you are.&lt;/p&gt;
</description>
  </item>
<item>
    <title>Cloudmade, my new employer</title>
    <link>http://blog.russnelson.com/opensource/cloudmade.html</link>
    <description>
&lt;p&gt;After 17 years of working for myself, I&apos;ve decided to fire my boss, and hire
a new one, &lt;a href=&quot;http://cloudmade.com/&quot;&gt;Cloudmade&lt;/a&gt;.  We&apos;re working on
improving &lt;a href=&quot;http://openstreetmap.org/&quot;&gt;OpenStreetMap&lt;/a&gt;, a community
edited map.  All sorts of geodata can, should, and need to be added to
OpenStreetMap.  I&apos;m available to give presentations about open data,
OpenStreetMap, and collaborative communities in the NorthEast of the USA.&lt;/p&gt;

&lt;p&gt;I&apos;m also blogging over at the &lt;a href=&quot;http://community.cloudmade.com/blog/&quot;&gt;community Cloudmade&lt;/a&gt; site.&lt;/p&gt;
</description>
  </item>
<item>
    <title>findwhistle</title>
    <link>http://blog.russnelson.com/opensource/findwhistle.html</link>
    <description>
&lt;p&gt;I&apos;ve experimented with keeping an audio recording in addition to a
GPS track of my bicycle rides.  The trouble with a continuous audio
recording is that 1) it&apos;s long, 2) it&apos;s boring, and 3) the interesting
things are hard to seek to.  If you could do reliable speech
recognition, you could say a word like &quot;mark&quot; or somesuch.  However,
in my experience, street noise is going to kill you.&lt;/p&gt;

&lt;p&gt;Better than that, you detect a whistle.  The code below will print the
duration of the whistle, the time from the beginning of the audio recording,
and the pitch of the whistle.  The purpose of this is to be able to do
continuous audio recording, and yet be able to take a waypoint with an
audio annotation.&lt;/p&gt;

&lt;code&gt;
&lt;pre&gt;
#!/usr/bin/python

import sys
import wave
import struct

def findwhistle(inwave):
    &quot;&quot;&quot;given an open wave file, return an array which consists of the times
    whenever a whistle was found.&quot;&quot;&quot;
    framecount = 0
    zerocross = 0
    lastzerocross = 0
    zerocrosssum = 0
    zerocrosscount = 0
    sign = 1
    while True:
        frames = inwave.readframes(100)
        if len(frames) == 0: break
        frames = struct.unpack(&quot;&lt;100h&quot;, frames)
        for i, sample in enumerate(frames):
            if sign * sample &gt; 0:
                zerocross += 1
            else:
                if abs(zerocross - lastzerocross) &lt;= 1:
                    zerocrosssum += zerocross
                    zerocrosscount += 1
                else:
                    if zerocrosscount &gt; 100:
                         print &apos;! %4.2f %4.2f %5.0f&apos; % ( zerocrosssum / 8000.0, (framecount + i - zerocrosssum) / 8000.0,  zerocrosscount / (zerocrosssum / 8000.0))
                    zerocrosssum = 0
                    zerocrosscount = 0
                #print zerocross
                sign = -sign
                lastzerocross = zerocross
                zerocross = 1
        framecount += len(frames)
    return framecount / 8000.0

def main():
    f = wave.open(sys.argv[1], &quot;r&quot;)
    print f.getparams()
    print findwhistle(f)

if __name__ == &quot;__main__&quot;:
    main()

&lt;/pre&gt;
&lt;/code&gt;
</description>
  </item>
<item>
    <title>SciPhone &amp;&amp; Open Source</title>
    <link>http://blog.russnelson.com/opensource/SciPhone.html</link>
    <description>
&lt;p&gt;&lt;a href=&quot;http://www.dealextreme.com/details.dx/sku.13241&quot;&gt;These guys (SciPhone)&lt;/a&gt; really REALLY ought to get together with some open source developers.
Looks like a great product, but it&apos;s almost 100% certain that their software
stinks.&lt;/p&gt;
</description>
  </item>
<item>
    <title>Franchise</title>
    <link>http://blog.russnelson.com/opensource/franchise.html</link>
    <description>
&lt;p&gt;In a free market, over time, competition in the production of a commodity 
product will eliminate all profits.  Bread-makers can sell their bread for
enough money to cover the cost of the capital invested in the bakery, the
cost of the flour, yeast, sugar, and water, the fuel needed for firing, and
the salary of the baker.  They can earn no more money than that.  If they
did, then another bakery would be established which would price its products
lower, splitting that profit between the customer and the owner of the new
bakery.&lt;/p&gt;

&lt;p&gt;In order to earn a profit, you need to do something special (called a
franchise).  This could have several forms: you could create something
new that nobody else has.  You could have an exclusive territory assigned
to you (as in the traditional franchise, such as McDonald&apos;s etc).  You could
have help from the government, in the form of a patent or copyright.  Or you could have
a professional certification, such as a law or medical degree, without which
one is prohibited from practice -- and possession of which is controlled
by other lawyers and doctors who are sure not to give out too many.&lt;/p&gt;

&lt;p&gt;In the case of software development, you can copyright and/or patent your
software (although it&apos;s dodgy that both apply, since the theory is that
they can&apos;t both be used on the same work).  Or, you can write your software
in such a way that it is inextricably tied to a piece of hardware which only
you sell.  Or you can develop an expertise with a piece of software which
nobody else can or will reproduce.&lt;/p&gt;

&lt;p&gt;Or you can simply not worry about
getting a franchise because you know that only certain types of people have
the ability to program.  If true (and I believe it to be true) then
programmers will forever command higher than usual salaries.  And the more
demand for programmers, the better-off will be programmers.  And the more
use of software, the more demand for programmers.  And the less expensive
is software, the more wide will be the use of it.&lt;/p&gt;

&lt;p&gt;Every process is a mix of inputs.  The ratio of inputs depends on the cost
of these inputs.  The process gets changed over time to handle the varying
cost of the inputs.  If one of them becomes cheaper, it becomes a larger
factor in the production.&lt;/p&gt;

&lt;p&gt;I believe that there is sufficient evidence to say that Open Source and
free software lowers the cost of production of software, and hence will
ineluctibly raise the salary of programmers, even as these programmers
give away more and more of their software.&lt;/p&gt;

&lt;p&gt;All of this, of course, is in complete opposition to Stallman&apos;s &lt;a href=&quot;http://www.gnu.org/gnu/manifesto.html&quot;&gt;GNU Manifesto&lt;/a&gt;.  He attempts to rebut
objections to GNU&apos;s goals.  He repeatedly makes the claim that free
software will reduce programmer&apos;s pay.  I claim otherwise.  Hopefully
Stallman has changed his mind.&lt;/p&gt;

</description>
  </item>
<item>
    <title>Web 2.0 doesn&apos;t imply usability</title>
    <link>http://blog.russnelson.com/opensource/web-2.0-does-not-imply-usability.html</link>
    <description>
&lt;p&gt;I recently got myself a &lt;a
href=&quot;http://flickr.com/photos/russnelson/&quot;&gt;Flickr Pro account&lt;/a&gt;,
and have been using Flickr for more of my photos.  I find myself more
and more annoyed at the rough edges in the Flickr user interface.  For
example, when you want to delete a tag from something, you click on
the [x] to the right of the tag.  Flickr asks you &quot;Do you want to
delete the tag?&quot; Cancel/Ok:&lt;br&gt; &lt;a
href=&quot;http://www.flickr.com/photos/russnelson/2462716167/&quot;
title=&quot;delete? by Russ Nelson, on Flickr&quot;&gt;&lt;img
src=&quot;http://farm3.static.flickr.com/2186/2462716167_6a3772ec65_o.png&quot;
width=&quot;516&quot; height=&quot;243&quot; alt=&quot;delete?&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is almost certainly the wrong thing to do.  It annoys people
because the website is (in effect) saying &quot;Hey, that might be a stupid
thing to do, so I&apos;m going to slow you down so you can think about it.&quot;
The first couple of times people might pause to think (but what
they&apos;re likely thinking is &quot;you stupid computer, I &lt;em&gt;told&lt;/em&gt; you
what to do&quot;.)  After that, when they want to delete a tag, the action
will be &quot;Click X; Click Ok&quot;, with no pause for thought.&lt;/p&gt;

&lt;p&gt;That is how people think.  That is how people are able to learn a
complicated game like chess, or go.  People chunk information and
actions together.  This allows the forebrain to go on thinking about
other things while the rest of the brain carries out an action
previously decided-upon.  If an action requires a confirmation, the
hindbrain will confirm it as part of executing the action chunk.&lt;/p&gt;

&lt;p&gt;The way to work &lt;em&gt;with&lt;/em&gt; human congnition rather than against
it is to allow for Undo.  Undo isn&apos;t a new idea -- we were using it 25
years ago.  Undo works well with the human brain because it allows
actions to happen without confirmations, but it also allows the
forebrain (which operates slower than the hindbrain) to realize that
it has made a mistake, and correct it with an Undo.&lt;/p&gt;

&lt;p&gt;Flickr isn&apos;t &lt;em&gt;all&lt;/em&gt; bad.  They do use Undo sometimes:&lt;/p&gt;
&lt;a href=&quot;http://www.flickr.com/photos/russnelson/2463595146/&quot;
title=&quot;confirm1 by Russ Nelson, on Flickr&quot;&gt;&lt;img
src=&quot;http://farm3.static.flickr.com/2364/2463595146_e312baf101_o.png&quot;
width=&quot;405&quot; height=&quot;192&quot; alt=&quot;confirm1&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When they add an image to a set, they add an indication that it&apos;s
in the set over on the right, so the &quot;OK&quot; part is useless.  They
should skip the dialog entirely and insert a temporary &quot;UNDO&quot; below
the set listing.  Even when they do use UNDO, they spoil its operation
with a confirmation:&lt;br&gt;&lt;a
href=&quot;http://www.flickr.com/photos/russnelson/2463595298/&quot;
title=&quot;confirm2 by Russ Nelson, on Flickr&quot;&gt;&lt;img
src=&quot;http://farm4.static.flickr.com/3175/2463595298_9002d8a04a_o.png&quot;
width=&quot;397&quot; height=&quot;192&quot; alt=&quot;confirm2&quot; /&gt;&lt;/a&gt;&lt;br&gt;Of course I want to
remove it from the set!  That&apos;s why I just clicked on UNDO, right?&lt;/p&gt;

&lt;p&gt;Following the confirmation is another useless &quot;Click OK to indicate
that you are still alive&quot; box.&lt;br&gt;&lt;a
href=&quot;http://www.flickr.com/photos/russnelson/2463595370/&quot;
title=&quot;confirm3 by Russ Nelson, on Flickr&quot;&gt;&lt;img
src=&quot;http://farm3.static.flickr.com/2080/2463595370_866e10a134_o.png&quot;
width=&quot;397&quot; height=&quot;179&quot; alt=&quot;confirm3&quot; /&gt;&lt;/a&gt;&lt;br&gt;Of course it&apos;s been
removed, because the set listing is now gone.  The proper way to
handle this is to grey out the set listing on the right, and add an
&quot;UNDO&quot; button below it.&lt;/p&gt;

&lt;p&gt;Even if you&apos;ve implemented your website using Open Source software
like Linux, Apache, MySQL, and PHP, you don&apos;t escape the low quality
typical of proprietary software unless &lt;em&gt;your software&lt;/em&gt; is Open
Source.&lt;/p&gt;

&lt;p&gt;It&apos;s easy to volunteer other people to fix problems.  In the Open
Source world, the typical response is &quot;great idea; send a patch.&quot;
Flickr lives in the Web 2.0 world, not the Open Source world.  Their
software sucks just like any proprietary program.  We can&apos;t fix it.
Only Flickr can fix it, and hopefully, they&apos;ll at least fix the
problems I&apos;ve outlined here.&lt;/p&gt;
</description>
  </item>
<item>
    <title>config.h Considered Harmful</title>
    <link>http://blog.russnelson.com/opensource/config.h-considered-harmful.html</link>
    <description>
&lt;p&gt;Many, many programs written in C or C++ use a file called &quot;config.h&quot; which contains #define statement that control the compilation of the program. These programs are also nearly always build using &apos;make&apos;.&lt;/p&gt;

&lt;p&gt;I claim that these two attributes are in conflict with each other. Or, in layman&apos;s terms, &quot;config.h sucks&quot;. The problem is that when you have multiple options in config.h, every file which may be compiled differently depending on the values defined therein, must be recompiled whenever config.h changes.&lt;/p&gt;

&lt;p&gt;The correct way to do compile-time options is to have a config subdirectory containing a multitude of .h files, each with its own #define in it. These are easily managed because each file has only one #define, and when the source file mentions the thing being defined, it needs a #include of that config file. The &apos;make&apos; program is trivially informed of these dependencies by looking at the files included in each source.&lt;/p&gt;

&lt;p&gt;So, when you change one option, only those files which depend on it will get recompiled.&lt;/p&gt;

&lt;p&gt;I wrote this blog posting while waiting for a program to recompile because I changed config.h .... and it&apos;s still not finished recompiling on pretty studly machine. Ahhhh, it just finished.&lt;/p&gt;

&lt;p&gt;Of course, this is completely disrupted when you rewrite your Makefile (as GNU automake does), but that&apos;s a subject for a different posting.&lt;/p&gt;

</description>
  </item>
<item>
    <title>Patents and Open Source</title>
    <link>http://blog.russnelson.com/opensource/patents-and-open-source.html</link>
    <description>
&lt;p&gt;Are you a patent holder, wondering how to write software which 
implements your patent?   Here&apos;s my advice:  Patents expire.  Towards
the end of the
patent&apos;s lifetime, you want to be trying to transfer the patent&apos;s
franchise over to the relationship between the patent-holder and the
licensee.  That can be done with closed-source software, but you risk
competitors writing their own software.  With Open Source software, as
long as you manage the relationship with the user correctly, you end
up with a franchise.&lt;/p&gt;

&lt;p&gt;Long before a patent expires, you have ZERO NEED for closed-source
software.  ZERO.  NONE.  The purpose of a patent is to give you
ownership over the idea.  The purpose of closed-source software is to
give you ownership over the code.  But if you already have a patent,
you own the idea.  No need to own the code -- in fact, owning the code
only hurts you, because it closes you out to people who would improve
the code, or even to people who would create new patented works based
on your patent.
&lt;/p&gt;

&lt;p&gt;If you have a patent, you NEED open source software.&lt;/p&gt;
</description>
  </item>
<item>
    <title>Licensing Adobe Flash</title>
    <link>http://blog.russnelson.com/opensource/licensing-adobe-flash.html</link>
    <description>
&lt;p&gt;Are you having trouble licensing the Adobe Flash player?  Apparently,
Adobe makes it difficult for some people to license their Flash player.
I don&apos;t know why -- you&apos;d think they&apos;d be all about the money.  But
regardless, the Gnash project is happy to license its Flash player to
you if Adobe won&apos;t license &lt;em&gt;their&lt;/em&gt; Flash player.  Go &lt;a href=&quot;http://getgnash.org/&quot;&gt;Get Gnash&lt;/a&gt; now.&lt;/p&gt;
</description>
  </item>
   </channel>
</rss>