<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://cafe.elharo.com/wp-atom.php">
	<title type="text">The Cafes</title>
	<subtitle type="text">Longer than a blog; shorter than a book</subtitle>

	<updated>2012-01-19T17:20:51Z</updated>

	<link rel="alternate" type="text/html" href="http://cafe.elharo.com" />
	<id>http://cafe.elharo.com/feed/atom/</id>
	

	<generator uri="http://wordpress.org/" version="3.1.3">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/TheCafes" /><feedburner:info uri="thecafes" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[An Open Letter to My Public Library]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/Y6IB15FbffA/" />
		<id>http://cafe.elharo.com/?p=701</id>
		<updated>2012-01-19T17:20:51Z</updated>
		<published>2012-01-19T11:15:03Z</published>
		<category scheme="http://cafe.elharo.com" term="Internet" />		<summary type="html"><![CDATA[Dear Librarians, I&#8217;d like to thank you for the work you&#8217;ve done putting the library catalog online. The ability to reserve books online (and then renew them online when I don&#8217;t finish them on time) has been invaluable. It has dramatically increased my use of the library. Now when I need a book I routinely [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/internet/an-open-letter-to-my-public-library/">&lt;p&gt;Dear Librarians,&lt;/p&gt;
&lt;p&gt;I&amp;#8217;d like to thank you for the work you&amp;#8217;ve done putting the library catalog online. The ability to reserve books online (and then renew them online when I don&amp;#8217;t finish them on time) has been invaluable. It has dramatically increased my use of the library. Now when I need a book I routinely check the library first rather than ordering it from Amazon. It&amp;#8217;s cheaper, the book gets to me faster; and when I&amp;#8217;m done, the book no longer takes up space in my apartment. Excellent! Kudos all around. &lt;/p&gt;
&lt;p&gt;And now you have eBooks so I don&amp;#8217;t even have to go to the library to pick up my reservations! Regrettably the selection of eBooks is somewhat thinner and more oversubscribed; and yes, I know this is partially the publishers&amp;#8217; fault. Still, for the books that are available, it&amp;#8217;s wonderful knowing that even the thickest physics text or mathematical tome isn&amp;#8217;t going to weigh more than a small eReader or tablet. It makes reviewing calculus  on the subway so much more practical. &lt;/p&gt;
&lt;p&gt;I&amp;#8217;d like to make a friendly suggestion for ramping this up a notch, making the library even more useful, expanding the collection, and increasing monetary donations to the library at the same time. Your circulating collection is large, probably one of  the largest in the country, and certainly the largest one I&amp;#8217;ve ever had the pleasure to use. Probably 90% of the time the book I&amp;#8217;m looking for is available at one of your branches, and you helpfully bring it from wherever it is to my local library where I can pick it up off the reserve shelf. But there&amp;#8217;s still that 10% of the time when you happen not to have the book I&amp;#8217;m looking for. (And for eBooks that&amp;#8217;s more like 90% of the time.) Sometimes that&amp;#8217;s because it&amp;#8217;s a relatively obscure technical book; but sometimes it just looks like a fluke. For instance, it&amp;#8217;s the second book in a trilogy for which you have the first and the third, but somehow missed the middle (or it went missing). Or it&amp;#8217;s a novel by an author, most of whose works you already have. It&amp;#8217;s something that clearly fits in your collection but just doesn&amp;#8217;t happen to be there yet. So off I surf to Amazon where I buy a book I only really want to read once, and that then is going to sit on my shelf untouched for years.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s my idea: I&amp;#8217;d rather buy the book for the library and than buy it for myself.&lt;br /&gt;
&lt;span id="more-701"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;What does this entail? Simple: an online form on your web site where I can request a book that&amp;#8217;s not currently in your collection, and where I can simultaneously make a donation with my credit card  earmarked for the purchase of that book. You&amp;#8217;d receive the information, verify that the book is reasonably suitable for the collection, charge my credit card, and then make the purchase. When the book arrives, you&amp;#8217;d add the usual bar codes and magnetic strips and insert it into the catalog. Then you&amp;#8217;d put it on the reserve shelf for me, and send me the usual e-mail letting me know it&amp;#8217;s arrived. I&amp;#8217;d have the customary 10 days to go pick it up and check it out. Of course I&amp;#8217;d have to return it in the usual time frame just like any other library book (maybe renewing it once or twice if nobody else had placed a hold on it). At this point you&amp;#8217;d put it on the shelves for everybody to browse and read. For eBooks this could be even faster. There&amp;#8217;s no technical reason I couldn&amp;#8217;t  buy the book for the library and be reading it in the time it takes to download. &lt;/p&gt;
&lt;p&gt;I think this is a win-win for all concerned. The library gets more books (and more donations); and patrons get to read books without perpetually storing them in their apartments. (I&amp;#8217;m sure you know how big a concern that is for New Yorkers.) If you asked for the retail cover price of the book in advance, you&amp;#8217;d probably even make a little profit on the deal to cover overhead and other activities. Since I&amp;#8217;d get a tax deduction, I could afford to pay a little more than the typical Amazon discount price. And as an added bonus, some of your patrons (me included) have employers who match charitable donations 1:1, so a $40 book purchase would garner you an extra $40 in unrestricted funds to be used for staff salary, computers, building maintenance, or other unsexy but necessary expenses.  &lt;/p&gt;
&lt;p&gt;What do you think? Sounds like a plan?&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fgXq1QgaL4yYxqFXPBR_pCbzA5U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fgXq1QgaL4yYxqFXPBR_pCbzA5U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fgXq1QgaL4yYxqFXPBR_pCbzA5U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fgXq1QgaL4yYxqFXPBR_pCbzA5U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/Y6IB15FbffA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/internet/an-open-letter-to-my-public-library/#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/internet/an-open-letter-to-my-public-library/feed/atom/" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/internet/an-open-letter-to-my-public-library/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[A Prediction: P == NP and within 5 years]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/Za2Yn5Ei9Rg/" />
		<id>http://cafe.elharo.com/?p=697</id>
		<updated>2011-09-29T11:36:37Z</updated>
		<published>2011-09-29T11:36:37Z</published>
		<category scheme="http://cafe.elharo.com" term="Math" />		<summary type="html"><![CDATA[So after reading this poll of mathematicians and computer scientists who have given the process way more thought than I have, I now suspect that indeed P == NP (though perhaps not usefully so). Why do I think this? Quite simply, it seems to me that there are a lot of possible attacks on this [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/math/a-prediction-p-np-and-within-5-years/">&lt;p&gt;So after reading &lt;a href="http://www.cs.umd.edu/~gasarch/papers/poll.pdf"&gt;this poll of mathematicians and computer scientists&lt;/a&gt; who have given the process way more thought than I have, I now suspect that indeed P == NP (though perhaps not usefully so). Why do I think this?&lt;br /&gt;
&lt;span id="more-697"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Quite simply, it seems to me that there are a lot of possible attacks on this problem, and that no one understands them all. The mathematicians claiming that P != NP (and especially that it won&amp;#8217;t be solved soon) are basically claiming that the math they know won&amp;#8217;t lead to a solution, whereas the mathematicians claiming that the problem will be solved are saying that they expect the math they know will lead to a solution. Knowing what won&amp;#8217;t work is important, but for making predictions knowing what will is more important.&lt;/p&gt;
&lt;p&gt;Of course, it could be that the problem will be solved and the solution will be that P != NP, as most folks seem to expect. Or it could be shown that the problem is undecidable (though that would likely take longer). &lt;/p&gt;
&lt;p&gt;Perhaps I&amp;#8217;m just an  optimist, but I&amp;#8217;m betting on a constructive solution to the problem. That is, I expect to see an algorithm soon that &amp;#8220;solves&amp;#8221; a known NP problem in polynomial time. That polynomial time may still be greater than the age of the universe, but it won&amp;#8217;t be NP. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pCFBKa1DDYWft16yTsAT1hPch2M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pCFBKa1DDYWft16yTsAT1hPch2M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pCFBKa1DDYWft16yTsAT1hPch2M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pCFBKa1DDYWft16yTsAT1hPch2M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/Za2Yn5Ei9Rg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/math/a-prediction-p-np-and-within-5-years/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/math/a-prediction-p-np-and-within-5-years/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/math/a-prediction-p-np-and-within-5-years/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[Cafe au lait/con Leche Are Down]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/foXXoPLQQkc/" />
		<id>http://cafe.elharo.com/?p=681</id>
		<updated>2011-03-29T13:56:19Z</updated>
		<published>2011-03-16T15:15:24Z</published>
		<category scheme="http://cafe.elharo.com" term="Web Development" />		<summary type="html"><![CDATA[Yes, I know Cafe au Lait and Cafe con Leche are down (not that this matters a great deal to anyone right now.) This is the result of a planned maintenance that requires me to do some DNS changes on my end. Unfortunately, I&#8217;m a little hobbled at the moment since I&#8217;m traveling in Europe [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/web/cafe-au-laitcon-leche-are-down/">&lt;p&gt;Yes, I know Cafe au Lait and Cafe con Leche are down (not that this matters a great deal to anyone right now.) This is the result of a planned maintenance that requires me to do some DNS changes on my end. Unfortunately, I&amp;#8217;m a little hobbled at the moment since I&amp;#8217;m traveling in Europe without my personal laptop and I&amp;#8217;m staying a hotel with pathetic wireless. I&amp;#8217;ll try to get it fixed ASAP, but as soon as possible could be as late as next Monday. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: I forgot that XOM downloads are also hosted on Cafe con Leche, and these matter a little more than year old news. So I spent a few minutes this morning to dig the password for my DNS server out of some web-based backups (Go Crashplan!) and updated the sites with the new IP addresses. All should be resolved as soon as the changes propagate over the next three hours or so. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2&lt;/strong&gt;: All is well. Both sites are up. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6XtI2iWLsvji0QbNXtys8ljKj5o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6XtI2iWLsvji0QbNXtys8ljKj5o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6XtI2iWLsvji0QbNXtys8ljKj5o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6XtI2iWLsvji0QbNXtys8ljKj5o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/foXXoPLQQkc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/web/cafe-au-laitcon-leche-are-down/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/web/cafe-au-laitcon-leche-are-down/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/web/cafe-au-laitcon-leche-are-down/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[My New Year&#8217;s Resolution]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/nAO4wBWZAjc/" />
		<id>http://cafe.elharo.com/?p=676</id>
		<updated>2011-09-29T11:34:59Z</updated>
		<published>2011-01-01T14:41:36Z</published>
		<category scheme="http://cafe.elharo.com" term="Programming" />		<summary type="html"><![CDATA[In 2011 my New Year&#8217;s resolution is to do more things the easy way, even if it takes longer the first time. I am going to stop using brute force to solve problems. In particular: I am finally going to memorize how one redirects both stderr and stdout to the same stream. (2&#62;&#38;1 &#124;) I [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/programming/my-new-years-resolution/">&lt;p&gt;In 2011 my New Year&amp;#8217;s resolution is to do more things the easy way, even if it takes longer the first time. I am going to stop using brute force to solve problems. In particular:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I am finally going to memorize how one redirects both stderr and stdout to the same stream. (&lt;code&gt;&lt;a href="http://stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21"&gt;2&amp;gt;&amp;amp;1&lt;/a&gt; |&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;I am going to learn the sed? trick my advisor showed me 20 years ago for repeating a command from the shell history while substituting one word for another, instead of just using the arrow key to backup to and erase the string. (&lt;code&gt;^string1^string2^&lt;/code&gt; or &lt;code&gt;!!:s/string1/string2/&lt;/code&gt; or for global substitution, not just the first occurrence &lt;code&gt;!!:gs/string1/string2/&lt;/code&gt;) &lt;/li&gt;
&lt;li&gt;I am going to increase my regex fu and use regular expressions consistently instead of just editing 20 lines of copy and paste code. (This would be easier if every editor didn&amp;#8217;t have subtly different syntax.)&lt;/li&gt;
&lt;li&gt;I am going to use Python to automate repetitive tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/S0q08KBaVlkgfHIO6TuwzjooHO4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S0q08KBaVlkgfHIO6TuwzjooHO4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/S0q08KBaVlkgfHIO6TuwzjooHO4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/S0q08KBaVlkgfHIO6TuwzjooHO4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/nAO4wBWZAjc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/programming/my-new-years-resolution/#comments" thr:count="5" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/programming/my-new-years-resolution/feed/atom/" thr:count="5" />
		<thr:total>5</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/programming/my-new-years-resolution/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[XML 2.0]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/547KzzYvdA0/" />
		<id>http://cafe.elharo.com/?p=523</id>
		<updated>2010-12-05T12:13:04Z</updated>
		<published>2010-12-04T12:06:10Z</published>
		<category scheme="http://cafe.elharo.com" term="XML" /><category scheme="http://cafe.elharo.com" term="2.0" /><category scheme="http://cafe.elharo.com" term="XML 2.0" />		<summary type="html"><![CDATA[First for the record, I&#8217;m speaking only for myself, not my employer, the W3C, Apple, Google, Microsoft, WWWAC, the DNRC, the NFL, etc. XML 1.1 failed. Why? It broke compatibility with XML 1.0 while not offering anyone any features they needed or wanted. It was not synchronous with tools, parsers, or other specs like XML [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/xml/xml-2-0/">&lt;p&gt;First for the record, I&amp;#8217;m speaking only for myself, not my employer, the W3C, Apple, Google, Microsoft, WWWAC, the DNRC, the NFL, etc. &lt;/p&gt;
&lt;p&gt;XML 1.1 failed. Why? It broke compatibility with XML 1.0 while not offering anyone any features they needed or wanted. It was not synchronous with tools, parsers, or other specs like XML Schemas. This may not have been crippling had anyone actually wanted XML 1.1, but no one did. There was simply no reason for anyone to upgrade. &lt;/p&gt;
&lt;p&gt;By contrast XML did succeed in replacing SGML because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It was compatible. It was a subset of SGML, not a superset or an incompatible intersection (aside from a couple of very minor technical points no one cared about in practice)&lt;/li&gt;
&lt;li&gt;It offered new features people actually wanted.&lt;/li&gt;
&lt;li&gt;It was simpler than what it replaced, not more complex.&lt;/li&gt;
&lt;li&gt;It put more information into the documents themselves. Documents were more self-contained. You no longer needed to parse a DTD before parsing a document. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To do better we have to fix these flaws. That is, XML 2.0 should be like XML 1.0 was to SGML, not like XML 1.1 was to XML 1.0. That is, it should be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Compatible with XML 1.0 without upgrading tools.&lt;/li&gt;
&lt;li&gt;Add new features lots of folks want (but without breaking backwards compatibility).&lt;/li&gt;
&lt;li&gt;Simpler and more efficient.&lt;/li&gt;
&lt;li&gt;Put more information into the documents themselves. You no longer need to parse a schema to find the types of elements. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These goals feel contradictory, but I plan to show they&amp;#8217;re not; and map out a path forward.&lt;br /&gt;
&lt;span id="more-523"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The technical requirement is to maintain compatibility. Existing parsers/tools still work. On a few edge cases, an XML 2.0 parser may report slightly different content than an XML 1.0 parser. E.g. more or less white space. However all XML 2.0 documents are well-formed XML 1.0 documents. It will be possible to write an XML 2.0 parser that is faster, simpler, and easier to use  than an XML 1.0 parser. However XML 1.0 parsers will still be able to parse XML 2.0 documents. XML 2.0 parsers will not, however, be able to parse all XML 1.0 documents, just as XML parsers can&amp;#8217;t parse arbitrary SGML. &lt;/p&gt;
&lt;p&gt;The attitudinal requirement is that XML 2.0 be useful. It has to solve real problems for real users. And it has to solve all the problems XML 1.0 solves too.&lt;br /&gt;
&lt;a href="http://www.textuality.com/xml/xmlSW.html"&gt;Tim Bray&amp;#8217;s Skunkworks&lt;/a&gt; meets goals #1, #3, and #4 but it didn&amp;#8217;t offer #2, so there was never a strong desire to implement it. Languages don&amp;#8217;t get replaced simply because there&amp;#8217;s something new that does the same thing a little more cleanly or a little better. They get replaced when there&amp;#8217;s something new that does the old things better and does new things too. &lt;/p&gt;
&lt;h2&gt;What we take out&lt;/h2&gt;
&lt;h3&gt;Internal DTD subsets&lt;/h3&gt;
&lt;p&gt;The internal DTD subset is responsible for much of the complexity and security issues with XML. Get rid of it. XML 2.0 documents cannot contain internal DTD subsets.&lt;/p&gt;
&lt;h3&gt;Validity&lt;/h3&gt;
&lt;p&gt;Validity is defined separately. The DOCTYPE declaration, if present, can point to schemas in any language with any validation rules. Perhaps we can use the public identifier to name the type of the schema and the system identifier to point to it. However validation is optional and outside the scope of the spec. &lt;/p&gt;
&lt;h3&gt;Namespace well-formedness is required&lt;/h3&gt;
&lt;p&gt;Build in namespaces. Require namespace well-formedness. All namespaces must be absolute URIs.&lt;/p&gt;
&lt;h3&gt;Neurotic and psychotic documents&lt;/h3&gt;
&lt;p&gt;All namespace prefixes must be declared on the root element. No prefix may have two different URIs in two different parts of the document. This may require rewriting of namespace prefixes when combining documents, e.g. with XInclude. This is uncommon, but if we have to do it we&amp;#8217;ll do it. &lt;/p&gt;
&lt;p&gt;Default namespaces may still be declared on any element.&lt;/p&gt;
&lt;h3&gt;CDATA sections&lt;/h3&gt;
&lt;p&gt;Eliminate CData sections. They&amp;#8217;re unnecessary syntax sugar and just lead to confusion among users and extra work for parser implementers. Ideally I&amp;#8217;d also like to eliminate the special treatment of the three character sequence &lt;code&gt;]]&amp;gt;&lt;/code&gt;. However that might break existing parsers. &lt;/p&gt;
&lt;h3&gt;C1 controls&lt;/h3&gt;
&lt;p&gt;The only reason C1 controls show up in an XML document is because someone has mislabeled a Windows text file. By forbidding these characters we will catch this problem much earlier. &lt;/p&gt;
&lt;p&gt;There are likely some other Unicode compatibility characters we should forbid as well. &lt;/p&gt;
&lt;h3&gt;DOM and the Infoset&lt;/h3&gt;
&lt;p&gt;Abandon DOM. Abandon the Infoset. They&amp;#8217;re confusing and not what users want or need. Folks can still use them&amp;#8211;XML 2.0 is a subset of XML 1.0, after all&amp;#8211;but they have no normative standing. &lt;/p&gt;
&lt;p&gt;Encourage a variety of different APIs and data models appropriate to their respective domains and languages. However be very clear that the actual text of the document is the normative form. The data model is a representation of the text. The text is not a serialization of the data model.  &lt;/p&gt;
&lt;h3&gt;White space preservation&lt;/h3&gt;
&lt;p&gt;White space is significant inside an element if and only if xml:space=&amp;#8221;preserve&amp;#8221;. Otherwise all consecutive white space is collapsed to a single space. &lt;/p&gt;
&lt;p&gt;Alternatively, provide a means of identifying elements in which white space should be preserved in the prolog, e.g. through a processing instruction.&lt;/p&gt;
&lt;p&gt;There are counter-examples this this&amp;#8211;e.g. the HTML pre element&amp;#8211;but I think this is what most people want most of the time so it makes sense to make it the default and make white space preservation the one that requires special casing. Some thought is needed to figure out the algorithm though, especially for white space like this&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;foo&gt; bar &amp;lt;/foo&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and this&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;bam/&gt; &amp;lt;foo&gt;bar/foo&gt;&lt;baz/&gt; &lt;bam&gt; &lt;/bam&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and this &lt;/p&gt;
&lt;p&gt;&lt;code&gt;The &amp;lt;em&gt;quick&amp;lt;/em&gt; &amp;lt;strong&gt;brown&amp;lt;/strong&gt; fox jumped over the lazy dog. &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Exactly which white space is retained, and to which element is it assigned?&lt;/p&gt;
&lt;p&gt;Whatever way we go here, use the same rules for all attribute values.  Attribute value normalization was a mistake in XML 1.0 anyway. Drop it.&lt;/p&gt;
&lt;h3&gt;Most character encodings&lt;/h3&gt;
&lt;p&gt;Use XML 1.0 name rules but base on Unicode properties for all non-ASCII characters. Provide a means of identifying the Unicode version in use. Default to Unicode 2.0, unless the document declares otherwise. This is the change I&amp;#8217;m least interested in, because it may break compatibility, and has no known actual use cases. That is, no one has ever been able to present a document that any actual user wants to produce that cannot be encoded with XML 1.0 name rules. &lt;/p&gt;
&lt;p&gt;Require UTF-8 or UTF-16 exclusively. In fact, maybe just require UTF-8. No other encodings are permitted. Use the encoding declaration to identify the Unicode version and recognize XML 2.0? e.g.&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version=&amp;#8221;1.0&amp;#8243; encoding=&amp;#8221;Unicode_5&amp;#8243;?&gt;&lt;/p&gt;
&lt;p&gt;Fallback to an XML 1.0 processor if this doesn&amp;#8217;t work.&lt;/p&gt;
&lt;p&gt;It does feel a little ugly to specify &lt;code&gt;version="1.0"&lt;/code&gt; for what I&amp;#8217;m calling XML 2.0. However, as long as the document adheres to the XML 1.0 grammar and constraints, this is completely legal. Maybe we shouldn&amp;#8217;t even call this a new version of XML but give it a new name. Perhaps YML (because Y comes after X)?  &lt;/p&gt;
&lt;h3&gt;standalone declaration&lt;/h3&gt;
&lt;p&gt;This means nothing in practice. No one relies on it. Get rid of it. &lt;/p&gt;
&lt;h2&gt;What we add&lt;/h2&gt;
&lt;h3&gt;More entities&lt;/h3&gt;
&lt;p&gt;Predefine the HTML 4 character entity set. Otherwise eliminate all general entity references. We can make this work with a required system ID that points to a DTD containing the definitions. Of course XML 2.0 parsers will not actually load this DTD, only XML 1.0 parsers will need to load it. &lt;/p&gt;
&lt;h3&gt;Links&lt;/h3&gt;
&lt;p&gt;Build in &lt;code&gt;xml:base&lt;/code&gt; and &lt;code&gt;xml:id&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Build in some form of simple links sufficient for use of HTML. Perhaps just &lt;code&gt;xml:link&lt;/code&gt; or  &lt;code&gt;xml:href&lt;/code&gt;, nothing fancier. This contains a URL, and is normally considered semantically equivalent to an HTML &lt;code&gt;&amp;lt;a href=''&gt;&lt;/code&gt;. I.e. it&amp;#8217;s a blue underlined thing you click on. &lt;/p&gt;
&lt;p&gt;Possibly we should even ditch the namespace prefixes. E.g &lt;code&gt;base&lt;/code&gt;, &lt;code&gt;id&lt;/code&gt;, and &lt;code&gt;link&lt;/code&gt;/&lt;code&gt;href&lt;/code&gt; attributes will simply be defined with these semantics. &lt;/p&gt;
&lt;h3&gt;Data Structures and Types&lt;/h3&gt;
&lt;p&gt;The biggest lack of XML 1.0 is a standard means of encoding basic data structures and types used in programming: lists, sets, maps, structs, ints floats, etc. This is why JSON is so popular. It&amp;#8217;s not that these things can&amp;#8217;t be encoded in XML 1.0, just that there are so many ways they can be encoded, and libraries provide no support for decoding them. &lt;/p&gt;
&lt;p&gt;To support this use case, we will allow an optional &lt;code&gt;xml:type&lt;/code&gt; or perhaps just &lt;code&gt;type&lt;/code&gt; attribute on all elements. The value  is a name from a type library such as XSD primitive types. Predefine a basic type library with the minimal types: integer, decimal, string, boolean, date, time. For example,&lt;/p&gt;
&lt;pre&gt;&amp;lt;sku type="string"&gt;H647345&amp;lt;/sku&gt;
&amp;lt;date type="date"&gt;2010-10-12&amp;lt;/date&gt;
&amp;lt;quantity type="integer"&gt;12&amp;lt;/quantity&gt;
&amp;lt;price type="decimal" units="dollars"&gt;3.45&amp;lt;/quantity&gt;
&amp;lt;price type="decimal" units="percent"&gt;7.25&amp;lt;/quantity&gt;&lt;/pre&gt;
&lt;p&gt;The default simple type is string. I.e. we can instead write&lt;/p&gt;
&lt;pre&gt;&lt;lt;sku&gt;H647345&lt;lt;/sku&gt;&lt;/pre&gt;
&lt;p&gt;We do not want the full set of XSD types. In particular, we do not want float, double, short, int, and long. Integers have arbitrary size, and real numbers are expressed in base 10. Parsers may express these with more or less precision as they choose. &lt;/p&gt;
&lt;p&gt;We also want list and map types and maybe set:&lt;/p&gt;
&lt;pre&gt;&amp;lt;crew type="list"&gt;
  &amp;lt;name&gt;Fred&amp;lt;/name&gt;
  &amp;lt;name&gt;Jane&amp;lt;/name&gt;
  &amp;lt;name&gt;Bob&amp;lt;/name&gt;
&amp;lt;/crew&gt;

&amp;lt;dimensions type="map"&gt;
  &amp;lt;width type="decimal" units="cm"&gt;34.3&amp;lt;/width&gt;
  &amp;lt;length type="decimal" units="cm"&gt;120.0&amp;lt;/length&gt;
  &amp;lt;height type="decimal" units="cm"&gt;3.10&amp;lt;/height&gt;
&amp;lt;/dimensions&gt;&lt;/pre&gt;
&lt;p&gt;Here I&amp;#8217;ve made the keys simply the element names. Possibly with maps we want to allow or require that the keys also be attributes or even elements, which would enable a broader range of key types. &lt;/p&gt;
&lt;p&gt;We probably want to define some sort of simple type defintiion that can be used by parsers rather than explicitly specifying the type of each element. E.g.&lt;/p&gt;
&lt;pre&gt;&amp;lt;dimensions type="map" valuetype="decimal" keytype="string"&gt;
  &amp;lt;dimension key="width" units="cm"&gt;34.3&amp;lt;/dimension&gt;
  &amp;lt;dimension key="length" units="cm"&gt;120.0&amp;lt;/dimension&gt;
  &amp;lt;dimension key="height" units="cm"&gt;3.10&amp;lt;/dimension&gt;
&amp;lt;/dimensions&gt;&lt;/pre&gt;
&lt;p&gt;Parsers and APIs are encouraged to make this content available to clients in a more cooked form appropriate to the programming language rather than as raw strings and nodes. However these types are all advisory, not compulsory. Further note that these types could be further parsed by a library that sits on top of an XML 1.0 parser. An XML 2.0 parser is not required. &lt;/p&gt;
&lt;p&gt;TBD: should XML 2.0 parsers treat violations of the constraints on the semantic types (e.g. &amp;lt;amount xml:type=&amp;#8217;int&amp;#8217;&gt;Bob&amp;lt;/amount&gt;) as a  fatal well-formedness error or a non-fatal validity error? If we just use the type attribute it would have to be the latter to avoid breaking compatibility with existing documents.&lt;/p&gt;
&lt;p&gt;The details of the type system remain to be worked out. How do we name and define new types? What does the syntax of a type definition look like? Do we need collections other than list and map? Exactly which primitive types do we predefine? Will the world really let us get away with integers and decimals or will they scream for int and float? Much work here remains to be done. But the basic idea is sound. We don&amp;#8217;t need to reinvent the same type annotations for every vocabulary. Just as XML 1.0 improved on SGML by eliminating the freedom to use different syntax to delimit elements and attributes, XML 2.0 will improve on XML 1.0 by eliminating the freedom to use different syntax to denote types. We will not limit which types one can express. We will simply specify a standard form for denoting type information. &lt;/p&gt;
&lt;h2&gt;What we can&amp;#8217;t do&lt;/h2&gt;
&lt;p&gt;There are a few minor changes I haven&amp;#8217;t been able to figure out how to make while maintaining backward compatibility. These include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allowing &amp;#8212; to appear in comments&lt;/li&gt;
&lt;li&gt;Not making ]]&amp;gt; special&lt;/li&gt;
&lt;li&gt;version=&amp;#8221;2.0&amp;#8243;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you can figure out how to make these compatible, please do let me know. I&amp;#8217;m almost willing to compromise on these minor points of backwards compatibility to simplify the parsing process, but I&amp;#8217;m not sure that&amp;#8217;s wise. &lt;/p&gt;
&lt;p&gt;&lt;code&gt;version="2.0"&lt;/code&gt; is the trickiest one. XML 1.0 parsers are not required to error out on this, but in practice many do. Perhaps we should drop the XML declaration completely? I.e. any document with an XML declaration is ipso facto not an XML 2.0 document. Instead all XML 2.0 documents will be identified with a specific DOCTYPE:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;!DOCTYPE XML2 PUBLIC "application/xml+xsd http://example.com/optional/actualschema.xsl" http://www.example.com/xml20.dtd"&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;As mentioned above, the DTD mentioned by the system identifier is a legal XML 1.0 DTD that defines all the HTML entities. XML 2.0 aware processors will ignore this. The public identifier (which may be empty) contains a MIME media type followed by the URL to the actual schema for the document.&lt;/p&gt;
&lt;h2&gt;The Way Forward&lt;/h2&gt;
&lt;p&gt;There&amp;#8217;s one other reason XML 1.0 succeeded where XML 1.1 failed: XML 1.0 was designed by a small committee of like-minded folks with a common goal. They didn&amp;#8217;t always agree on the route, but they were all driving to the same destination. The W3C pretty much ignored them until they were done. By contrast, XML 1.1 was hobbled by a W3C process that took far longer to accomplish much less. If XML 2.0 is to succeed, it needs to follow XML 1.0, not XML 1.1. &lt;/p&gt;
&lt;p&gt;A small group of interested folks should convene outside the W3C and write the spec. One month to agree on goals and requirements; one month to write the first draft. Run it up a flagpole and see who salutes. &lt;/p&gt;
&lt;p&gt;Step 2 is to write parsers and APIs for the new draft, and gain some implementation experience. Develop a test suite of sample documents. That will take longer, but is necessary. Work the bugs out of the spec. At the point where the goals seem to be satisfied and the spec is reasonably implemented, present it to the world as a fait accompli. If some organization feels like adopting it as a formal standard, that&amp;#8217;s fine, though it&amp;#8217;s hardly necessary. &lt;/p&gt;
&lt;p&gt;The real goal is to take the lessons of the last 12 years of XML, and apply them to create something even better. Who&amp;#8217;s with me? &lt;/p&gt;
&lt;h2&gt;P.S.&lt;/h2&gt;
&lt;p&gt;If you want to comment, please be aware that you need to escape &amp;lt; as &amp;amp;lt; and &amp;gt; as &amp;amp;gt;. The comments allow basic HTML but aren&amp;#8217;t smart enough to distinguish between plain text and real HTML comments. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/V-Szq4UtpZr5TJ7pL_YGEJj_Gys/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V-Szq4UtpZr5TJ7pL_YGEJj_Gys/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/V-Szq4UtpZr5TJ7pL_YGEJj_Gys/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V-Szq4UtpZr5TJ7pL_YGEJj_Gys/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/547KzzYvdA0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/xml/xml-2-0/#comments" thr:count="48" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/xml/xml-2-0/feed/atom/" thr:count="48" />
		<thr:total>48</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/xml/xml-2-0/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[Could not load a dependent class com/jcraft/jsch/Logger]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/nyuWrvTO3TI/" />
		<id>http://cafe.elharo.com/?p=639</id>
		<updated>2010-07-09T10:53:44Z</updated>
		<published>2010-06-25T10:40:59Z</published>
		<category scheme="http://cafe.elharo.com" term="Java" /><category scheme="http://cafe.elharo.com" term="ant" /><category scheme="http://cafe.elharo.com" term="jsch" />		<summary type="html"><![CDATA[Have you ever seen an Ant error message like this? BUILD FAILED /Users/elharo/Projects/XOM/build.xml:545: Problem: failed to create task or type scp Cause: Could not load a dependent class com/jcraft/jsch/Logger It is not enough to have Ant's optional JARs you need the JAR files that the optional tasks depend upon. Ant's optional task dependencies are listed [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/programming/java-programming/could-not-load-a-dependent-class-comjcraftjschlogger/">&lt;p&gt;Have you ever seen an Ant error message like this? &lt;/p&gt;
&lt;pre&gt;BUILD FAILED
/Users/elharo/Projects/XOM/build.xml:545: Problem: failed to create task or type scp
Cause: Could not load a dependent class com/jcraft/jsch/Logger
       It is not enough to have Ant's optional JARs
       you need the JAR files that the optional tasks depend upon.
       Ant's optional task dependencies are listed in the manual.
Action: Determine what extra JAR files are needed, and place them in one of:
        -/opt/ant/lib
        -/Users/elharo/.ant/lib
        -a directory added on the command line with the -lib argument

Do not panic, this is a common problem.
The commonest cause is a missing JAR.

This is not a bug; it is a configuration problem&lt;/pre&gt;
&lt;p&gt;As usual, the ant error message is completely unhelpful, though for once it&amp;#8217;s at least technically correct. (Most of the time when ant says, &amp;#8220;This is not a bug; it is a configuration problem&amp;#8221;, it is in fact a bug and not a configuration problem.) Here&amp;#8217;s what&amp;#8217;s really happening.&lt;br /&gt;
&lt;span id="more-639"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The jsch jar file distributed from http://www.jcraft.com/jsch/ is corrupt. Either they uploaded it wrong or they misconfigured their web server or both. (Update: it looks like a misconfigured server/poorly designed web page. The so-called download link isn&amp;#8217;t that at all. You can follow it but not save it.) The jar file with the relevant classes is there, but it&amp;#8217;s no good. You can check your local copy by trying to list its contents with &lt;samp&gt;jar tvf&lt;/samp&gt;:&lt;/p&gt;
&lt;pre&gt;$ jar tvf /usr/share/ant/lib/jsch*jar
java.util.zip.ZipException: error in opening zip file
	at java.util.zip.ZipFile.open(Native Method)
	at java.util.zip.ZipFile.&lt;init&gt;(ZipFile.java:114)
	at java.util.zip.ZipFile.&lt;init&gt;(ZipFile.java:75)
	at sun.tools.jar.Main.list(Main.java:979)
	at sun.tools.jar.Main.run(Main.java:224)
	at sun.tools.jar.Main.main(Main.java:1149)&lt;/pre&gt;
&lt;p&gt;If you see anything but a list of classes, the problem is that the JSCH jar is no good. To fix it, use &lt;a href="http://downloads.sourceforge.net/project/jsch/jsch.jar/0.1.42/jsch-0.1.42.jar?use_mirror=softlayer&amp;amp;ts=1278672723"&gt;this link to sourceforge&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;Once again I am reminded of the perils of depending on external libraries, especially ones you don&amp;#8217;t build or distribute with your own product. In 2010 ssh and scp are mandatory features of any build and deployment system. Secure communications are too important to be left to random third party web sites. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jHhVbxI5Uy6faVp5SdIwvqICxas/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jHhVbxI5Uy6faVp5SdIwvqICxas/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jHhVbxI5Uy6faVp5SdIwvqICxas/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jHhVbxI5Uy6faVp5SdIwvqICxas/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/nyuWrvTO3TI" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/programming/java-programming/could-not-load-a-dependent-class-comjcraftjschlogger/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/programming/java-programming/could-not-load-a-dependent-class-comjcraftjschlogger/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/programming/java-programming/could-not-load-a-dependent-class-comjcraftjschlogger/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[Dn&#8217;t Abbrvt]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/HMN4j7iCEPA/" />
		<id>http://cafe.elharo.com/?p=515</id>
		<updated>2011-03-15T15:10:56Z</updated>
		<published>2010-04-28T10:32:43Z</published>
		<category scheme="http://cafe.elharo.com" term="Programming" />		<summary type="html"><![CDATA[Is req a request or a requisition? Is res a response, a reservation, a resume, or a result? Is def a default or a definition? Is rng a range or a random number generator? Is v1 version 1 or value 1? Is e an event, an entity, or an exception? Is f a file or [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/programming/dnt-abbrvt/">&lt;p&gt;Is &lt;code&gt;req&lt;/code&gt; a request or a requisition?&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;res&lt;/code&gt; a response, a reservation, a resume, or a result?&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;def&lt;/code&gt; a default or a definition?&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;rng&lt;/code&gt; a range or a random number generator?&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;v1&lt;/code&gt; version 1 or value 1?&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;e&lt;/code&gt; an event, an entity, or an exception? &lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;f&lt;/code&gt; a file or a float? &lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;lst&lt;/code&gt; a list or the least value? &lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;temp&lt;/code&gt; a  temporary variable or a temperature reading?&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;rep&lt;/code&gt; a  representation, a representative, a repetition, or a reputation?&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;tm&lt;/code&gt; a time or a trademark? Or even another temporary variable? And if it is a time, is it a timestamp, a time of day, or a duration? (These are three very different things.)&lt;/p&gt;
&lt;p&gt;Is &lt;code&gt;admin&lt;/code&gt; an administrator, an administrative assistant, or a system administrator?&lt;/p&gt;
&lt;p&gt;In context, you can usually figure these things out, but you have to think about them. That&amp;#8217;s inefficient. Far better to just spell out what you mean from the get go.&lt;br /&gt;
&lt;span id="more-515"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There are a few abbreviations that are so well known and understood that they&amp;#8217;re acceptable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;max&lt;/code&gt; for maximum&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min&lt;/code&gt; for minimum&lt;/li&gt;
&lt;li&gt;&lt;code&gt;in&lt;/code&gt; for &lt;code&gt;InputStream&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;out&lt;/code&gt; for &lt;code&gt;OutputStream&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;e&lt;/code&gt; or &lt;code&gt;ex&lt;/code&gt; for an exception in a &lt;code&gt;catch&lt;/code&gt; clause (but nowhere else).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;num&lt;/code&gt; for number, though only when used as prefix as in &lt;code&gt;numTokens&lt;/code&gt;, or &lt;code&gt;numHits&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can use single letter variable names for the occasional quantity that has no meaning other than its type. For example, a string variable can be named &lt;code&gt;s&lt;/code&gt;, an int variable &lt;code&gt;i&lt;/code&gt;, or a double variable &lt;code&gt;x&lt;/code&gt;. However, this should only be used when the program really doesn&amp;#8217;t know anything about the nature of the variable other than its type. For example, a method that calculates the cube root of a double may name its argument &lt;code&gt;x&lt;/code&gt;; but a method that converts temperature from degrees Fahrenheit to degrees Celsius should name its argument &lt;code&gt;degrees&lt;/code&gt;, &lt;code&gt;degreesFahrenheit&lt;/code&gt;, or perhaps &lt;code&gt;temperatureFahrenheit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In addition, there&amp;#8217;s nothing at all wrong with using common acronyms that are more recognized than what they stand for: URL, HTML, XML, XSL, etc. However, these are the exceptions, not the rules; and I would still be careful with common abbreviations that mean something else at first glance. EmployeeBO is almost certainly a Business Object, but that wasn&amp;#8217;t what you read it as first, was it? &lt;/p&gt;
&lt;p&gt;Code should be optimized for reading and comprehension, not for marginally faster typing. You should no more abbreviate names in your code than you do words in your sentences. No1 wnts 2 rd txt wrttn lk ths. &lt;img src='http://cafe.elharo.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VqTJbvLrHGRCo1XtcbiNXcsBEzU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VqTJbvLrHGRCo1XtcbiNXcsBEzU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VqTJbvLrHGRCo1XtcbiNXcsBEzU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VqTJbvLrHGRCo1XtcbiNXcsBEzU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/HMN4j7iCEPA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/programming/dnt-abbrvt/#comments" thr:count="8" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/programming/dnt-abbrvt/feed/atom/" thr:count="8" />
		<thr:total>8</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/programming/dnt-abbrvt/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[Bruce Eckel is Wrong]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/8x6uUpXht70/" />
		<id>http://cafe.elharo.com/?p=517</id>
		<updated>2010-04-20T10:59:14Z</updated>
		<published>2010-04-20T10:59:14Z</published>
		<category scheme="http://cafe.elharo.com" term="Programming" /><category scheme="http://cafe.elharo.com" term="Bruce Eckel" /><category scheme="http://cafe.elharo.com" term="exceptions" />		<summary type="html"><![CDATA[Every time the subject of checked versus runtime exceptions comes up, someone cites Bruce Eckel as an argument by authority. This is unfortunate, because, as much as I like and respect Bruce, he is out to sea on this one. Nor is it merely a matter of opinion. In this case, Bruce is factually incorrect. [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/programming/bruce-eckel-is-wrong/">&lt;p&gt;Every time the subject of checked versus runtime exceptions comes up, someone cites Bruce Eckel as an argument by authority. This is unfortunate, because, as much as I like and respect Bruce, he is out to sea on this one. Nor is it merely a matter of opinion. In this case, Bruce is factually incorrect. He believes things about checked exceptions that just aren&amp;#8217;t true; and I think it&amp;#8217;s time to lay his misconceptions to rest once and for all.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s see exactly what Bruce&amp;#8217;s mistake is. The following is an extended selection from &lt;cite&gt;Thinking in Java, 4th edition, pp. 490-491&lt;/cite&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;An exception-handling system is a trapdoor that allows your program to abandon execution of the normal sequence of statements. The trapdoors used when an &amp;#8220;exceptional condition&amp;#8221; occurs, such that normal execution is no longer possible or desirable. Exceptions represent conditions that the current method is unable to handle. The reason exception-handling systems were developed is because the approach of dealing with each possible error condition produced by each function call was too onerous, and programmers simply weren&amp;#8217;t doing it. As a result, they were ignoring the errors. It&amp;#8217;s worth observing that the issue of programmer convenience in handling errors was a prime motivation for exceptions in the first place.&lt;/p&gt;
&lt;p&gt;One of the important guidelines in exception handling is &amp;#8220;Don&amp;#8217;t catch an exception unless you know what to do with it.&amp;#8221; In fact, one of the important goals of exception handling is to move the error-handling code away from the point where the errors occur. This allows you to focus on what you want to accomplish in one section of your code, and how you&amp;#8217;re going to deal with problems in a distinct separate section of your code. As a result, your mainline code is not cluttered with error-handling logic, and it&amp;#8217;s much easier to understand and maintain. Exception handling also tends to reduce the amount of error-handling code, by allowing one handler to deal with many error sites.&lt;/p&gt;
&lt;p&gt;Checked exceptions complicate the scenario a bit, because they force you to add &lt;strong&gt;catch&lt;/strong&gt; clauses in places where you may not be ready to handle an error. This results in the &amp;#8220;harmful if swallowed&amp;#8221; problem:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;try {&lt;br /&gt;
 // ... to do something useful&lt;br /&gt;
} catch (ObligatoryException e) {} // Gulp!&lt;/code&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Do you see the mistake? It&amp;#8217;s a common one.&lt;span id="more-517"&gt;&lt;/span&gt; Let me repeat it, so it&amp;#8217;s really obvious [emphasis mine]:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Checked exceptions complicate the scenario a bit, because &lt;em&gt;they force you to add &lt;strong&gt;catch&lt;/strong&gt; clauses in places where you may not be ready to handle an error&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is false. You are never forced to add &lt;code&gt;catch&lt;/code&gt; clauses where you are not ready to handle an error. This isn&amp;#8217;t a matter of opinion. It&amp;#8217;s a matter of fact. Checked exceptions do not require &lt;code&gt;catch&lt;/code&gt; blocks. They require a &lt;code&gt;catch&lt;/code&gt; block OR a &lt;code&gt;throws&lt;/code&gt; declaration. Eckel&amp;#8217;s entire argument is based on ignoring the possibility of a &lt;code&gt;throws&lt;/code&gt; declaration. &lt;/p&gt;
&lt;p&gt;While Bruce is absolutely right that you should not catch an exception unless you know what to do with it, this in no way means that you should insert a &lt;code&gt;catch&lt;/code&gt; block everywhere a checked exception may be thrown. If you aren&amp;#8217;t ready to handle an error at one place, let the exception bubble up.   If a checked exception is thrown inside a method where you are not ready to handle it, then the correct response is to add a &lt;code&gt;throws&lt;/code&gt; clause to the method indicating that the exception will bubble up from that method. For example,&lt;/p&gt;
&lt;pre&gt; public void doSomethingUseful() throws ObligatoryException {
   // ... do something useful that throws an obligatory exception
} &lt;/pre&gt;
&lt;p&gt;You do not and should not insert a &lt;code&gt;catch&lt;/code&gt; block in a method where you cannot do anything reasonable in the &lt;code&gt;catch&lt;/code&gt; block. Checked exceptions never meant that every exception had to be caught as soon as it was thrown. It is perfectly acceptable to declare that a method throws a checked exception. Indeed, this is exactly how exceptions are meant to be used. It warns whoever calls your method that they need to be ready for this exceptional condition, and they either need to catch it and handle it themselves; or, they themselves need to declare that they throw it so that they warn their callers.&lt;/p&gt;
&lt;p&gt;Yes, if it were true that every checked exception needed to be caught immediately, then checked exceptions would be incredibly inconvenient. However, experienced Java programmers don&amp;#8217;t do this. Catching each and every checked exception at the first opportunity  is a sure mark of a novice Java developer.&lt;/p&gt;
&lt;p&gt;Occasionally, you&amp;#8217;ll &lt;a href="http://www.ibm.com/developerworks/java/library/j-ce/index.html"&gt;override a method inherited from a superclass or implement a method declared in interface that does not declare it throws the checked exception that your method throws and thus can&amp;#8217;t throw the correct exception&lt;/a&gt;. In this case alone, it may be acceptable to wrap the exception in either a checked exception that the original declaration declares or in a runtime exception (if the original declaration does not declare any appropriate checked exceptions). For example,&lt;/p&gt;
&lt;pre&gt;   @Override
    public void doSomethingUseful() {
        try {
     // ... do something useful that throws an obligatory exception
        }
        catch (ObligatoryException e) {
            throw new ObligatoryRuntimeException (e);
        }&lt;/pre&gt;
&lt;p&gt;However, you still don&amp;#8217;t need to handle the exception before you&amp;#8217;re ready for it.&lt;/p&gt;
&lt;p&gt;I will note that this situation is a failure of design. When you&amp;#8217;re forced to do this, one of two things is broken:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The superclass/interface was not designed properly for extension. Specifically it did not take into account the exceptions overriders/implementers might reasonably want to throw. The method likely should have been declared final and probably shouldn&amp;#8217;t be extended at all. &lt;/li&gt;
&lt;li&gt; The overriding/implementing method is violating the contract of the method it overrides/implements by doing something it really should not be doing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A good example of the latter would be letting an &lt;code&gt;IOException&lt;/code&gt; wrapped in a &lt;code&gt;RuntimeException&lt;/code&gt; escape from the &lt;code&gt;run()&lt;/code&gt; method of &lt;code&gt;java.lang.Thread&lt;/code&gt; or &lt;code&gt;java.lang.Runnable&lt;/code&gt;. These methods do not have sufficient context to handle such an exception, but something further down in the call chain does. The exception should be handled before it bubbles all the way up (though not necessarily in the same method where it&amp;#8217;s first thrown). &lt;/p&gt;
&lt;p&gt;In a method properly designed for extension, an empty &lt;code&gt;throws&lt;/code&gt; clause (or a &lt;code&gt;throws&lt;/code&gt; clause that does not match the actual exception) indicates that callers of that method cannot handle and do not expect such an exception. An overriding method that throws a new exception is violating the contract by failing to handle it, the same as it would were it to restrict a precondition or loosen a postcondition. (In essence, this is another form of loosening a postcondition.)&lt;/p&gt;
&lt;p&gt;Eckel is not the only one to make the mistake of assuming that checked exceptions must be immediately at handled at the first possible opportunity. For example, he  cites Barbara Liskov and Alan Snyder explaining their decision not to include checked exceptions in CLU:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;requiring that the text of a handler be attached to the invocation that raises the exception would lead to unreadable programs in which expressions were broken up with handlers&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;True. Requiring that the text of a handler be attached to the invocation that raises the exception would lead to unreadable programs. Fortunately neither Java nor checked exceptions require any such thing. When handlers are appropriate they can usually be moved to the end of a method, far away from the the invocation that raises the exception. When handlers are inappropriate, you use a &lt;code&gt;throws&lt;/code&gt; clause instead. Immediately following every statement that can throw an exception with a &lt;code&gt;catch&lt;/code&gt; block is bad form on a par with &lt;code&gt;goto&lt;/code&gt;. &lt;/p&gt;
&lt;p&gt;Liskov and Snyder continue:&lt;/p&gt;
&lt;p&gt;&amp;#8220;We felt it was unrealistic to require the programmer to provide handlers in situations where no meaningful action can be taken.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Also very true, but of course, checked exceptions do not require the programmer to provide handlers in situations where no meaningful action can be taken. When no meaningful action can be taken (out of memory error, stack overflow, class not found, etc.) Java programs throw &lt;code&gt;Error&lt;/code&gt;s, not checked exceptions, not even runtime exceptions. Checked exceptions &lt;a href="http://cafe.elharo.com/blogroll/internal-and-external-exceptions/"&gt;signal environmental problems that programmers cannot prevent or predict&lt;/a&gt;, should test for, and most decidedly can handle. To choose the most extreme example, if a production-worthy database system is writing a file and the disk fills up, it should handle the condition gracefully without corrupting the database. A disk full error is neither unforeseeable nor unmanageable. Most checked exceptions aren&amp;#8217;t even that tricky to respond to. &lt;/p&gt;
&lt;p&gt;What checked exceptions actually do require is that any method that can throw a checked exception warn its callers that the exception may be thrown. That&amp;#8217;s all. A checked exception is nothing more and nothing less than part of the return type. Methods may return normally or they may throw exceptions. It makes just as much sense to specify the exceptions that can be thrown by a method as it does to specify that a method returns an &lt;code&gt;int&lt;/code&gt; or a &lt;code&gt;String&lt;/code&gt;. A method that does not declare the exceptions it throws is incomplete.&lt;/p&gt;
&lt;p&gt;A lot of us didn&amp;#8217;t really &lt;em&gt;get&lt;/em&gt; checked exceptions when Java was released in the mid-nineties. It was a genuinely new idea that I don&amp;#8217;t think  any programming language before had foreshadowed. Liskov and Snyder wrote the paper quoted here in 1979, and their quotes make sense if you assume they simply didn&amp;#8217;t conceive of having different kinds of exceptions in the language. if you only have one kind of exception then it makes sense for it to be a runtime exception rather than a checked exception. &lt;/p&gt;
&lt;p&gt;Personally, I didn&amp;#8217;t really understand how to use exceptions until the first edition of &lt;cite&gt;Effective Java&lt;/cite&gt; was published. But it&amp;#8217;s been 15 years. That&amp;#8217;s long enough for the message to get out. In 2010 we know better. Proper error handling requires distinguishing programming errors (runtime exceptions) from environmental problems (checked exceptions). Proper error handling requires correcting programming errors and writing handlers for unpreventable environmental conditions. Proper error handling requires knowing when to catch and knowing when to throw. If you try to work with only one kind of exception, or try to get by with only &lt;code&gt;catch&lt;/code&gt; but no &lt;code&gt;throws&lt;/code&gt;, then exceptions are going to seem very ugly and inconvenient. But if you use checked &lt;em&gt;and&lt;/em&gt; runtime exceptions, and use &lt;code&gt;catch&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; &lt;code&gt;throws&lt;/code&gt;, then your error handling code will be far cleaner, safer, and more maintainable. Error handling without checked exceptions and &lt;code&gt;throws&lt;/code&gt; is like arithmetic without &lt;code&gt;*&lt;/code&gt; and &lt;code&gt;/&lt;/code&gt;. Sure, you can do it, but why would when you when using the features the language offers makes life so much simpler? &lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kt-7TgcgyaNlpH3ZLOjBUxrMd70/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kt-7TgcgyaNlpH3ZLOjBUxrMd70/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kt-7TgcgyaNlpH3ZLOjBUxrMd70/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kt-7TgcgyaNlpH3ZLOjBUxrMd70/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/8x6uUpXht70" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/programming/bruce-eckel-is-wrong/#comments" thr:count="56" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/programming/bruce-eckel-is-wrong/feed/atom/" thr:count="56" />
		<thr:total>56</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/programming/bruce-eckel-is-wrong/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[Would You Entrust Your Data to These Yokels?]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/vdmNeCGEfXk/" />
		<id>http://cafe.elharo.com/?p=571</id>
		<updated>2009-12-31T12:40:19Z</updated>
		<published>2009-12-31T12:38:58Z</published>
		<category scheme="http://cafe.elharo.com" term="Security" /><category scheme="http://cafe.elharo.com" term="Windows" /><category scheme="http://cafe.elharo.com" term="backup" /><category scheme="http://cafe.elharo.com" term="Dell" /><category scheme="http://cafe.elharo.com" term="public key certificate" /><category scheme="http://cafe.elharo.com" term="SSL" />		<summary type="html"><![CDATA[If Dell can&#8217;t even manage their public key certificates, how can I trust them to keep my data safe and secure? Technical Details www.delldatasafe.com uses an invalid security certificate. The certificate is not trusted because the issuer certificate is unknown. (Error code: sec_error_unknown_issuer)]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/security/would-you-entrust-your-data-to-these-yokels/">&lt;p&gt;&lt;img src="http://www.elharo.com/blog/wp-content/uploads/2009/12/delldatasafe.png" alt="You have asked Firefox to connect&lt;br /&gt;
securely to www.delldatasafe.com, but we can't confirm that your connection is secure.&lt;/p&gt;
&lt;p&gt;Normally, when you try to connect securely,&lt;br /&gt;
sites will present trusted identification to prove that you are&lt;br /&gt;
going to the right place. However, this site's identity can't be verified.&lt;/p&gt;
&lt;p&gt;What Should I Do?&lt;/p&gt;
&lt;p&gt;If you usually connect to&lt;br /&gt;
this site without problems, this error could mean that someone is&lt;br /&gt;
trying to impersonate the site, and you shouldn't continue.&lt;/p&gt;
&lt;p&gt;             www.delldatasafe.com uses an invalid security certificate.&lt;/p&gt;
&lt;p&gt;The certificate is not trusted because the issuer certificate is unknown.&lt;/p&gt;
&lt;p&gt;(Error code: sec_error_unknown_issuer)" title="delldatasafe" width="811" height="602" class="alignnone size-full wp-image-1002887" /&gt;&lt;/p&gt;
&lt;p&gt;If Dell can&amp;#8217;t even manage their public key certificates, how can I trust them to keep my data safe and secure?&lt;br /&gt;
&lt;span id="more-571"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="technicalContentHeading"&gt;Technical Details&lt;/h3&gt;
&lt;p id="technicalContentText"&gt;www.delldatasafe.com uses an invalid security certificate.&lt;br /&gt;
The certificate is not trusted because the issuer certificate is unknown.&lt;br /&gt;
(Error code: sec_error_unknown_issuer)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/udhAxWNrmO28gvE07xCr3F7UW5s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/udhAxWNrmO28gvE07xCr3F7UW5s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/udhAxWNrmO28gvE07xCr3F7UW5s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/udhAxWNrmO28gvE07xCr3F7UW5s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/vdmNeCGEfXk" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/security/would-you-entrust-your-data-to-these-yokels/#comments" thr:count="11" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/security/would-you-entrust-your-data-to-these-yokels/feed/atom/" thr:count="11" />
		<thr:total>11</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/security/would-you-entrust-your-data-to-these-yokels/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Elliotte Rusty Harold</name>
						<uri>http://www.elharo.com/</uri>
					</author>
		<title type="html"><![CDATA[SourceForge for the 21st Century]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TheCafes/~3/ptmTTlPGEgE/" />
		<id>http://cafe.elharo.com/?p=551</id>
		<updated>2009-12-31T12:39:46Z</updated>
		<published>2009-12-21T11:54:23Z</published>
		<category scheme="http://cafe.elharo.com" term="Programming" /><category scheme="http://cafe.elharo.com" term="CVS" /><category scheme="http://cafe.elharo.com" term="source code control repository" /><category scheme="http://cafe.elharo.com" term="subversion" /><category scheme="http://cafe.elharo.com" term="svn" />		<summary type="html"><![CDATA[Lately I&#8217;ve been thinking a lot about continuous deployment for reasons I&#8217;m not quite yet at liberty to disclose. This has inspired me to improve the XOM release process, to make it more of a one click process, or, to be more accurate, a one ant target process. I can now release a new version [...]]]></summary>
		<content type="html" xml:base="http://cafe.elharo.com/programming/sourceforge-for-the-21st-century/">&lt;p&gt;Lately I&amp;#8217;ve been thinking a lot about continuous deployment for reasons I&amp;#8217;m not quite yet at liberty to disclose. This has inspired me to improve the &lt;a href="http://www.xom.nu/"&gt;XOM&lt;/a&gt; release process, to make it more of a one click process, or, to be more accurate, a one ant target process. I can now release a new version simply by typing:&lt;/p&gt;
&lt;p&gt;&lt;samp&gt;$ ant -Dpassword = secret -Dwebpassword=other_secret release&lt;/samp&gt;&lt;/p&gt;
&lt;p&gt;This not only builds the entire project. It tags the release in CVS, uploads the zip and tar.gz files to IBiblio, and uploads the documentation to my web host. It doesn&amp;#8217;t yet file a bug to upload the maven files, but I&amp;#8217;m working on that.&lt;/p&gt;
&lt;p&gt;During the process of setting this up, I realized that my organization is a little backwards. In particular, I&amp;#8217;m pushing  all the artifacts from my local system. Instead, I should merely be committing everything to the source code control repository; tagging a release; and then having the further downstream artifacts like the zip and tar.gz files and documentation pulled from source code control onto the Web servers.&lt;/p&gt;
&lt;p&gt;There are some commercial products that are organized like this, including &lt;a href="http://www.thoughtworks-studios.com/cruise-release-management"&gt;ThoughtWorks&amp;#8217;s Cruise&lt;/a&gt;, but none of the major open source hosting sites such as SourceForge and java.net work like this. Certainly, SourceForge and similar sites have been major contributors to the open source revolution. They have enabled hobbyist developers working in their garages to use tools and techniques of software development that were previously limited to corporations. They have it enabled far-flung developers around the world to collaborate with each other far more effectively than they could do by e-mailing each other tar files. They have removed the burden of system administration from many programmers, thus enabling them to devote more time to writing code. Make no mistake. SourceForge et al. are real force for good in the community.&lt;/p&gt;
&lt;p&gt;That said, the state of the art in software development has moved forward significantly since these sites were founded. CVS has mostly been replaced by Subversion. On some projects, Subversion has been been replaced by distributed version control systems such as git and Mercurial. Unit testing and test driven development have moved from extreme practices to standard operating procedure. Continuous integration using products like Hudson and Cruise Control is routine. Nonetheless, most project hosting sites still offer little beyond a source code repository, a bug tracker, and some webspace. Not that that&amp;#8217;s not important, but we can do so much more.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s time to think about what a modern project hosting site might want to offer and what it might look like.&lt;br /&gt;
&lt;span id="more-551"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Continuous Integration&lt;/h3&gt;
&lt;p&gt;The first step forward, and possibly the hardest, is to add continuous integration capabilities to the existing project hosting repositories. Every time code is checked into SourceForge or Java.net or code.google.com, the project should be built and the tests should be run. Technically, the hard part is understanding every project&amp;#8217;s unique build infrastructure. Some projects use ant; some use make; some use maven; and some roll their own. Maven is probably the most constrained of a lot. For the others, it will be necessary to ask project owners which targets to run for which tasks. It&amp;#8217;s probably a good idea to auto generate basic ant or maven or make scripts for new projects.&lt;/p&gt;
&lt;p&gt;Beyond merely building the code, running the tests has some very serious security implications. Currently project hosting sites do not run third-party code. They store it; they display it; they make it available and bundle it up as tar and zip files; but they don&amp;#8217;t even compile it, much less run it. Running arbitrary third-party Java and C code submitted by any random &lt;a href="http://www.jwz.org/doc/cadt.html"&gt;teenager with attention deficit disorder&lt;/a&gt; somewhere on the Internet is begging for trouble. 10 years ago I would&amp;#8217;ve thought this was insane and impossible. But now, just maybe we can do it.&lt;/p&gt;
&lt;p&gt;In fact, there are several services on the Internet today that will run arbitrary third-party code for all comers. Amazon&amp;#8217;s EC2 service lets anybody with a credit card run what amounts to a complete rooted Linux box on Amazon&amp;#8217;s network. Google&amp;#8217;s AppEngine let&amp;#8217;s more or less anyone, credit card or no, run Python and Java code inside Google&amp;#8217;s cloud. And these are hardly the only such services. Advances in virtualization and security sandboxing have made this possible. That said, it certainly helps to have a real user attached to any code that you run so you know who to blame when it starts spamming the world. However when an application goes rogue whether through malice or incompetence, it is possible to shut it down quickly. It is possible to limit the resources used by anyone test suite, and to limit what else I can see on the same filesystem and the same network.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://bamboo.ci.codehaus.org/start.action"&gt;Codehaus uses Atalassian Bamboo&lt;/a&gt; to provide continuous integration, including test running, for their projects. However they&amp;#8217;re a relatively small site that&amp;#8217;s somewhat picky about the projects they host. They do use a separate server for the continuous integration. I&amp;#8217;m not sure what other, if any, security precautions they put in place. &lt;a href="https://launchpad.net/"&gt;Launchpad&lt;/a&gt; builds Ubuntu packages, but I&amp;#8217;m not sure of they run tests. &lt;a href="http://www.javaforge.com/project/11"&gt;JavaForge&lt;/a&gt; builds Java code and runs the unit tests, apparently on top of Amazon EC2. &lt;a href="http://www.assembla.com/"&gt;Assembla&lt;/a&gt; will build and run tests, and also uses Amazon EC2. Both of these thereby delegate some of the security issues to Amazon&amp;#8217;s virtualized systems. &lt;/p&gt;
&lt;h3&gt;submit queue&lt;/h3&gt;
&lt;p&gt;Once we&amp;#8217;ve solved the problem of running continuous integration servers on project hosting sites, the next step is to flip them around. The usual process is to commit code to the repository and have the continuous integration server pull the code out of the repository. Then, if the build or tests fail, the continuous integration server goes into red mode and sends out alerts. Wouldn&amp;#8217;t it be better if the server never turned red in the first place?&lt;/p&gt;
&lt;p&gt;What should happen is that new code gets sent directly to the continuous integration server rather than to the source code repository. The continuous integration server pulls the latest known good build from the repository. then it patches the new code into the build and runs the tests. If the tests pass, the continuous integration server commits the code to the repository. If the tests fail, the code is never committed at all.&lt;/p&gt;
&lt;p&gt;So far as I know, no current project hosting sites offer this; and it&amp;#8217;s a relatively uncommon feature even among self hosted projects. However, it&amp;#8217;s a critical one, especially when accepting contributions from the wide world of programmers, not all of whom have yet learned the importance of test driven development. I suppose such a site could also perform other checks on the source code. For example, it could verify coding conventions or measure the incremental code coverage before and after the check-in. It could automatically reject any patches that did not meet some predetermined measures of quality. That said, automated checks tend to be better used as additional data for humans to evaluate rather than as hard and fast rules. One way this can happen is by offering code metrics to code reviewers. This brings us to the next improvement in the code hosting ecosystem.&lt;/p&gt;
&lt;h3&gt;Code Reviews&lt;/h3&gt;
&lt;p&gt;Committing code, even assuming all the tests pass, is still a serious operation. Most open source projects don&amp;#8217;t want to allow just anyone to commit code willy-nilly. Usually there&amp;#8217;s a core group of committers that reviews all incoming patches and decides whether or not to accept them, to reject them, or to send them back for further work. This is somewhat labor-intensive both on the reviewer and the reviewee. &lt;/p&gt;
&lt;p&gt;However, if we move to a submit queue-based system, this can become somewhat more straightforward. The continuous integration server can check every incoming patch regardless of the submitter&amp;#8217;s status. If the tests pass, it can send an automatic request for review to a project commiter. If the commiter approves the change, then the continuous integration server can commit it to the source code control repository.&lt;/p&gt;
&lt;p&gt;Indeed, it&amp;#8217;s probably a good idea to require code reviews for all submitted changes, not just those from new users. After all, it&amp;#8217;s not like the project&amp;#8217;s owners are immune from introducing bugs. In fact, they probably introduce more than anybody else, if for no other reason than that they commit more code than anyone else. Code reviews are well known for increasing the quality of a code base and avoiding stupid errors, yet they&amp;#8217;re one of the lesser used software development practices among open-source programmers. It&amp;#8217;s time for that to change. Web-based code review interfaces such as Guido von Rossum&amp;#8217;s &lt;a href="http://code.google.com/appengine/articles/rietveld.html"&gt;Rietveld&lt;/a&gt; have the potential to really move the community forward here. We should integrate this technology or something equivalent into project hosting sites. code.google.com already offers code review, and a few others like BitBucket do too.  The rest should follow. &lt;/p&gt;
&lt;h3&gt;One-button deployment&lt;/h3&gt;
&lt;p&gt;The final stage of software development is deployment. Eventually the software has to ship to and be installed by its intended users. Here is one area where open source projects have a significantly easier time than a lot of commercial projects, especially enterprise projects. The deployment process for many open source projects consists of little more than uploading a few jar files and some documentation to the right directories on the right Web servers. This should become a one-button operation.&lt;/p&gt;
&lt;p&gt;All of project owners should have to do to release a new version is choose a version number and push a button. The server should pull all the code, documentation, and configuration information out of the source code repository; build everything; and put all the finished artifacts in the right locations. No further manual work should be required. This does require that absolutely everything needed to release goes into the repository; not only code but also HTML files, images, config files, and more. The only things that don&amp;#8217;t go into the repository are the artifacts that are built from these components: jar files, zip files, Javadoc, etc.&lt;/p&gt;
&lt;p&gt;Maven comes close to this, but it still builds and deploys from a local system rather than from the version control repository. This should be turned around. Ideally, &lt;code&gt;maven deploy&lt;/code&gt; should work with nothing more than a pom.xml file. Deploying shouldn&amp;#8217;t need to access the local maven repository or the local copy of the source code at all.&lt;/p&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;There might even be a startup idea in here somewhere. Open source projects aren&amp;#8217;t the only ones that would like to offload some of the routine system administration tasks involved in running source code control repositories, continuous integration servers, bug trackers, and deployment pipelines. More likely, what&amp;#8217;s really needed are some tweaks in and additions to the existing project hosting services. Or perhaps we can even take advantage of the advances in virtualization technology to install these services on top of Amazon EC2 and similar platforms.&lt;/p&gt;
&lt;p&gt;But one thing is for certain: if open source projects are to keep pace with and surpass closed systems, then their software development practices need to be at least as good and probably better than the state-of-the-art in the overall software development community. In order to do that, it&amp;#8217;s time to upgrade our tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Wh9uMMxHVgsJhsHxXnTS5iY7KyQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wh9uMMxHVgsJhsHxXnTS5iY7KyQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Wh9uMMxHVgsJhsHxXnTS5iY7KyQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Wh9uMMxHVgsJhsHxXnTS5iY7KyQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/TheCafes/~4/ptmTTlPGEgE" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://cafe.elharo.com/programming/sourceforge-for-the-21st-century/#comments" thr:count="5" />
		<link rel="replies" type="application/atom+xml" href="http://cafe.elharo.com/programming/sourceforge-for-the-21st-century/feed/atom/" thr:count="5" />
		<thr:total>5</thr:total>
	<feedburner:origLink>http://cafe.elharo.com/programming/sourceforge-for-the-21st-century/</feedburner:origLink></entry>
	</feed>

